From b6df4dbb92f466c34ff51b9ec26a941294cab8f0 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 29 Apr 2026 15:32:23 +0000 Subject: [PATCH] Snapshot: MLS sync fixes, image refresh, plugin/theme updates MLS plugin fixes from this session: - Fix silent insert failures: location column NOT NULL was rejecting wpdb->insert calls, causing ~18k new properties since Dec 2025 to be lost. Inserts now build raw SQL with ST_PointFromText so the spatial column is populated atomically. - Auto-refresh expired media URLs in MLS_Media_Handler::fetch_and_cache(), guarded by a property-level GET_LOCK so concurrent fetches share one API refresh. - Normalize WP_Error to null in mls_get_property_image() so callers can rely on the documented string|null contract. - Support comma-separated property_type filters in MLS_Query and MLS_Cluster so the homepage "View All Commercial" link (?property_type=Commercial+Sale,Land,Farm) actually filters correctly. - Incremental sync now looks back 10 minutes past the latest modification timestamp as a safety margin against missed records. - Smart sync exits silently (info-level, not warning) when a full sync is in progress. Operational: - New cron: weekly full sync Sundays at 3 AM (/usr/local/bin/mls-full-sync). - New cron: hourly 2GB cap on mls-thumbnails/ and cache/transformed-images/ (/usr/local/bin/mls-image-cache-cap). - Logrotate config for wp-content/debug.log (2-day retention, daily rotation, delaycompress). Repo policy: - CLAUDE.md updated with explicit "commit everything except build artifacts" policy. - .gitignore: untrack runtime image caches and debug.log rotations. Other modifications in this snapshot are pre-existing in-flight theme/plugin/db_content_updates work. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/settings.local.json | 5 +- .gitignore | 9 + CLAUDE.md | 32 + .../2026-01-05_SEO_albert_lea_landing_page.md | 0 .../2026-01-06_agent-testimonials.md | 0 .../2026-01-06_favicon-management.md | 0 .../2026-01-06_mls-ssl-skip-config.md | 0 ...-12_22-37_property-inquiry-form-reorder.md | 138 + .../2026-01-12_agent-mls-id-assignments.md | 35 + ...2026-01-20_remove-legacy-property-posts.md | 65 + ...2026-01-21_17-34_split-about-team-pages.md | 130 + .../2026-01-21_18-15_blog-enhancements.md | 67 + .../2026-01-21_manual-property-system.md | 77 + .../2026-01-23_about-page-acf-fields.md | 37 + db_content_updates/README.md | 0 node_modules/.package-lock.json | 9 +- package-lock.json | 12 +- package.json | 3 + wordpress-20260104.sql.gz | Bin .../e5215a1698b82c652e6d53647619cac7.webp | Bin 996208 -> 0 bytes wp-content/plugins/mls-by-hansonxyz/README.md | 64 +- .../admin/css/manual-property.css | 86 + .../admin/js/manual-property.js | 110 + .../mls-by-hansonxyz/cli/class-mls-cli.php | 156 +- .../includes/class-mls-api-client.php | 52 +- .../includes/class-mls-cluster.php | 55 +- .../includes/class-mls-db.php | 148 +- .../includes/class-mls-garbage-collector.php | 59 +- .../includes/class-mls-geocoder.php | 264 + .../includes/class-mls-image-endpoint.php | 358 +- .../includes/class-mls-media-handler.php | 650 +- .../includes/class-mls-query.php | 181 +- .../includes/class-mls-rate-limiter.php | 188 +- .../includes/class-mls-sync-engine.php | 394 +- .../mls-by-hansonxyz/mls-by-hansonxyz.php | 41 +- .../wp-mail-smtp/assets/css/admin-bar.min.css | 1 + .../assets/css/admin-notifications.min.css | 1 + .../assets/css/admin-site-health.min.css | 1 + .../assets/css/dashboard-widget.min.css | 1 + .../css/emails/summary-report-email.css | 299 + .../assets/css/smtp-about.min.css | 1 + .../assets/css/smtp-admin.min.css | 1 + .../assets/css/smtp-smart-routing.min.css | 1 + .../assets/css/vendor/flatpickr.min.css | 13 + .../assets/css/vendor/jquery-confirm.min.css | 9 + .../assets/css/vendor/lity.min.css | 3 + .../assets/images/about/affiliatewp.png | Bin 0 -> 1300 bytes .../images/about/duplicator-icon-large.png | Bin 0 -> 4980 bytes .../wp-mail-smtp/assets/images/about/edd.png | Bin 0 -> 3594 bytes .../assets/images/about/icon-full.svg | 1 + .../assets/images/about/icon-none.svg | 1 + .../assets/images/about/icon-partial.svg | 1 + .../assets/images/about/plugin-aioseo.png | Bin 0 -> 2595 bytes .../assets/images/about/plugin-charitable.png | Bin 0 -> 8073 bytes .../assets/images/about/plugin-mi.png | Bin 0 -> 2665 bytes .../assets/images/about/plugin-om.png | Bin 0 -> 10229 bytes .../assets/images/about/plugin-pushengage.png | Bin 0 -> 1420 bytes .../assets/images/about/plugin-rp.png | Bin 0 -> 2039 bytes .../assets/images/about/plugin-seedprod.png | Bin 0 -> 7472 bytes .../plugin-smash-balloon-facebook-feeds.png | Bin 0 -> 2989 bytes .../plugin-smash-balloon-instagram-feeds.png | Bin 0 -> 3114 bytes .../plugin-smash-balloon-twitter-feeds.png | Bin 0 -> 2309 bytes .../plugin-smash-balloon-youtube-feeds.png | Bin 0 -> 1371 bytes .../assets/images/about/plugin-trustpulse.png | Bin 0 -> 1281 bytes .../assets/images/about/plugin-wpcode.png | Bin 0 -> 20791 bytes .../assets/images/about/plugin-wpf.png | Bin 0 -> 17306 bytes .../assets/images/about/searchwp.png | Bin 0 -> 3033 bytes .../assets/images/about/sugar-calendar.png | Bin 0 -> 1696 bytes .../wp-mail-smtp/assets/images/about/team.jpg | Bin 0 -> 94273 bytes .../assets/images/about/wp-simple-pay.png | Bin 0 -> 2851 bytes .../additional-connections/screenshot-01.png | Bin 0 -> 135702 bytes .../additional-connections/screenshot-02.png | Bin 0 -> 72699 bytes .../additional-connections/thumbnail-01.png | Bin 0 -> 21481 bytes .../additional-connections/thumbnail-02.png | Bin 0 -> 13505 bytes .../assets/images/dash-widget/error-icon.svg | 1 + .../images/dash-widget/smtp/delivered.svg | 1 + .../assets/images/dash-widget/smtp/sent.svg | 1 + .../assets/images/dash-widget/smtp/total.svg | 1 + .../assets/images/dash-widget/smtp/unsent.svg | 1 + .../images/dash-widget/wp/delivered.svg | 1 + .../assets/images/dash-widget/wp/sent.svg | 1 + .../assets/images/dash-widget/wp/total.svg | 1 + .../assets/images/dash-widget/wp/unsent.svg | 1 + .../assets/images/dash-widget/yes-green.svg | 1 + .../images/email-reports/screenshot-01.png | Bin 0 -> 77117 bytes .../images/email-reports/screenshot-02.png | Bin 0 -> 145973 bytes .../images/email-reports/screenshot-03.png | Bin 0 -> 55194 bytes .../images/email-reports/thumbnail-01.png | Bin 0 -> 16703 bytes .../images/email-reports/thumbnail-02.png | Bin 0 -> 21749 bytes .../images/email-reports/thumbnail-03.png | Bin 0 -> 13525 bytes .../assets/images/email/icon-check.png | Bin 0 -> 1092 bytes .../images/email/illustration-success.svg | 1 + .../assets/images/email/signature.png | Bin 0 -> 7165 bytes .../images/email/wp-mail-smtp-whitelabel.png | Bin 0 -> 8872 bytes .../assets/images/email/wp-mail-smtp.png | Bin 0 -> 10848 bytes .../assets/images/flyout-menu/facebook.svg | 1 + .../assets/images/flyout-menu/life-ring.svg | 1 + .../assets/images/flyout-menu/lightbulb.svg | 1 + .../assets/images/flyout-menu/mascot.svg | 1 + .../assets/images/flyout-menu/star.svg | 1 + .../arrow-rotate-right-purple.svg | 1 + .../assets/images/font-awesome/cancel-red.svg | 1 + .../font-awesome/check-circle-dark-green.svg | 1 + .../font-awesome/check-circle-solid-green.svg | 1 + .../images/font-awesome/clock-orange.svg | 1 + .../exclamation-circle-regular-red.svg | 1 + .../exclamation-circle-solid-orange.svg | 1 + .../exclamation-circle-solid-red.svg | 1 + .../images/font-awesome/info-circle-blue.svg | 1 + .../images/font-awesome/info-circle.svg | 1 + .../assets/images/icons/arrow-up.svg | 1 + .../assets/images/icons/badge-percent.svg | 1 + .../assets/images/icons/check-solid.svg | 1 + .../assets/images/icons/check.svg | 1 + .../assets/images/icons/close.svg | 1 + .../icons/dashicons/dashicons-pdf-grey.svg | 1 + .../dashicons/dashicons-yes-alt-green.svg | 1 + .../assets/images/icons/error.svg | 1 + .../images/icons/exclamation-circle.svg | 1 + .../assets/images/icons/lightbulb.svg | 1 + .../assets/images/icons/success.svg | 1 + .../assets/images/icons/warning.svg | 1 + .../wp-mail-smtp/assets/images/icons/zoom.svg | 1 + .../assets/images/loaders/loading-blue.svg | 1 + .../assets/images/loaders/loading-white.svg | 1 + .../assets/images/loaders/loading.svg | 1 + .../assets/images/logo-whitelabel.svg | 1 + .../wp-mail-smtp/assets/images/logo.svg | 1 + .../assets/images/logs/archive-thumbnail.png | Bin 0 -> 18748 bytes .../assets/images/logs/archive.png | Bin 0 -> 131390 bytes .../assets/images/logs/single-thumbnail.png | Bin 0 -> 34215 bytes .../assets/images/logs/single.png | Bin 0 -> 84948 bytes .../wp-mail-smtp/assets/images/menu-icon.svg | 1 + .../wp-mail-smtp/assets/images/pattie.svg | 1 + .../assets/images/pro-badge-small.svg | 1 + .../wp-mail-smtp/assets/images/pro-badge.svg | 1 + .../assets/images/providers/aws.svg | 1 + .../assets/images/providers/brevo.svg | 1 + .../assets/images/providers/elasticemail.svg | 1 + .../assets/images/providers/google.svg | 1 + .../assets/images/providers/mailersend.svg | 1 + .../assets/images/providers/mailgun.svg | 1 + .../assets/images/providers/mailjet.svg | 1 + .../assets/images/providers/mandrill.svg | 1 + .../assets/images/providers/microsoft.svg | 1 + .../assets/images/providers/pepipost-smtp.png | Bin 0 -> 3236 bytes .../assets/images/providers/pepipost.png | Bin 0 -> 13808 bytes .../assets/images/providers/php.svg | 1 + .../assets/images/providers/postmark.svg | 1 + .../assets/images/providers/resend.svg | 1 + .../assets/images/providers/sendgrid.svg | 1 + .../assets/images/providers/sendlayer.svg | 1 + .../assets/images/providers/smtp-com.svg | 1 + .../assets/images/providers/smtp.svg | 1 + .../assets/images/providers/smtp2go.svg | 1 + .../assets/images/providers/sparkpost.svg | 1 + .../assets/images/providers/zoho.svg | 1 + .../assets/images/recommended.svg | 1 + .../images/reports/email/icon-arrow-down.png | Bin 0 -> 271 bytes .../images/reports/email/icon-arrow-up.png | Bin 0 -> 276 bytes .../images/reports/email/icon-check-gray.png | Bin 0 -> 886 bytes .../images/reports/email/icon-check.png | Bin 0 -> 876 bytes .../images/reports/email/icon-click.png | Bin 0 -> 421 bytes .../images/reports/email/icon-email.png | Bin 0 -> 585 bytes .../images/reports/email/icon-error.png | Bin 0 -> 815 bytes .../assets/images/reports/email/icon-open.png | Bin 0 -> 427 bytes .../wp-mail-smtp-logo-dark-whitelabel.png | Bin 0 -> 10073 bytes .../reports/email/wp-mail-smtp-logo-dark.png | Bin 0 -> 13700 bytes .../email/wp-mail-smtp-logo-whitelabel.png | Bin 0 -> 11031 bytes .../reports/email/wp-mail-smtp-logo.png | Bin 0 -> 14229 bytes .../assets/images/reports/icon-note.png | Bin 0 -> 1233 bytes .../wp-mail-smtp/assets/images/wp-spinner.gif | Bin 0 -> 3656 bytes .../plugins/wp-mail-smtp/assets/js/connect.js | 178 + .../wp-mail-smtp/assets/js/connect.min.js | 1 + .../wp-mail-smtp/assets/js/smtp-about.js | 189 + .../wp-mail-smtp/assets/js/smtp-about.min.js | 1 + .../assets/js/smtp-admin-notices.js | 93 + .../assets/js/smtp-admin-notices.min.js | 1 + .../wp-mail-smtp/assets/js/smtp-admin.js | 581 + .../wp-mail-smtp/assets/js/smtp-admin.min.js | 1 + .../assets/js/smtp-dashboard-widget.js | 305 + .../assets/js/smtp-dashboard-widget.min.js | 1 + .../assets/js/smtp-notifications.js | 185 + .../assets/js/smtp-notifications.min.js | 1 + .../assets/js/smtp-tools-debug-events.js | 360 + .../assets/js/smtp-tools-debug-events.min.js | 1 + .../assets/js/vendor/chart.min.js | 16 + .../js/vendor/chartjs-adapter-moment.min.js | 10 + .../assets/js/vendor/flatpickr.min.js | 2 + .../assets/js/vendor/jquery-confirm.min.js | 10 + .../assets/js/vendor/jquery.matchHeight.js | 388 + .../js/vendor/jquery.matchHeight.min.js | 1 + .../wp-mail-smtp/assets/js/vendor/lity.min.js | 5 + .../assets/languages/wp-mail-smtp-vue.php | 1075 + .../assets/languages/wp-mail-smtp.pot | 5501 ++++++ .../assets/vue/css/wizard.min.css | 1 + .../assets/vue/css/wizard.rtl.min.css | 1 + .../wp-mail-smtp/assets/vue/img/amazonses.svg | 1 + .../wp-mail-smtp/assets/vue/img/arrow.svg | 1 + .../wp-mail-smtp/assets/vue/img/brevo.svg | 4 + .../vue/img/check-circle-solid-white.svg | 1 + .../assets/vue/img/check-circle-solid.svg | 1 + .../assets/vue/img/check-solid.svg | 1 + .../vue/img/chevron-down-solid-grey.svg | 1 + .../assets/vue/img/copy-solid.svg | 1 + .../assets/vue/img/elasticemail.svg | 1 + .../vue/img/exclamation-circle-solid.svg | 1 + .../assets/vue/img/gmail-sign-in-btn.svg | 1 + .../wp-mail-smtp/assets/vue/img/gmail.svg | 1 + .../assets/vue/img/info-circle-solid.svg | 1 + .../assets/vue/img/loading-blue.svg | 1 + .../assets/vue/img/loading-pattie.svg | 28 + .../assets/vue/img/loading-white.svg | 1 + .../wp-mail-smtp/assets/vue/img/loading.svg | 1 + .../assets/vue/img/lock-solid.svg | 1 + .../wp-mail-smtp/assets/vue/img/logo.svg | 1 + .../img/long-arrow-alt-left-regular-grey.svg | 1 + .../vue/img/long-arrow-alt-left-regular.svg | 1 + .../long-arrow-alt-right-regular-white.svg | 1 + .../vue/img/long-arrow-alt-right-regular.svg | 1 + .../assets/vue/img/mailersend.svg | 10 + .../wp-mail-smtp/assets/vue/img/mailgun.svg | 1 + .../wp-mail-smtp/assets/vue/img/mailjet.svg | 1 + .../wp-mail-smtp/assets/vue/img/mandrill.svg | 15 + .../assets/vue/img/outlook-sign-in-btn.svg | 1 + .../wp-mail-smtp/assets/vue/img/outlook.svg | 1 + .../wp-mail-smtp/assets/vue/img/postmark.svg | 1 + .../wp-mail-smtp/assets/vue/img/pro-badge.svg | 1 + .../assets/vue/img/question-circle-solid.svg | 1 + .../wp-mail-smtp/assets/vue/img/resend.svg | 1 + .../wp-mail-smtp/assets/vue/img/sendgrid.svg | 1 + .../wp-mail-smtp/assets/vue/img/sendlayer.svg | 5 + .../wp-mail-smtp/assets/vue/img/smtp.svg | 1 + .../wp-mail-smtp/assets/vue/img/smtp2go.svg | 1 + .../wp-mail-smtp/assets/vue/img/smtpcom.svg | 1 + .../wp-mail-smtp/assets/vue/img/sparkpost.svg | 1 + .../assets/vue/img/star-solid.svg | 1 + .../assets/vue/img/thumbs-down-hover.svg | 1 + .../assets/vue/img/thumbs-down.svg | 1 + .../assets/vue/img/thumbs-up-hover.svg | 1 + .../wp-mail-smtp/assets/vue/img/thumbs-up.svg | 1 + .../assets/vue/img/times-solid-grey.svg | 1 + .../assets/vue/img/times-solid.svg | 1 + .../wp-mail-smtp/assets/vue/img/working.svg | 67 + .../wp-mail-smtp/assets/vue/img/zoho.svg | 1 + .../assets/vue/js/chunk-vendors.min.js | 43 + .../wp-mail-smtp/assets/vue/js/wizard.min.js | 1 + wp-content/plugins/wp-mail-smtp/readme.txt | 592 + .../wp-mail-smtp/src/AbstractConnection.php | 67 + .../wp-mail-smtp/src/Admin/AdminBarMenu.php | 164 + .../plugins/wp-mail-smtp/src/Admin/Area.php | 1587 ++ .../src/Admin/ConnectionSettings.php | 440 + .../src/Admin/DashboardWidget.php | 775 + .../src/Admin/DebugEvents/DebugEvents.php | 438 + .../src/Admin/DebugEvents/Event.php | 597 + .../Admin/DebugEvents/EventsCollection.php | 421 + .../src/Admin/DebugEvents/Migration.php | 69 + .../src/Admin/DebugEvents/Table.php | 582 + .../wp-mail-smtp/src/Admin/DomainChecker.php | 203 + .../wp-mail-smtp/src/Admin/Education.php | 108 + .../wp-mail-smtp/src/Admin/FlyoutMenu.php | 146 + .../wp-mail-smtp/src/Admin/Notifications.php | 544 + .../wp-mail-smtp/src/Admin/PageAbstract.php | 208 + .../wp-mail-smtp/src/Admin/PageInterface.php | 45 + .../wp-mail-smtp/src/Admin/Pages/About.php | 92 + .../wp-mail-smtp/src/Admin/Pages/AboutTab.php | 676 + .../src/Admin/Pages/ActionSchedulerTab.php | 157 + .../Admin/Pages/AdditionalConnectionsTab.php | 193 + .../src/Admin/Pages/AlertsTab.php | 407 + .../wp-mail-smtp/src/Admin/Pages/AuthTab.php | 74 + .../src/Admin/Pages/ControlTab.php | 327 + .../src/Admin/Pages/DebugEventsTab.php | 605 + .../src/Admin/Pages/EmailReports.php | 55 + .../src/Admin/Pages/EmailReportsTab.php | 180 + .../src/Admin/Pages/ExportTab.php | 151 + .../wp-mail-smtp/src/Admin/Pages/Logs.php | 68 + .../wp-mail-smtp/src/Admin/Pages/LogsTab.php | 204 + .../wp-mail-smtp/src/Admin/Pages/MiscTab.php | 543 + .../src/Admin/Pages/SettingsTab.php | 441 + .../src/Admin/Pages/SmartRoutingTab.php | 313 + .../wp-mail-smtp/src/Admin/Pages/TestTab.php | 1606 ++ .../wp-mail-smtp/src/Admin/Pages/Tools.php | 55 + .../src/Admin/Pages/VersusTab.php | 281 + .../src/Admin/ParentPageAbstract.php | 381 + .../src/Admin/PluginsInstallSkin.php | 58 + .../plugins/wp-mail-smtp/src/Admin/Review.php | 226 + .../wp-mail-smtp/src/Admin/SetupWizard.php | 1492 ++ .../src/Compatibility/Compatibility.php | 80 + .../src/Compatibility/Plugin/Admin2020.php | 70 + .../Compatibility/Plugin/PluginAbstract.php | 77 + .../Compatibility/Plugin/PluginInterface.php | 68 + .../src/Compatibility/Plugin/Polylang.php | 65 + .../src/Compatibility/Plugin/PolylangPro.php | 36 + .../src/Compatibility/Plugin/WPForms.php | 35 + .../src/Compatibility/Plugin/WPFormsLite.php | 47 + .../src/Compatibility/Plugin/WPML.php | 69 + .../src/Compatibility/Plugin/WooCommerce.php | 47 + .../plugins/wp-mail-smtp/src/Conflicts.php | 630 + .../plugins/wp-mail-smtp/src/Connect.php | 308 + .../plugins/wp-mail-smtp/src/Connection.php | 78 + .../wp-mail-smtp/src/ConnectionInterface.php | 76 + .../wp-mail-smtp/src/ConnectionsManager.php | 48 + wp-content/plugins/wp-mail-smtp/src/Core.php | 1430 ++ .../plugins/wp-mail-smtp/src/DBRepair.php | 238 + wp-content/plugins/wp-mail-smtp/src/Debug.php | 199 + wp-content/plugins/wp-mail-smtp/src/Geo.php | 225 + .../wp-mail-smtp/src/Helpers/Crypto.php | 163 + .../plugins/wp-mail-smtp/src/Helpers/DB.php | 41 + .../wp-mail-smtp/src/Helpers/Helpers.php | 186 + .../src/Helpers/PluginImportDataRetriever.php | 323 + .../plugins/wp-mail-smtp/src/Helpers/UI.php | 118 + .../plugins/wp-mail-smtp/src/MailCatcher.php | 73 + .../wp-mail-smtp/src/MailCatcherInterface.php | 69 + .../wp-mail-smtp/src/MailCatcherTrait.php | 575 + .../wp-mail-smtp/src/MailCatcherV6.php | 66 + .../plugins/wp-mail-smtp/src/Migration.php | 517 + .../wp-mail-smtp/src/MigrationAbstract.php | 161 + .../plugins/wp-mail-smtp/src/Migrations.php | 170 + .../src/OptimizedEmailSending.php | 59 + .../plugins/wp-mail-smtp/src/Options.php | 1815 ++ .../plugins/wp-mail-smtp/src/Processor.php | 529 + .../src/Providers/AmazonSES/Options.php | 44 + .../src/Providers/AuthAbstract.php | 245 + .../src/Providers/AuthInterface.php | 30 + .../src/Providers/ElasticEmail/Mailer.php | 479 + .../src/Providers/ElasticEmail/Options.php | 132 + .../wp-mail-smtp/src/Providers/Gmail/Auth.php | 554 + .../src/Providers/Gmail/Logger.php | 176 + .../src/Providers/Gmail/Mailer.php | 294 + .../src/Providers/Gmail/Options.php | 299 + .../wp-mail-smtp/src/Providers/Loader.php | 244 + .../src/Providers/Mail/Mailer.php | 49 + .../src/Providers/Mail/Options.php | 59 + .../src/Providers/MailerAbstract.php | 703 + .../src/Providers/MailerInterface.php | 86 + .../src/Providers/MailerSend/Mailer.php | 498 + .../src/Providers/MailerSend/Options.php | 160 + .../src/Providers/Mailgun/Mailer.php | 468 + .../src/Providers/Mailgun/Options.php | 178 + .../src/Providers/Mailjet/Mailer.php | 549 + .../src/Providers/Mailjet/Options.php | 173 + .../src/Providers/Mandrill/Mailer.php | 503 + .../src/Providers/Mandrill/Options.php | 128 + .../src/Providers/OptionsAbstract.php | 563 + .../src/Providers/OptionsInterface.php | 71 + .../src/Providers/Outlook/Options.php | 44 + .../src/Providers/Outlook/Provider.php | 114 + .../src/Providers/Pepipost/Mailer.php | 32 + .../src/Providers/Pepipost/Options.php | 29 + .../src/Providers/PepipostAPI/Mailer.php | 477 + .../src/Providers/PepipostAPI/Options.php | 127 + .../src/Providers/Postmark/Mailer.php | 466 + .../src/Providers/Postmark/Options.php | 164 + .../src/Providers/Resend/Mailer.php | 454 + .../src/Providers/Resend/Options.php | 133 + .../src/Providers/SMTP/Mailer.php | 32 + .../src/Providers/SMTP/Options.php | 48 + .../src/Providers/SMTP2GO/Mailer.php | 508 + .../src/Providers/SMTP2GO/Options.php | 133 + .../src/Providers/SMTPcom/Mailer.php | 478 + .../src/Providers/SMTPcom/Options.php | 174 + .../src/Providers/Sendgrid/Mailer.php | 398 + .../src/Providers/Sendgrid/Options.php | 148 + .../src/Providers/Sendinblue/Api.php | 115 + .../src/Providers/Sendinblue/Mailer.php | 454 + .../src/Providers/Sendinblue/Options.php | 184 + .../src/Providers/Sendlayer/Mailer.php | 453 + .../src/Providers/Sendlayer/Options.php | 140 + .../src/Providers/SparkPost/Mailer.php | 539 + .../src/Providers/SparkPost/Options.php | 182 + .../src/Providers/Zoho/Options.php | 46 + .../wp-mail-smtp/src/Queue/Attachments.php | 242 + .../plugins/wp-mail-smtp/src/Queue/Email.php | 608 + .../wp-mail-smtp/src/Queue/Migration.php | 87 + .../plugins/wp-mail-smtp/src/Queue/Queue.php | 763 + .../src/Reports/Emails/Summary.php | 433 + .../wp-mail-smtp/src/Reports/Reports.php | 237 + .../plugins/wp-mail-smtp/src/SiteHealth.php | 428 + .../src/Tasks/DebugEventsCleanupTask.php | 129 + .../plugins/wp-mail-smtp/src/Tasks/Meta.php | 533 + .../src/Tasks/NotificationsUpdateTask.php | 75 + .../src/Tasks/Queue/CleanupQueueTask.php | 90 + .../src/Tasks/Queue/ProcessQueueTask.php | 84 + .../src/Tasks/Queue/SendEnqueuedEmailTask.php | 97 + .../src/Tasks/Reports/SummaryEmailTask.php | 104 + .../plugins/wp-mail-smtp/src/Tasks/Task.php | 434 + .../plugins/wp-mail-smtp/src/Tasks/Tasks.php | 321 + .../plugins/wp-mail-smtp/src/Upgrade.php | 91 + .../plugins/wp-mail-smtp/src/Uploads.php | 237 + .../src/UsageTracking/SendUsageTask.php | 122 + .../src/UsageTracking/UsageTracking.php | 379 + wp-content/plugins/wp-mail-smtp/src/WP.php | 894 + .../plugins/wp-mail-smtp/src/WPMailArgs.php | 252 + .../wp-mail-smtp/src/WPMailInitiator.php | 271 + wp-content/plugins/wp-mail-smtp/uninstall.php | 263 + .../plugins/wp-mail-smtp/vendor/autoload.php | 25 + .../vendor/composer/ClassLoader.php | 579 + .../vendor/composer/InstalledVersions.php | 359 + .../vendor/composer/autoload_classmap.php | 781 + .../vendor/composer/autoload_files.php | 13 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 11 + .../vendor/composer/autoload_real.php | 49 + .../vendor/composer/autoload_static.php | 822 + .../vendor/composer/installed.php | 263 + .../vendor/paragonie/random_compat/LICENSE | 22 + .../dist/random_compat.phar.pubkey | 5 + .../dist/random_compat.phar.pubkey.asc | 11 + .../paragonie/random_compat/lib/random.php | 32 + .../random_compat/other/build_phar.php | 57 + .../random_compat/psalm-autoload.php | 9 + .../vendor/ralouphie/getallheaders/LICENSE | 21 + .../getallheaders/src/getallheaders.php | 46 + .../action-scheduler/action-scheduler.php | 70 + .../action-scheduler/changelog.txt | 200 + .../classes/ActionScheduler_ActionClaim.php | 45 + .../classes/ActionScheduler_ActionFactory.php | 378 + .../classes/ActionScheduler_AdminView.php | 311 + ...tionScheduler_AsyncRequest_QueueRunner.php | 93 + .../classes/ActionScheduler_Compatibility.php | 111 + .../ActionScheduler_DataController.php | 210 + .../classes/ActionScheduler_DateTime.php | 79 + .../classes/ActionScheduler_Exception.php | 11 + .../ActionScheduler_FatalErrorMonitor.php | 98 + ...ActionScheduler_InvalidActionException.php | 47 + .../classes/ActionScheduler_ListTable.php | 675 + .../classes/ActionScheduler_LogEntry.php | 78 + .../classes/ActionScheduler_NullLogEntry.php | 18 + .../classes/ActionScheduler_OptionLock.php | 136 + .../classes/ActionScheduler_QueueCleaner.php | 254 + .../classes/ActionScheduler_QueueRunner.php | 254 + ...tionScheduler_RecurringActionScheduler.php | 81 + .../ActionScheduler_SystemInformation.php | 93 + .../classes/ActionScheduler_Versions.php | 151 + .../ActionScheduler_WPCommentCleaner.php | 133 + .../ActionScheduler_wcSystemStatus.php | 165 + .../classes/WP_CLI/Action/Cancel_Command.php | 120 + .../classes/WP_CLI/Action/Create_Command.php | 153 + .../classes/WP_CLI/Action/Delete_Command.php | 108 + .../WP_CLI/Action/Generate_Command.php | 121 + .../classes/WP_CLI/Action/Get_Command.php | 75 + .../classes/WP_CLI/Action/List_Command.php | 133 + .../classes/WP_CLI/Action/Next_Command.php | 71 + .../classes/WP_CLI/Action/Run_Command.php | 194 + .../ActionScheduler_WPCLI_Clean_Command.php | 123 + .../ActionScheduler_WPCLI_QueueRunner.php | 195 + ...ctionScheduler_WPCLI_Scheduler_command.php | 202 + .../classes/WP_CLI/Action_Command.php | 353 + .../classes/WP_CLI/Migration_Command.php | 190 + .../classes/WP_CLI/ProgressBar.php | 139 + .../classes/WP_CLI/System_Command.php | 282 + .../classes/abstracts/ActionScheduler.php | 403 + .../ActionScheduler_Abstract_ListTable.php | 797 + .../ActionScheduler_Abstract_QueueRunner.php | 384 + ...onScheduler_Abstract_RecurringSchedule.php | 112 + .../ActionScheduler_Abstract_Schedule.php | 89 + .../ActionScheduler_Abstract_Schema.php | 187 + .../abstracts/ActionScheduler_Lock.php | 74 + .../abstracts/ActionScheduler_Logger.php | 258 + .../abstracts/ActionScheduler_Store.php | 506 + .../ActionScheduler_TimezoneHelper.php | 162 + .../ActionScheduler_WPCLI_Command.php | 83 + .../actions/ActionScheduler_Action.php | 191 + .../ActionScheduler_CanceledAction.php | 25 + .../ActionScheduler_FinishedAction.php | 21 + .../actions/ActionScheduler_NullAction.php | 25 + .../data-stores/ActionScheduler_DBLogger.php | 154 + .../data-stores/ActionScheduler_DBStore.php | 1342 ++ .../ActionScheduler_HybridStore.php | 460 + .../ActionScheduler_wpCommentLogger.php | 282 + .../ActionScheduler_wpPostStore.php | 1105 ++ ...eduler_wpPostStore_PostStatusRegistrar.php | 63 + ...cheduler_wpPostStore_PostTypeRegistrar.php | 53 + ...cheduler_wpPostStore_TaxonomyRegistrar.php | 33 + .../classes/migration/ActionMigrator.php | 126 + .../ActionScheduler_DBStoreMigrator.php | 52 + .../classes/migration/BatchFetcher.php | 95 + .../classes/migration/Config.php | 196 + .../classes/migration/Controller.php | 245 + .../migration/DryRun_ActionMigrator.php | 28 + .../classes/migration/DryRun_LogMigrator.php | 23 + .../classes/migration/LogMigrator.php | 58 + .../classes/migration/Runner.php | 171 + .../classes/migration/Scheduler.php | 128 + .../ActionScheduler_CanceledSchedule.php | 63 + .../ActionScheduler_CronSchedule.php | 111 + .../ActionScheduler_IntervalSchedule.php | 90 + .../ActionScheduler_NullSchedule.php | 39 + .../schedules/ActionScheduler_Schedule.php | 22 + .../ActionScheduler_SimpleSchedule.php | 81 + .../schema/ActionScheduler_LoggerSchema.php | 101 + .../schema/ActionScheduler_StoreSchema.php | 145 + ...eduler_Abstract_QueueRunner_Deprecated.php | 27 + .../ActionScheduler_AdminView_Deprecated.php | 153 + .../ActionScheduler_Schedule_Deprecated.php | 29 + .../ActionScheduler_Store_Deprecated.php | 50 + .../action-scheduler/deprecated/functions.php | 129 + .../action-scheduler/functions.php | 513 + .../action-scheduler/lib/WP_Async_Request.php | 188 + .../lib/cron-expression/CronExpression.php | 318 + .../CronExpression_AbstractField.php | 100 + .../CronExpression_DayOfMonthField.php | 110 + .../CronExpression_DayOfWeekField.php | 124 + .../CronExpression_FieldFactory.php | 55 + .../CronExpression_FieldInterface.php | 39 + .../CronExpression_HoursField.php | 47 + .../CronExpression_MinutesField.php | 39 + .../CronExpression_MonthField.php | 55 + .../CronExpression_YearField.php | 43 + .../lib/cron-expression/LICENSE | 19 + .../woocommerce/action-scheduler/license.txt | 674 + .../woocommerce/action-scheduler/readme.txt | 244 + .../google/apiclient-services/src/Gmail.php | 115 + .../src/Gmail/AutoForwarding.php | 78 + .../src/Gmail/BatchDeleteMessagesRequest.php | 43 + .../src/Gmail/BatchModifyMessagesRequest.php | 79 + .../src/Gmail/CseIdentity.php | 76 + .../src/Gmail/CseKeyPair.php | 149 + .../src/Gmail/CsePrivateKeyMetadata.php | 74 + .../apiclient-services/src/Gmail/Delegate.php | 60 + .../src/Gmail/DisableCseKeyPairRequest.php | 24 + .../apiclient-services/src/Gmail/Draft.php | 58 + .../src/Gmail/EnableCseKeyPairRequest.php | 24 + .../apiclient-services/src/Gmail/Filter.php | 74 + .../src/Gmail/FilterAction.php | 79 + .../src/Gmail/FilterCriteria.php | 186 + .../src/Gmail/ForwardingAddress.php | 60 + .../src/Gmail/HardwareKeyMetadata.php | 42 + .../apiclient-services/src/Gmail/History.php | 123 + .../src/Gmail/HistoryLabelAdded.php | 59 + .../src/Gmail/HistoryLabelRemoved.php | 59 + .../src/Gmail/HistoryMessageAdded.php | 40 + .../src/Gmail/HistoryMessageDeleted.php | 40 + .../src/Gmail/ImapSettings.php | 96 + .../src/Gmail/KaclsKeyMetadata.php | 60 + .../apiclient-services/src/Gmail/Label.php | 202 + .../src/Gmail/LabelColor.php | 60 + .../src/Gmail/LanguageSettings.php | 42 + .../src/Gmail/ListCseIdentitiesResponse.php | 59 + .../src/Gmail/ListCseKeyPairsResponse.php | 59 + .../src/Gmail/ListDelegatesResponse.php | 41 + .../src/Gmail/ListDraftsResponse.php | 77 + .../src/Gmail/ListFiltersResponse.php | 41 + .../Gmail/ListForwardingAddressesResponse.php | 41 + .../src/Gmail/ListHistoryResponse.php | 77 + .../src/Gmail/ListLabelsResponse.php | 41 + .../src/Gmail/ListMessagesResponse.php | 77 + .../src/Gmail/ListSendAsResponse.php | 41 + .../src/Gmail/ListSmimeInfoResponse.php | 41 + .../src/Gmail/ListThreadsResponse.php | 77 + .../apiclient-services/src/Gmail/Message.php | 185 + .../src/Gmail/MessagePart.php | 127 + .../src/Gmail/MessagePartBody.php | 78 + .../src/Gmail/MessagePartHeader.php | 60 + .../src/Gmail/ModifyMessageRequest.php | 61 + .../src/Gmail/ModifyThreadRequest.php | 61 + .../src/Gmail/ObliterateCseKeyPairRequest.php | 24 + .../src/Gmail/PivKeyMetadata.php | 42 + .../src/Gmail/PopSettings.php | 60 + .../apiclient-services/src/Gmail/Profile.php | 96 + .../src/Gmail/Resource/Users.php | 83 + .../src/Gmail/Resource/UsersDrafts.php | 144 + .../src/Gmail/Resource/UsersHistory.php | 68 + .../src/Gmail/Resource/UsersLabels.php | 131 + .../src/Gmail/Resource/UsersMessages.php | 261 + .../Resource/UsersMessagesAttachments.php | 52 + .../src/Gmail/Resource/UsersSettings.php | 201 + .../src/Gmail/Resource/UsersSettingsCse.php | 32 + .../Resource/UsersSettingsCseIdentities.php | 132 + .../Resource/UsersSettingsCseKeypairs.php | 153 + .../Gmail/Resource/UsersSettingsDelegates.php | 117 + .../Gmail/Resource/UsersSettingsFilters.php | 97 + .../UsersSettingsForwardingAddresses.php | 105 + .../Gmail/Resource/UsersSettingsSendAs.php | 164 + .../Resource/UsersSettingsSendAsSmimeInfo.php | 126 + .../src/Gmail/Resource/UsersThreads.php | 154 + .../apiclient-services/src/Gmail/SendAs.php | 184 + .../src/Gmail/SignAndEncryptKeyPairs.php | 60 + .../src/Gmail/SmimeInfo.php | 150 + .../apiclient-services/src/Gmail/SmtpMsa.php | 114 + .../apiclient-services/src/Gmail/Thread.php | 95 + .../src/Gmail/VacationSettings.php | 168 + .../src/Gmail/WatchRequest.php | 97 + .../src/Gmail/WatchResponse.php | 60 + .../vendor_prefixed/google/apiclient/LICENSE | 203 + .../apiclient/src/AccessToken/Revoke.php | 65 + .../apiclient/src/AccessToken/Verify.php | 217 + .../src/AuthHandler/AuthHandlerFactory.php | 47 + .../src/AuthHandler/Guzzle6AuthHandler.php | 76 + .../src/AuthHandler/Guzzle7AuthHandler.php | 25 + .../google/apiclient/src/Client.php | 1063 + .../google/apiclient/src/Collection.php | 104 + .../google/apiclient/src/Exception.php | 23 + .../google/apiclient/src/Http/Batch.php | 191 + .../apiclient/src/Http/MediaFileUpload.php | 273 + .../google/apiclient/src/Http/REST.php | 153 + .../google/apiclient/src/Model.php | 301 + .../google/apiclient/src/Service.php | 67 + .../apiclient/src/Service/Exception.php | 65 + .../google/apiclient/src/Service/Resource.php | 216 + .../google/apiclient/src/Task/Composer.php | 77 + .../google/apiclient/src/Task/Exception.php | 23 + .../google/apiclient/src/Task/Retryable.php | 26 + .../google/apiclient/src/Task/Runner.php | 235 + .../apiclient/src/Utils/UriTemplate.php | 264 + .../google/apiclient/src/aliases.php | 80 + .../vendor_prefixed/google/auth/LICENSE | 203 + .../vendor_prefixed/google/auth/autoload.php | 35 + .../google/auth/src/AccessToken.php | 390 + .../src/ApplicationDefaultCredentials.php | 301 + .../src/Cache/InvalidArgumentException.php | 23 + .../google/auth/src/Cache/Item.php | 146 + .../auth/src/Cache/MemoryCacheItemPool.php | 161 + .../auth/src/Cache/SysVCacheItemPool.php | 207 + .../google/auth/src/Cache/TypedItem.php | 142 + .../google/auth/src/CacheTrait.php | 96 + .../src/CredentialSource/AwsNativeSource.php | 270 + .../auth/src/CredentialSource/FileSource.php | 60 + .../auth/src/CredentialSource/UrlSource.php | 74 + .../Credentials/AppIdentityCredentials.php | 209 + .../ExternalAccountCredentials.php | 229 + .../auth/src/Credentials/GCECredentials.php | 493 + .../auth/src/Credentials/IAMCredentials.php | 77 + .../ImpersonatedServiceAccountCredentials.php | 120 + .../src/Credentials/InsecureCredentials.php | 62 + .../Credentials/ServiceAccountCredentials.php | 312 + .../ServiceAccountJwtAccessCredentials.php | 171 + .../Credentials/UserRefreshCredentials.php | 130 + .../google/auth/src/CredentialsLoader.php | 242 + ...ternalAccountCredentialSourceInterface.php | 23 + .../google/auth/src/FetchAuthTokenCache.php | 261 + .../auth/src/FetchAuthTokenInterface.php | 52 + .../google/auth/src/GCECache.php | 70 + .../auth/src/GetQuotaProjectInterface.php | 32 + .../auth/src/GetUniverseDomainInterface.php | 34 + .../src/HttpHandler/Guzzle6HttpHandler.php | 59 + .../src/HttpHandler/Guzzle7HttpHandler.php | 22 + .../auth/src/HttpHandler/HttpClientCache.php | 51 + .../src/HttpHandler/HttpHandlerFactory.php | 62 + .../vendor_prefixed/google/auth/src/Iam.php | 86 + .../google/auth/src/IamSignerTrait.php | 61 + .../src/Middleware/AuthTokenMiddleware.php | 138 + .../Middleware/ProxyAuthTokenMiddleware.php | 130 + .../ScopedAccessTokenMiddleware.php | 140 + .../auth/src/Middleware/SimpleMiddleware.php | 86 + .../google/auth/src/OAuth2.php | 1520 ++ .../auth/src/ProjectIdProviderInterface.php | 32 + .../auth/src/ServiceAccountSignerTrait.php | 52 + .../google/auth/src/SignBlobInterface.php | 43 + .../auth/src/UpdateMetadataInterface.php | 36 + .../google/auth/src/UpdateMetadataTrait.php | 62 + .../vendor_prefixed/guzzlehttp/guzzle/LICENSE | 27 + .../guzzlehttp/guzzle/src/BodySummarizer.php | 23 + .../guzzle/src/BodySummarizerInterface.php | 12 + .../guzzlehttp/guzzle/src/Client.php | 402 + .../guzzlehttp/guzzle/src/ClientInterface.php | 78 + .../guzzlehttp/guzzle/src/ClientTrait.php | 227 + .../guzzle/src/Cookie/CookieJar.php | 240 + .../guzzle/src/Cookie/CookieJarInterface.php | 74 + .../guzzle/src/Cookie/FileCookieJar.php | 92 + .../guzzle/src/Cookie/SessionCookieJar.php | 71 + .../guzzle/src/Cookie/SetCookie.php | 411 + .../src/Exception/BadResponseException.php | 31 + .../guzzle/src/Exception/ClientException.php | 10 + .../guzzle/src/Exception/ConnectException.php | 47 + .../guzzle/src/Exception/GuzzleException.php | 8 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 111 + .../guzzle/src/Exception/ServerException.php | 10 + .../Exception/TooManyRedirectsException.php | 7 + .../src/Exception/TransferException.php | 7 + .../guzzle/src/Handler/CurlFactory.php | 567 + .../src/Handler/CurlFactoryInterface.php | 23 + .../guzzle/src/Handler/CurlHandler.php | 43 + .../guzzle/src/Handler/CurlMultiHandler.php | 237 + .../guzzle/src/Handler/EasyHandle.php | 91 + .../guzzle/src/Handler/HeaderProcessor.php | 36 + .../guzzle/src/Handler/MockHandler.php | 174 + .../guzzlehttp/guzzle/src/Handler/Proxy.php | 49 + .../guzzle/src/Handler/StreamHandler.php | 464 + .../guzzlehttp/guzzle/src/HandlerStack.php | 238 + .../guzzle/src/MessageFormatter.php | 168 + .../guzzle/src/MessageFormatterInterface.php | 17 + .../guzzlehttp/guzzle/src/Middleware.php | 227 + .../guzzlehttp/guzzle/src/Pool.php | 116 + .../guzzle/src/PrepareBodyMiddleware.php | 86 + .../guzzle/src/RedirectMiddleware.php | 162 + .../guzzlehttp/guzzle/src/RequestOptions.php | 244 + .../guzzlehttp/guzzle/src/RetryMiddleware.php | 91 + .../guzzlehttp/guzzle/src/TransferStats.php | 114 + .../guzzlehttp/guzzle/src/Utils.php | 339 + .../guzzlehttp/guzzle/src/functions.php | 158 + .../guzzle/src/functions_include.php | 8 + .../guzzlehttp/promises/LICENSE | 24 + .../promises/src/AggregateException.php | 15 + .../promises/src/CancellationException.php | 11 + .../guzzlehttp/promises/src/Coroutine.php | 143 + .../guzzlehttp/promises/src/Create.php | 68 + .../guzzlehttp/promises/src/Each.php | 56 + .../guzzlehttp/promises/src/EachPromise.php | 196 + .../promises/src/FulfilledPromise.php | 73 + .../guzzlehttp/promises/src/Is.php | 36 + .../guzzlehttp/promises/src/Promise.php | 236 + .../promises/src/PromiseInterface.php | 80 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 78 + .../promises/src/RejectionException.php | 41 + .../guzzlehttp/promises/src/TaskQueue.php | 65 + .../promises/src/TaskQueueInterface.php | 21 + .../guzzlehttp/promises/src/Utils.php | 219 + .../vendor_prefixed/guzzlehttp/psr7/LICENSE | 26 + .../guzzlehttp/psr7/src/AppendStream.php | 203 + .../guzzlehttp/psr7/src/BufferStream.php | 121 + .../guzzlehttp/psr7/src/CachingStream.php | 125 + .../guzzlehttp/psr7/src/DroppingStream.php | 40 + .../src/Exception/MalformedUriException.php | 12 + .../guzzlehttp/psr7/src/FnStream.php | 149 + .../guzzlehttp/psr7/src/Header.php | 117 + .../guzzlehttp/psr7/src/HttpFactory.php | 76 + .../guzzlehttp/psr7/src/InflateStream.php | 33 + .../guzzlehttp/psr7/src/LazyOpenStream.php | 41 + .../guzzlehttp/psr7/src/LimitStream.php | 128 + .../guzzlehttp/psr7/src/Message.php | 189 + .../guzzlehttp/psr7/src/MessageTrait.php | 209 + .../guzzlehttp/psr7/src/MimeType.php | 27 + .../guzzlehttp/psr7/src/MultipartStream.php | 130 + .../guzzlehttp/psr7/src/NoSeekStream.php | 23 + .../guzzlehttp/psr7/src/PumpStream.php | 149 + .../guzzlehttp/psr7/src/Query.php | 112 + .../guzzlehttp/psr7/src/Request.php | 124 + .../guzzlehttp/psr7/src/Response.php | 78 + .../guzzlehttp/psr7/src/Rfc7230.php | 22 + .../guzzlehttp/psr7/src/ServerRequest.php | 266 + .../guzzlehttp/psr7/src/Stream.php | 235 + .../psr7/src/StreamDecoratorTrait.php | 131 + .../guzzlehttp/psr7/src/StreamWrapper.php | 145 + .../guzzlehttp/psr7/src/UploadedFile.php | 152 + .../guzzlehttp/psr7/src/Uri.php | 572 + .../guzzlehttp/psr7/src/UriComparator.php | 43 + .../guzzlehttp/psr7/src/UriNormalizer.php | 175 + .../guzzlehttp/psr7/src/UriResolver.php | 180 + .../guzzlehttp/psr7/src/Utils.php | 386 + .../constant_time_encoding/LICENSE.txt | 48 + .../constant_time_encoding/src/Base32.php | 440 + .../constant_time_encoding/src/Base32Hex.php | 99 + .../constant_time_encoding/src/Base64.php | 338 + .../src/Base64DotSlash.php | 79 + .../src/Base64DotSlashOrdered.php | 75 + .../src/Base64UrlSafe.php | 83 + .../constant_time_encoding/src/Binary.php | 98 + .../src/EncoderInterface.php | 51 + .../constant_time_encoding/src/Encoding.php | 299 + .../constant_time_encoding/src/Hex.php | 155 + .../constant_time_encoding/src/RFC4648.php | 206 + .../psr/cache/src/CacheException.php | 10 + .../psr/cache/src/CacheItemInterface.php | 100 + .../psr/cache/src/CacheItemPoolInterface.php | 129 + .../cache/src/InvalidArgumentException.php | 13 + .../vendor_prefixed/psr/http-client/LICENSE | 19 + .../src/ClientExceptionInterface.php | 10 + .../psr/http-client/src/ClientInterface.php | 19 + .../src/NetworkExceptionInterface.php | 23 + .../src/RequestExceptionInterface.php | 23 + .../vendor_prefixed/psr/http-factory/LICENSE | 21 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 43 + .../src/UploadedFileFactoryInterface.php | 28 + .../http-factory/src/UriFactoryInterface.php | 17 + .../vendor_prefixed/psr/http-message/LICENSE | 19 + .../psr/http-message/src/MessageInterface.php | 177 + .../psr/http-message/src/RequestInterface.php | 124 + .../http-message/src/ResponseInterface.php | 66 + .../src/ServerRequestInterface.php | 249 + .../psr/http-message/src/StreamInterface.php | 144 + .../src/UploadedFileInterface.php | 118 + .../psr/http-message/src/UriInterface.php | 309 + .../vendor_prefixed/psr/log/LICENSE | 19 + .../psr/log/Psr/Log/AbstractLogger.php | 121 + .../log/Psr/Log/InvalidArgumentException.php | 7 + .../psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 25 + .../psr/log/Psr/Log/LoggerInterface.php | 117 + .../psr/log/Psr/Log/LoggerTrait.php | 134 + .../psr/log/Psr/Log/NullLogger.php | 30 + .../symfony/deprecation-contracts/LICENSE | 19 + .../deprecation-contracts/function.php | 27 + .../symfony/polyfill-intl-idn/Idn.php | 725 + .../symfony/polyfill-intl-idn/Info.php | 22 + .../symfony/polyfill-intl-idn/LICENSE | 19 + .../Resources/unidata/DisallowedRanges.php | 294 + .../Resources/unidata/Regex.php | 29 + .../Resources/unidata/deviation.php | 5 + .../Resources/unidata/disallowed.php | 5 + .../unidata/disallowed_STD3_mapped.php | 5 + .../unidata/disallowed_STD3_valid.php | 5 + .../Resources/unidata/ignored.php | 5 + .../Resources/unidata/mapped.php | 5 + .../Resources/unidata/virama.php | 5 + .../symfony/polyfill-intl-idn/bootstrap.php | 145 + .../symfony/polyfill-intl-idn/bootstrap80.php | 125 + .../symfony/polyfill-mbstring/LICENSE | 19 + .../symfony/polyfill-mbstring/Mbstring.php | 835 + .../Resources/unidata/caseFolding.php | 5 + .../Resources/unidata/lowerCase.php | 5 + .../Resources/unidata/titleCaseRegexp.php | 6 + .../Resources/unidata/upperCase.php | 5 + .../symfony/polyfill-mbstring/bootstrap.php | 172 + .../symfony/polyfill-mbstring/bootstrap80.php | 167 + .../plugins/wp-mail-smtp/wp-mail-smtp.php | 64 + .../plugins/wp-mail-smtp/wp_mail_smtp.php | 349 + .../wpforms-lite/assets/css/admin-bar.css | 66 + .../wpforms-lite/assets/css/admin-bar.min.css | 1 + .../assets/css/admin-integrations.css | 2585 +++ .../assets/css/admin-integrations.min.css | 1 + .../assets/css/admin-list-table-ext.css | 613 + .../assets/css/admin-list-table-ext.min.css | 1 + .../assets/css/admin-notifications.css | 245 + .../assets/css/admin-notifications.min.css | 1 + .../assets/css/admin-wp5.7-colors.css | 124 + .../assets/css/admin-wp5.7-colors.min.css | 1 + .../plugins/wpforms-lite/assets/css/admin.css | 11578 +++++++++++ .../wpforms-lite/assets/css/admin.min.css | 1 + .../assets/css/admin/admin-form-templates.css | 1043 + .../css/admin/admin-form-templates.min.css | 1 + .../assets/css/admin/admin-splash-modal.css | 490 + .../css/admin/admin-splash-modal.min.css | 1 + .../assets/css/admin/edit-post-education.css | 98 + .../css/admin/edit-post-education.min.css | 1 + .../assets/css/builder/builder-alerts.css | 339 + .../assets/css/builder/builder-alerts.min.css | 1 + .../assets/css/builder/builder-basic.css | 1356 ++ .../assets/css/builder/builder-basic.min.css | 1 + .../assets/css/builder/builder-fields-min.css | 1987 ++ .../css/builder/builder-fields-types.css | 4467 +++++ .../css/builder/builder-fields-types.min.css | 1 + .../assets/css/builder/builder-fields.css | 2041 ++ .../css/builder/builder-fields.min-min.css | 1 + .../assets/css/builder/builder-fields.min.css | 1 + .../assets/css/builder/builder-overlay.css | 69 + .../css/builder/builder-overlay.min.css | 1 + .../assets/css/builder/builder-panels.css | 3170 +++ .../assets/css/builder/builder-panels.min.css | 1 + .../assets/css/builder/builder-scrollbars.css | 330 + .../css/builder/builder-scrollbars.min.css | 1 + .../assets/css/builder/builder-subsystems.css | 933 + .../css/builder/builder-subsystems.min.css | 1 + .../css/builder/builder-third-party.css | 624 + .../css/builder/builder-third-party.min.css | 1 + .../assets/css/builder/builder-ui-general.css | 1527 ++ .../css/builder/builder-ui-general.min.css | 1 + .../assets/css/builder/content-editor.css | 234 + .../assets/css/builder/content-editor.min.css | 1 + .../wpforms-lite/assets/css/challenge.css | 906 + .../wpforms-lite/assets/css/challenge.min.css | 1 + .../wpforms-lite/assets/css/choices.css | 490 + .../wpforms-lite/assets/css/choices.min.css | 1 + .../assets/css/dashboard-widget.css | 651 + .../assets/css/dashboard-widget.min.css | 1 + .../assets/css/emails/classic.css | 837 + .../assets/css/emails/classic.min.css | 1 + .../assets/css/emails/compact.css | 884 + .../assets/css/emails/compact.min.css | 1 + .../css/emails/corrupted-data-report.css | 617 + .../css/emails/corrupted-data-report.min.css | 1 + .../assets/css/emails/general.css | 650 + .../assets/css/emails/general.min.css | 1 + .../emails/partials/classic_media_queries.css | 75 + .../partials/classic_media_queries.min.css | 1 + .../emails/partials/compact_media_queries.css | 75 + .../partials/compact_media_queries.min.css | 1 + .../css/emails/partials/media_queries.css | 54 + .../css/emails/partials/media_queries.min.css | 1 + .../emails/partials/summary_media_queries.css | 242 + .../partials/summary_media_queries.min.css | 1 + .../assets/css/emails/summary.css | 819 + .../assets/css/emails/summary.min.css | 1 + .../assets/css/form-embed-wizard.css | 185 + .../assets/css/form-embed-wizard.min.css | 1 + .../css/frontend/classic/wpforms-base.css | 2213 +++ .../css/frontend/classic/wpforms-base.min.css | 1 + .../css/frontend/classic/wpforms-full.css | 3375 ++++ .../css/frontend/classic/wpforms-full.min.css | 1 + .../css/frontend/modern/wpforms-base.css | 1820 ++ .../css/frontend/modern/wpforms-base.min.css | 1 + .../css/frontend/modern/wpforms-full.css | 3999 ++++ .../css/frontend/modern/wpforms-full.min.css | 1 + .../assets/css/frontend/wpforms-dashicons.css | 15 + .../css/frontend/wpforms-dashicons.min.css | 1 + .../css/frontend/wpforms-form-preview.css | 12 + .../css/frontend/wpforms-form-preview.min.css | 1 + .../assets/css/frontend/wpforms-no-styles.css | 84 + .../css/frontend/wpforms-no-styles.min.css | 1 + .../assets/css/integrations/ai/ai-forms.css | 577 + .../css/integrations/ai/ai-forms.min.css | 1 + .../css/integrations/ai/chat-element.css | 585 + .../css/integrations/ai/chat-element.min.css | 1 + .../integrations/ai/form-templates-page.css | 42 + .../ai/form-templates-page.min.css | 1 + .../assets/css/integrations/ai/modal.css | 252 + .../assets/css/integrations/ai/modal.min.css | 1 + .../assets/css/integrations/divi/choices.css | 995 + .../css/integrations/divi/choices.min.css | 1 + .../divi/wpforms-classic-base.css | 4430 +++++ .../divi/wpforms-classic-base.min.css | 1 + .../divi/wpforms-classic-full.css | 6754 +++++++ .../divi/wpforms-classic-full.min.css | 1 + .../integrations/divi/wpforms-modern-base.css | 3641 ++++ .../divi/wpforms-modern-base.min.css | 1 + .../integrations/divi/wpforms-modern-full.css | 8000 ++++++++ .../divi/wpforms-modern-full.min.css | 1 + .../square/admin-settings-square.css | 17 + .../square/admin-settings-square.min.css | 1 + .../divi/wpforms-square-card-placeholder.css | 233 + .../wpforms-square-card-placeholder.min.css | 1 + .../square/divi/wpforms-square.css | 127 + .../square/divi/wpforms-square.min.css | 1 + .../wpforms-square-card-placeholder.css | 233 + .../wpforms-square-card-placeholder.min.css | 1 + .../integrations/square/wpforms-square.css | 127 + .../square/wpforms-square.min.css | 1 + .../stripe/admin-settings-stripe.css | 85 + .../stripe/admin-settings-stripe.min.css | 1 + .../stripe/builder-stripe-common.css | 61 + .../stripe/builder-stripe-common.min.css | 1 + .../integrations/stripe/builder-stripe.css | 291 + .../stripe/builder-stripe.min.css | 1 + .../integrations/stripe/wpforms-stripe.css | 270 + .../stripe/wpforms-stripe.min.css | 1 + .../woocommerce/notifications.css | 72 + .../woocommerce/notifications.min.css | 1 + .../wpforms-lite/assets/css/logger.css | 185 + .../wpforms-lite/assets/css/logger.min.css | 1 + .../wpforms-lite/assets/fonts/wpforms.eot | Bin 0 -> 5296 bytes .../wpforms-lite/assets/fonts/wpforms.svg | 11 + .../wpforms-lite/assets/fonts/wpforms.ttf | Bin 0 -> 5132 bytes .../wpforms-lite/assets/fonts/wpforms.woff | Bin 0 -> 2976 bytes .../wpforms-lite/assets/fonts/wpforms.woff2 | Bin 0 -> 2344 bytes .../complete-guide-to-wpforms-settings.png | Bin 0 -> 33200 bytes .../about/how-choose-right-form-field.png | Bin 0 -> 59931 bytes .../about/how-create-gdpr-compliant-forms.png | Bin 0 -> 13139 bytes .../how-install-activate-wpforms-addons.png | Bin 0 -> 19896 bytes .../assets/images/about/icon-full.svg | 1 + .../assets/images/about/icon-none.svg | 1 + .../assets/images/about/icon-partial.svg | 1 + .../assets/images/about/plugin-affwp.png | Bin 0 -> 1207 bytes .../assets/images/about/plugin-aioseo.png | Bin 0 -> 3361 bytes .../assets/images/about/plugin-charitable.png | Bin 0 -> 3323 bytes .../assets/images/about/plugin-duplicator.png | Bin 0 -> 5151 bytes .../assets/images/about/plugin-edd.png | Bin 0 -> 1898 bytes .../assets/images/about/plugin-mi.png | Bin 0 -> 7238 bytes .../assets/images/about/plugin-om.png | Bin 0 -> 46309 bytes .../assets/images/about/plugin-pushengage.png | Bin 0 -> 1474 bytes .../assets/images/about/plugin-rp.png | Bin 0 -> 2190 bytes .../assets/images/about/plugin-sb-fb.png | Bin 0 -> 9607 bytes .../images/about/plugin-sb-instagram.png | Bin 0 -> 7233 bytes .../assets/images/about/plugin-sb-twitter.png | Bin 0 -> 7884 bytes .../assets/images/about/plugin-sb-youtube.png | Bin 0 -> 2697 bytes .../assets/images/about/plugin-searchwp.png | Bin 0 -> 2190 bytes .../assets/images/about/plugin-seedprod.png | Bin 0 -> 12326 bytes .../assets/images/about/plugin-smtp.png | Bin 0 -> 8391 bytes .../images/about/plugin-sugarcalendar.png | Bin 0 -> 967 bytes .../assets/images/about/plugin-trustpulse.png | Bin 0 -> 2364 bytes .../images/about/plugin-wp-simple-pay.png | Bin 0 -> 1022 bytes .../assets/images/about/plugin-wpcode.png | Bin 0 -> 23059 bytes .../wpforms-lite/assets/images/about/team.jpg | Bin 0 -> 393560 bytes .../images/addon-icon-activecampaign.png | Bin 0 -> 2785 bytes .../assets/images/addon-icon-airtable.png | Bin 0 -> 2488 bytes .../images/addon-icon-authorize-net.png | Bin 0 -> 4259 bytes .../assets/images/addon-icon-aweber.png | Bin 0 -> 8542 bytes .../assets/images/addon-icon-brevo.png | Bin 0 -> 12939 bytes .../assets/images/addon-icon-calculations.png | Bin 0 -> 1025 bytes .../images/addon-icon-campaign-monitor.png | Bin 0 -> 1772 bytes .../assets/images/addon-icon-captcha.png | Bin 0 -> 9811 bytes .../images/addon-icon-conditional-logic.png | Bin 0 -> 4536 bytes .../images/addon-icon-constant-contact.png | Bin 0 -> 2045 bytes .../addon-icon-conversational-forms.png | Bin 0 -> 4049 bytes .../assets/images/addon-icon-convertkit.png | Bin 0 -> 2757 bytes .../assets/images/addon-icon-coupons.png | Bin 0 -> 4928 bytes .../assets/images/addon-icon-drip.png | Bin 0 -> 7313 bytes .../assets/images/addon-icon-dropbox.png | Bin 0 -> 2610 bytes .../images/addon-icon-entry-automation.png | Bin 0 -> 3639 bytes .../images/addon-icon-form-abandonment.png | Bin 0 -> 5243 bytes .../assets/images/addon-icon-form-locker.png | Bin 0 -> 5518 bytes .../assets/images/addon-icon-form-pages.png | Bin 0 -> 1277 bytes .../images/addon-icon-form-templates-pack.png | Bin 0 -> 3204 bytes .../assets/images/addon-icon-geolocation.png | Bin 0 -> 12283 bytes .../assets/images/addon-icon-getresponse.png | Bin 0 -> 5001 bytes .../images/addon-icon-google-calendar.png | Bin 0 -> 2155 bytes .../assets/images/addon-icon-google-drive.png | Bin 0 -> 7396 bytes .../images/addon-icon-google-sheets.png | Bin 0 -> 1300 bytes .../assets/images/addon-icon-hubspot.png | Bin 0 -> 3613 bytes .../assets/images/addon-icon-kit.png | Bin 0 -> 1803 bytes .../assets/images/addon-icon-lead-forms.png | Bin 0 -> 6269 bytes .../assets/images/addon-icon-mailchimp.png | Bin 0 -> 6620 bytes .../assets/images/addon-icon-mailerlite.png | Bin 0 -> 2272 bytes .../assets/images/addon-icon-mailpoet.png | Bin 0 -> 2718 bytes .../assets/images/addon-icon-make.png | Bin 0 -> 5914 bytes .../assets/images/addon-icon-n8n.png | Bin 0 -> 3168 bytes .../assets/images/addon-icon-notion.png | Bin 0 -> 6003 bytes .../images/addon-icon-offline-forms.png | Bin 0 -> 2570 bytes .../images/addon-icon-paypal-commerce.png | Bin 0 -> 22086 bytes .../images/addon-icon-paypal-standard.png | Bin 0 -> 22086 bytes .../assets/images/addon-icon-pdf.png | Bin 0 -> 2155 bytes .../assets/images/addon-icon-pipedrive.png | Bin 0 -> 3264 bytes .../images/addon-icon-post-submissions.png | Bin 0 -> 4091 bytes .../assets/images/addon-icon-salesforce.png | Bin 0 -> 4003 bytes .../assets/images/addon-icon-save-resume.png | Bin 0 -> 2853 bytes .../assets/images/addon-icon-sendinblue.png | Bin 0 -> 6259 bytes .../assets/images/addon-icon-signatures.png | Bin 0 -> 7632 bytes .../assets/images/addon-icon-slack.png | Bin 0 -> 3258 bytes .../assets/images/addon-icon-square.png | Bin 0 -> 1680 bytes .../assets/images/addon-icon-stripe.png | Bin 0 -> 2711 bytes .../images/addon-icon-surveys-polls.png | Bin 0 -> 2716 bytes .../assets/images/addon-icon-twilio.png | Bin 0 -> 3492 bytes .../assets/images/addon-icon-user-journey.png | Bin 0 -> 4057 bytes .../images/addon-icon-user-registration.png | Bin 0 -> 7684 bytes .../assets/images/addon-icon-webhooks.png | Bin 0 -> 13134 bytes .../assets/images/addon-icon-zapier.png | Bin 0 -> 2410 bytes .../assets/images/addon-icon-zoho-crm.png | Bin 0 -> 3005 bytes .../admin-flyout-menu/sullie-active.svg | 1 + .../admin-flyout-menu/sullie-default.svg | 1 + .../assets/images/anti-spam/akismet.svg | 4 + .../assets/images/anti-spam/cloudflare.svg | 1 + .../images/anti-spam/country-filter.svg | 4 + .../images/anti-spam/custom-captcha.svg | 7 + .../assets/images/anti-spam/hcaptcha.svg | 35 + .../images/anti-spam/keyword-filter.svg | 4 + .../assets/images/anti-spam/recaptcha.svg | 12 + .../wpforms-lite/assets/images/brand.svg | 1 + .../assets/images/builder-default-arrow.png | Bin 0 -> 2377 bytes .../assets/images/builder/back.svg | 1 + .../assets/images/builder/check-circle.svg | 1 + .../assets/images/builder/default-arrow.svg | 1 + .../assets/images/builder/ie-logo.svg | 1 + .../images/builder/illustration-marketing.svg | 1 + .../images/builder/illustration-payments.svg | 1 + .../builder/image-upload-placeholder.svg | 5 + .../assets/images/builder/loading-avatar.svg | 1 + .../assets/images/builder/loading-spinner.svg | 1 + .../images/builder/placeholder-200x125.svg | 1 + .../assets/images/builder/toggle-tab-bg.svg | 10 + .../assets/images/challenge/bar-bg.png | Bin 0 -> 288 bytes .../challenge/chevron-circle-down-regular.svg | 1 + .../assets/images/challenge/confetti.svg | 72 + .../images/challenge/getting-started.png | Bin 0 -> 82647 bytes .../assets/images/challenge/party-popper.png | Bin 0 -> 5065 bytes .../assets/images/challenge/popup-contact.png | Bin 0 -> 2214 bytes .../assets/images/challenge/red-arrow.svg | 1 + .../assets/images/challenge/sullie-circle.png | Bin 0 -> 6038 bytes .../images/challenge/times-circle-regular.svg | 1 + .../assets/images/check-circle.svg | 3 + .../assets/images/check-solid.svg | 1 + .../assets/images/community/announcements.png | Bin 0 -> 1509 bytes .../images/community/announcements@2x.png | Bin 0 -> 2748 bytes .../assets/images/community/dev-docs.png | Bin 0 -> 1137 bytes .../assets/images/community/dev-docs@2x.png | Bin 0 -> 1807 bytes .../assets/images/community/suggest.png | Bin 0 -> 663 bytes .../assets/images/community/suggest@2x.png | Bin 0 -> 1286 bytes .../assets/images/community/vip-circle.png | Bin 0 -> 2621 bytes .../assets/images/community/vip-circle@2x.png | Bin 0 -> 4951 bytes .../assets/images/community/wpbeginner.png | Bin 0 -> 1594 bytes .../assets/images/community/wpbeginner@2x.png | Bin 0 -> 3095 bytes .../assets/images/community/youtube.png | Bin 0 -> 635 bytes .../assets/images/community/youtube@2x.png | Bin 0 -> 1035 bytes .../images/constant-contact/cc-about-logo.png | Bin 0 -> 6904 bytes .../constant-contact/cc-about-logo@2x.png | Bin 0 -> 13477 bytes .../constant-contact/cc-about-step1.png | Bin 0 -> 110479 bytes .../constant-contact/cc-about-step2.png | Bin 0 -> 78992 bytes .../constant-contact/cc-about-step3.png | Bin 0 -> 88945 bytes .../constant-contact/cc-about-step4.png | Bin 0 -> 97134 bytes .../coupons-addon-screenshot-01.png | Bin 0 -> 80359 bytes .../coupons-addon-screenshot-02.png | Bin 0 -> 97125 bytes .../coupons-addon-thumbnail-01.png | Bin 0 -> 24931 bytes .../coupons-addon-thumbnail-02.png | Bin 0 -> 15668 bytes .../assets/images/cross-inverse.svg | 1 + .../wpforms-lite/assets/images/cross.svg | 1 + .../images/dashicons-arrow-right-alt.svg | 3 + .../images/duplicator/screenshot-full@2x.png | Bin 0 -> 85884 bytes .../images/duplicator/screenshot-tnail.png | Bin 0 -> 5549 bytes .../images/duplicator/screenshot-tnail@2x.png | Bin 0 -> 12899 bytes .../images/duplicator/wpforms-duplicator.svg | 70 + .../images/edit-post-education-page-1.png | Bin 0 -> 4563 bytes .../images/edit-post-education-page-2.png | Bin 0 -> 5234 bytes .../assets/images/email/icon-downward.png | Bin 0 -> 364 bytes .../assets/images/email/icon-overview.png | Bin 0 -> 829 bytes .../assets/images/email/icon-upward.png | Bin 0 -> 343 bytes .../assets/images/email/info-block-icon.png | Bin 0 -> 1022 bytes .../images/email/notification-block-icon.png | Bin 0 -> 1122 bytes .../assets/images/email/template-classic.svg | 1 + .../assets/images/email/template-compact.svg | 1 + .../assets/images/email/template-elegant.svg | 1 + .../assets/images/email/template-modern.svg | 1 + .../images/email/template-placeholder.svg | 1 + .../images/email/template-plaintext.svg | 1 + .../assets/images/email/template-tech.svg | 1 + .../assets/images/empty-states/no-entries.svg | 1 + .../assets/images/empty-states/no-fields.svg | 1 + .../images/empty-states/no-form-elementor.svg | 1 + .../assets/images/empty-states/no-forms.svg | 1 + .../images/empty-states/no-user-templates.png | Bin 0 -> 51828 bytes .../payments/get-started-lite.svg | 1 + .../empty-states/payments/get-started-pro.svg | 1 + .../empty-states/payments/no-payments.svg | 1 + .../images/empty-states/waving-hand-emoji.png | Bin 0 -> 19786 bytes .../images/entry-automation/education.png | Bin 0 -> 216953 bytes .../assets/images/exclamation-circle.svg | 3 + .../images/exclamation-triangle-orange.svg | 3 + .../assets/images/exclamation-triangle.svg | 1 + .../wpforms-lite/assets/images/file-code.svg | 3 + .../frontend/file-download/lock-alt.svg | 3 + .../file-download/triangle-exclamation.svg | 3 + .../address-autocomplete.jpg | Bin 0 -> 18084 bytes .../address-autocomplete@2x.jpg | Bin 0 -> 37894 bytes .../geolocation-education/entry-location.jpg | Bin 0 -> 31409 bytes .../entry-location@2x.jpg | Bin 0 -> 120921 bytes .../smart-address-field.jpg | Bin 0 -> 50127 bytes .../smart-address-field@2x.jpg | Bin 0 -> 159819 bytes .../images/gutenberg/panel-background.png | Bin 0 -> 7807 bytes .../assets/images/gutenberg/panel-button.png | Bin 0 -> 28531 bytes .../images/gutenberg/panel-container.png | Bin 0 -> 18204 bytes .../assets/images/gutenberg/panel-field.png | Bin 0 -> 19889 bytes .../assets/images/gutenberg/panel-label.png | Bin 0 -> 13416 bytes .../assets/images/gutenberg/panel-themes.png | Bin 0 -> 40659 bytes .../assets/images/icon-chart-smaller.png | Bin 0 -> 818 bytes .../wpforms-lite/assets/images/icon-chart.png | Bin 0 -> 390 bytes .../wpforms-lite/assets/images/icon-file.svg | 11 + .../wpforms-lite/assets/images/icon-graph.png | Bin 0 -> 476 bytes .../images/icon-provider-constant-contact.png | Bin 0 -> 4108 bytes .../icon-provider-uncanny-automator.png | Bin 0 -> 12324 bytes .../wpforms-lite/assets/images/icon-tags.svg | 1 + .../assets/images/icon-user-template.svg | 7 + .../assets/images/icon-wpforms.svg | 3 + .../images/integrations/ai/ai-answer-icon.svg | 47 + .../images/integrations/ai/ai-error-icon.svg | 5 + .../integrations/ai/ai-feature-icon.svg | 3 + .../images/integrations/ai/ai-feature.svg | 3 + .../integrations/ai/ai-form-empty-state.svg | 73 + .../integrations/ai/ai-warning-icon.svg | 7 + .../assets/images/integrations/ai/back.svg | 1 + .../images/integrations/ai/bulb-orange.svg | 1 + .../images/integrations/ai/bulb-red.svg | 1 + .../assets/images/integrations/ai/close.svg | 3 + .../images/integrations/ai/flag-usa.svg | 3 + .../images/integrations/ai/globe-americas.svg | 3 + .../images/integrations/ai/icon-design.svg | 1 + .../images/integrations/ai/icon-market.svg | 1 + .../images/integrations/ai/icon-pizza.svg | 1 + .../integrations/ai/icon-restaurant.svg | 1 + .../images/integrations/ai/icon-send-blue.svg | 1 + .../integrations/ai/icon-send-purple.svg | 3 + .../images/integrations/ai/icon-send.svg | 3 + .../images/integrations/ai/icon-stop-sign.svg | 1 + .../images/integrations/ai/icon-stop.svg | 3 + .../images/integrations/ai/icon-sullie.svg | 1 + .../images/integrations/ai/icon-ticket.svg | 1 + .../assets/images/integrations/ai/insert.svg | 3 + .../images/integrations/ai/leaf-maple.svg | 3 + .../images/integrations/ai/pin-chat.svg | 1 + .../assets/images/integrations/ai/store.svg | 3 + .../integrations/ai/thumbs-down-hover.svg | 3 + .../integrations/ai/thumbs-down-inactive.svg | 3 + .../integrations/ai/thumbs-down-solid.svg | 3 + .../images/integrations/ai/thumbs-down.svg | 3 + .../images/integrations/ai/thumbs-up.svg | 3 + .../images/integrations/ai/tree-palm.svg | 3 + .../images/integrations/ai/unpin-chat.svg | 1 + .../images/integrations/divi/wpforms-icon.svg | 1 + .../elementor/font/icon-wpforms.eot | Bin 0 -> 5976 bytes .../elementor/font/icon-wpforms.svg | 1 + .../elementor/font/icon-wpforms.ttf | Bin 0 -> 5808 bytes .../elementor/font/icon-wpforms.woff | Bin 0 -> 3312 bytes .../elementor/font/icon-wpforms.woff2 | Bin 0 -> 2632 bytes .../integrations/elementor/wpforms-icon.svg | 1 + .../integrations/gutenberg/block-preview.png | Bin 0 -> 3779 bytes .../images/integrations/stripe/cc-preview.png | Bin 0 -> 3157 bytes .../images/integrations/woocommerce/mail.svg | 94 + .../assets/images/jquery.minicolors.png | Bin 0 -> 68627 bytes .../images/lite-connect/check-circle.svg | 3 + .../assets/images/lite-connect/cloud.svg | 3 + .../assets/images/lite-connect/envelope.svg | 3 + .../images/lite-connect/info-circle.svg | 3 + .../assets/images/lite-connect/lock-ai.svg | 3 + .../assets/images/lite-connect/lock-alt.svg | 3 + .../images/lite-connect/raised-hand.png | Bin 0 -> 1881 bytes .../assets/images/lite-connect/wait.svg | 4 + .../screenshot-access-controls.png | Bin 0 -> 16034 bytes .../screenshot-access-controls@2x.png | Bin 0 -> 63932 bytes .../screenshot-members.png | Bin 0 -> 38556 bytes .../screenshot-members@2x.png | Bin 0 -> 94060 bytes .../screenshot-user-role-editor.png | Bin 0 -> 46434 bytes .../screenshot-user-role-editor@2x.png | Bin 0 -> 156336 bytes .../assets/images/logo-negative.png | Bin 0 -> 7679 bytes .../wpforms-lite/assets/images/logo.png | Bin 0 -> 7668 bytes .../assets/images/page-plugin/arrow-right.svg | 1 + .../assets/images/payments/chevron.svg | 1 + .../images/payments/icon-exclamation.svg | 1 + .../images/payments/icon-total-coupons.svg | 1 + .../images/payments/icon-total-payments.svg | 1 + .../images/payments/icon-total-refunded.svg | 1 + .../images/payments/icon-total-sales.svg | 1 + .../payments/icon-total-subscription.svg | 1 + .../images/payments/single/icon-coupon.svg | 1 + .../images/payments/single/icon-cycle.svg | 1 + .../images/payments/single/icon-date.svg | 1 + .../payments/single/icon-lifetime-total.svg | 1 + .../images/payments/single/icon-method.svg | 1 + .../images/payments/single/icon-one-time.svg | 1 + .../payments/single/icon-subscription.svg | 1 + .../images/payments/single/icon-total.svg | 1 + .../images/payments/single/info-circle.svg | 1 + .../assets/images/payments/star.svg | 1 + .../images/payments/status/icon-active.svg | 1 + .../images/payments/status/icon-cancelled.svg | 1 + .../images/payments/status/icon-completed.svg | 1 + .../images/payments/status/icon-failed.svg | 1 + .../images/payments/status/icon-n-a.svg | 1 + .../payments/status/icon-not-synced.svg | 1 + .../payments/status/icon-partrefund.svg | 1 + .../images/payments/status/icon-pending.svg | 1 + .../images/payments/status/icon-processed.svg | 1 + .../images/payments/status/icon-refunded.svg | 1 + .../assets/images/pdf-education/pdf.svg | 19 + .../assets/images/phone/us-flag.png | Bin 0 -> 1883 bytes .../privacy-compliance/screenshot-full.png | Bin 0 -> 45357 bytes .../privacy-compliance/screenshot-full@2x.png | Bin 0 -> 45357 bytes .../privacy-compliance/screenshot-tnail.png | Bin 0 -> 8230 bytes .../screenshot-tnail@2x.png | Bin 0 -> 7642 bytes .../privacy-compliance/wpforms-wpconsent.svg | 73 + .../assets/images/recaptcha-placeholder.png | Bin 0 -> 5467 bytes .../richtext/tinymce-toolbar-basic-mb.png | Bin 0 -> 3995 bytes .../images/richtext/tinymce-toolbar-basic.png | Bin 0 -> 3680 bytes .../richtext/tinymce-toolbar-full-mb.png | Bin 0 -> 3784 bytes .../images/richtext/tinymce-toolbar-full.png | Bin 0 -> 4141 bytes .../wpforms-lite/assets/images/search.svg | 1 + .../assets/images/settings-captcha-addon.png | Bin 0 -> 4317 bytes .../images/settings-captcha-cloudflare.svg | 1 + .../images/settings-captcha-hcaptcha.svg | 1 + .../assets/images/settings-captcha-none.svg | 3 + .../images/settings-captcha-recaptcha.svg | 1 + .../assets/images/settings-email-html.png | Bin 0 -> 554 bytes .../images/settings-email-plaintext.png | Bin 0 -> 253 bytes .../assets/images/smtp/arrow-right.svg | 1 + .../assets/images/smtp/pattie-2.svg | 1 + .../assets/images/smtp/pattie.svg | 1 + .../assets/images/smtp/screenshot-full.png | Bin 0 -> 73091 bytes .../assets/images/smtp/screenshot-tnail.png | Bin 0 -> 10971 bytes .../assets/images/smtp/wpforms-wpmailsmtp.png | Bin 0 -> 5710 bytes .../images/smtp/wpforms-wpmailsmtp@2x.png | Bin 0 -> 10673 bytes .../assets/images/spinner-blue.svg | 1 + .../assets/images/spinner-white.svg | 1 + .../wpforms-lite/assets/images/spinner.svg | 1 + .../assets/images/splash/sullie.svg | 45 + .../wpforms-lite/assets/images/step-1.svg | 1 + .../wpforms-lite/assets/images/step-2.svg | 1 + .../wpforms-lite/assets/images/step-3.svg | 1 + .../assets/images/step-complete.svg | 1 + .../assets/images/stripe/stripe-connect.png | Bin 0 -> 4303 bytes .../assets/images/submit-spin.svg | 1 + .../sugar-calendar/screenshot-full@2x.png | Bin 0 -> 192345 bytes .../sugar-calendar/screenshot-tnail.png | Bin 0 -> 6929 bytes .../sugar-calendar/screenshot-tnail@2x.png | Bin 0 -> 13494 bytes .../sugar-calendar/wpforms-sugar-calendar.svg | 64 + .../wpforms-lite/assets/images/sullie-alt.png | Bin 0 -> 19198 bytes .../assets/images/sullie-builder-mobile.png | Bin 0 -> 14265 bytes .../images/sullie-edit-post-education.svg | 1 + .../wpforms-lite/assets/images/sullie-vc.png | Bin 0 -> 4395 bytes .../wpforms-lite/assets/images/sullie.png | Bin 0 -> 25007 bytes ...thumbnail-simple-contact-form-template.jpg | Bin 0 -> 19298 bytes .../assets/images/times-circle.svg | 1 + .../wpforms-lite/assets/images/trash-red.svg | 1 + .../wpforms-lite/assets/images/trash.svg | 1 + .../uncanny-automator/screenshot-full@2x.png | Bin 0 -> 159843 bytes .../uncanny-automator/screenshot-tnail.png | Bin 0 -> 7572 bytes .../uncanny-automator/screenshot-tnail@2x.png | Bin 0 -> 20196 bytes .../wpforms-uncanny-automator.svg | 139 + .../assets/images/welcome-feature-icon-1.png | Bin 0 -> 1034 bytes .../assets/images/welcome-feature-icon-10.png | Bin 0 -> 1921 bytes .../assets/images/welcome-feature-icon-2.png | Bin 0 -> 901 bytes .../assets/images/welcome-feature-icon-3.png | Bin 0 -> 1890 bytes .../assets/images/welcome-feature-icon-4.png | Bin 0 -> 1708 bytes .../assets/images/welcome-feature-icon-5.png | Bin 0 -> 1984 bytes .../assets/images/welcome-feature-icon-6.png | Bin 0 -> 2196 bytes .../assets/images/welcome-feature-icon-7.png | Bin 0 -> 3649 bytes .../assets/images/welcome-feature-icon-8.png | Bin 0 -> 3897 bytes .../assets/images/welcome-feature-icon-9.png | Bin 0 -> 1347 bytes .../images/welcome-testimonial-bill.jpg | Bin 0 -> 6828 bytes .../images/welcome-testimonial-david.jpg | Bin 0 -> 4960 bytes .../assets/images/welcome-video.png | Bin 0 -> 24480 bytes .../images/wpconsent/screenshot-full@2x.png | Bin 0 -> 45357 bytes .../images/wpconsent/screenshot-tnail.png | Bin 0 -> 8230 bytes .../images/wpconsent/screenshot-tnail@2x.png | Bin 0 -> 7642 bytes .../images/wpconsent/wpforms-wpconsent.svg | 73 + .../assets/images/wpforms-logo.svg | 1 + .../wpforms-lite/assets/images/zoom.svg | 1 + .../assets/js/admin/admin-editor.js | 57 + .../assets/js/admin/admin-editor.min.js | 1 + .../assets/js/admin/admin-notifications.js | 194 + .../js/admin/admin-notifications.min.js | 1 + .../wpforms-lite/assets/js/admin/admin.js | 2643 +++ .../wpforms-lite/assets/js/admin/admin.min.js | 1 + .../admin/builder/admin-builder-providers.js | 594 + .../builder/admin-builder-providers.min.js | 1 + .../assets/js/admin/builder/admin-builder.js | 9815 ++++++++++ .../js/admin/builder/admin-builder.min.js | 25 + .../js/admin/builder/chocolate-choices.js | 81 + .../js/admin/builder/chocolate-choices.min.js | 1 + .../assets/js/admin/builder/choices-list.js | 131 + .../js/admin/builder/choices-list.min.js | 1 + .../assets/js/admin/builder/context-menu.js | 714 + .../js/admin/builder/context-menu.min.js | 1 + .../assets/js/admin/builder/drag-fields.js | 919 + .../js/admin/builder/drag-fields.min.js | 1 + .../assets/js/admin/builder/dropdown-list.js | 389 + .../js/admin/builder/dropdown-list.min.js | 9 + .../assets/js/admin/builder/email-template.js | 217 + .../js/admin/builder/email-template.min.js | 1 + .../assets/js/admin/builder/field-map.js | 236 + .../assets/js/admin/builder/field-map.min.js | 1 + .../builder/fields/internal-information.js | 486 + .../fields/internal-information.min.js | 21 + .../assets/js/admin/builder/fields/numbers.js | 317 + .../js/admin/builder/fields/numbers.min.js | 1 + .../assets/js/admin/builder/fields/rating.js | 117 + .../js/admin/builder/fields/rating.min.js | 1 + .../assets/js/admin/builder/form-templates.js | 788 + .../js/admin/builder/form-templates.min.js | 1 + .../assets/js/admin/builder/help.js | 554 + .../assets/js/admin/builder/help.min.js | 1 + .../assets/js/admin/builder/image-upload.js | 185 + .../js/admin/builder/image-upload.min.js | 1 + .../js/admin/builder/multiple-choices.js | 443 + .../js/admin/builder/multiple-choices.min.js | 1 + .../assets/js/admin/builder/panel-loader.js | 236 + .../js/admin/builder/panel-loader.min.js | 1 + .../assets/js/admin/builder/payments-utils.js | 119 + .../js/admin/builder/payments-utils.min.js | 1 + .../assets/js/admin/builder/providers.js | 1159 ++ .../assets/js/admin/builder/providers.min.js | 1 + .../assets/js/admin/builder/search-fields.js | 207 + .../js/admin/builder/search-fields.min.js | 1 + .../assets/js/admin/builder/settings.js | 453 + .../assets/js/admin/builder/settings.min.js | 1 + .../assets/js/admin/builder/setup.js | 749 + .../assets/js/admin/builder/setup.min.js | 1 + .../assets/js/admin/builder/smart-tags.js | 1655 ++ .../assets/js/admin/builder/smart-tags.min.js | 5 + .../assets/js/admin/builder/templates.js | 158 + .../assets/js/admin/builder/templates.min.js | 1 + .../themes/builder-themes-no-access.js | 109 + .../themes/builder-themes-no-access.min.js | 1 + .../js/admin/builder/themes/builder-themes.js | 264 + .../builder/themes/builder-themes.min.js | 1 + .../themes/modules/advanced-settings.js | 221 + .../themes/modules/advanced-settings.min.js | 1 + .../builder/themes/modules/background.js | 367 + .../builder/themes/modules/background.min.js | 1 + .../js/admin/builder/themes/modules/common.js | 955 + .../builder/themes/modules/common.min.js | 1 + .../builder/themes/modules/stock-photos.js | 356 + .../themes/modules/stock-photos.min.js | 4 + .../js/admin/builder/themes/modules/themes.js | 908 + .../builder/themes/modules/themes.min.js | 15 + .../js/admin/builder/wpforms-choicesjs.js | 282 + .../js/admin/builder/wpforms-choicesjs.min.js | 1 + .../js/admin/challenge/challenge-admin.js | 188 + .../js/admin/challenge/challenge-admin.min.js | 1 + .../js/admin/challenge/challenge-builder.js | 294 + .../admin/challenge/challenge-builder.min.js | 1 + .../js/admin/challenge/challenge-core.js | 927 + .../js/admin/challenge/challenge-core.min.js | 1 + .../js/admin/challenge/challenge-embed.js | 352 + .../js/admin/challenge/challenge-embed.min.js | 1 + .../assets/js/admin/education/core.js | 789 + .../assets/js/admin/education/core.min.js | 1 + .../js/admin/education/edit-post.es5.js | 436 + .../js/admin/education/edit-post.es5.min.js | 1 + .../assets/js/admin/education/edit-post.js | 476 + .../assets/js/admin/education/pdf.js | 127 + .../assets/js/admin/education/pdf.min.js | 1 + .../js/admin/education/pointers/payment.js | 133 + .../admin/education/pointers/payment.min.js | 1 + .../assets/js/admin/email/settings.js | 515 + .../assets/js/admin/email/settings.min.js | 1 + .../assets/js/admin/form-embed-wizard.js | 596 + .../assets/js/admin/form-embed-wizard.min.js | 1 + .../assets/js/admin/forms/overview.js | 1176 ++ .../assets/js/admin/forms/overview.min.js | 10 + .../assets/js/admin/logger/logger.js | 134 + .../assets/js/admin/logger/logger.min.js | 1 + .../wpforms-lite/assets/js/admin/notices.js | 81 + .../assets/js/admin/notices.min.js | 1 + .../assets/js/admin/pages/common.js | 276 + .../assets/js/admin/pages/common.min.js | 1 + .../assets/js/admin/pages/form-templates.js | 247 + .../js/admin/pages/form-templates.min.js | 1 + .../js/admin/pages/privacy-compliance.js | 318 + .../js/admin/pages/privacy-compliance.min.js | 1 + .../assets/js/admin/pages/smtp.js | 259 + .../assets/js/admin/pages/smtp.min.js | 1 + .../assets/js/admin/payments/overview.js | 1042 + .../assets/js/admin/payments/overview.min.js | 1 + .../assets/js/admin/payments/single.js | 229 + .../assets/js/admin/payments/single.min.js | 1 + .../assets/js/admin/share/admin-utils.js | 1432 ++ .../assets/js/admin/share/admin-utils.min.js | 1 + .../assets/js/admin/share/contrast-checker.js | 230 + .../js/admin/share/contrast-checker.min.js | 1 + .../assets/js/admin/share/list-table-ext.js | 847 + .../js/admin/share/list-table-ext.min.js | 1 + .../wpforms-lite/assets/js/admin/share/xor.js | 196 + .../assets/js/admin/share/xor.min.js | 1 + .../assets/js/admin/splash/modal.js | 120 + .../assets/js/admin/splash/modal.min.js | 1 + .../assets/js/frontend/fields/address.js | 125 + .../assets/js/frontend/fields/address.min.js | 1 + .../js/frontend/fields/text-limit.es5.js | 287 + .../js/frontend/fields/text-limit.es5.min.js | 1 + .../assets/js/frontend/fields/text-limit.js | 338 + .../js/frontend/wpforms-confirmation.js | 21 + .../js/frontend/wpforms-confirmation.min.js | 1 + .../assets/js/frontend/wpforms-modern.js | 544 + .../assets/js/frontend/wpforms-modern.min.js | 1 + .../assets/js/frontend/wpforms.js | 4313 +++++ .../assets/js/frontend/wpforms.min.js | 5 + .../ai/chat-element/modules/api.js | 170 + .../ai/chat-element/modules/api.min.js | 1 + .../chat-element/modules/helpers-choices.js | 319 + .../modules/helpers-choices.min.js | 19 + .../ai/chat-element/modules/helpers-forms.js | 163 + .../chat-element/modules/helpers-forms.min.js | 8 + .../ai/chat-element/modules/helpers-text.js | 67 + .../chat-element/modules/helpers-text.min.js | 5 + .../chat-element/wpforms-ai-chat-element.js | 1398 ++ .../wpforms-ai-chat-element.min.js | 43 + .../ai/chat-element/wpforms-ai-dock.js | 245 + .../ai/chat-element/wpforms-ai-dock.min.js | 3 + .../ai/choices/wpforms-ai-modal.js | 307 + .../ai/choices/wpforms-ai-modal.min.js | 1 + .../ai/form-generator/form-generator.js | 223 + .../ai/form-generator/form-generator.min.js | 23 + .../ai/form-generator/modules/main.js | 563 + .../ai/form-generator/modules/main.min.js | 22 + .../ai/form-generator/modules/modals.js | 389 + .../ai/form-generator/modules/modals.min.js | 6 + .../ai/form-generator/modules/preview.js | 410 + .../ai/form-generator/modules/preview.min.js | 6 + .../integrations/constant-contact-v3/auth.js | 249 + .../constant-contact-v3/auth.min.js | 1 + .../constant-contact-v3/builder.js | 603 + .../constant-contact-v3/builder.min.js | 1 + .../js/integrations/divi/formselector.es5.js | 4195 ++++ .../integrations/divi/formselector.es5.min.js | 1 + .../js/integrations/divi/formselector.js | 202 + .../integrations/elementor/editor-context.js | 70 + .../elementor/editor-context.min.js | 1 + .../integrations/elementor/editor-modern.js | 1256 ++ .../elementor/editor-modern.min.js | 4 + .../js/integrations/elementor/editor.js | 623 + .../js/integrations/elementor/editor.min.js | 1 + .../js/integrations/elementor/frontend.js | 154 + .../js/integrations/elementor/frontend.min.js | 1 + .../js/integrations/elementor/themes.js | 965 + .../js/integrations/elementor/themes.min.js | 15 + .../gutenberg/formselector-legacy.es5.js | 413 + .../gutenberg/formselector-legacy.es5.min.js | 1 + .../gutenberg/formselector-legacy.js | 385 + .../gutenberg/modules/advanced-settings.js | 164 + .../gutenberg/modules/background-preview.js | 66 + .../gutenberg/modules/background-styles.js | 607 + .../gutenberg/modules/button-styles.js | 181 + .../integrations/gutenberg/modules/common.js | 2041 ++ .../gutenberg/modules/container-styles.js | 255 + .../gutenberg/modules/education.js | 76 + .../gutenberg/modules/field-styles.js | 189 + .../gutenberg/modules/themes-panel.js | 1044 + .../square/admin/builder-square.js | 416 + .../square/admin/builder-square.min.js | 1 + .../square/admin/settings-square.js | 375 + .../square/admin/settings-square.min.js | 1 + .../js/integrations/square/wpforms-square.js | 807 + .../integrations/square/wpforms-square.min.js | 1 + .../stripe/admin-builder-modern-stripe.js | 669 + .../stripe/admin-builder-modern-stripe.min.js | 1 + .../stripe/admin-builder-stripe-card-field.js | 222 + .../admin-builder-stripe-card-field.min.js | 1 + .../stripe/admin-builder-stripe.js | 242 + .../stripe/admin-builder-stripe.min.js | 1 + .../stripe/admin-settings-stripe.js | 158 + .../stripe/admin-settings-stripe.min.js | 1 + .../stripe/wpforms-stripe-elements.js | 472 + .../stripe/wpforms-stripe-elements.min.js | 1 + .../stripe/wpforms-stripe-payment-element.js | 1283 ++ .../wpforms-stripe-payment-element.min.js | 1 + .../integrations/woocommerce/notifications.js | 74 + .../woocommerce/notifications.min.js | 1 + .../assets/js/integrations/wpcode/wpcode.js | 165 + .../js/integrations/wpcode/wpcode.min.js | 1 + .../wpforms-lite/assets/js/share/utils.js | 253 + .../wpforms-lite/assets/js/share/utils.min.js | 1 + .../assets/languages/wpforms-lite.pot | 16173 ++++++++++++++++ .../wpforms-lite/assets/lib/chart.min.js | 14 + .../assets/lib/chartjs-adapter-moment.min.js | 7 + .../wpforms-lite/assets/lib/choices.min.js | 5 + .../wpforms-lite/assets/lib/conditions.min.js | 1 + .../assets/lib/flatpickr/flatpickr.min.css | 14 + .../assets/lib/flatpickr/flatpickr.min.js | 2 + .../assets/lib/font-awesome/css/all.min.css | 9 + .../lib/font-awesome/css/v4-shims.min.css | 6 + .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 101180 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 19000 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 113260 bytes .../webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4056 bytes .../wpforms-lite/assets/lib/htmx.min.js | 1 + .../lib/jquery.confirm/jquery-confirm.min.css | 6 + .../lib/jquery.confirm/jquery-confirm.min.js | 7 + .../assets/lib/jquery.inputmask.min.js | 8 + .../assets/lib/jquery.insert-at-caret.min.js | 13 + .../jquery.minicolors.min.css | 1 + .../jquery.minicolors.min.js | 8 + .../jquery.timepicker.min.css | 1 + .../jquery.timepicker.min.js | 7 + .../jquery.tooltipster.min.css | 1 + .../jquery.tooltipster.min.js | 2 + .../assets/lib/jquery.validate.min.js | 4 + .../wpforms-lite/assets/lib/list.min.js | 2 + .../wpforms-lite/assets/lib/lity/lity.min.css | 3 + .../wpforms-lite/assets/lib/lity/lity.min.js | 5 + .../wpforms-lite/assets/lib/mailcheck.min.js | 1 + .../wpforms-lite/assets/lib/md5.min.js | 20 + .../wpforms-lite/assets/lib/punycode.min.js | 1 + .../wpforms-lite/assets/lib/purify.min.js | 2 + .../wpforms-multiselect-checkboxes.min.css | 1 + .../wpforms-multiselect-checkboxes.min.js | 1 + .../wpforms-lite/assets/lite/css/admin.css | 635 + .../assets/lite/css/admin.min.css | 1 + .../lite/css/admin/entries/entry-list.css | 505 + .../lite/css/admin/entries/entry-list.min.css | 1 + .../lite/css/admin/entries/view-entry.css | 392 + .../lite/css/admin/entries/view-entry.min.css | 1 + .../assets/lite/css/builder-education.css | 423 + .../assets/lite/css/builder-education.min.css | 1 + .../assets/lite/css/dashboard-education.css | 1047 + .../lite/css/dashboard-education.min.css | 1 + .../assets/lite/images/sample/flag.png | Bin 0 -> 251 bytes .../assets/lite/images/sample/flag@2x.png | Bin 0 -> 396 bytes .../assets/lite/images/sample/map.png | Bin 0 -> 370814 bytes .../assets/lite/images/sample/map@2x.png | Bin 0 -> 1139616 bytes .../assets/lite/images/sample/signature.png | Bin 0 -> 5494 bytes .../lite/images/sample/signature@2x.png | Bin 0 -> 12650 bytes .../js/admin/builder/admin-builder-lite.js | 110 + .../admin/builder/admin-builder-lite.min.js | 1 + .../assets/lite/js/admin/connect.js | 181 + .../assets/lite/js/admin/connect.min.js | 1 + .../assets/lite/js/admin/dashboard-widget.js | 382 + .../lite/js/admin/dashboard-widget.min.js | 1 + .../assets/lite/js/admin/education/core.js | 176 + .../lite/js/admin/education/core.min.js | 1 + .../lite/js/admin/education/lite-connect.js | 565 + .../js/admin/education/lite-connect.min.js | 1 + .../lite/js/admin/entries/entry-list.js | 120 + .../lite/js/admin/entries/entry-list.min.js | 1 + .../lite/js/admin/entries/view-entry.js | 105 + .../lite/js/admin/entries/view-entry.min.js | 1 + .../js/integrations/elementor/themes.json | 452 + .../gutenberg/formselector.es5.js | 5739 ++++++ .../gutenberg/formselector.es5.min.js | 1 + .../js/integrations/gutenberg/formselector.js | 121 + .../js/integrations/gutenberg/themes.json | 452 + wp-content/plugins/wpforms-lite/changelog.txt | 1981 ++ .../wpforms-lite/includes/admin/admin.php | 785 + .../includes/admin/ajax-actions.php | 951 + .../includes/admin/builder/class-builder.php | 1457 ++ .../includes/admin/builder/functions.php | 942 + .../admin/builder/panels/class-base.php | 462 + .../admin/builder/panels/class-fields.php | 793 + .../admin/builder/panels/class-payments.php | 112 + .../admin/builder/panels/class-providers.php | 154 + .../admin/builder/panels/class-revisions.php | 205 + .../admin/builder/panels/class-settings.php | 385 + .../admin/builder/panels/class-setup.php | 132 + .../includes/admin/class-about.php | 1820 ++ .../includes/admin/class-editor.php | 383 + .../includes/admin/class-menu.php | 623 + .../includes/admin/class-notices.php | 139 + .../includes/admin/class-review.php | 346 + .../includes/admin/class-settings.php | 820 + .../includes/admin/class-welcome.php | 394 + .../includes/admin/settings-api.php | 732 + .../wpforms-lite/includes/class-db.php | 949 + .../wpforms-lite/includes/class-fields.php | 98 + .../wpforms-lite/includes/class-form.php | 1566 ++ .../wpforms-lite/includes/class-install.php | 229 + .../wpforms-lite/includes/class-process.php | 2237 +++ .../wpforms-lite/includes/class-providers.php | 86 + .../wpforms-lite/includes/class-templates.php | 66 + .../wpforms-lite/includes/class-widget.php | 192 + .../wpforms-lite/includes/deprecated.php | 425 + .../includes/emails/class-emails.php | 893 + .../emails/templates/body-default.php | 16 + .../includes/emails/templates/default.php | 328 + .../emails/templates/field-default.php | 18 + .../emails/templates/footer-default.php | 67 + .../emails/templates/header-default.php | 376 + .../includes/fields/class-base.php | 4406 +++++ .../includes/fields/class-checkbox.php | 773 + .../includes/fields/class-email.php | 1397 ++ .../includes/fields/class-gdpr-checkbox.php | 329 + .../fields/class-internal-information.php | 934 + .../includes/fields/class-name.php | 681 + .../includes/fields/class-number-slider.php | 452 + .../includes/fields/class-number.php | 278 + .../includes/fields/class-radio.php | 944 + .../includes/fields/class-select.php | 795 + .../includes/fields/class-text.php | 558 + .../includes/fields/class-textarea.php | 380 + .../wpforms-lite/includes/functions-list.php | 7 + .../wpforms-lite/includes/functions.php | 30 + .../includes/functions/access.php | 394 + .../includes/functions/builder.php | 33 + .../includes/functions/checks.php | 595 + .../includes/functions/colors.php | 165 + .../includes/functions/data-presets.php | 445 + .../includes/functions/date-time.php | 118 + .../wpforms-lite/includes/functions/debug.php | 227 + .../includes/functions/education.php | 96 + .../includes/functions/escape-sanitize.php | 633 + .../includes/functions/filesystem-media.php | 301 + .../includes/functions/form-fields.php | 688 + .../wpforms-lite/includes/functions/forms.php | 584 + .../wpforms-lite/includes/functions/list.php | 324 + .../includes/functions/payments.php | 807 + .../includes/functions/plugins.php | 105 + .../includes/functions/privacy.php | 103 + .../includes/functions/providers.php | 77 + .../includes/functions/utilities.php | 423 + .../wpforms-lite/includes/integrations.php | 118 + .../includes/providers/class-base.php | 1451 ++ .../providers/class-constant-contact.php | 969 + .../includes/templates/class-base.php | 342 + .../includes/templates/class-blank.php | 78 + .../templates/class-simple-contact-form.php | 86 + .../lite/templates/admin/addons.php | 98 + .../lite/templates/admin/entries/notice.php | 22 + .../admin/entries/overview/actions.php | 24 + .../admin/entries/overview/bulk-actions.php | 38 + .../admin/entries/overview/entry-list.php | 86 + .../admin/entries/overview/header.php | 39 + .../admin/entries/overview/modal.php | 88 + .../admin/entries/overview/table.php | 70 + .../templates/admin/entries/single/entry.php | 426 + .../lite/templates/builder/context-menu.php | 127 + .../education/admin/did-you-know.php | 60 + .../lite-connect/challenge-popup-footer.php | 33 + .../lite-connect/dashboard-widget-before.php | 29 + .../templates/education/admin/notice-bar.php | 36 + .../admin/settings/integrations-item.php | 43 + .../education/builder/did-you-know.php | 34 + .../builder/lite-connect/ai-modal.php | 76 + .../builder/lite-connect/top-bar.php | 27 + .../education/builder/providers-item.php | 38 + .../education/builder/settings-item.php | 29 + .../education/lite-connect-modal.php | 83 + .../wpforms-lite/lite/wpforms-lite.php | 1165 ++ wp-content/plugins/wpforms-lite/readme.txt | 888 + wp-content/plugins/wpforms-lite/src/API.php | 52 + .../wpforms-lite/src/Access/Capabilities.php | 62 + .../wpforms-lite/src/Admin/Addons/Addons.php | 600 + .../src/Admin/Addons/AddonsCache.php | 137 + .../wpforms-lite/src/Admin/AdminBarMenu.php | 712 + .../Base/Tables/DataObjects/ColumnBase.php | 155 + .../Admin/Base/Tables/Facades/ColumnsBase.php | 85 + .../wpforms-lite/src/Admin/Blocks/Links.php | 140 + .../wpforms-lite/src/Admin/Builder/Addons.php | 338 + .../src/Admin/Builder/Ajax/PanelLoader.php | 146 + .../src/Admin/Builder/Ajax/SaveForm.php | 51 + .../src/Admin/Builder/AntiSpam.php | 423 + .../src/Admin/Builder/ContextMenu.php | 61 + .../wpforms-lite/src/Admin/Builder/Help.php | 1377 ++ .../src/Admin/Builder/HelpCache.php | 64 + .../src/Admin/Builder/ImageUpload.php | 49 + .../Notifications/Advanced/EmailTemplate.php | 189 + .../src/Admin/Builder/Settings/Themes.php | 1256 ++ .../src/Admin/Builder/Shortcuts.php | 120 + .../src/Admin/Builder/TemplateSingleCache.php | 247 + .../src/Admin/Builder/Templates.php | 1308 ++ .../src/Admin/Builder/TemplatesCache.php | 267 + .../wpforms-lite/src/Admin/Challenge.php | 772 + .../src/Admin/Dashboard/Widget.php | 303 + .../src/Admin/Education/AddonsItemBase.php | 174 + .../src/Admin/Education/AddonsListBase.php | 62 + .../src/Admin/Education/Admin/EditPost.php | 249 + .../Education/Admin/Settings/Geolocation.php | 152 + .../Education/Admin/Settings/Integrations.php | 67 + .../Admin/Education/Admin/Settings/SMTP.php | 67 + .../Education/Admin/Tools/EntryAutomation.php | 156 + .../Admin/Education/Builder/Calculations.php | 304 + .../src/Admin/Education/Builder/Captcha.php | 192 + .../src/Admin/Education/Builder/Fields.php | 75 + .../Admin/Education/Builder/Geolocation.php | 154 + .../src/Admin/Education/Builder/PDF.php | 246 + .../src/Admin/Education/Builder/Panel.php | 69 + .../src/Admin/Education/Builder/Payments.php | 70 + .../src/Admin/Education/Builder/Providers.php | 71 + .../src/Admin/Education/Builder/Settings.php | 69 + .../wpforms-lite/src/Admin/Education/Core.php | 143 + .../Admin/Education/EducationInterface.php | 27 + .../src/Admin/Education/Fields.php | 416 + .../src/Admin/Education/Helpers.php | 172 + .../src/Admin/Education/Pointers/Payment.php | 157 + .../src/Admin/Education/Pointers/Pointer.php | 445 + .../src/Admin/Education/StringsTrait.php | 184 + .../wpforms-lite/src/Admin/FlyoutMenu.php | 141 + .../src/Admin/FormEmbedWizard.php | 480 + .../src/Admin/Forms/Ajax/Columns.php | 103 + .../src/Admin/Forms/Ajax/Tags.php | 273 + .../src/Admin/Forms/BulkActions.php | 493 + .../src/Admin/Forms/ListTable.php | 648 + .../wpforms-lite/src/Admin/Forms/Page.php | 361 + .../wpforms-lite/src/Admin/Forms/Search.php | 268 + .../Admin/Forms/Table/DataObjects/Column.php | 12 + .../src/Admin/Forms/Table/Facades/Columns.php | 315 + .../wpforms-lite/src/Admin/Forms/Tags.php | 613 + .../src/Admin/Forms/UserTemplates.php | 440 + .../wpforms-lite/src/Admin/Forms/Views.php | 798 + .../wpforms-lite/src/Admin/Helpers/Chart.php | 138 + .../src/Admin/Helpers/Datepicker.php | 461 + .../plugins/wpforms-lite/src/Admin/Loader.php | 89 + .../plugins/wpforms-lite/src/Admin/Notice.php | 402 + .../src/Admin/Notifications/EventDriven.php | 776 + .../src/Admin/Notifications/Notifications.php | 793 + .../src/Admin/Pages/Community.php | 166 + .../src/Admin/Pages/ConstantContact.php | 90 + .../src/Admin/Pages/Duplicator.php | 487 + .../wpforms-lite/src/Admin/Pages/Page.php | 748 + .../src/Admin/Pages/PrivacyCompliance.php | 481 + .../wpforms-lite/src/Admin/Pages/SMTP.php | 562 + .../src/Admin/Pages/SugarCalendar.php | 492 + .../src/Admin/Pages/Templates.php | 149 + .../src/Admin/Pages/UncannyAutomator.php | 469 + .../src/Admin/Payments/Payments.php | 299 + .../src/Admin/Payments/ScreenOptions.php | 187 + .../Payments/Views/Coupons/Education.php | 189 + .../Admin/Payments/Views/Overview/Ajax.php | 557 + .../Payments/Views/Overview/BulkActions.php | 220 + .../Admin/Payments/Views/Overview/Chart.php | 336 + .../Admin/Payments/Views/Overview/Coupon.php | 170 + .../Admin/Payments/Views/Overview/Filters.php | 175 + .../Admin/Payments/Views/Overview/Helpers.php | 119 + .../Payments/Views/Overview/ModeToggle.php | 43 + .../Admin/Payments/Views/Overview/Page.php | 510 + .../Admin/Payments/Views/Overview/Search.php | 378 + .../Admin/Payments/Views/Overview/Table.php | 1407 ++ .../Views/Overview/Traits/ResetNotices.php | 272 + .../Payments/Views/PaymentsViewsInterface.php | 43 + .../src/Admin/Payments/Views/Single.php | 1348 ++ .../wpforms-lite/src/Admin/Revisions.php | 496 + .../src/Admin/Settings/Captcha/Captcha.php | 197 + .../src/Admin/Settings/Captcha/HCaptcha.php | 75 + .../src/Admin/Settings/Captcha/Page.php | 372 + .../src/Admin/Settings/Captcha/ReCaptcha.php | 100 + .../src/Admin/Settings/Captcha/Turnstile.php | 106 + .../wpforms-lite/src/Admin/Settings/Email.php | 669 + .../src/Admin/Settings/ModernMarkup.php | 159 + .../src/Admin/Settings/Payments.php | 96 + .../wpforms-lite/src/Admin/SiteHealth.php | 120 + .../src/Admin/Splash/SplashCache.php | 166 + .../src/Admin/Splash/SplashScreen.php | 419 + .../src/Admin/Splash/SplashTrait.php | 283 + .../src/Admin/Splash/SplashUpgrader.php | 58 + .../src/Admin/Tools/Importers.php | 79 + .../src/Admin/Tools/Importers/Base.php | 156 + .../Admin/Tools/Importers/ContactForm7.php | 686 + .../Tools/Importers/ImporterInterface.php | 53 + .../src/Admin/Tools/Importers/NinjaForms.php | 555 + .../src/Admin/Tools/Importers/PirateForms.php | 696 + .../wpforms-lite/src/Admin/Tools/Tools.php | 196 + .../src/Admin/Tools/Views/ActionScheduler.php | 102 + .../Admin/Tools/Views/ActionSchedulerList.php | 99 + .../src/Admin/Tools/Views/CodeSnippets.php | 152 + .../src/Admin/Tools/Views/EntryAutomation.php | 118 + .../src/Admin/Tools/Views/Export.php | 370 + .../src/Admin/Tools/Views/Import.php | 446 + .../src/Admin/Tools/Views/Importer.php | 372 + .../src/Admin/Tools/Views/Logs.php | 296 + .../src/Admin/Tools/Views/System.php | 444 + .../src/Admin/Tools/Views/View.php | 119 + .../src/Admin/Traits/FormTemplates.php | 688 + .../src/Admin/Traits/HasScreenOptions.php | 203 + .../wpforms-lite/src/Db/Payments/Meta.php | 423 + .../wpforms-lite/src/Db/Payments/Payment.php | 529 + .../wpforms-lite/src/Db/Payments/Queries.php | 386 + .../src/Db/Payments/UpdateHelpers.php | 70 + .../src/Db/Payments/ValueValidator.php | 203 + .../wpforms-lite/src/Emails/Helpers.php | 360 + .../wpforms-lite/src/Emails/InfoBlocks.php | 295 + .../wpforms-lite/src/Emails/Mailer.php | 630 + .../src/Emails/NotificationBlocks.php | 186 + .../wpforms-lite/src/Emails/Notifications.php | 1418 ++ .../wpforms-lite/src/Emails/Preview.php | 463 + .../wpforms-lite/src/Emails/Styler.php | 136 + .../wpforms-lite/src/Emails/Summaries.php | 577 + .../src/Emails/Tasks/FetchInfoBlocksTask.php | 113 + .../src/Emails/Templates/Classic.php | 21 + .../src/Emails/Templates/Compact.php | 21 + .../src/Emails/Templates/General.php | 465 + .../src/Emails/Templates/Notifications.php | 112 + .../src/Emails/Templates/Plain.php | 69 + .../src/Emails/Templates/Summary.php | 117 + .../plugins/wpforms-lite/src/ErrorHandler.php | 418 + .../wpforms-lite/src/Forms/Akismet.php | 323 + .../wpforms-lite/src/Forms/AntiSpam.php | 385 + .../src/Forms/Fields/Addons/Coupon/Field.php | 298 + .../Forms/Fields/Addons/LikertScale/Field.php | 372 + .../Fields/Addons/NetPromoterScore/Field.php | 288 + .../Forms/Fields/Addons/Signature/Field.php | 199 + .../src/Forms/Fields/Address/Field.php | 769 + .../src/Forms/Fields/Address/Frontend.php | 73 + .../src/Forms/Fields/Base/Frontend.php | 54 + .../src/Forms/Fields/Camera/Field.php | 471 + .../src/Forms/Fields/Content/Field.php | 133 + .../src/Forms/Fields/CreditCard/Field.php | 265 + .../src/Forms/Fields/CustomCaptcha/Field.php | 315 + .../src/Forms/Fields/DateTime/Field.php | 901 + .../src/Forms/Fields/Divider/Field.php | 183 + .../src/Forms/Fields/EntryPreview/Field.php | 271 + .../src/Forms/Fields/FileUpload/Field.php | 472 + .../Fields/Helpers/RequirementsAlerts.php | 255 + .../src/Forms/Fields/Hidden/Field.php | 193 + .../src/Forms/Fields/Html/Field.php | 215 + .../src/Forms/Fields/Pagebreak/Field.php | 646 + .../src/Forms/Fields/Password/Field.php | 345 + .../Forms/Fields/PaymentCheckbox/Field.php | 594 + .../Forms/Fields/PaymentMultiple/Field.php | 536 + .../src/Forms/Fields/PaymentSelect/Field.php | 644 + .../src/Forms/Fields/PaymentSingle/Field.php | 848 + .../src/Forms/Fields/PaymentTotal/Field.php | 897 + .../src/Forms/Fields/Phone/Field.php | 235 + .../src/Forms/Fields/Rating/Field.php | 608 + .../src/Forms/Fields/Richtext/Field.php | 204 + .../Fields/Traits/AccessRestrictionsTrait.php | 613 + .../src/Forms/Fields/Traits/CameraTrait.php | 384 + .../src/Forms/Fields/Traits/ContentInput.php | 588 + .../Forms/Fields/Traits/FileDisplayTrait.php | 182 + .../Fields/Traits/FileEntriesEditTrait.php | 193 + .../Forms/Fields/Traits/FileMethodsTrait.php | 161 + .../src/Forms/Fields/Traits/NumberField.php | 300 + .../src/Forms/Fields/Traits/ProField.php | 619 + .../src/Forms/Fields/Traits/ReadOnlyField.php | 148 + .../src/Forms/Fields/Url/Field.php | 157 + .../wpforms-lite/src/Forms/Honeypot.php | 84 + .../wpforms-lite/src/Forms/IconChoices.php | 624 + .../wpforms-lite/src/Forms/Locator.php | 1417 ++ .../wpforms-lite/src/Forms/Preview.php | 394 + .../wpforms-lite/src/Forms/Submission.php | 280 + .../plugins/wpforms-lite/src/Forms/Token.php | 381 + .../plugins/wpforms-lite/src/Frontend/Amp.php | 386 + .../wpforms-lite/src/Frontend/CSSVars.php | 825 + .../wpforms-lite/src/Frontend/Captcha.php | 670 + .../wpforms-lite/src/Frontend/Classic.php | 406 + .../wpforms-lite/src/Frontend/Frontend.php | 2290 +++ .../wpforms-lite/src/Frontend/Modern.php | 322 + .../wpforms-lite/src/Helpers/CacheBase.php | 569 + .../wpforms-lite/src/Helpers/Chain.php | 416 + .../wpforms-lite/src/Helpers/Crypto.php | 130 + .../plugins/wpforms-lite/src/Helpers/DB.php | 291 + .../plugins/wpforms-lite/src/Helpers/File.php | 409 + .../plugins/wpforms-lite/src/Helpers/Form.php | 70 + .../src/Helpers/PluginSilentUpgrader.php | 614 + .../wpforms-lite/src/Helpers/Templates.php | 225 + .../wpforms-lite/src/Helpers/Transient.php | 279 + .../wpforms-lite/src/Integrations/AI/AI.php | 75 + .../src/Integrations/AI/API/API.php | 124 + .../src/Integrations/AI/API/Choices.php | 66 + .../src/Integrations/AI/API/Forms.php | 411 + .../src/Integrations/AI/API/Http/Request.php | 160 + .../src/Integrations/AI/API/Http/Response.php | 136 + .../src/Integrations/AI/Admin/Ajax/Base.php | 135 + .../Integrations/AI/Admin/Ajax/Choices.php | 73 + .../src/Integrations/AI/Admin/Ajax/Forms.php | 442 + .../AI/Admin/Builder/Enqueues.php | 276 + .../AI/Admin/Builder/FieldOption.php | 149 + .../Integrations/AI/Admin/Builder/Forms.php | 440 + .../Integrations/AI/Admin/Pages/Templates.php | 105 + .../src/Integrations/AI/Admin/Settings.php | 71 + .../src/Integrations/AI/Helpers.php | 145 + .../ConstantContact/V3/Api/Api.php | 445 + .../ConstantContact/V3/Api/Http/Request.php | 157 + .../ConstantContact/V3/Api/Http/Response.php | 158 + .../Integrations/ConstantContact/V3/Auth.php | 259 + .../ConstantContact/V3/ConstantContact.php | 169 + .../Integrations/ConstantContact/V3/Core.php | 126 + .../V3/Migration/Migration.php | 773 + .../ConstantContact/V3/Process.php | 303 + .../V3/Settings/FieldMapping.php | 346 + .../V3/Settings/FormBuilder.php | 391 + .../V3/Settings/PageIntegrations.php | 107 + .../DefaultContent/DefaultContent.php | 73 + .../DefaultThemes/DefaultThemes.php | 311 + .../src/Integrations/Divi/Divi.php | 386 + .../src/Integrations/Divi/WPFormsSelector.php | 143 + .../Elementor/Controls/WPFormsThemes.php | 59 + .../src/Integrations/Elementor/Elementor.php | 484 + .../src/Integrations/Elementor/RestApi.php | 210 + .../src/Integrations/Elementor/ThemesData.php | 219 + .../src/Integrations/Elementor/Widget.php | 458 + .../Integrations/Elementor/WidgetModern.php | 1010 + .../Integrations/Gutenberg/FormSelector.php | 1062 + .../src/Integrations/Gutenberg/RestApi.php | 224 + .../src/Integrations/Gutenberg/ThemesData.php | 219 + .../src/Integrations/IntegrationInterface.php | 27 + .../src/Integrations/LiteConnect/API.php | 480 + .../Integrations/LiteConnect/Integration.php | 462 + .../Integrations/LiteConnect/LiteConnect.php | 272 + .../LiteConnect/RefreshAccessTokenTask.php | 76 + .../wpforms-lite/src/Integrations/Loader.php | 126 + .../src/Integrations/SMTP/Notifications.php | 321 + .../SolidCentral/SolidCentral.php | 34 + .../Square/AddonCompatibility.php | 67 + .../Square/Admin/Builder/Enqueues.php | 118 + .../Square/Admin/Builder/Notifications.php | 132 + .../Square/Admin/Builder/Settings.php | 297 + .../Square/Admin/Builder/Traits/Content.php | 565 + .../src/Integrations/Square/Admin/Connect.php | 876 + .../src/Integrations/Square/Admin/Entries.php | 54 + .../src/Integrations/Square/Admin/Notices.php | 276 + .../Admin/Payments/SingleActionsHandler.php | 165 + .../Integrations/Square/Admin/Settings.php | 577 + .../Square/Admin/WebhookSettings.php | 436 + .../src/Integrations/Square/Api/Api.php | 1757 ++ .../Integrations/Square/Api/WebhookEvent.php | 50 + .../Integrations/Square/Api/WebhookRoute.php | 364 + .../Integrations/Square/Api/Webhooks/Base.php | 220 + .../Square/Api/Webhooks/PaymentCreated.php | 224 + .../Square/Api/Webhooks/PaymentUpdated.php | 183 + .../Square/Api/Webhooks/RefundUpdated.php | 94 + .../Api/Webhooks/SubscriptionCreated.php | 42 + .../Api/Webhooks/SubscriptionUpdated.php | 60 + .../Square/Api/WebhooksManager.php | 206 + .../src/Integrations/Square/Connection.php | 561 + .../Integrations/Square/CurlCompatibility.php | 59 + .../src/Integrations/Square/Fields/Square.php | 575 + .../src/Integrations/Square/Frontend.php | 177 + .../src/Integrations/Square/Helpers.php | 558 + .../Square/Integrations/BlockEditor.php | 137 + .../Integrations/Square/Integrations/Divi.php | 113 + .../Square/Integrations/Elementor.php | 78 + .../Integrations/IntegrationInterface.php | 36 + .../Square/Integrations/Loader.php | 69 + .../src/Integrations/Square/Process.php | 1313 ++ .../src/Integrations/Square/Square.php | 237 + .../src/Integrations/Square/Tasks.php | 51 + .../Square/WebhooksHealthCheck.php | 241 + .../Stripe/Admin/Builder/Enqueues.php | 130 + .../Stripe/Admin/Builder/Notifications.php | 132 + .../Stripe/Admin/Builder/Settings.php | 338 + .../Admin/Builder/Traits/ContentTrait.php | 804 + .../src/Integrations/Stripe/Admin/Connect.php | 582 + .../src/Integrations/Stripe/Admin/Notices.php | 178 + .../Admin/Payments/SingleActionsHandler.php | 214 + .../Integrations/Stripe/Admin/Settings.php | 442 + .../Stripe/Admin/WebhookSettings.php | 322 + .../Integrations/Stripe/Api/ApiInterface.php | 134 + .../src/Integrations/Stripe/Api/Common.php | 501 + .../Integrations/Stripe/Api/DomainManager.php | 259 + .../Stripe/Api/PaymentIntents.php | 930 + .../Integrations/Stripe/Api/WebhookRoute.php | 369 + .../Integrations/Stripe/Api/Webhooks/Base.php | 167 + .../Api/Webhooks/ChargeRefundUpdated.php | 187 + .../Stripe/Api/Webhooks/ChargeRefunded.php | 114 + .../Stripe/Api/Webhooks/ChargeSucceeded.php | 83 + .../Webhooks/CustomerSubscriptionCreated.php | 44 + .../Webhooks/CustomerSubscriptionDeleted.php | 42 + .../Webhooks/CustomerSubscriptionUpdated.php | 59 + .../Exceptions/AmountMismatchException.php | 25 + .../Stripe/Api/Webhooks/InvoiceCreated.php | 170 + .../Api/Webhooks/InvoicePaymentSucceeded.php | 92 + .../Stripe/Api/WebhooksManager.php | 298 + .../Integrations/Stripe/DomainHealthCheck.php | 160 + .../Fields/PaymentElementCreditCard.php | 363 + .../Stripe/Fields/StripeCreditCard.php | 269 + .../Stripe/Fields/Traits/CreditCard.php | 383 + .../src/Integrations/Stripe/Frontend.php | 256 + .../src/Integrations/Stripe/Helpers.php | 522 + .../src/Integrations/Stripe/Process.php | 1381 ++ .../src/Integrations/Stripe/RateLimit.php | 425 + .../src/Integrations/Stripe/Stripe.php | 81 + .../Stripe/StripeAddonCompatibility.php | 90 + .../Stripe/WebhooksHealthCheck.php | 329 + ...le-developer-merchantid-domain-association | 1 + .../UncannyAutomator/UncannyAutomator.php | 204 + .../UsageTracking/SendUsageTask.php | 133 + .../UsageTracking/UsageTracking.php | 1047 + .../Integrations/WPCode/RegisterLibrary.php | 61 + .../src/Integrations/WPCode/WPCode.php | 246 + .../Integrations/WPMailSMTP/Notifications.php | 228 + .../src/Integrations/WPorg/Translations.php | 154 + .../WooCommerce/Notifications.php | 230 + .../wpforms-lite/src/Lite/Admin/Connect.php | 288 + .../src/Lite/Admin/ConnectSkin.php | 35 + .../src/Lite/Admin/DashboardWidget.php | 583 + .../Lite/Admin/Education/Admin/DidYouKnow.php | 181 + .../Lite/Admin/Education/Admin/NoticeBar.php | 72 + .../Admin/Education/Builder/Confirmations.php | 86 + .../Admin/Education/Builder/DidYouKnow.php | 107 + .../Lite/Admin/Education/Builder/Fields.php | 168 + .../Admin/Education/Builder/Notifications.php | 135 + .../src/Lite/Admin/Education/Core.php | 53 + .../src/Lite/Admin/Education/LiteConnect.php | 469 + .../src/Lite/Admin/Pages/Addons.php | 130 + .../src/Lite/Admin/Settings/Access.php | 171 + .../src/Lite/Emails/Summaries.php | 221 + .../Integrations/Elementor/ThemesData.php | 24 + .../Integrations/Gutenberg/FormSelector.php | 116 + .../Integrations/Gutenberg/ThemesData.php | 24 + .../Integrations/LiteConnect/Integration.php | 109 + .../Integrations/LiteConnect/LiteConnect.php | 184 + .../LiteConnect/SendEntryTask.php | 135 + .../src/Lite/Reports/EntriesCount.php | 187 + .../plugins/wpforms-lite/src/Loader.php | 964 + .../wpforms-lite/src/Logger/ListTable.php | 585 + .../plugins/wpforms-lite/src/Logger/Log.php | 231 + .../wpforms-lite/src/Logger/Record.php | 268 + .../wpforms-lite/src/Logger/RecordQuery.php | 80 + .../wpforms-lite/src/Logger/Records.php | 134 + .../wpforms-lite/src/Logger/Repository.php | 289 + .../wpforms-lite/src/Migrations/Base.php | 512 + .../src/Migrations/Migrations.php | 53 + .../src/Migrations/Tasks/UpgradeBaseTask.php | 304 + .../src/Migrations/Upgrade159.php | 39 + .../src/Migrations/Upgrade1672.php | 45 + .../src/Migrations/Upgrade168.php | 57 + .../src/Migrations/Upgrade175.php | 93 + .../src/Migrations/Upgrade1751.php | 28 + .../src/Migrations/Upgrade177.php | 47 + .../src/Migrations/Upgrade182.php | 110 + .../src/Migrations/Upgrade183.php | 33 + .../src/Migrations/Upgrade184.php | 47 + .../src/Migrations/Upgrade186.php | 27 + .../src/Migrations/Upgrade187.php | 71 + .../src/Migrations/Upgrade1_9_1.php | 57 + .../src/Migrations/Upgrade1_9_2.php | 47 + .../src/Migrations/Upgrade1_9_7.php | 24 + .../src/Migrations/Upgrade1_9_8_6.php | 108 + .../src/Migrations/UpgradeBase.php | 148 + .../src/Providers/Provider/Core.php | 147 + .../src/Providers/Provider/Process.php | 129 + .../Provider/Settings/FormBuilder.php | 816 + .../Settings/FormBuilderInterface.php | 33 + .../Provider/Settings/PageIntegrations.php | 386 + .../Settings/PageIntegrationsInterface.php | 22 + .../src/Providers/Provider/Status.php | 192 + .../wpforms-lite/src/Providers/Providers.php | 72 + .../src/Requirements/Requirements.php | 1490 ++ .../src/SmartTags/SmartTag/AdminEmail.php | 27 + .../src/SmartTags/SmartTag/AuthorDisplay.php | 47 + .../src/SmartTags/SmartTag/AuthorEmail.php | 47 + .../src/SmartTags/SmartTag/AuthorId.php | 43 + .../src/SmartTags/SmartTag/Date.php | 35 + .../src/SmartTags/SmartTag/FieldHtmlId.php | 56 + .../src/SmartTags/SmartTag/FieldId.php | 59 + .../src/SmartTags/SmartTag/FieldValueId.php | 45 + .../src/SmartTags/SmartTag/FormId.php | 27 + .../src/SmartTags/SmartTag/FormName.php | 31 + .../src/SmartTags/SmartTag/Generic.php | 27 + .../src/SmartTags/SmartTag/OrderSummary.php | 367 + .../src/SmartTags/SmartTag/PageId.php | 40 + .../src/SmartTags/SmartTag/PageTitle.php | 83 + .../src/SmartTags/SmartTag/PageUrl.php | 40 + .../src/SmartTags/SmartTag/QueryVar.php | 76 + .../src/SmartTags/SmartTag/SiteName.php | 27 + .../src/SmartTags/SmartTag/SmartTag.php | 322 + .../src/SmartTags/SmartTag/UniqueValue.php | 91 + .../src/SmartTags/SmartTag/UrlLogin.php | 27 + .../src/SmartTags/SmartTag/UrlLogout.php | 27 + .../SmartTags/SmartTag/UrlLostPassword.php | 27 + .../src/SmartTags/SmartTag/UrlReferer.php | 47 + .../src/SmartTags/SmartTag/UrlRegister.php | 27 + .../src/SmartTags/SmartTag/UserDisplay.php | 35 + .../src/SmartTags/SmartTag/UserEmail.php | 35 + .../src/SmartTags/SmartTag/UserFirstName.php | 35 + .../src/SmartTags/SmartTag/UserFullName.php | 35 + .../src/SmartTags/SmartTag/UserId.php | 35 + .../src/SmartTags/SmartTag/UserIp.php | 39 + .../src/SmartTags/SmartTag/UserLastName.php | 35 + .../src/SmartTags/SmartTag/UserMeta.php | 47 + .../wpforms-lite/src/SmartTags/SmartTags.php | 569 + .../src/Tasks/Actions/AsyncRequestTask.php | 70 + .../Actions/DomainAutoRegistrationTask.php | 139 + .../Actions/EntryEmailsMetaCleanupTask.php | 110 + .../src/Tasks/Actions/EntryEmailsTask.php | 65 + .../Tasks/Actions/FormsLocatorScanTask.php | 575 + .../IconChoicesFontAwesomeUpgradeTask.php | 156 + .../src/Tasks/Actions/Migration173Task.php | 268 + .../src/Tasks/Actions/Migration175Task.php | 454 + .../src/Tasks/Actions/PurgeSpamTask.php | 137 + .../SquareSubscriptionTransactionIDTask.php | 161 + .../Actions/StripeLinkSubscriptionsTask.php | 310 + .../Actions/WebhooksAutoConfigurationTask.php | 139 + .../plugins/wpforms-lite/src/Tasks/Meta.php | 267 + .../plugins/wpforms-lite/src/Tasks/Task.php | 377 + .../plugins/wpforms-lite/src/Tasks/Tasks.php | 447 + .../plugins/wpforms-lite/src/WPForms.php | 623 + .../wpforms-lite/templates/admin-bar-menu.php | 50 + .../templates/admin/challenge/builder.php | 45 + .../templates/admin/challenge/embed.php | 121 + .../templates/admin/challenge/modal.php | 78 + .../templates/admin/challenge/welcome.php | 23 + .../templates/admin/components/chart.php | 37 + .../templates/admin/components/datepicker.php | 80 + .../admin/dashboard/widget/settings.php | 59 + .../admin/dashboard/widget/welcome.php | 13 + .../templates/admin/empty-states/no-forms.php | 46 + .../admin/empty-states/no-user-templates.php | 47 + .../empty-states/payments/get-started.php | 55 + .../empty-states/payments/no-payments.php | 50 + .../admin/form-embed-wizard/popup.php | 95 + .../admin/form-embed-wizard/tooltip.php | 43 + .../templates/admin/forms/bulk-edit-tags.php | 42 + .../templates/admin/forms/search-box.php | 27 + .../templates/admin/forms/search-reset.php | 26 + .../templates/admin/notifications.php | 50 + .../admin/pages/constant-contact.php | 139 + .../templates/admin/payments/hidden-field.php | 27 + .../templates/admin/payments/mode-toggle.php | 22 + .../templates/admin/payments/reports.php | 54 + .../admin/payments/reset-filter-notice.php | 65 + .../payments/single/advanced-details.php | 47 + .../admin/payments/single/details.php | 85 + .../admin/payments/single/entry-details.php | 85 + .../templates/admin/payments/single/field.php | 25 + .../payments/single/heading-navigation.php | 59 + .../templates/admin/payments/single/log.php | 56 + .../admin/payments/single/no-payment.php | 27 + .../admin/payments/single/payment-details.php | 86 + .../admin/payments/single/payment-history.php | 66 + .../payments/tablenav-filter-multiselect.php | 33 + .../admin/payments/tablenav-filters.php | 38 + .../templates/admin/promotion.php | 82 + .../admin/settings/email-heading.php | 23 + .../admin/settings/hcaptcha-description.php | 29 + .../admin/settings/recaptcha-description.php | 57 + .../admin/settings/specific-note.php | 25 + .../admin/settings/turnstile-description.php | 29 + .../templates/admin/splash/footer.php | 24 + .../templates/admin/splash/header.php | 25 + .../templates/admin/splash/modal.php | 56 + .../templates/admin/splash/section.php | 61 + .../builder/antispam/also-available.php | 44 + .../templates/builder/field-context-menu.php | 128 + .../builder/fullscreen/abort-message.php | 32 + .../builder/fullscreen/ie-notice.php | 44 + .../builder/fullscreen/mobile-notice.php | 31 + .../wpforms-lite/templates/builder/help.php | 145 + .../notifications/email-template-link.php | 28 + .../notifications/email-template-modal.php | 57 + .../builder/payment/recurring/item.php | 25 + .../templates/builder/payment/sidebar.php | 38 + .../templates/builder/revisions/list.php | 79 + .../builder/revisions/notice-disabled.php | 26 + .../builder/revisions/notice-limited.php | 35 + .../templates/builder/templates-item.php | 130 + .../templates/builder/themes/notices.php | 115 + .../templates/builder/themes/preview.php | 90 + .../admin/edit-post/classic-notice.php | 29 + .../education/admin/edit-post/notice.php | 33 + .../templates/education/admin/page.php | 107 + .../education/admin/payments/single-page.php | 53 + .../education/admin/settings/smtp-notice.php | 40 + .../templates/emails/classic-body.php | 22 + .../templates/emails/classic-field.php | 17 + .../templates/emails/classic-footer.php | 50 + .../templates/emails/classic-header.php | 57 + .../templates/emails/classic-queries.php | 90 + .../templates/emails/classic-style.php | 83 + .../templates/emails/compact-body.php | 22 + .../templates/emails/compact-field.php | 15 + .../templates/emails/compact-footer.php | 50 + .../templates/emails/compact-header.php | 57 + .../templates/emails/compact-queries.php | 89 + .../templates/emails/compact-style.php | 83 + .../templates/emails/general-body-plain.php | 19 + .../templates/emails/general-body.php | 28 + .../templates/emails/general-footer.php | 33 + .../templates/emails/general-header.php | 42 + .../templates/emails/general-queries.php | 15 + .../templates/emails/general-style.php | 30 + .../templates/emails/summary-body-plain.php | 102 + .../templates/emails/summary-body.php | 318 + .../templates/emails/summary-footer-plain.php | 26 + .../templates/emails/summary-footer.php | 48 + .../templates/emails/summary-header.php | 57 + .../templates/emails/summary-queries.php | 17 + .../templates/emails/summary-style.php | 23 + .../fields/content/action-buttons.php | 32 + .../file-upload/file-upload-backend.php | 47 + .../internal-information/icon-expanded.php | 17 + .../internal-information/icon-lightbulb.php | 17 + .../icon-not-expanded.php | 18 + .../fields/number-slider/builder-preview.php | 35 + .../fields/number-slider/frontend.php | 36 + .../fields/total/summary-preview.php | 95 + .../builder/connection.php | 70 + .../constant-contact-v3/builder/error.php | 12 + .../builder/select-field.php | 27 + .../integrations/elementor/form-selector.php | 24 + .../integrations/elementor/no-forms.php | 47 + .../integrations/elementor/popup.php | 16 + .../stripe/builder/custom-metadata.php | 123 + .../integrations/wpcode/code-snippets.php | 107 + wp-content/plugins/wpforms-lite/uninstall.php | 179 + .../plugins/wpforms-lite/vendor/autoload.php | 22 + .../vendor/composer/ClassLoader.php | 579 + .../vendor/composer/InstalledVersions.php | 396 + .../wpforms-lite/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 2908 +++ .../vendor/composer/autoload_files.php | 12 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 17 + .../vendor/composer/autoload_real.php | 50 + .../vendor/composer/autoload_static.php | 2982 +++ .../vendor/composer/installed.php | 196 + .../vendor/composer/platform_check.php | 25 + .../wpforms-lite/vendor/psr/log/LICENSE | 19 + .../vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + .../vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 26 + .../psr/log/Psr/Log/LoggerInterface.php | 125 + .../vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + .../vendor/psr/log/Psr/Log/NullLogger.php | 30 + .../vendor/symfony/polyfill-iconv/Iconv.php | 718 + .../vendor/symfony/polyfill-iconv/LICENSE | 19 + .../Resources/charset/from.big5.php | 13719 +++++++++++++ .../Resources/charset/from.cp037.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp1006.php | Bin 0 -> 3860 bytes .../Resources/charset/from.cp1026.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp424.php | Bin 0 -> 3210 bytes .../Resources/charset/from.cp437.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp500.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp737.php | Bin 0 -> 3834 bytes .../Resources/charset/from.cp775.php | Bin 0 -> 3815 bytes .../Resources/charset/from.cp850.php | Bin 0 -> 3809 bytes .../Resources/charset/from.cp852.php | Bin 0 -> 3808 bytes .../Resources/charset/from.cp855.php | Bin 0 -> 3809 bytes .../Resources/charset/from.cp856.php | Bin 0 -> 3194 bytes .../Resources/charset/from.cp857.php | Bin 0 -> 3763 bytes .../Resources/charset/from.cp860.php | Bin 0 -> 3840 bytes .../Resources/charset/from.cp861.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp862.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp863.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp864.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp865.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp866.php | Bin 0 -> 3831 bytes .../Resources/charset/from.cp869.php | Bin 0 -> 3676 bytes .../Resources/charset/from.cp874.php | Bin 0 -> 3410 bytes .../Resources/charset/from.cp875.php | Bin 0 -> 3776 bytes .../Resources/charset/from.cp932.php | Bin 0 -> 134095 bytes .../Resources/charset/from.cp936.php | Bin 0 -> 372283 bytes .../Resources/charset/from.cp949.php | Bin 0 -> 291504 bytes .../Resources/charset/from.cp950.php | Bin 0 -> 231436 bytes .../Resources/charset/from.iso-8859-1.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-10.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-11.php | Bin 0 -> 3746 bytes .../Resources/charset/from.iso-8859-13.php | Bin 0 -> 3783 bytes .../Resources/charset/from.iso-8859-14.php | Bin 0 -> 3801 bytes .../Resources/charset/from.iso-8859-15.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-16.php | Bin 0 -> 3782 bytes .../Resources/charset/from.iso-8859-2.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-3.php | Bin 0 -> 3674 bytes .../Resources/charset/from.iso-8859-4.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-5.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-6.php | Bin 0 -> 3104 bytes .../Resources/charset/from.iso-8859-7.php | Bin 0 -> 3692 bytes .../Resources/charset/from.iso-8859-8.php | Bin 0 -> 3242 bytes .../Resources/charset/from.iso-8859-9.php | Bin 0 -> 3779 bytes .../Resources/charset/from.koi8-r.php | Bin 0 -> 3835 bytes .../Resources/charset/from.koi8-u.php | Bin 0 -> 3827 bytes .../Resources/charset/from.us-ascii.php | Bin 0 -> 1859 bytes .../Resources/charset/from.windows-1250.php | Bin 0 -> 3721 bytes .../Resources/charset/from.windows-1251.php | Bin 0 -> 3782 bytes .../Resources/charset/from.windows-1252.php | Bin 0 -> 3721 bytes .../Resources/charset/from.windows-1253.php | Bin 0 -> 3542 bytes .../Resources/charset/from.windows-1254.php | Bin 0 -> 3691 bytes .../Resources/charset/from.windows-1255.php | Bin 0 -> 3454 bytes .../Resources/charset/from.windows-1256.php | Bin 0 -> 3800 bytes .../Resources/charset/from.windows-1257.php | Bin 0 -> 3616 bytes .../Resources/charset/from.windows-1258.php | Bin 0 -> 3662 bytes .../Resources/charset/translit.php | 4106 ++++ .../symfony/polyfill-iconv/bootstrap.php | 84 + .../symfony/polyfill-iconv/bootstrap80.php | 76 + .../vendor/symfony/polyfill-mbstring/LICENSE | 19 + .../symfony/polyfill-mbstring/Mbstring.php | 1045 + .../Resources/unidata/caseFolding.php | 119 + .../Resources/unidata/lowerCase.php | 1397 ++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 ++ .../symfony/polyfill-mbstring/bootstrap.php | 172 + .../symfony/polyfill-mbstring/bootstrap80.php | 167 + .../vendor/symfony/polyfill-php80/LICENSE | 19 + .../vendor/symfony/polyfill-php80/Php80.php | 115 + .../symfony/polyfill-php80/PhpToken.php | 106 + .../Resources/stubs/Attribute.php | 31 + .../Resources/stubs/PhpToken.php | 16 + .../Resources/stubs/Stringable.php | 20 + .../Resources/stubs/UnhandledMatchError.php | 16 + .../Resources/stubs/ValueError.php | 16 + .../symfony/polyfill-php80/bootstrap.php | 42 + .../action-scheduler/action-scheduler.php | 70 + .../classes/ActionScheduler_ActionClaim.php | 45 + .../classes/ActionScheduler_ActionFactory.php | 378 + .../classes/ActionScheduler_AdminView.php | 311 + ...tionScheduler_AsyncRequest_QueueRunner.php | 93 + .../classes/ActionScheduler_Compatibility.php | 111 + .../ActionScheduler_DataController.php | 210 + .../classes/ActionScheduler_DateTime.php | 79 + .../classes/ActionScheduler_Exception.php | 11 + .../ActionScheduler_FatalErrorMonitor.php | 98 + ...ActionScheduler_InvalidActionException.php | 47 + .../classes/ActionScheduler_ListTable.php | 675 + .../classes/ActionScheduler_LogEntry.php | 78 + .../classes/ActionScheduler_NullLogEntry.php | 18 + .../classes/ActionScheduler_OptionLock.php | 136 + .../classes/ActionScheduler_QueueCleaner.php | 254 + .../classes/ActionScheduler_QueueRunner.php | 254 + ...tionScheduler_RecurringActionScheduler.php | 81 + .../ActionScheduler_SystemInformation.php | 93 + .../classes/ActionScheduler_Versions.php | 151 + .../ActionScheduler_WPCommentCleaner.php | 133 + .../ActionScheduler_wcSystemStatus.php | 165 + .../classes/WP_CLI/Action/Cancel_Command.php | 120 + .../classes/WP_CLI/Action/Create_Command.php | 153 + .../classes/WP_CLI/Action/Delete_Command.php | 108 + .../WP_CLI/Action/Generate_Command.php | 121 + .../classes/WP_CLI/Action/Get_Command.php | 75 + .../classes/WP_CLI/Action/List_Command.php | 133 + .../classes/WP_CLI/Action/Next_Command.php | 71 + .../classes/WP_CLI/Action/Run_Command.php | 194 + .../ActionScheduler_WPCLI_Clean_Command.php | 123 + .../ActionScheduler_WPCLI_QueueRunner.php | 195 + ...ctionScheduler_WPCLI_Scheduler_command.php | 202 + .../classes/WP_CLI/Action_Command.php | 353 + .../classes/WP_CLI/Migration_Command.php | 190 + .../classes/WP_CLI/ProgressBar.php | 139 + .../classes/WP_CLI/System_Command.php | 282 + .../classes/abstracts/ActionScheduler.php | 403 + .../ActionScheduler_Abstract_ListTable.php | 797 + .../ActionScheduler_Abstract_QueueRunner.php | 384 + ...onScheduler_Abstract_RecurringSchedule.php | 112 + .../ActionScheduler_Abstract_Schedule.php | 89 + .../ActionScheduler_Abstract_Schema.php | 187 + .../abstracts/ActionScheduler_Lock.php | 74 + .../abstracts/ActionScheduler_Logger.php | 258 + .../abstracts/ActionScheduler_Store.php | 506 + .../ActionScheduler_TimezoneHelper.php | 162 + .../ActionScheduler_WPCLI_Command.php | 83 + .../actions/ActionScheduler_Action.php | 191 + .../ActionScheduler_CanceledAction.php | 25 + .../ActionScheduler_FinishedAction.php | 21 + .../actions/ActionScheduler_NullAction.php | 25 + .../data-stores/ActionScheduler_DBLogger.php | 154 + .../data-stores/ActionScheduler_DBStore.php | 1342 ++ .../ActionScheduler_HybridStore.php | 460 + .../ActionScheduler_wpCommentLogger.php | 282 + .../ActionScheduler_wpPostStore.php | 1105 ++ ...eduler_wpPostStore_PostStatusRegistrar.php | 63 + ...cheduler_wpPostStore_PostTypeRegistrar.php | 53 + ...cheduler_wpPostStore_TaxonomyRegistrar.php | 33 + .../classes/migration/ActionMigrator.php | 126 + .../ActionScheduler_DBStoreMigrator.php | 52 + .../classes/migration/BatchFetcher.php | 95 + .../classes/migration/Config.php | 196 + .../classes/migration/Controller.php | 245 + .../migration/DryRun_ActionMigrator.php | 28 + .../classes/migration/DryRun_LogMigrator.php | 23 + .../classes/migration/LogMigrator.php | 58 + .../classes/migration/Runner.php | 171 + .../classes/migration/Scheduler.php | 128 + .../ActionScheduler_CanceledSchedule.php | 63 + .../ActionScheduler_CronSchedule.php | 111 + .../ActionScheduler_IntervalSchedule.php | 90 + .../ActionScheduler_NullSchedule.php | 39 + .../schedules/ActionScheduler_Schedule.php | 22 + .../ActionScheduler_SimpleSchedule.php | 81 + .../schema/ActionScheduler_LoggerSchema.php | 101 + .../schema/ActionScheduler_StoreSchema.php | 145 + ...eduler_Abstract_QueueRunner_Deprecated.php | 27 + .../ActionScheduler_AdminView_Deprecated.php | 153 + .../ActionScheduler_Schedule_Deprecated.php | 29 + .../ActionScheduler_Store_Deprecated.php | 50 + .../action-scheduler/deprecated/functions.php | 129 + .../action-scheduler/functions.php | 513 + .../action-scheduler/lib/WP_Async_Request.php | 188 + .../lib/cron-expression/CronExpression.php | 318 + .../CronExpression_AbstractField.php | 100 + .../CronExpression_DayOfMonthField.php | 110 + .../CronExpression_DayOfWeekField.php | 124 + .../CronExpression_FieldFactory.php | 55 + .../CronExpression_FieldInterface.php | 39 + .../CronExpression_HoursField.php | 47 + .../CronExpression_MinutesField.php | 39 + .../CronExpression_MonthField.php | 55 + .../CronExpression_YearField.php | 43 + .../lib/cron-expression/LICENSE | 19 + .../woocommerce/action-scheduler/license.txt | 674 + .../apimatic/core-interfaces/LICENSE | 21 + .../src/Core/Authentication/AuthGroup.php | 9 + .../src/Core/Authentication/AuthInterface.php | 15 + .../src/Core/ContextInterface.php | 11 + .../core-interfaces/src/Core/Format.php | 10 + .../src/Core/Logger/ApiLoggerInterface.php | 21 + .../Core/Request/NonEmptyParamInterface.php | 8 + .../src/Core/Request/ParamInterface.php | 31 + .../Request/RequestArraySerialization.php | 13 + .../src/Core/Request/RequestInterface.php | 29 + .../src/Core/Request/RequestMethod.php | 13 + .../Core/Request/RequestSetterInterface.php | 16 + .../Core/Request/TypeValidatorInterface.php | 19 + .../src/Core/Response/ResponseInterface.php | 16 + .../src/Http/HttpClientInterface.php | 17 + .../src/Http/HttpConfigurations.php | 43 + .../core-interfaces/src/Http/RetryOption.php | 19 + .../src/Sdk/ConverterInterface.php | 16 + .../src/Sdk/ExceptionInterface.php | 7 + .../vendor_prefixed/apimatic/core/LICENSE | 21 + .../apimatic/core/src/ApiCall.php | 45 + .../apimatic/core/src/Authentication/Auth.php | 107 + .../core/src/Authentication/CoreAuth.php | 44 + .../apimatic/core/src/Client.php | 128 + .../apimatic/core/src/ClientBuilder.php | 174 + .../Exceptions/AuthValidationException.php | 22 + .../apimatic/core/src/Logger/ApiLogger.php | 69 + .../BaseHttpLoggingConfiguration.php | 76 + .../Configuration/LoggingConfiguration.php | 58 + .../Configuration/RequestConfiguration.php | 31 + .../Configuration/ResponseConfiguration.php | 8 + .../core/src/Logger/ConsoleLogger.php | 36 + .../core/src/Logger/LoggerConstants.php | 19 + .../core/src/Logger/NullApiLogger.php | 24 + .../Parameters/AdditionalFormParams.php | 42 + .../Parameters/AdditionalHeaderParams.php | 19 + .../Parameters/AdditionalQueryParams.php | 72 + .../core/src/Request/Parameters/BodyParam.php | 41 + .../src/Request/Parameters/EncodedParam.php | 81 + .../core/src/Request/Parameters/FormParam.php | 85 + .../src/Request/Parameters/HeaderParam.php | 31 + .../src/Request/Parameters/MultipleParams.php | 52 + .../core/src/Request/Parameters/Parameter.php | 130 + .../src/Request/Parameters/QueryParam.php | 81 + .../src/Request/Parameters/TemplateParam.php | 65 + .../apimatic/core/src/Request/Request.php | 240 + .../core/src/Request/RequestBuilder.php | 132 + .../apimatic/core/src/Response/Context.php | 100 + .../core/src/Response/ResponseError.php | 67 + .../core/src/Response/ResponseHandler.php | 175 + .../src/Response/Types/DeserializableType.php | 30 + .../core/src/Response/Types/ErrorType.php | 127 + .../src/Response/Types/ResponseMultiType.php | 42 + .../core/src/Response/Types/ResponseType.php | 56 + .../TestCase/BodyMatchers/BodyComparator.php | 184 + .../src/TestCase/BodyMatchers/BodyMatcher.php | 50 + .../BodyMatchers/KeysAndValuesBodyMatcher.php | 17 + .../TestCase/BodyMatchers/KeysBodyMatcher.php | 26 + .../BodyMatchers/NativeBodyMatcher.php | 45 + .../TestCase/BodyMatchers/RawBodyMatcher.php | 30 + .../core/src/TestCase/CoreTestCase.php | 80 + .../core/src/TestCase/HeadersMatcher.php | 60 + .../core/src/TestCase/StatusCodeMatcher.php | 62 + .../apimatic/core/src/TestCase/TestParam.php | 77 + .../core/src/Types/CallbackCatcher.php | 54 + .../core/src/Types/Sdk/CoreApiResponse.php | 98 + .../core/src/Types/Sdk/CoreCallback.php | 97 + .../core/src/Types/Sdk/CoreContext.php | 29 + .../core/src/Types/Sdk/CoreFileWrapper.php | 84 + .../core/src/Types/Sdk/CoreRequest.php | 127 + .../core/src/Types/Sdk/CoreResponse.php | 66 + .../apimatic/core/src/Utils/CoreHelper.php | 263 + .../apimatic/core/src/Utils/DateHelper.php | 582 + .../apimatic/core/src/Utils/JsonHelper.php | 76 + .../core/src/Utils/XmlDeserializer.php | 160 + .../apimatic/core/src/Utils/XmlSerializer.php | 120 + .../apimatic/jsonmapper/LICENSE | 47 + .../apimatic/jsonmapper/example/Address.php | 15 + .../apimatic/jsonmapper/example/Contact.php | 12 + .../apimatic/jsonmapper/example/run.php | 12 + .../src/AnyOfValidationException.php | 39 + .../apimatic/jsonmapper/src/JsonMapper.php | 1662 ++ .../jsonmapper/src/JsonMapperException.php | 153 + .../src/OneOfValidationException.php | 53 + .../jsonmapper/src/TypeCombination.php | 393 + .../apimatic/unirest-php/LICENSE | 26 + .../unirest-php/src/Configuration.php | 341 + .../apimatic/unirest-php/src/HttpClient.php | 310 + .../apimatic/unirest-php/src/Request/Body.php | 58 + .../unirest-php/src/Request/Request.php | 119 + .../apimatic/unirest-php/src/Response.php | 55 + .../ezyang/htmlpurifier/LICENSE | 504 + .../library/HTMLPurifier.auto.php | 11 + .../library/HTMLPurifier.autoload-legacy.php | 13 + .../library/HTMLPurifier.autoload.php | 24 + .../library/HTMLPurifier.composer.php | 7 + .../library/HTMLPurifier.func.php | 25 + .../library/HTMLPurifier.includes.php | 237 + .../library/HTMLPurifier.kses.php | 29 + .../library/HTMLPurifier.path.php | 11 + .../htmlpurifier/library/HTMLPurifier.php | 265 + .../library/HTMLPurifier.safe-includes.php | 230 + .../library/HTMLPurifier/Arborize.php | 78 + .../library/HTMLPurifier/AttrCollections.php | 135 + .../library/HTMLPurifier/AttrDef.php | 135 + .../library/HTMLPurifier/AttrDef/CSS.php | 122 + .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 34 + .../HTMLPurifier/AttrDef/CSS/Background.php | 104 + .../AttrDef/CSS/BackgroundPosition.php | 139 + .../HTMLPurifier/AttrDef/CSS/Border.php | 56 + .../HTMLPurifier/AttrDef/CSS/Color.php | 127 + .../HTMLPurifier/AttrDef/CSS/Composite.php | 46 + .../AttrDef/CSS/DenyElementDecorator.php | 43 + .../HTMLPurifier/AttrDef/CSS/Filter.php | 73 + .../library/HTMLPurifier/AttrDef/CSS/Font.php | 152 + .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 197 + .../HTMLPurifier/AttrDef/CSS/Ident.php | 30 + .../AttrDef/CSS/ImportantDecorator.php | 55 + .../HTMLPurifier/AttrDef/CSS/Length.php | 71 + .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 103 + .../HTMLPurifier/AttrDef/CSS/Multiple.php | 70 + .../HTMLPurifier/AttrDef/CSS/Number.php | 79 + .../HTMLPurifier/AttrDef/CSS/Percentage.php | 49 + .../HTMLPurifier/AttrDef/CSS/Ratio.php | 40 + .../AttrDef/CSS/TextDecoration.php | 39 + .../library/HTMLPurifier/AttrDef/CSS/URI.php | 69 + .../library/HTMLPurifier/AttrDef/Clone.php | 42 + .../library/HTMLPurifier/AttrDef/Enum.php | 69 + .../HTMLPurifier/AttrDef/HTML/Bool.php | 44 + .../HTMLPurifier/AttrDef/HTML/Class.php | 44 + .../HTMLPurifier/AttrDef/HTML/Color.php | 48 + .../AttrDef/HTML/ContentEditable.php | 16 + .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 36 + .../library/HTMLPurifier/AttrDef/HTML/ID.php | 94 + .../HTMLPurifier/AttrDef/HTML/Length.php | 48 + .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 59 + .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 54 + .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 64 + .../HTMLPurifier/AttrDef/HTML/Pixels.php | 70 + .../library/HTMLPurifier/AttrDef/Integer.php | 84 + .../library/HTMLPurifier/AttrDef/Lang.php | 80 + .../library/HTMLPurifier/AttrDef/Switch.php | 49 + .../library/HTMLPurifier/AttrDef/Text.php | 21 + .../library/HTMLPurifier/AttrDef/URI.php | 96 + .../HTMLPurifier/AttrDef/URI/Email.php | 18 + .../AttrDef/URI/Email/SimpleCheck.php | 29 + .../library/HTMLPurifier/AttrDef/URI/Host.php | 129 + .../library/HTMLPurifier/AttrDef/URI/IPv4.php | 43 + .../library/HTMLPurifier/AttrDef/URI/IPv6.php | 80 + .../library/HTMLPurifier/AttrTransform.php | 57 + .../HTMLPurifier/AttrTransform/Background.php | 27 + .../HTMLPurifier/AttrTransform/BdoDir.php | 26 + .../HTMLPurifier/AttrTransform/BgColor.php | 27 + .../HTMLPurifier/AttrTransform/BoolToCSS.php | 45 + .../HTMLPurifier/AttrTransform/Border.php | 27 + .../HTMLPurifier/AttrTransform/EnumToCSS.php | 62 + .../AttrTransform/ImgRequired.php | 45 + .../HTMLPurifier/AttrTransform/ImgSpace.php | 53 + .../HTMLPurifier/AttrTransform/Input.php | 55 + .../HTMLPurifier/AttrTransform/Lang.php | 30 + .../HTMLPurifier/AttrTransform/Length.php | 42 + .../HTMLPurifier/AttrTransform/Name.php | 33 + .../HTMLPurifier/AttrTransform/NameSync.php | 44 + .../HTMLPurifier/AttrTransform/Nofollow.php | 48 + .../HTMLPurifier/AttrTransform/SafeEmbed.php | 25 + .../HTMLPurifier/AttrTransform/SafeObject.php | 28 + .../HTMLPurifier/AttrTransform/SafeParam.php | 82 + .../AttrTransform/ScriptRequired.php | 24 + .../AttrTransform/TargetBlank.php | 44 + .../AttrTransform/TargetNoopener.php | 36 + .../AttrTransform/TargetNoreferrer.php | 36 + .../HTMLPurifier/AttrTransform/Textarea.php | 28 + .../library/HTMLPurifier/AttrTypes.php | 88 + .../library/HTMLPurifier/AttrValidator.php | 144 + .../library/HTMLPurifier/Bootstrap.php | 87 + .../library/HTMLPurifier/CSSDefinition.php | 212 + .../library/HTMLPurifier/ChildDef.php | 49 + .../HTMLPurifier/ChildDef/Chameleon.php | 55 + .../library/HTMLPurifier/ChildDef/Custom.php | 88 + .../library/HTMLPurifier/ChildDef/Empty.php | 36 + .../library/HTMLPurifier/ChildDef/List.php | 88 + .../HTMLPurifier/ChildDef/Optional.php | 44 + .../HTMLPurifier/ChildDef/Required.php | 110 + .../ChildDef/StrictBlockquote.php | 98 + .../library/HTMLPurifier/ChildDef/Table.php | 207 + .../library/HTMLPurifier/Config.php | 815 + .../library/HTMLPurifier/ConfigSchema.php | 166 + .../ConfigSchema/Builder/ConfigSchema.php | 34 + .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 137 + .../HTMLPurifier/ConfigSchema/Exception.php | 11 + .../HTMLPurifier/ConfigSchema/Interchange.php | 44 + .../ConfigSchema/Interchange/Directive.php | 78 + .../ConfigSchema/Interchange/Id.php | 53 + .../ConfigSchema/InterchangeBuilder.php | 197 + .../HTMLPurifier/ConfigSchema/Validator.php | 224 + .../ConfigSchema/ValidatorAtom.php | 119 + .../HTMLPurifier/ConfigSchema/schema.ser | 1 + .../library/HTMLPurifier/ContentSets.php | 151 + .../library/HTMLPurifier/Context.php | 80 + .../library/HTMLPurifier/Definition.php | 51 + .../library/HTMLPurifier/DefinitionCache.php | 116 + .../DefinitionCache/Decorator.php | 101 + .../DefinitionCache/Decorator/Cleanup.php | 74 + .../DefinitionCache/Decorator/Memory.php | 80 + .../HTMLPurifier/DefinitionCache/Null.php | 70 + .../DefinitionCache/Serializer.php | 281 + .../HTMLPurifier/DefinitionCacheFactory.php | 99 + .../library/HTMLPurifier/Doctype.php | 60 + .../library/HTMLPurifier/DoctypeRegistry.php | 122 + .../library/HTMLPurifier/ElementDef.php | 199 + .../library/HTMLPurifier/Encoder.php | 566 + .../library/HTMLPurifier/EntityLookup.php | 47 + .../HTMLPurifier/EntityLookup/entities.ser | 1 + .../library/HTMLPurifier/EntityParser.php | 202 + .../library/HTMLPurifier/ErrorCollector.php | 214 + .../library/HTMLPurifier/ErrorStruct.php | 68 + .../library/HTMLPurifier/Exception.php | 12 + .../library/HTMLPurifier/Filter.php | 53 + .../Filter/ExtractStyleBlocks.php | 336 + .../library/HTMLPurifier/Filter/YouTube.php | 52 + .../library/HTMLPurifier/Generator.php | 252 + .../library/HTMLPurifier/HTMLDefinition.php | 422 + .../library/HTMLPurifier/HTMLModule.php | 261 + .../library/HTMLPurifier/HTMLModule/Bdo.php | 29 + .../HTMLModule/CommonAttributes.php | 23 + .../library/HTMLPurifier/HTMLModule/Edit.php | 47 + .../library/HTMLPurifier/HTMLModule/Forms.php | 78 + .../HTMLPurifier/HTMLModule/Hypertext.php | 31 + .../HTMLPurifier/HTMLModule/Iframe.php | 37 + .../library/HTMLPurifier/HTMLModule/Image.php | 38 + .../HTMLPurifier/HTMLModule/Legacy.php | 131 + .../library/HTMLPurifier/HTMLModule/List.php | 47 + .../library/HTMLPurifier/HTMLModule/Name.php | 26 + .../HTMLPurifier/HTMLModule/Nofollow.php | 24 + .../HTMLModule/NonXMLCommonAttributes.php | 16 + .../HTMLPurifier/HTMLModule/Object.php | 29 + .../HTMLPurifier/HTMLModule/Presentation.php | 41 + .../HTMLPurifier/HTMLModule/Proprietary.php | 23 + .../library/HTMLPurifier/HTMLModule/Ruby.php | 30 + .../HTMLPurifier/HTMLModule/SafeEmbed.php | 24 + .../HTMLPurifier/HTMLModule/SafeObject.php | 40 + .../HTMLPurifier/HTMLModule/SafeScripting.php | 43 + .../HTMLPurifier/HTMLModule/Scripting.php | 58 + .../HTMLModule/StyleAttribute.php | 33 + .../HTMLPurifier/HTMLModule/Tables.php | 42 + .../HTMLPurifier/HTMLModule/Target.php | 26 + .../HTMLPurifier/HTMLModule/TargetBlank.php | 24 + .../HTMLModule/TargetNoopener.php | 23 + .../HTMLModule/TargetNoreferrer.php | 23 + .../library/HTMLPurifier/HTMLModule/Text.php | 67 + .../library/HTMLPurifier/HTMLModule/Tidy.php | 200 + .../HTMLPurifier/HTMLModule/Tidy/Name.php | 31 + .../HTMLModule/Tidy/Proprietary.php | 32 + .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 40 + .../HTMLModule/Tidy/Transitional.php | 16 + .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 25 + .../HTMLModule/Tidy/XHTMLAndHTML4.php | 89 + .../HTMLModule/XMLCommonAttributes.php | 16 + .../HTMLPurifier/HTMLModuleManager.php | 392 + .../library/HTMLPurifier/IDAccumulator.php | 54 + .../library/HTMLPurifier/Injector.php | 265 + .../HTMLPurifier/Injector/AutoParagraph.php | 333 + .../HTMLPurifier/Injector/DisplayLinkURI.php | 38 + .../library/HTMLPurifier/Injector/Linkify.php | 59 + .../HTMLPurifier/Injector/PurifierLinkify.php | 63 + .../HTMLPurifier/Injector/RemoveEmpty.php | 111 + .../Injector/RemoveSpansWithoutAttributes.php | 83 + .../HTMLPurifier/Injector/SafeObject.php | 104 + .../library/HTMLPurifier/Language.php | 190 + .../HTMLPurifier/Language/messages/en.php | 49 + .../library/HTMLPurifier/LanguageFactory.php | 182 + .../library/HTMLPurifier/Length.php | 146 + .../library/HTMLPurifier/Lexer.php | 301 + .../library/HTMLPurifier/Lexer/DOMLex.php | 391 + .../library/HTMLPurifier/Lexer/DirectLex.php | 430 + .../library/HTMLPurifier/Lexer/PH5P.php | 3157 +++ .../library/HTMLPurifier/Node.php | 46 + .../library/HTMLPurifier/Node/Comment.php | 36 + .../library/HTMLPurifier/Node/Element.php | 56 + .../library/HTMLPurifier/Node/Text.php | 50 + .../library/HTMLPurifier/PercentEncoder.php | 114 + .../library/HTMLPurifier/Printer.php | 190 + .../HTMLPurifier/Printer/CSSDefinition.php | 38 + .../HTMLPurifier/Printer/ConfigForm.php | 397 + .../HTMLPurifier/Printer/HTMLDefinition.php | 261 + .../library/HTMLPurifier/PropertyList.php | 113 + .../HTMLPurifier/PropertyListIterator.php | 41 + .../library/HTMLPurifier/Queue.php | 59 + .../library/HTMLPurifier/Strategy.php | 24 + .../HTMLPurifier/Strategy/Composite.php | 29 + .../library/HTMLPurifier/Strategy/Core.php | 18 + .../HTMLPurifier/Strategy/FixNesting.php | 175 + .../HTMLPurifier/Strategy/MakeWellFormed.php | 596 + .../Strategy/RemoveForeignElements.php | 178 + .../Strategy/ValidateAttributes.php | 39 + .../library/HTMLPurifier/StringHash.php | 46 + .../library/HTMLPurifier/StringHashParser.php | 133 + .../library/HTMLPurifier/TagTransform.php | 35 + .../HTMLPurifier/TagTransform/Font.php | 88 + .../HTMLPurifier/TagTransform/Simple.php | 41 + .../library/HTMLPurifier/Token.php | 92 + .../library/HTMLPurifier/Token/Comment.php | 37 + .../library/HTMLPurifier/Token/Empty.php | 17 + .../library/HTMLPurifier/Token/End.php | 25 + .../library/HTMLPurifier/Token/Start.php | 11 + .../library/HTMLPurifier/Token/Tag.php | 66 + .../library/HTMLPurifier/Token/Text.php | 49 + .../library/HTMLPurifier/TokenFactory.php | 108 + .../htmlpurifier/library/HTMLPurifier/URI.php | 293 + .../library/HTMLPurifier/URIDefinition.php | 110 + .../library/HTMLPurifier/URIFilter.php | 70 + .../URIFilter/DisableExternal.php | 52 + .../URIFilter/DisableExternalResources.php | 25 + .../URIFilter/DisableResources.php | 22 + .../HTMLPurifier/URIFilter/HostBlacklist.php | 44 + .../HTMLPurifier/URIFilter/MakeAbsolute.php | 153 + .../library/HTMLPurifier/URIFilter/Munge.php | 108 + .../HTMLPurifier/URIFilter/SafeIframe.php | 66 + .../library/HTMLPurifier/URIParser.php | 59 + .../library/HTMLPurifier/URIScheme.php | 89 + .../library/HTMLPurifier/URIScheme/data.php | 138 + .../library/HTMLPurifier/URIScheme/file.php | 43 + .../library/HTMLPurifier/URIScheme/ftp.php | 58 + .../library/HTMLPurifier/URIScheme/http.php | 34 + .../library/HTMLPurifier/URIScheme/https.php | 19 + .../library/HTMLPurifier/URIScheme/mailto.php | 37 + .../library/HTMLPurifier/URIScheme/news.php | 34 + .../library/HTMLPurifier/URIScheme/nntp.php | 31 + .../library/HTMLPurifier/URIScheme/tel.php | 45 + .../HTMLPurifier/URISchemeRegistry.php | 73 + .../library/HTMLPurifier/UnitConverter.php | 276 + .../library/HTMLPurifier/VarParser.php | 170 + .../HTMLPurifier/VarParser/Flexible.php | 127 + .../library/HTMLPurifier/VarParser/Native.php | 37 + .../HTMLPurifier/VarParserException.php | 11 + .../library/HTMLPurifier/Zipper.php | 169 + .../php-jsonpointer/src/Rs/Json/Pointer.php | 144 + .../Rs/Json/Pointer/InvalidJsonException.php | 7 + .../Json/Pointer/InvalidPointerException.php | 7 + .../Json/Pointer/NonWalkableJsonException.php | 7 + .../NonexistentValueReferencedException.php | 7 + .../vendor_prefixed/square/square/LICENSE | 10 + .../square/square/example-autoload.php | 55 + .../square/square/src/ApiHelper.php | 148 + .../square/square/src/Apis/ApplePayApi.php | 45 + .../square/src/Apis/BankAccountsApi.php | 70 + .../square/square/src/Apis/BaseApi.php | 37 + .../src/Apis/BookingCustomAttributesApi.php | 327 + .../square/square/src/Apis/BookingsApi.php | 287 + .../square/square/src/Apis/CardsApi.php | 87 + .../square/square/src/Apis/CashDrawersApi.php | 72 + .../square/square/src/Apis/CatalogApi.php | 417 + .../square/square/src/Apis/CheckoutApi.php | 197 + .../src/Apis/CustomerCustomAttributesApi.php | 319 + .../square/src/Apis/CustomerGroupsApi.php | 106 + .../square/src/Apis/CustomerSegmentsApi.php | 52 + .../square/square/src/Apis/CustomersApi.php | 336 + .../square/square/src/Apis/DevicesApi.php | 108 + .../square/square/src/Apis/DisputesApi.php | 180 + .../square/square/src/Apis/EmployeesApi.php | 45 + .../square/square/src/Apis/EventsApi.php | 72 + .../square/src/Apis/GiftCardActivitiesApi.php | 79 + .../square/square/src/Apis/GiftCardsApi.php | 155 + .../square/square/src/Apis/InventoryApi.php | 301 + .../square/square/src/Apis/InvoicesApi.php | 230 + .../square/square/src/Apis/LaborApi.php | 330 + .../src/Apis/LocationCustomAttributesApi.php | 312 + .../square/square/src/Apis/LocationsApi.php | 83 + .../square/square/src/Apis/LoyaltyApi.php | 455 + .../src/Apis/MerchantCustomAttributesApi.php | 313 + .../square/square/src/Apis/MerchantsApi.php | 51 + .../src/Apis/MobileAuthorizationApi.php | 43 + .../square/square/src/Apis/OAuthApi.php | 104 + .../src/Apis/OrderCustomAttributesApi.php | 333 + .../square/square/src/Apis/OrdersApi.php | 200 + .../square/square/src/Apis/PaymentsApi.php | 208 + .../square/square/src/Apis/PayoutsApi.php | 94 + .../square/square/src/Apis/RefundsApi.php | 106 + .../square/square/src/Apis/SitesApi.php | 28 + .../square/square/src/Apis/SnippetsApi.php | 82 + .../square/src/Apis/SubscriptionsApi.php | 263 + .../square/square/src/Apis/TeamApi.php | 263 + .../square/square/src/Apis/TerminalApi.php | 264 + .../square/src/Apis/TransactionsApi.php | 122 + .../square/src/Apis/V1TransactionsApi.php | 77 + .../square/square/src/Apis/VendorsApi.php | 131 + .../src/Apis/WebhookSubscriptionsApi.php | 166 + .../BearerAuthCredentialsBuilder.php | 45 + .../src/Authentication/BearerAuthManager.php | 41 + .../square/src/BearerAuthCredentials.php | 21 + .../square/src/ConfigurationDefaults.php | 30 + .../square/src/ConfigurationInterface.php | 49 + .../square/square/src/Environment.php | 14 + .../square/src/Exceptions/ApiException.php | 58 + .../square/square/src/Http/ApiResponse.php | 95 + .../square/square/src/Http/HttpCallBack.php | 12 + .../square/square/src/Http/HttpContext.php | 30 + .../square/square/src/Http/HttpMethod.php | 18 + .../square/square/src/Http/HttpRequest.php | 12 + .../square/square/src/Http/HttpResponse.php | 12 + .../square/square/src/Models/ACHDetails.php | 140 + .../src/Models/AcceptDisputeResponse.php | 85 + .../src/Models/AcceptedPaymentMethods.php | 170 + .../Models/AccumulateLoyaltyPointsRequest.php | 114 + .../AccumulateLoyaltyPointsResponse.php | 120 + .../square/src/Models/ActionCancelReason.php | 20 + .../square/square/src/Models/ActivityType.php | 269 + .../src/Models/AddGroupToCustomerResponse.php | 59 + .../square/src/Models/AdditionalRecipient.php | 173 + .../square/square/src/Models/Address.php | 559 + .../src/Models/AdjustLoyaltyPointsRequest.php | 136 + .../Models/AdjustLoyaltyPointsResponse.php | 87 + .../square/src/Models/AfterpayDetails.php | 65 + .../square/src/Models/ApplicationDetails.php | 108 + ...pplicationDetailsExternalSquareProduct.php | 21 + .../square/src/Models/ApplicationType.php | 9 + .../square/src/Models/AppointmentSegment.php | 252 + .../square/src/Models/ArchivedState.php | 25 + .../square/square/src/Models/Availability.php | 131 + .../square/square/src/Models/BankAccount.php | 565 + .../src/Models/BankAccountPaymentDetails.php | 316 + .../square/src/Models/BankAccountStatus.php | 27 + .../square/src/Models/BankAccountType.php | 36 + .../Models/BatchChangeInventoryRequest.php | 154 + .../Models/BatchChangeInventoryResponse.php | 113 + .../BatchDeleteCatalogObjectsRequest.php | 72 + .../BatchDeleteCatalogObjectsResponse.php | 111 + .../BatchRetrieveCatalogObjectsRequest.php | 283 + .../BatchRetrieveCatalogObjectsResponse.php | 113 + .../BatchRetrieveInventoryChangesRequest.php | 369 + .../BatchRetrieveInventoryChangesResponse.php | 117 + .../BatchRetrieveInventoryCountsRequest.php | 284 + .../BatchRetrieveInventoryCountsResponse.php | 119 + .../src/Models/BatchRetrieveOrdersRequest.php | 104 + .../Models/BatchRetrieveOrdersResponse.php | 88 + .../BatchUpsertCatalogObjectsRequest.php | 155 + .../BatchUpsertCatalogObjectsResponse.php | 140 + .../square/square/src/Models/Booking.php | 553 + .../src/Models/BookingBookingSource.php | 29 + .../src/Models/BookingCreatorDetails.php | 110 + .../BookingCreatorDetailsCreatorType.php | 19 + .../BookingCustomAttributeDeleteRequest.php | 93 + .../BookingCustomAttributeDeleteResponse.php | 85 + .../BookingCustomAttributeUpsertRequest.php | 133 + .../BookingCustomAttributeUpsertResponse.php | 112 + .../square/src/Models/BookingStatus.php | 36 + .../square/square/src/Models/BreakType.php | 255 + .../src/Models/Builders/ACHDetailsBuilder.php | 91 + .../Builders/AcceptDisputeResponseBuilder.php | 59 + .../AcceptedPaymentMethodsBuilder.php | 109 + .../AccumulateLoyaltyPointsRequestBuilder.php | 42 + ...AccumulateLoyaltyPointsResponseBuilder.php | 69 + .../AddGroupToCustomerResponseBuilder.php | 48 + .../Builders/AdditionalRecipientBuilder.php | 77 + .../src/Models/Builders/AddressBuilder.php | 281 + .../AdjustLoyaltyPointsRequestBuilder.php | 59 + .../AdjustLoyaltyPointsResponseBuilder.php | 59 + .../Builders/AfterpayDetailsBuilder.php | 55 + .../Builders/ApplicationDetailsBuilder.php | 65 + .../Builders/AppointmentSegmentBuilder.php | 123 + .../Models/Builders/AvailabilityBuilder.php | 84 + .../Models/Builders/BankAccountBuilder.php | 166 + .../BankAccountPaymentDetailsBuilder.php | 175 + .../BatchChangeInventoryRequestBuilder.php | 76 + .../BatchChangeInventoryResponseBuilder.php | 70 + ...atchDeleteCatalogObjectsRequestBuilder.php | 55 + ...tchDeleteCatalogObjectsResponseBuilder.php | 68 + ...chRetrieveCatalogObjectsRequestBuilder.php | 111 + ...hRetrieveCatalogObjectsResponseBuilder.php | 69 + ...RetrieveInventoryChangesRequestBuilder.php | 181 + ...etrieveInventoryChangesResponseBuilder.php | 69 + ...hRetrieveInventoryCountsRequestBuilder.php | 145 + ...RetrieveInventoryCountsResponseBuilder.php | 69 + .../BatchRetrieveOrdersRequestBuilder.php | 57 + .../BatchRetrieveOrdersResponseBuilder.php | 59 + ...atchUpsertCatalogObjectsRequestBuilder.php | 41 + ...tchUpsertCatalogObjectsResponseBuilder.php | 80 + .../src/Models/Builders/BookingBuilder.php | 258 + .../Builders/BookingCreatorDetailsBuilder.php | 67 + ...ingCustomAttributeDeleteRequestBuilder.php | 40 + ...ngCustomAttributeDeleteResponseBuilder.php | 58 + ...ingCustomAttributeUpsertRequestBuilder.php | 59 + ...ngCustomAttributeUpsertResponseBuilder.php | 69 + .../src/Models/Builders/BreakTypeBuilder.php | 82 + .../BulkCreateCustomerDataBuilder.php | 221 + .../BulkCreateCustomersRequestBuilder.php | 40 + .../BulkCreateCustomersResponseBuilder.php | 59 + .../BulkCreateTeamMembersRequestBuilder.php | 40 + .../BulkCreateTeamMembersResponseBuilder.php | 59 + .../BulkCreateVendorsRequestBuilder.php | 40 + .../BulkCreateVendorsResponseBuilder.php | 59 + ...eBookingCustomAttributesRequestBuilder.php | 40 + ...BookingCustomAttributesResponseBuilder.php | 59 + .../BulkDeleteCustomersRequestBuilder.php | 39 + .../BulkDeleteCustomersResponseBuilder.php | 59 + ...LocationCustomAttributesRequestBuilder.php | 40 + ...ionCustomAttributeDeleteRequestBuilder.php | 49 + ...ocationCustomAttributesResponseBuilder.php | 51 + ...onCustomAttributeDeleteResponseBuilder.php | 60 + ...MerchantCustomAttributesRequestBuilder.php | 40 + ...antCustomAttributeDeleteRequestBuilder.php | 49 + ...erchantCustomAttributesResponseBuilder.php | 51 + ...ntCustomAttributeDeleteResponseBuilder.php | 50 + ...eteOrderCustomAttributesRequestBuilder.php | 40 + ...tesRequestDeleteCustomAttributeBuilder.php | 49 + ...teOrderCustomAttributesResponseBuilder.php | 51 + .../BulkRetrieveBookingsRequestBuilder.php | 39 + .../BulkRetrieveBookingsResponseBuilder.php | 59 + .../BulkRetrieveCustomersRequestBuilder.php | 39 + .../BulkRetrieveCustomersResponseBuilder.php | 59 + ...eamMemberBookingProfilesRequestBuilder.php | 39 + ...amMemberBookingProfilesResponseBuilder.php | 59 + .../BulkRetrieveVendorsRequestBuilder.php | 55 + .../BulkRetrieveVendorsResponseBuilder.php | 59 + .../Builders/BulkSwapPlanRequestBuilder.php | 41 + .../Builders/BulkSwapPlanResponseBuilder.php | 58 + .../BulkUpdateCustomerDataBuilder.php | 231 + .../BulkUpdateCustomersRequestBuilder.php | 40 + .../BulkUpdateCustomersResponseBuilder.php | 59 + .../BulkUpdateTeamMembersRequestBuilder.php | 40 + .../BulkUpdateTeamMembersResponseBuilder.php | 59 + .../BulkUpdateVendorsRequestBuilder.php | 40 + .../BulkUpdateVendorsResponseBuilder.php | 59 + ...tBookingCustomAttributesRequestBuilder.php | 40 + ...BookingCustomAttributesResponseBuilder.php | 59 + ...CustomerCustomAttributesRequestBuilder.php | 40 + ...merCustomAttributeUpsertRequestBuilder.php | 61 + ...ustomerCustomAttributesResponseBuilder.php | 59 + ...erCustomAttributeUpsertResponseBuilder.php | 71 + ...LocationCustomAttributesRequestBuilder.php | 40 + ...ionCustomAttributeUpsertRequestBuilder.php | 61 + ...ocationCustomAttributesResponseBuilder.php | 59 + ...onCustomAttributeUpsertResponseBuilder.php | 71 + ...MerchantCustomAttributesRequestBuilder.php | 40 + ...antCustomAttributeUpsertRequestBuilder.php | 61 + ...erchantCustomAttributesResponseBuilder.php | 59 + ...ntCustomAttributeUpsertResponseBuilder.php | 71 + ...ertOrderCustomAttributesRequestBuilder.php | 40 + ...tesRequestUpsertCustomAttributeBuilder.php | 59 + ...rtOrderCustomAttributesResponseBuilder.php | 51 + .../BusinessAppointmentSettingsBuilder.php | 240 + .../BusinessBookingProfileBuilder.php | 150 + .../Models/Builders/BusinessHoursBuilder.php | 56 + .../Builders/BusinessHoursPeriodBuilder.php | 83 + .../Builders/BuyNowPayLaterDetailsBuilder.php | 77 + .../CalculateLoyaltyPointsRequestBuilder.php | 84 + .../CalculateLoyaltyPointsResponseBuilder.php | 68 + .../Builders/CalculateOrderRequestBuilder.php | 59 + .../CalculateOrderResponseBuilder.php | 59 + .../Builders/CancelBookingRequestBuilder.php | 73 + .../Builders/CancelBookingResponseBuilder.php | 59 + .../Builders/CancelInvoiceRequestBuilder.php | 39 + .../Builders/CancelInvoiceResponseBuilder.php | 59 + .../CancelLoyaltyPromotionResponseBuilder.php | 59 + ...lPaymentByIdempotencyKeyRequestBuilder.php | 39 + ...PaymentByIdempotencyKeyResponseBuilder.php | 48 + .../Builders/CancelPaymentResponseBuilder.php | 59 + .../CancelSubscriptionResponseBuilder.php | 70 + .../CancelTerminalActionResponseBuilder.php | 59 + .../CancelTerminalCheckoutResponseBuilder.php | 59 + .../CancelTerminalRefundResponseBuilder.php | 59 + .../CaptureTransactionResponseBuilder.php | 48 + .../src/Models/Builders/CardBuilder.php | 248 + .../Builders/CardPaymentDetailsBuilder.php | 305 + .../Builders/CardPaymentTimelineBuilder.php | 91 + .../Models/Builders/CashAppDetailsBuilder.php | 83 + .../Builders/CashDrawerDeviceBuilder.php | 65 + .../Builders/CashDrawerShiftBuilder.php | 281 + .../Builders/CashDrawerShiftEventBuilder.php | 106 + .../CashDrawerShiftSummaryBuilder.php | 190 + .../Builders/CashPaymentDetailsBuilder.php | 50 + .../CatalogAvailabilityPeriodBuilder.php | 83 + .../Builders/CatalogCategoryBuilder.php | 206 + ...atalogCustomAttributeDefinitionBuilder.php | 151 + ...AttributeDefinitionNumberConfigBuilder.php | 55 + ...ributeDefinitionSelectionConfigBuilder.php | 74 + ...nConfigCustomAttributeSelectionBuilder.php | 59 + ...AttributeDefinitionStringConfigBuilder.php | 55 + .../CatalogCustomAttributeValueBuilder.php | 157 + .../Builders/CatalogDiscountBuilder.php | 150 + .../Builders/CatalogEcomSeoDataBuilder.php | 91 + .../Builders/CatalogIdMappingBuilder.php | 73 + .../Models/Builders/CatalogImageBuilder.php | 109 + .../Builders/CatalogInfoResponseBuilder.php | 70 + .../CatalogInfoResponseLimitsBuilder.php | 235 + .../Models/Builders/CatalogItemBuilder.php | 453 + ...talogItemFoodAndBeverageDetailsBuilder.php | 93 + ...everageDetailsDietaryPreferenceBuilder.php | 75 + ...oodAndBeverageDetailsIngredientBuilder.php | 75 + .../CatalogItemModifierListInfoBuilder.php | 130 + .../Builders/CatalogItemOptionBuilder.php | 128 + .../CatalogItemOptionForItemBuilder.php | 55 + .../CatalogItemOptionValueBuilder.php | 127 + ...ItemOptionValueForItemVariationBuilder.php | 73 + .../Builders/CatalogItemVariationBuilder.php | 379 + .../CatalogMeasurementUnitBuilder.php | 66 + .../Builders/CatalogModifierBuilder.php | 139 + .../Builders/CatalogModifierListBuilder.php | 184 + .../CatalogModifierOverrideBuilder.php | 57 + .../Builders/CatalogObjectBatchBuilder.php | 40 + .../Models/Builders/CatalogObjectBuilder.php | 379 + .../Builders/CatalogObjectCategoryBuilder.php | 65 + .../CatalogObjectReferenceBuilder.php | 73 + .../Builders/CatalogPricingRuleBuilder.php | 256 + .../Builders/CatalogProductSetBuilder.php | 163 + .../Models/Builders/CatalogQueryBuilder.php | 147 + .../Builders/CatalogQueryExactBuilder.php | 40 + ...emVariationsForItemOptionValuesBuilder.php | 55 + ...CatalogQueryItemsForItemOptionsBuilder.php | 55 + ...atalogQueryItemsForModifierListBuilder.php | 39 + .../CatalogQueryItemsForTaxBuilder.php | 39 + .../Builders/CatalogQueryPrefixBuilder.php | 40 + .../Builders/CatalogQueryRangeBuilder.php | 75 + .../Builders/CatalogQuerySetBuilder.php | 40 + .../CatalogQuerySortedAttributeBuilder.php | 67 + .../Builders/CatalogQueryTextBuilder.php | 39 + .../Builders/CatalogQuickAmountBuilder.php | 77 + .../CatalogQuickAmountsSettingsBuilder.php | 76 + .../CatalogStockConversionBuilder.php | 41 + .../CatalogSubscriptionPlanBuilder.php | 131 + ...atalogSubscriptionPlanVariationBuilder.php | 113 + .../src/Models/Builders/CatalogTaxBuilder.php | 147 + .../Builders/CatalogTimePeriodBuilder.php | 55 + .../Models/Builders/CatalogV1IdBuilder.php | 73 + .../CategoryPathToRootNodeBuilder.php | 73 + .../ChangeBillingAnchorDateRequestBuilder.php | 73 + ...ChangeBillingAnchorDateResponseBuilder.php | 70 + ...hargeRequestAdditionalRecipientBuilder.php | 42 + .../Models/Builders/ChargeRequestBuilder.php | 243 + .../Models/Builders/ChargeResponseBuilder.php | 59 + .../src/Models/Builders/CheckoutBuilder.php | 188 + ...heckoutLocationSettingsBrandingBuilder.php | 75 + .../CheckoutLocationSettingsBuilder.php | 135 + ...CheckoutLocationSettingsCouponsBuilder.php | 55 + .../CheckoutLocationSettingsPolicyBuilder.php | 91 + ...CheckoutLocationSettingsTippingBuilder.php | 120 + .../CheckoutMerchantSettingsBuilder.php | 58 + ...sPaymentMethodsAfterpayClearpayBuilder.php | 68 + ...fterpayClearpayEligibilityRangeBuilder.php | 43 + ...tMerchantSettingsPaymentMethodsBuilder.php | 79 + ...ingsPaymentMethodsPaymentMethodBuilder.php | 55 + .../Builders/CheckoutOptionsBuilder.php | 215 + .../Builders/ClearpayDetailsBuilder.php | 55 + .../Builders/CloneOrderRequestBuilder.php | 67 + .../Builders/CloneOrderResponseBuilder.php | 59 + .../Models/Builders/CollectedDataBuilder.php | 47 + .../CompletePaymentRequestBuilder.php | 55 + .../CompletePaymentResponseBuilder.php | 59 + .../src/Models/Builders/ComponentBuilder.php | 94 + .../Builders/ConfirmationDecisionBuilder.php | 47 + .../Builders/ConfirmationOptionsBuilder.php | 70 + .../Models/Builders/CoordinatesBuilder.php | 73 + ...ustomAttributeDefinitionRequestBuilder.php | 50 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../Builders/CreateBookingRequestBuilder.php | 50 + .../Builders/CreateBookingResponseBuilder.php | 59 + .../CreateBreakTypeRequestBuilder.php | 50 + .../CreateBreakTypeResponseBuilder.php | 59 + .../Builders/CreateCardRequestBuilder.php | 52 + .../Builders/CreateCardResponseBuilder.php | 59 + .../CreateCatalogImageRequestBuilder.php | 61 + .../CreateCatalogImageResponseBuilder.php | 59 + .../Builders/CreateCheckoutRequestBuilder.php | 113 + .../CreateCheckoutResponseBuilder.php | 59 + .../CreateCustomerCardRequestBuilder.php | 70 + .../CreateCustomerCardResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 50 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../CreateCustomerGroupRequestBuilder.php | 50 + .../CreateCustomerGroupResponseBuilder.php | 59 + .../Builders/CreateCustomerRequestBuilder.php | 159 + .../CreateCustomerResponseBuilder.php | 59 + .../CreateDeviceCodeRequestBuilder.php | 41 + .../CreateDeviceCodeResponseBuilder.php | 59 + ...reateDisputeEvidenceFileRequestBuilder.php | 59 + ...eateDisputeEvidenceFileResponseBuilder.php | 59 + ...reateDisputeEvidenceTextRequestBuilder.php | 50 + ...eateDisputeEvidenceTextResponseBuilder.php | 59 + .../CreateGiftCardActivityRequestBuilder.php | 41 + .../CreateGiftCardActivityResponseBuilder.php | 59 + .../Builders/CreateGiftCardRequestBuilder.php | 42 + .../CreateGiftCardResponseBuilder.php | 59 + .../CreateInvoiceAttachmentRequestBuilder.php | 57 + ...CreateInvoiceAttachmentResponseBuilder.php | 59 + .../Builders/CreateInvoiceRequestBuilder.php | 50 + .../Builders/CreateInvoiceResponseBuilder.php | 59 + .../Builders/CreateJobRequestBuilder.php | 41 + .../Builders/CreateJobResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 50 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../Builders/CreateLocationRequestBuilder.php | 48 + .../CreateLocationResponseBuilder.php | 59 + .../CreateLoyaltyAccountRequestBuilder.php | 41 + .../CreateLoyaltyAccountResponseBuilder.php | 59 + .../CreateLoyaltyPromotionRequestBuilder.php | 41 + .../CreateLoyaltyPromotionResponseBuilder.php | 59 + .../CreateLoyaltyRewardRequestBuilder.php | 41 + .../CreateLoyaltyRewardResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 50 + ...stomAttributeDefinitionResponseBuilder.php | 59 + ...eMobileAuthorizationCodeRequestBuilder.php | 47 + ...MobileAuthorizationCodeResponseBuilder.php | 68 + ...ustomAttributeDefinitionRequestBuilder.php | 50 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../Builders/CreateOrderRequestBuilder.php | 58 + .../Builders/CreateOrderResponseBuilder.php | 59 + .../CreatePaymentLinkRequestBuilder.php | 111 + .../CreatePaymentLinkResponseBuilder.php | 70 + .../Builders/CreatePaymentRequestBuilder.php | 276 + .../Builders/CreatePaymentResponseBuilder.php | 59 + .../Builders/CreateRefundRequestBuilder.php | 52 + .../Builders/CreateRefundResponseBuilder.php | 59 + .../Builders/CreateShiftRequestBuilder.php | 50 + .../Builders/CreateShiftResponseBuilder.php | 59 + .../CreateSubscriptionRequestBuilder.php | 153 + .../CreateSubscriptionResponseBuilder.php | 59 + .../CreateTeamMemberRequestBuilder.php | 58 + .../CreateTeamMemberResponseBuilder.php | 59 + .../CreateTerminalActionRequestBuilder.php | 41 + .../CreateTerminalActionResponseBuilder.php | 59 + .../CreateTerminalCheckoutRequestBuilder.php | 41 + .../CreateTerminalCheckoutResponseBuilder.php | 59 + .../CreateTerminalRefundRequestBuilder.php | 50 + .../CreateTerminalRefundResponseBuilder.php | 59 + .../Builders/CreateVendorRequestBuilder.php | 50 + .../Builders/CreateVendorResponseBuilder.php | 59 + ...reateWebhookSubscriptionRequestBuilder.php | 50 + ...eateWebhookSubscriptionResponseBuilder.php | 59 + .../Builders/CustomAttributeBuilder.php | 124 + .../CustomAttributeDefinitionBuilder.php | 149 + .../Builders/CustomAttributeFilterBuilder.php | 138 + .../Models/Builders/CustomFieldBuilder.php | 39 + .../Builders/CustomerAddressFilterBuilder.php | 58 + .../src/Models/Builders/CustomerBuilder.php | 337 + .../CustomerCreationSourceFilterBuilder.php | 65 + .../CustomerCustomAttributeFilterBuilder.php | 61 + ...tomerCustomAttributeFilterValueBuilder.php | 130 + .../CustomerCustomAttributeFiltersBuilder.php | 56 + .../Builders/CustomerDetailsBuilder.php | 73 + .../Models/Builders/CustomerFilterBuilder.php | 132 + .../Models/Builders/CustomerGroupBuilder.php | 69 + .../Builders/CustomerPreferencesBuilder.php | 55 + .../Models/Builders/CustomerQueryBuilder.php | 59 + .../Builders/CustomerSegmentBuilder.php | 69 + .../Models/Builders/CustomerSortBuilder.php | 57 + .../Models/Builders/CustomerTaxIdsBuilder.php | 55 + .../Builders/CustomerTextFilterBuilder.php | 73 + .../Builders/DataCollectionOptionsBuilder.php | 52 + .../src/Models/Builders/DateRangeBuilder.php | 73 + ...stomAttributeDefinitionResponseBuilder.php | 48 + ...eBookingCustomAttributeResponseBuilder.php | 48 + .../DeleteBreakTypeResponseBuilder.php | 48 + .../DeleteCatalogObjectResponseBuilder.php | 68 + .../DeleteCustomerCardResponseBuilder.php | 48 + ...stomAttributeDefinitionResponseBuilder.php | 48 + ...CustomerCustomAttributeResponseBuilder.php | 48 + .../DeleteCustomerGroupResponseBuilder.php | 48 + .../Builders/DeleteCustomerRequestBuilder.php | 47 + .../DeleteCustomerResponseBuilder.php | 48 + .../DeleteDisputeEvidenceResponseBuilder.php | 48 + ...DeleteInvoiceAttachmentResponseBuilder.php | 48 + .../Builders/DeleteInvoiceRequestBuilder.php | 47 + .../Builders/DeleteInvoiceResponseBuilder.php | 48 + ...stomAttributeDefinitionResponseBuilder.php | 48 + ...LocationCustomAttributeResponseBuilder.php | 48 + .../DeleteLoyaltyRewardResponseBuilder.php | 48 + ...stomAttributeDefinitionResponseBuilder.php | 48 + ...MerchantCustomAttributeResponseBuilder.php | 48 + ...stomAttributeDefinitionResponseBuilder.php | 48 + ...eteOrderCustomAttributeResponseBuilder.php | 48 + .../DeletePaymentLinkResponseBuilder.php | 68 + .../Builders/DeleteShiftResponseBuilder.php | 48 + .../Builders/DeleteSnippetResponseBuilder.php | 48 + ...eleteSubscriptionActionResponseBuilder.php | 59 + ...leteWebhookSubscriptionResponseBuilder.php | 48 + ...reateDisputeEvidenceFileRequestBuilder.php | 67 + ...eateDisputeEvidenceFileResponseBuilder.php | 59 + ...reateDisputeEvidenceTextRequestBuilder.php | 50 + ...eateDisputeEvidenceTextResponseBuilder.php | 59 + .../Models/Builders/DestinationBuilder.php | 57 + .../Builders/DestinationDetailsBuilder.php | 70 + ...inationDetailsCardRefundDetailsBuilder.php | 84 + ...inationDetailsCashRefundDetailsBuilder.php | 50 + ...ionDetailsExternalRefundDetailsBuilder.php | 58 + .../Builders/DeviceAttributesBuilder.php | 131 + .../src/Models/Builders/DeviceBuilder.php | 80 + .../Builders/DeviceCheckoutOptionsBuilder.php | 104 + .../src/Models/Builders/DeviceCodeBuilder.php | 153 + ...ponentDetailsApplicationDetailsBuilder.php | 93 + ...eComponentDetailsBatteryDetailsBuilder.php | 65 + ...mponentDetailsCardReaderDetailsBuilder.php | 47 + ...ComponentDetailsEthernetDetailsBuilder.php | 73 + ...viceComponentDetailsMeasurementBuilder.php | 55 + ...tDetailsNetworkInterfaceDetailsBuilder.php | 55 + ...viceComponentDetailsWiFiDetailsBuilder.php | 120 + .../Models/Builders/DeviceDetailsBuilder.php | 91 + .../Models/Builders/DeviceMetadataBuilder.php | 253 + .../Models/Builders/DeviceStatusBuilder.php | 47 + .../Builders/DigitalWalletDetailsBuilder.php | 84 + .../Builders/DisableCardResponseBuilder.php | 59 + .../Builders/DisableEventsResponseBuilder.php | 48 + .../DismissTerminalActionResponseBuilder.php | 59 + ...DismissTerminalCheckoutResponseBuilder.php | 59 + .../DismissTerminalRefundResponseBuilder.php | 59 + .../src/Models/Builders/DisputeBuilder.php | 255 + .../Builders/DisputeEvidenceBuilder.php | 140 + .../Builders/DisputeEvidenceFileBuilder.php | 73 + .../Builders/DisputedPaymentBuilder.php | 55 + .../src/Models/Builders/EmployeeBuilder.php | 185 + .../Models/Builders/EmployeeWageBuilder.php | 94 + .../Builders/EnableEventsResponseBuilder.php | 48 + .../src/Models/Builders/ErrorBuilder.php | 60 + .../src/Models/Builders/EventBuilder.php | 130 + .../src/Models/Builders/EventDataBuilder.php | 101 + .../Models/Builders/EventMetadataBuilder.php | 73 + .../Builders/EventTypeMetadataBuilder.php | 67 + .../ExternalPaymentDetailsBuilder.php | 69 + .../Models/Builders/FilterValueBuilder.php | 91 + .../Builders/FloatNumberRangeBuilder.php | 73 + .../Models/Builders/FulfillmentBuilder.php | 147 + .../FulfillmentDeliveryDetailsBuilder.php | 388 + .../FulfillmentFulfillmentEntryBuilder.php | 76 + .../FulfillmentPickupDetailsBuilder.php | 283 + ...kupDetailsCurbsidePickupDetailsBuilder.php | 73 + .../Builders/FulfillmentRecipientBuilder.php | 120 + .../FulfillmentShipmentDetailsBuilder.php | 260 + .../GetBankAccountByV1IdResponseBuilder.php | 59 + .../GetBankAccountResponseBuilder.php | 59 + .../Builders/GetBreakTypeResponseBuilder.php | 59 + .../Builders/GetDeviceCodeResponseBuilder.php | 59 + .../Builders/GetDeviceResponseBuilder.php | 59 + .../GetEmployeeWageResponseBuilder.php | 59 + .../Builders/GetInvoiceResponseBuilder.php | 59 + .../GetPaymentRefundResponseBuilder.php | 59 + .../Builders/GetPaymentResponseBuilder.php | 59 + .../Builders/GetPayoutResponseBuilder.php | 59 + .../Builders/GetShiftResponseBuilder.php | 59 + .../GetTeamMemberWageResponseBuilder.php | 59 + .../GetTerminalActionResponseBuilder.php | 59 + .../GetTerminalCheckoutResponseBuilder.php | 59 + .../GetTerminalRefundResponseBuilder.php | 59 + .../GiftCardActivityActivateBuilder.php | 120 + ...GiftCardActivityAdjustDecrementBuilder.php | 41 + ...GiftCardActivityAdjustIncrementBuilder.php | 41 + .../Builders/GiftCardActivityBlockBuilder.php | 37 + .../Builders/GiftCardActivityBuilder.php | 272 + .../GiftCardActivityClearBalanceBuilder.php | 39 + .../GiftCardActivityDeactivateBuilder.php | 39 + .../GiftCardActivityImportBuilder.php | 40 + .../GiftCardActivityImportReversalBuilder.php | 40 + .../Builders/GiftCardActivityLoadBuilder.php | 120 + .../GiftCardActivityRedeemBuilder.php | 78 + .../GiftCardActivityRefundBuilder.php | 94 + ...CardActivityTransferBalanceFromBuilder.php | 41 + ...ftCardActivityTransferBalanceToBuilder.php | 41 + .../GiftCardActivityUnblockBuilder.php | 37 + ...dActivityUnlinkedActivityRefundBuilder.php | 68 + .../src/Models/Builders/GiftCardBuilder.php | 118 + .../Builders/InventoryAdjustmentBuilder.php | 294 + .../InventoryAdjustmentGroupBuilder.php | 77 + .../Builders/InventoryChangeBuilder.php | 101 + .../Models/Builders/InventoryCountBuilder.php | 139 + .../InventoryPhysicalCountBuilder.php | 222 + .../Builders/InventoryTransferBuilder.php | 240 + .../InvoiceAcceptedPaymentMethodsBuilder.php | 127 + .../Builders/InvoiceAttachmentBuilder.php | 107 + .../src/Models/Builders/InvoiceBuilder.php | 371 + .../Builders/InvoiceCustomFieldBuilder.php | 83 + .../Models/Builders/InvoiceFilterBuilder.php | 57 + .../InvoicePaymentReminderBuilder.php | 103 + .../Builders/InvoicePaymentRequestBuilder.php | 217 + .../Models/Builders/InvoiceQueryBuilder.php | 51 + .../Builders/InvoiceRecipientBuilder.php | 127 + .../InvoiceRecipientTaxIdsBuilder.php | 47 + .../Models/Builders/InvoiceSortBuilder.php | 47 + .../ItemVariationLocationOverridesBuilder.php | 142 + .../Models/Builders/JobAssignmentBuilder.php | 114 + .../square/src/Models/Builders/JobBuilder.php | 113 + .../LinkCustomerToGiftCardRequestBuilder.php | 39 + .../LinkCustomerToGiftCardResponseBuilder.php | 59 + .../ListBankAccountsRequestBuilder.php | 91 + .../ListBankAccountsResponseBuilder.php | 69 + ...stomAttributeDefinitionsRequestBuilder.php | 73 + ...tomAttributeDefinitionsResponseBuilder.php | 69 + ...tBookingCustomAttributesRequestBuilder.php | 91 + ...BookingCustomAttributesResponseBuilder.php | 69 + .../Builders/ListBookingsRequestBuilder.php | 163 + .../Builders/ListBookingsResponseBuilder.php | 69 + .../Builders/ListBreakTypesRequestBuilder.php | 91 + .../ListBreakTypesResponseBuilder.php | 69 + .../Builders/ListCardsRequestBuilder.php | 119 + .../Builders/ListCardsResponseBuilder.php | 69 + ...istCashDrawerShiftEventsRequestBuilder.php | 75 + ...stCashDrawerShiftEventsResponseBuilder.php | 69 + .../ListCashDrawerShiftsRequestBuilder.php | 121 + .../ListCashDrawerShiftsResponseBuilder.php | 69 + .../Builders/ListCatalogRequestBuilder.php | 91 + .../Builders/ListCatalogResponseBuilder.php | 69 + ...stomAttributeDefinitionsRequestBuilder.php | 73 + ...tomAttributeDefinitionsResponseBuilder.php | 69 + ...CustomerCustomAttributesRequestBuilder.php | 91 + ...ustomerCustomAttributesResponseBuilder.php | 69 + .../ListCustomerGroupsRequestBuilder.php | 73 + .../ListCustomerGroupsResponseBuilder.php | 69 + .../ListCustomerSegmentsRequestBuilder.php | 73 + .../ListCustomerSegmentsResponseBuilder.php | 69 + .../Builders/ListCustomersRequestBuilder.php | 111 + .../Builders/ListCustomersResponseBuilder.php | 79 + .../ListDeviceCodesRequestBuilder.php | 101 + .../ListDeviceCodesResponseBuilder.php | 69 + .../Builders/ListDevicesRequestBuilder.php | 101 + .../Builders/ListDevicesResponseBuilder.php | 69 + .../ListDisputeEvidenceRequestBuilder.php | 55 + .../ListDisputeEvidenceResponseBuilder.php | 69 + .../Builders/ListDisputesRequestBuilder.php | 91 + .../Builders/ListDisputesResponseBuilder.php | 69 + .../ListEmployeeWagesRequestBuilder.php | 91 + .../ListEmployeeWagesResponseBuilder.php | 69 + .../Builders/ListEmployeesRequestBuilder.php | 101 + .../Builders/ListEmployeesResponseBuilder.php | 69 + .../Builders/ListEventTypesRequestBuilder.php | 55 + .../ListEventTypesResponseBuilder.php | 69 + .../ListGiftCardActivitiesRequestBuilder.php | 181 + .../ListGiftCardActivitiesResponseBuilder.php | 69 + .../Builders/ListGiftCardsRequestBuilder.php | 127 + .../Builders/ListGiftCardsResponseBuilder.php | 69 + .../Builders/ListInvoicesRequestBuilder.php | 75 + .../Builders/ListInvoicesResponseBuilder.php | 69 + .../Builders/ListJobsRequestBuilder.php | 55 + .../Builders/ListJobsResponseBuilder.php | 69 + ...tLocationBookingProfilesRequestBuilder.php | 73 + ...LocationBookingProfilesResponseBuilder.php | 69 + ...stomAttributeDefinitionsRequestBuilder.php | 83 + ...tomAttributeDefinitionsResponseBuilder.php | 69 + ...LocationCustomAttributesRequestBuilder.php | 101 + ...ocationCustomAttributesResponseBuilder.php | 69 + .../Builders/ListLocationsResponseBuilder.php | 59 + .../ListLoyaltyProgramsResponseBuilder.php | 59 + .../ListLoyaltyPromotionsRequestBuilder.php | 83 + .../ListLoyaltyPromotionsResponseBuilder.php | 69 + ...stomAttributeDefinitionsRequestBuilder.php | 83 + ...tomAttributeDefinitionsResponseBuilder.php | 69 + ...MerchantCustomAttributesRequestBuilder.php | 101 + ...erchantCustomAttributesResponseBuilder.php | 69 + .../Builders/ListMerchantsRequestBuilder.php | 55 + .../Builders/ListMerchantsResponseBuilder.php | 69 + ...stomAttributeDefinitionsRequestBuilder.php | 83 + ...tomAttributeDefinitionsResponseBuilder.php | 61 + ...istOrderCustomAttributesRequestBuilder.php | 101 + ...stOrderCustomAttributesResponseBuilder.php | 69 + .../ListPaymentLinksRequestBuilder.php | 73 + .../ListPaymentLinksResponseBuilder.php | 69 + .../ListPaymentRefundsRequestBuilder.php | 181 + .../ListPaymentRefundsResponseBuilder.php | 69 + .../Builders/ListPaymentsRequestBuilder.php | 299 + .../Builders/ListPaymentsResponseBuilder.php | 69 + .../ListPayoutEntriesRequestBuilder.php | 83 + .../ListPayoutEntriesResponseBuilder.php | 69 + .../Builders/ListPayoutsRequestBuilder.php | 147 + .../Builders/ListPayoutsResponseBuilder.php | 69 + .../Builders/ListRefundsRequestBuilder.php | 101 + .../Builders/ListRefundsResponseBuilder.php | 69 + .../Builders/ListSitesResponseBuilder.php | 59 + .../ListSubscriptionEventsRequestBuilder.php | 73 + .../ListSubscriptionEventsResponseBuilder.php | 69 + ...eamMemberBookingProfilesRequestBuilder.php | 109 + ...amMemberBookingProfilesResponseBuilder.php | 69 + .../ListTeamMemberWagesRequestBuilder.php | 91 + .../ListTeamMemberWagesResponseBuilder.php | 69 + .../ListTransactionsRequestBuilder.php | 101 + .../ListTransactionsResponseBuilder.php | 69 + .../ListWebhookEventTypesRequestBuilder.php | 55 + .../ListWebhookEventTypesResponseBuilder.php | 69 + ...ListWebhookSubscriptionsRequestBuilder.php | 101 + ...istWebhookSubscriptionsResponseBuilder.php | 69 + .../ListWorkweekConfigsRequestBuilder.php | 73 + .../ListWorkweekConfigsResponseBuilder.php | 69 + .../LocationBookingProfileBuilder.php | 91 + .../src/Models/Builders/LocationBuilder.php | 407 + .../Models/Builders/LoyaltyAccountBuilder.php | 155 + ...ltyAccountExpiringPointDeadlineBuilder.php | 40 + .../Builders/LoyaltyAccountMappingBuilder.php | 75 + .../LoyaltyEventAccumulatePointsBuilder.php | 83 + ...yEventAccumulatePromotionPointsBuilder.php | 60 + .../LoyaltyEventAdjustPointsBuilder.php | 67 + .../Models/Builders/LoyaltyEventBuilder.php | 141 + .../LoyaltyEventCreateRewardBuilder.php | 50 + .../LoyaltyEventDateTimeFilterBuilder.php | 40 + .../LoyaltyEventDeleteRewardBuilder.php | 50 + .../LoyaltyEventExpirePointsBuilder.php | 40 + .../Builders/LoyaltyEventFilterBuilder.php | 92 + .../LoyaltyEventLocationFilterBuilder.php | 39 + ...oyaltyEventLoyaltyAccountFilterBuilder.php | 39 + .../LoyaltyEventOrderFilterBuilder.php | 39 + .../Builders/LoyaltyEventOtherBuilder.php | 40 + .../Builders/LoyaltyEventQueryBuilder.php | 48 + .../LoyaltyEventRedeemRewardBuilder.php | 59 + .../LoyaltyEventTypeFilterBuilder.php | 39 + .../LoyaltyProgramAccrualRuleBuilder.php | 101 + ...yProgramAccrualRuleCategoryDataBuilder.php | 39 + ...ramAccrualRuleItemVariationDataBuilder.php | 39 + ...altyProgramAccrualRuleSpendDataBuilder.php | 77 + ...altyProgramAccrualRuleVisitDataBuilder.php | 50 + .../Models/Builders/LoyaltyProgramBuilder.php | 155 + .../LoyaltyProgramExpirationPolicyBuilder.php | 39 + .../LoyaltyProgramRewardDefinitionBuilder.php | 81 + .../LoyaltyProgramRewardTierBuilder.php | 82 + .../LoyaltyProgramTerminologyBuilder.php | 40 + ...yaltyPromotionAvailableTimeDataBuilder.php | 59 + .../Builders/LoyaltyPromotionBuilder.php | 161 + .../LoyaltyPromotionIncentiveBuilder.php | 61 + ...tionIncentivePointsAdditionDataBuilder.php | 39 + ...onIncentivePointsMultiplierDataBuilder.php | 73 + .../LoyaltyPromotionTriggerLimitBuilder.php | 49 + .../Models/Builders/LoyaltyRewardBuilder.php | 118 + .../src/Models/Builders/MBreakBuilder.php | 71 + .../Builders/MeasurementUnitBuilder.php | 118 + .../Builders/MeasurementUnitCustomBuilder.php | 40 + .../src/Models/Builders/MerchantBuilder.php | 133 + .../ModifierLocationOverridesBuilder.php | 76 + .../src/Models/Builders/MoneyBuilder.php | 65 + .../Builders/ObtainTokenRequestBuilder.php | 184 + .../Builders/ObtainTokenResponseBuilder.php | 148 + .../Builders/OfflinePaymentDetailsBuilder.php | 47 + .../src/Models/Builders/OrderBuilder.php | 425 + .../Models/Builders/OrderCreatedBuilder.php | 103 + .../Builders/OrderCreatedObjectBuilder.php | 48 + .../src/Models/Builders/OrderEntryBuilder.php | 83 + .../Builders/OrderFulfillmentBuilder.php | 147 + ...OrderFulfillmentDeliveryDetailsBuilder.php | 388 + ...rderFulfillmentFulfillmentEntryBuilder.php | 76 + .../OrderFulfillmentPickupDetailsBuilder.php | 283 + ...kupDetailsCurbsidePickupDetailsBuilder.php | 73 + .../OrderFulfillmentRecipientBuilder.php | 120 + ...OrderFulfillmentShipmentDetailsBuilder.php | 260 + .../OrderFulfillmentUpdatedBuilder.php | 132 + .../OrderFulfillmentUpdatedObjectBuilder.php | 48 + .../OrderFulfillmentUpdatedUpdateBuilder.php | 75 + .../OrderLineItemAppliedDiscountBuilder.php | 68 + ...derLineItemAppliedServiceChargeBuilder.php | 68 + .../OrderLineItemAppliedTaxBuilder.php | 68 + .../Models/Builders/OrderLineItemBuilder.php | 344 + .../Builders/OrderLineItemDiscountBuilder.php | 206 + .../Builders/OrderLineItemModifierBuilder.php | 166 + ...ricingBlocklistsBlockedDiscountBuilder.php | 91 + ...ItemPricingBlocklistsBlockedTaxBuilder.php | 91 + .../OrderLineItemPricingBlocklistsBuilder.php | 75 + .../Builders/OrderLineItemTaxBuilder.php | 186 + .../Builders/OrderMoneyAmountsBuilder.php | 88 + .../Builders/OrderPricingOptionsBuilder.php | 73 + .../Builders/OrderQuantityUnitBuilder.php | 102 + .../Models/Builders/OrderReturnBuilder.php | 174 + .../Builders/OrderReturnDiscountBuilder.php | 186 + .../Builders/OrderReturnLineItemBuilder.php | 333 + .../OrderReturnLineItemModifierBuilder.php | 166 + .../OrderReturnServiceChargeBuilder.php | 253 + .../Models/Builders/OrderReturnTaxBuilder.php | 176 + .../Models/Builders/OrderReturnTipBuilder.php | 102 + .../Models/Builders/OrderRewardBuilder.php | 40 + .../OrderRoundingAdjustmentBuilder.php | 84 + .../Builders/OrderServiceChargeBuilder.php | 263 + .../Models/Builders/OrderSourceBuilder.php | 55 + .../Models/Builders/OrderUpdatedBuilder.php | 113 + .../Builders/OrderUpdatedObjectBuilder.php | 48 + .../Builders/PaginationCursorBuilder.php | 55 + .../PauseSubscriptionRequestBuilder.php | 119 + .../PauseSubscriptionResponseBuilder.php | 70 + .../Builders/PayOrderRequestBuilder.php | 75 + .../Builders/PayOrderResponseBuilder.php | 59 + ...lanceActivityAppFeeRefundDetailBuilder.php | 91 + ...anceActivityAppFeeRevenueDetailBuilder.php | 73 + ...eActivityAutomaticSavingsDetailBuilder.php | 73 + ...yAutomaticSavingsReversedDetailBuilder.php | 73 + ...mentBalanceActivityChargeDetailBuilder.php | 55 + ...BalanceActivityDepositFeeDetailBuilder.php | 55 + ...ctivityDepositFeeReversedDetailBuilder.php | 55 + ...entBalanceActivityDisputeDetailBuilder.php | 73 + ...PaymentBalanceActivityFeeDetailBuilder.php | 55 + ...nceActivityFreeProcessingDetailBuilder.php | 55 + ...nceActivityHoldAdjustmentDetailBuilder.php | 55 + ...alanceActivityOpenDisputeDetailBuilder.php | 73 + ...ceActivityOtherAdjustmentDetailBuilder.php | 55 + ...ymentBalanceActivityOtherDetailBuilder.php | 55 + ...mentBalanceActivityRefundDetailBuilder.php | 73 + ...ActivityReleaseAdjustmentDetailBuilder.php | 55 + ...alanceActivityReserveHoldDetailBuilder.php | 55 + ...nceActivityReserveReleaseDetailBuilder.php | 55 + ...ivitySquareCapitalPaymentDetailBuilder.php | 55 + ...areCapitalReversedPaymentDetailBuilder.php | 55 + ...vitySquarePayrollTransferDetailBuilder.php | 55 + ...rePayrollTransferReversedDetailBuilder.php | 55 + ...ntBalanceActivityTaxOnFeeDetailBuilder.php | 73 + ...anceActivityThirdPartyFeeDetailBuilder.php | 55 + ...tivityThirdPartyFeeRefundDetailBuilder.php | 73 + .../src/Models/Builders/PaymentBuilder.php | 515 + .../Models/Builders/PaymentLinkBuilder.php | 157 + .../PaymentLinkRelatedResourcesBuilder.php | 75 + .../Models/Builders/PaymentOptionsBuilder.php | 101 + .../Models/Builders/PaymentRefundBuilder.php | 239 + .../src/Models/Builders/PayoutBuilder.php | 167 + .../Models/Builders/PayoutEntryBuilder.php | 374 + .../src/Models/Builders/PayoutFeeBuilder.php | 76 + .../src/Models/Builders/PhaseBuilder.php | 109 + .../src/Models/Builders/PhaseInputBuilder.php | 57 + .../Builders/PrePopulatedDataBuilder.php | 84 + .../Models/Builders/ProcessingFeeBuilder.php | 84 + .../Builders/PublishInvoiceRequestBuilder.php | 57 + .../PublishInvoiceResponseBuilder.php | 59 + .../Models/Builders/QrCodeOptionsBuilder.php | 41 + .../Models/Builders/QuantityRatioBuilder.php | 73 + .../src/Models/Builders/QuickPayBuilder.php | 42 + .../src/Models/Builders/RangeBuilder.php | 73 + .../Models/Builders/ReceiptOptionsBuilder.php | 75 + .../RedeemLoyaltyRewardRequestBuilder.php | 40 + .../RedeemLoyaltyRewardResponseBuilder.php | 59 + .../src/Models/Builders/RefundBuilder.php | 102 + .../Builders/RefundPaymentRequestBuilder.php | 217 + .../Builders/RefundPaymentResponseBuilder.php | 59 + .../Builders/RegisterDomainRequestBuilder.php | 39 + .../RegisterDomainResponseBuilder.php | 58 + ...RemoveGroupFromCustomerResponseBuilder.php | 48 + .../ResumeSubscriptionRequestBuilder.php | 65 + .../ResumeSubscriptionResponseBuilder.php | 70 + ...ustomAttributeDefinitionRequestBuilder.php | 47 + ...stomAttributeDefinitionResponseBuilder.php | 59 + ...veBookingCustomAttributeRequestBuilder.php | 65 + ...eBookingCustomAttributeResponseBuilder.php | 59 + .../RetrieveBookingResponseBuilder.php | 59 + ...eBusinessBookingProfileResponseBuilder.php | 59 + .../Builders/RetrieveCardResponseBuilder.php | 59 + .../RetrieveCashDrawerShiftRequestBuilder.php | 39 + ...RetrieveCashDrawerShiftResponseBuilder.php | 59 + .../RetrieveCatalogObjectRequestBuilder.php | 91 + .../RetrieveCatalogObjectResponseBuilder.php | 69 + ...ustomAttributeDefinitionRequestBuilder.php | 47 + ...stomAttributeDefinitionResponseBuilder.php | 59 + ...eCustomerCustomAttributeRequestBuilder.php | 65 + ...CustomerCustomAttributeResponseBuilder.php | 59 + .../RetrieveCustomerGroupResponseBuilder.php | 59 + .../RetrieveCustomerResponseBuilder.php | 59 + ...RetrieveCustomerSegmentResponseBuilder.php | 59 + ...RetrieveDisputeEvidenceResponseBuilder.php | 59 + .../RetrieveDisputeResponseBuilder.php | 59 + .../RetrieveEmployeeResponseBuilder.php | 59 + .../RetrieveGiftCardFromGANRequestBuilder.php | 39 + ...RetrieveGiftCardFromGANResponseBuilder.php | 59 + ...etrieveGiftCardFromNonceRequestBuilder.php | 39 + ...trieveGiftCardFromNonceResponseBuilder.php | 59 + .../RetrieveGiftCardResponseBuilder.php | 59 + ...ieveInventoryAdjustmentResponseBuilder.php | 59 + ...RetrieveInventoryChangesRequestBuilder.php | 73 + ...etrieveInventoryChangesResponseBuilder.php | 69 + .../RetrieveInventoryCountRequestBuilder.php | 73 + .../RetrieveInventoryCountResponseBuilder.php | 69 + ...eInventoryPhysicalCountResponseBuilder.php | 59 + ...trieveInventoryTransferResponseBuilder.php | 59 + .../Builders/RetrieveJobResponseBuilder.php | 59 + ...eLocationBookingProfileResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 47 + ...stomAttributeDefinitionResponseBuilder.php | 59 + ...eLocationCustomAttributeRequestBuilder.php | 65 + ...LocationCustomAttributeResponseBuilder.php | 59 + .../RetrieveLocationResponseBuilder.php | 59 + ...etrieveLocationSettingsResponseBuilder.php | 59 + .../RetrieveLoyaltyAccountResponseBuilder.php | 59 + .../RetrieveLoyaltyProgramResponseBuilder.php | 59 + ...etrieveLoyaltyPromotionResponseBuilder.php | 59 + .../RetrieveLoyaltyRewardResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 47 + ...stomAttributeDefinitionResponseBuilder.php | 59 + ...eMerchantCustomAttributeRequestBuilder.php | 65 + ...MerchantCustomAttributeResponseBuilder.php | 59 + .../RetrieveMerchantResponseBuilder.php | 59 + ...etrieveMerchantSettingsResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 47 + ...stomAttributeDefinitionResponseBuilder.php | 59 + ...ieveOrderCustomAttributeRequestBuilder.php | 65 + ...eveOrderCustomAttributeResponseBuilder.php | 59 + .../Builders/RetrieveOrderResponseBuilder.php | 59 + .../RetrievePaymentLinkResponseBuilder.php | 59 + .../RetrieveSnippetResponseBuilder.php | 59 + .../RetrieveSubscriptionRequestBuilder.php | 55 + .../RetrieveSubscriptionResponseBuilder.php | 59 + ...eamMemberBookingProfileResponseBuilder.php | 59 + .../RetrieveTeamMemberResponseBuilder.php | 59 + .../RetrieveTokenStatusResponseBuilder.php | 88 + .../RetrieveTransactionResponseBuilder.php | 59 + .../RetrieveVendorResponseBuilder.php | 59 + .../RetrieveWageSettingResponseBuilder.php | 59 + ...ieveWebhookSubscriptionResponseBuilder.php | 59 + .../Builders/RevokeTokenRequestBuilder.php | 109 + .../Builders/RevokeTokenResponseBuilder.php | 58 + .../Models/Builders/RiskEvaluationBuilder.php | 57 + .../Builders/SaveCardOptionsBuilder.php | 67 + .../SearchAvailabilityFilterBuilder.php | 95 + .../SearchAvailabilityQueryBuilder.php | 40 + .../SearchAvailabilityRequestBuilder.php | 40 + .../SearchAvailabilityResponseBuilder.php | 59 + .../SearchCatalogItemsRequestBuilder.php | 138 + .../SearchCatalogItemsResponseBuilder.php | 79 + .../SearchCatalogObjectsRequestBuilder.php | 118 + .../SearchCatalogObjectsResponseBuilder.php | 89 + .../SearchCustomersRequestBuilder.php | 78 + .../SearchCustomersResponseBuilder.php | 79 + .../Builders/SearchEventsFilterBuilder.php | 102 + .../Builders/SearchEventsQueryBuilder.php | 59 + .../Builders/SearchEventsRequestBuilder.php | 68 + .../Builders/SearchEventsResponseBuilder.php | 80 + .../Builders/SearchEventsSortBuilder.php | 57 + .../Builders/SearchInvoicesRequestBuilder.php | 60 + .../SearchInvoicesResponseBuilder.php | 69 + .../SearchLoyaltyAccountsRequestBuilder.php | 68 + ...ountsRequestLoyaltyAccountQueryBuilder.php | 74 + .../SearchLoyaltyAccountsResponseBuilder.php | 69 + .../SearchLoyaltyEventsRequestBuilder.php | 68 + .../SearchLoyaltyEventsResponseBuilder.php | 69 + .../SearchLoyaltyRewardsRequestBuilder.php | 68 + ...ewardsRequestLoyaltyRewardQueryBuilder.php | 49 + .../SearchLoyaltyRewardsResponseBuilder.php | 69 + .../SearchOrdersCustomerFilterBuilder.php | 55 + .../SearchOrdersDateTimeFilterBuilder.php | 68 + .../Builders/SearchOrdersFilterBuilder.php | 92 + .../SearchOrdersFulfillmentFilterBuilder.php | 73 + .../Builders/SearchOrdersQueryBuilder.php | 59 + .../Builders/SearchOrdersRequestBuilder.php | 88 + .../Builders/SearchOrdersResponseBuilder.php | 80 + .../Builders/SearchOrdersSortBuilder.php | 49 + .../SearchOrdersSourceFilterBuilder.php | 55 + .../SearchOrdersStateFilterBuilder.php | 39 + .../Builders/SearchShiftsRequestBuilder.php | 68 + .../Builders/SearchShiftsResponseBuilder.php | 69 + .../SearchSubscriptionsFilterBuilder.php | 91 + .../SearchSubscriptionsQueryBuilder.php | 48 + .../SearchSubscriptionsRequestBuilder.php | 78 + .../SearchSubscriptionsResponseBuilder.php | 69 + .../SearchTeamMembersFilterBuilder.php | 83 + .../SearchTeamMembersQueryBuilder.php | 48 + .../SearchTeamMembersRequestBuilder.php | 68 + .../SearchTeamMembersResponseBuilder.php | 69 + .../SearchTerminalActionsRequestBuilder.php | 68 + .../SearchTerminalActionsResponseBuilder.php | 69 + .../SearchTerminalCheckoutsRequestBuilder.php | 68 + ...SearchTerminalCheckoutsResponseBuilder.php | 69 + .../SearchTerminalRefundsRequestBuilder.php | 68 + .../SearchTerminalRefundsResponseBuilder.php | 69 + .../Builders/SearchVendorsRequestBuilder.php | 69 + .../SearchVendorsRequestFilterBuilder.php | 73 + .../SearchVendorsRequestSortBuilder.php | 57 + .../Builders/SearchVendorsResponseBuilder.php | 69 + .../Models/Builders/SegmentFilterBuilder.php | 50 + .../Models/Builders/SelectOptionBuilder.php | 40 + .../Models/Builders/SelectOptionsBuilder.php | 52 + .../src/Models/Builders/ShiftBuilder.php | 203 + .../Models/Builders/ShiftFilterBuilder.php | 133 + .../src/Models/Builders/ShiftQueryBuilder.php | 59 + .../src/Models/Builders/ShiftSortBuilder.php | 57 + .../src/Models/Builders/ShiftWageBuilder.php | 94 + .../Models/Builders/ShiftWorkdayBuilder.php | 76 + .../Models/Builders/ShippingFeeBuilder.php | 58 + .../Models/Builders/SignatureImageBuilder.php | 57 + .../Builders/SignatureOptionsBuilder.php | 51 + .../src/Models/Builders/SiteBuilder.php | 121 + .../src/Models/Builders/SnippetBuilder.php | 79 + .../Builders/SnippetResponseBuilder.php | 59 + .../Builders/SourceApplicationBuilder.php | 83 + .../Builders/SquareAccountDetailsBuilder.php | 74 + .../StandardUnitDescriptionBuilder.php | 84 + .../StandardUnitDescriptionGroupBuilder.php | 74 + .../SubmitEvidenceResponseBuilder.php | 59 + .../Builders/SubscriptionActionBuilder.php | 130 + .../Models/Builders/SubscriptionBuilder.php | 263 + .../Builders/SubscriptionEventBuilder.php | 82 + .../Builders/SubscriptionEventInfoBuilder.php | 65 + .../Builders/SubscriptionPhaseBuilder.php | 115 + .../Builders/SubscriptionPricingBuilder.php | 76 + .../Builders/SubscriptionSourceBuilder.php | 55 + .../SubscriptionTestResultBuilder.php | 103 + .../Builders/SwapPlanRequestBuilder.php | 74 + .../Builders/SwapPlanResponseBuilder.php | 70 + .../src/Models/Builders/TaxIdsBuilder.php | 87 + .../TeamMemberAssignedLocationsBuilder.php | 65 + .../TeamMemberBookingProfileBuilder.php | 95 + .../src/Models/Builders/TeamMemberBuilder.php | 199 + .../Models/Builders/TeamMemberWageBuilder.php | 130 + .../TenderBankAccountDetailsBuilder.php | 47 + .../src/Models/Builders/TenderBuilder.php | 254 + .../TenderBuyNowPayLaterDetailsBuilder.php | 57 + .../Builders/TenderCardDetailsBuilder.php | 68 + .../Builders/TenderCashDetailsBuilder.php | 58 + .../TenderSquareAccountDetailsBuilder.php | 47 + .../Models/Builders/TerminalActionBuilder.php | 277 + .../Builders/TerminalActionQueryBuilder.php | 59 + .../TerminalActionQueryFilterBuilder.php | 94 + .../TerminalActionQuerySortBuilder.php | 47 + .../Builders/TerminalCheckoutBuilder.php | 289 + .../Builders/TerminalCheckoutQueryBuilder.php | 59 + .../TerminalCheckoutQueryFilterBuilder.php | 84 + .../TerminalCheckoutQuerySortBuilder.php | 47 + .../Models/Builders/TerminalRefundBuilder.php | 151 + .../Builders/TerminalRefundQueryBuilder.php | 59 + .../TerminalRefundQueryFilterBuilder.php | 84 + .../TerminalRefundQuerySortBuilder.php | 55 + .../TestWebhookSubscriptionRequestBuilder.php | 55 + ...TestWebhookSubscriptionResponseBuilder.php | 59 + .../src/Models/Builders/TimeRangeBuilder.php | 73 + .../Models/Builders/TipSettingsBuilder.php | 127 + .../Models/Builders/TransactionBuilder.php | 188 + ...linkCustomerFromGiftCardRequestBuilder.php | 39 + ...inkCustomerFromGiftCardResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 58 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../Builders/UpdateBookingRequestBuilder.php | 58 + .../Builders/UpdateBookingResponseBuilder.php | 59 + .../UpdateBreakTypeRequestBuilder.php | 40 + .../UpdateBreakTypeResponseBuilder.php | 59 + .../UpdateCatalogImageRequestBuilder.php | 39 + .../UpdateCatalogImageResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 58 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../UpdateCustomerGroupRequestBuilder.php | 40 + .../UpdateCustomerGroupResponseBuilder.php | 59 + .../Builders/UpdateCustomerRequestBuilder.php | 231 + .../UpdateCustomerResponseBuilder.php | 59 + .../Builders/UpdateInvoiceRequestBuilder.php | 76 + .../Builders/UpdateInvoiceResponseBuilder.php | 59 + .../UpdateItemModifierListsRequestBuilder.php | 75 + ...UpdateItemModifierListsResponseBuilder.php | 58 + .../UpdateItemTaxesRequestBuilder.php | 75 + .../UpdateItemTaxesResponseBuilder.php | 58 + .../Builders/UpdateJobRequestBuilder.php | 40 + .../Builders/UpdateJobResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 58 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../Builders/UpdateLocationRequestBuilder.php | 48 + .../UpdateLocationResponseBuilder.php | 59 + .../UpdateLocationSettingsRequestBuilder.php | 40 + .../UpdateLocationSettingsResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 58 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../UpdateMerchantSettingsRequestBuilder.php | 40 + .../UpdateMerchantSettingsResponseBuilder.php | 59 + ...ustomAttributeDefinitionRequestBuilder.php | 58 + ...stomAttributeDefinitionResponseBuilder.php | 59 + .../Builders/UpdateOrderRequestBuilder.php | 84 + .../Builders/UpdateOrderResponseBuilder.php | 59 + .../UpdatePaymentLinkRequestBuilder.php | 40 + .../UpdatePaymentLinkResponseBuilder.php | 59 + .../Builders/UpdatePaymentRequestBuilder.php | 50 + .../Builders/UpdatePaymentResponseBuilder.php | 59 + .../Builders/UpdateShiftRequestBuilder.php | 40 + .../Builders/UpdateShiftResponseBuilder.php | 59 + .../UpdateSubscriptionRequestBuilder.php | 48 + .../UpdateSubscriptionResponseBuilder.php | 59 + .../UpdateTeamMemberRequestBuilder.php | 48 + .../UpdateTeamMemberResponseBuilder.php | 59 + .../Builders/UpdateVendorRequestBuilder.php | 58 + .../Builders/UpdateVendorResponseBuilder.php | 59 + .../UpdateWageSettingRequestBuilder.php | 40 + .../UpdateWageSettingResponseBuilder.php | 59 + ...pdateWebhookSubscriptionRequestBuilder.php | 48 + ...dateWebhookSubscriptionResponseBuilder.php | 59 + ...SubscriptionSignatureKeyRequestBuilder.php | 55 + ...ubscriptionSignatureKeyResponseBuilder.php | 58 + .../UpdateWorkweekConfigRequestBuilder.php | 40 + .../UpdateWorkweekConfigResponseBuilder.php | 59 + ...rtBookingCustomAttributeRequestBuilder.php | 58 + ...tBookingCustomAttributeResponseBuilder.php | 59 + .../UpsertCatalogObjectRequestBuilder.php | 41 + .../UpsertCatalogObjectResponseBuilder.php | 70 + ...tCustomerCustomAttributeRequestBuilder.php | 58 + ...CustomerCustomAttributeResponseBuilder.php | 59 + ...tLocationCustomAttributeRequestBuilder.php | 58 + ...LocationCustomAttributeResponseBuilder.php | 59 + ...tMerchantCustomAttributeRequestBuilder.php | 58 + ...MerchantCustomAttributeResponseBuilder.php | 59 + ...sertOrderCustomAttributeRequestBuilder.php | 58 + ...ertOrderCustomAttributeResponseBuilder.php | 59 + .../Builders/UpsertSnippetRequestBuilder.php | 40 + .../Builders/UpsertSnippetResponseBuilder.php | 59 + .../src/Models/Builders/V1DeviceBuilder.php | 65 + .../Builders/V1ListOrdersRequestBuilder.php | 83 + .../Builders/V1ListOrdersResponseBuilder.php | 48 + .../src/Models/Builders/V1MoneyBuilder.php | 65 + .../src/Models/Builders/V1OrderBuilder.php | 404 + .../Builders/V1OrderHistoryEntryBuilder.php | 57 + .../Models/Builders/V1PhoneNumberBuilder.php | 40 + .../src/Models/Builders/V1TenderBuilder.php | 262 + .../Builders/V1UpdateOrderRequestBuilder.php | 111 + .../src/Models/Builders/VendorBuilder.php | 171 + .../Models/Builders/VendorContactBuilder.php | 121 + .../VoidTransactionResponseBuilder.php | 48 + .../Models/Builders/WageSettingBuilder.php | 122 + .../Builders/WebhookSubscriptionBuilder.php | 167 + .../Models/Builders/WorkweekConfigBuilder.php | 80 + .../src/Models/BulkCreateCustomerData.php | 435 + .../src/Models/BulkCreateCustomersRequest.php | 79 + .../Models/BulkCreateCustomersResponse.php | 100 + .../Models/BulkCreateTeamMembersRequest.php | 76 + .../Models/BulkCreateTeamMembersResponse.php | 90 + .../src/Models/BulkCreateVendorsRequest.php | 66 + .../src/Models/BulkCreateVendorsResponse.php | 97 + ...lkDeleteBookingCustomAttributesRequest.php | 70 + ...kDeleteBookingCustomAttributesResponse.php | 92 + .../src/Models/BulkDeleteCustomersRequest.php | 65 + .../Models/BulkDeleteCustomersResponse.php | 100 + ...kDeleteLocationCustomAttributesRequest.php | 68 + ...stLocationCustomAttributeDeleteRequest.php | 60 + ...DeleteLocationCustomAttributesResponse.php | 98 + ...eLocationCustomAttributeDeleteResponse.php | 85 + ...kDeleteMerchantCustomAttributesRequest.php | 68 + ...stMerchantCustomAttributeDeleteRequest.php | 60 + ...DeleteMerchantCustomAttributesResponse.php | 98 + ...eMerchantCustomAttributeDeleteResponse.php | 60 + ...BulkDeleteOrderCustomAttributesRequest.php | 64 + ...AttributesRequestDeleteCustomAttribute.php | 87 + ...ulkDeleteOrderCustomAttributesResponse.php | 95 + .../Models/BulkRetrieveBookingsRequest.php | 64 + .../Models/BulkRetrieveBookingsResponse.php | 89 + .../Models/BulkRetrieveCustomersRequest.php | 65 + .../Models/BulkRetrieveCustomersResponse.php | 100 + ...trieveTeamMemberBookingProfilesRequest.php | 65 + ...rieveTeamMemberBookingProfilesResponse.php | 90 + .../src/Models/BulkRetrieveVendorsRequest.php | 69 + .../Models/BulkRetrieveVendorsResponse.php | 93 + .../square/src/Models/BulkSwapPlanRequest.php | 121 + .../src/Models/BulkSwapPlanResponse.php | 84 + .../src/Models/BulkUpdateCustomerData.php | 470 + .../src/Models/BulkUpdateCustomersRequest.php | 81 + .../Models/BulkUpdateCustomersResponse.php | 100 + .../Models/BulkUpdateTeamMembersRequest.php | 80 + .../Models/BulkUpdateTeamMembersResponse.php | 90 + .../src/Models/BulkUpdateVendorsRequest.php | 68 + .../src/Models/BulkUpdateVendorsResponse.php | 95 + ...lkUpsertBookingCustomAttributesRequest.php | 70 + ...kUpsertBookingCustomAttributesResponse.php | 94 + ...kUpsertCustomerCustomAttributesRequest.php | 70 + ...stCustomerCustomAttributeUpsertRequest.php | 133 + ...UpsertCustomerCustomAttributesResponse.php | 94 + ...eCustomerCustomAttributeUpsertResponse.php | 112 + ...kUpsertLocationCustomAttributesRequest.php | 70 + ...stLocationCustomAttributeUpsertRequest.php | 133 + ...UpsertLocationCustomAttributesResponse.php | 94 + ...eLocationCustomAttributeUpsertResponse.php | 112 + ...kUpsertMerchantCustomAttributesRequest.php | 70 + ...stMerchantCustomAttributeUpsertRequest.php | 133 + ...UpsertMerchantCustomAttributesResponse.php | 94 + ...eMerchantCustomAttributeUpsertResponse.php | 112 + ...BulkUpsertOrderCustomAttributesRequest.php | 64 + ...AttributesRequestUpsertCustomAttribute.php | 130 + ...ulkUpsertOrderCustomAttributesResponse.php | 93 + .../Models/BusinessAppointmentSettings.php | 490 + ...sinessAppointmentSettingsAlignmentTime.php | 27 + ...AppointmentSettingsBookingLocationType.php | 23 + ...sAppointmentSettingsCancellationPolicy.php | 20 + ...SettingsMaxAppointmentsPerDayLimitType.php | 19 + .../src/Models/BusinessBookingProfile.php | 276 + .../BusinessBookingProfileBookingPolicy.php | 19 + ...ssBookingProfileCustomerTimezoneChoice.php | 19 + .../square/src/Models/BusinessHours.php | 69 + .../square/src/Models/BusinessHoursPeriod.php | 138 + .../src/Models/BuyNowPayLaterDetails.php | 118 + .../Models/CalculateLoyaltyPointsRequest.php | 174 + .../Models/CalculateLoyaltyPointsResponse.php | 112 + .../src/Models/CalculateOrderRequest.php | 119 + .../src/Models/CalculateOrderResponse.php | 90 + .../src/Models/CancelBookingRequest.php | 98 + .../src/Models/CancelBookingResponse.php | 84 + .../src/Models/CancelInvoiceRequest.php | 64 + .../src/Models/CancelInvoiceResponse.php | 87 + .../Models/CancelLoyaltyPromotionResponse.php | 90 + .../CancelPaymentByIdempotencyKeyRequest.php | 61 + .../CancelPaymentByIdempotencyKeyResponse.php | 60 + .../src/Models/CancelPaymentResponse.php | 83 + .../src/Models/CancelSubscriptionResponse.php | 119 + .../Models/CancelTerminalActionResponse.php | 80 + .../Models/CancelTerminalCheckoutResponse.php | 80 + .../Models/CancelTerminalRefundResponse.php | 82 + .../src/Models/CaptureTransactionResponse.php | 59 + .../square/square/src/Models/Card.php | 532 + .../square/square/src/Models/CardBrand.php | 25 + .../square/square/src/Models/CardCoBrand.php | 14 + .../square/src/Models/CardPaymentDetails.php | 611 + .../square/src/Models/CardPaymentTimeline.php | 137 + .../square/src/Models/CardPrepaidType.php | 14 + .../square/square/src/Models/CardType.php | 14 + .../square/src/Models/CashAppDetails.php | 132 + .../square/src/Models/CashDrawerDevice.php | 87 + .../square/src/Models/CashDrawerEventType.php | 66 + .../square/src/Models/CashDrawerShift.php | 691 + .../src/Models/CashDrawerShiftEvent.php | 206 + .../src/Models/CashDrawerShiftState.php | 24 + .../src/Models/CashDrawerShiftSummary.php | 412 + .../square/src/Models/CashPaymentDetails.php | 111 + .../src/Models/CatalogAvailabilityPeriod.php | 138 + .../square/src/Models/CatalogCategory.php | 422 + .../square/src/Models/CatalogCategoryType.php | 23 + .../CatalogCustomAttributeDefinition.php | 400 + ...CustomAttributeDefinitionAppVisibility.php | 26 + ...gCustomAttributeDefinitionNumberConfig.php | 86 + ...stomAttributeDefinitionSelectionConfig.php | 120 + ...electionConfigCustomAttributeSelection.php | 96 + ...tomAttributeDefinitionSellerVisibility.php | 23 + ...gCustomAttributeDefinitionStringConfig.php | 77 + .../CatalogCustomAttributeDefinitionType.php | 27 + .../Models/CatalogCustomAttributeValue.php | 306 + .../square/src/Models/CatalogDiscount.php | 322 + .../Models/CatalogDiscountModifyTaxBasis.php | 16 + .../square/src/Models/CatalogDiscountType.php | 29 + .../square/src/Models/CatalogEcomSeoData.php | 137 + .../square/src/Models/CatalogIdMapping.php | 111 + .../square/square/src/Models/CatalogImage.php | 202 + .../square/src/Models/CatalogInfoResponse.php | 103 + .../src/Models/CatalogInfoResponseLimits.php | 455 + .../square/square/src/Models/CatalogItem.php | 1107 ++ .../CatalogItemFoodAndBeverageDetails.php | 145 + ...oodAndBeverageDetailsDietaryPreference.php | 118 + ...aryPreferenceStandardDietaryPreference.php | 18 + ...ndBeverageDetailsDietaryPreferenceType.php | 19 + ...ogItemFoodAndBeverageDetailsIngredient.php | 118 + ...ageDetailsIngredientStandardIngredient.php | 25 + .../Models/CatalogItemModifierListInfo.php | 339 + .../square/src/Models/CatalogItemOption.php | 228 + .../src/Models/CatalogItemOptionForItem.php | 69 + .../src/Models/CatalogItemOptionValue.php | 223 + ...CatalogItemOptionValueForItemVariation.php | 104 + .../src/Models/CatalogItemProductType.php | 50 + .../src/Models/CatalogItemVariation.php | 891 + .../src/Models/CatalogMeasurementUnit.php | 119 + .../square/src/Models/CatalogModifier.php | 260 + .../square/src/Models/CatalogModifierList.php | 429 + .../CatalogModifierListModifierType.php | 19 + .../CatalogModifierListSelectionType.php | 21 + .../src/Models/CatalogModifierOverride.php | 96 + .../square/src/Models/CatalogObject.php | 1085 ++ .../square/src/Models/CatalogObjectBatch.php | 64 + .../src/Models/CatalogObjectCategory.php | 92 + .../src/Models/CatalogObjectReference.php | 103 + .../square/src/Models/CatalogObjectType.php | 133 + .../square/src/Models/CatalogPricingRule.php | 588 + .../square/src/Models/CatalogPricingType.php | 19 + .../square/src/Models/CatalogProductSet.php | 359 + .../square/square/src/Models/CatalogQuery.php | 321 + .../square/src/Models/CatalogQueryExact.php | 93 + ...QueryItemVariationsForItemOptionValues.php | 75 + .../CatalogQueryItemsForItemOptions.php | 75 + .../CatalogQueryItemsForModifierList.php | 64 + .../src/Models/CatalogQueryItemsForTax.php | 64 + .../square/src/Models/CatalogQueryPrefix.php | 87 + .../square/src/Models/CatalogQueryRange.php | 133 + .../square/src/Models/CatalogQuerySet.php | 96 + .../Models/CatalogQuerySortedAttribute.php | 127 + .../square/src/Models/CatalogQueryText.php | 65 + .../square/src/Models/CatalogQuickAmount.php | 173 + .../src/Models/CatalogQuickAmountType.php | 19 + .../Models/CatalogQuickAmountsSettings.php | 139 + .../CatalogQuickAmountsSettingsOption.php | 23 + .../src/Models/CatalogStockConversion.php | 145 + .../src/Models/CatalogSubscriptionPlan.php | 271 + .../CatalogSubscriptionPlanVariation.php | 249 + .../square/square/src/Models/CatalogTax.php | 280 + .../square/src/Models/CatalogTimePeriod.php | 107 + .../square/square/src/Models/CatalogV1Id.php | 104 + .../src/Models/CategoryPathToRootNode.php | 101 + .../Models/ChangeBillingAnchorDateRequest.php | 114 + .../ChangeBillingAnchorDateResponse.php | 119 + .../square/square/src/Models/ChangeTiming.php | 19 + .../square/src/Models/ChargeRequest.php | 662 + .../ChargeRequestAdditionalRecipient.php | 125 + .../square/src/Models/ChargeResponse.php | 94 + .../square/square/src/Models/Checkout.php | 445 + .../src/Models/CheckoutLocationSettings.php | 241 + .../CheckoutLocationSettingsBranding.php | 108 + ...outLocationSettingsBrandingButtonShape.php | 11 + ...koutLocationSettingsBrandingHeaderType.php | 11 + .../CheckoutLocationSettingsCoupons.php | 62 + .../Models/CheckoutLocationSettingsPolicy.php | 140 + .../CheckoutLocationSettingsTipping.php | 230 + .../src/Models/CheckoutMerchantSettings.php | 80 + ...CheckoutMerchantSettingsPaymentMethods.php | 126 + ...SettingsPaymentMethodsAfterpayClearpay.php | 104 + ...ethodsAfterpayClearpayEligibilityRange.php | 110 + ...antSettingsPaymentMethodsPaymentMethod.php | 65 + .../square/src/Models/CheckoutOptions.php | 413 + .../src/Models/CheckoutOptionsPaymentType.php | 43 + .../square/src/Models/ClearpayDetails.php | 65 + .../square/src/Models/CloneOrderRequest.php | 152 + .../square/src/Models/CloneOrderResponse.php | 94 + .../square/src/Models/CollectedData.php | 51 + .../src/Models/CompletePaymentRequest.php | 75 + .../src/Models/CompletePaymentResponse.php | 83 + .../square/square/src/Models/Component.php | 175 + .../src/Models/ComponentComponentType.php | 17 + .../src/Models/ConfirmationDecision.php | 51 + .../square/src/Models/ConfirmationOptions.php | 168 + .../square/square/src/Models/Coordinates.php | 101 + .../square/square/src/Models/Country.php | 1012 + ...ookingCustomAttributeDefinitionRequest.php | 91 + ...okingCustomAttributeDefinitionResponse.php | 88 + .../src/Models/CreateBookingRequest.php | 86 + .../src/Models/CreateBookingResponse.php | 84 + .../src/Models/CreateBreakTypeRequest.php | 87 + .../src/Models/CreateBreakTypeResponse.php | 87 + .../square/src/Models/CreateCardRequest.php | 164 + .../square/src/Models/CreateCardResponse.php | 89 + .../src/Models/CreateCatalogImageRequest.php | 187 + .../src/Models/CreateCatalogImageResponse.php | 106 + .../src/Models/CreateCheckoutRequest.php | 364 + .../src/Models/CreateCheckoutResponse.php | 86 + .../src/Models/CreateCustomerCardRequest.php | 162 + .../src/Models/CreateCustomerCardResponse.php | 88 + ...stomerCustomAttributeDefinitionRequest.php | 91 + ...tomerCustomAttributeDefinitionResponse.php | 88 + .../src/Models/CreateCustomerGroupRequest.php | 94 + .../Models/CreateCustomerGroupResponse.php | 92 + .../src/Models/CreateCustomerRequest.php | 382 + .../src/Models/CreateCustomerResponse.php | 87 + .../src/Models/CreateDeviceCodeRequest.php | 89 + .../src/Models/CreateDeviceCodeResponse.php | 78 + .../CreateDisputeEvidenceFileRequest.php | 114 + .../CreateDisputeEvidenceFileResponse.php | 81 + .../CreateDisputeEvidenceTextRequest.php | 113 + .../CreateDisputeEvidenceTextResponse.php | 81 + .../Models/CreateGiftCardActivityRequest.php | 92 + .../Models/CreateGiftCardActivityResponse.php | 90 + .../src/Models/CreateGiftCardRequest.php | 116 + .../src/Models/CreateGiftCardResponse.php | 85 + .../Models/CreateInvoiceAttachmentRequest.php | 83 + .../CreateInvoiceAttachmentResponse.php | 83 + .../src/Models/CreateInvoiceRequest.php | 99 + .../src/Models/CreateInvoiceResponse.php | 87 + .../square/src/Models/CreateJobRequest.php | 94 + .../square/src/Models/CreateJobResponse.php | 88 + ...cationCustomAttributeDefinitionRequest.php | 91 + ...ationCustomAttributeDefinitionResponse.php | 88 + .../src/Models/CreateLocationRequest.php | 54 + .../src/Models/CreateLocationResponse.php | 85 + .../Models/CreateLoyaltyAccountRequest.php | 92 + .../Models/CreateLoyaltyAccountResponse.php | 87 + .../Models/CreateLoyaltyPromotionRequest.php | 94 + .../Models/CreateLoyaltyPromotionResponse.php | 90 + .../src/Models/CreateLoyaltyRewardRequest.php | 94 + .../Models/CreateLoyaltyRewardResponse.php | 89 + ...rchantCustomAttributeDefinitionRequest.php | 91 + ...chantCustomAttributeDefinitionResponse.php | 88 + .../CreateMobileAuthorizationCodeRequest.php | 55 + .../CreateMobileAuthorizationCodeResponse.php | 113 + ...eOrderCustomAttributeDefinitionRequest.php | 91 + ...OrderCustomAttributeDefinitionResponse.php | 85 + .../square/src/Models/CreateOrderRequest.php | 102 + .../square/src/Models/CreateOrderResponse.php | 96 + .../src/Models/CreatePaymentLinkRequest.php | 233 + .../src/Models/CreatePaymentLinkResponse.php | 101 + .../src/Models/CreatePaymentRequest.php | 864 + .../src/Models/CreatePaymentResponse.php | 86 + .../square/src/Models/CreateRefundRequest.php | 180 + .../src/Models/CreateRefundResponse.php | 86 + .../square/src/Models/CreateShiftRequest.php | 89 + .../square/src/Models/CreateShiftResponse.php | 89 + .../src/Models/CreateSubscriptionRequest.php | 436 + .../src/Models/CreateSubscriptionResponse.php | 90 + .../src/Models/CreateTeamMemberRequest.php | 89 + .../src/Models/CreateTeamMemberResponse.php | 84 + .../Models/CreateTerminalActionRequest.php | 93 + .../Models/CreateTerminalActionResponse.php | 80 + .../Models/CreateTerminalCheckoutRequest.php | 91 + .../Models/CreateTerminalCheckoutResponse.php | 80 + .../Models/CreateTerminalRefundRequest.php | 92 + .../Models/CreateTerminalRefundResponse.php | 82 + .../square/src/Models/CreateVendorRequest.php | 97 + .../src/Models/CreateVendorResponse.php | 83 + .../CreateWebhookSubscriptionRequest.php | 89 + .../CreateWebhookSubscriptionResponse.php | 91 + .../square/square/src/Models/Currency.php | 744 + .../square/src/Models/CustomAttribute.php | 301 + .../src/Models/CustomAttributeDefinition.php | 376 + .../CustomAttributeDefinitionVisibility.php | 30 + .../src/Models/CustomAttributeFilter.php | 279 + .../square/square/src/Models/CustomField.php | 64 + .../square/square/src/Models/Customer.php | 725 + .../src/Models/CustomerAddressFilter.php | 87 + .../src/Models/CustomerCreationSource.php | 107 + .../Models/CustomerCreationSourceFilter.php | 102 + .../Models/CustomerCustomAttributeFilter.php | 130 + .../CustomerCustomAttributeFilterValue.php | 274 + .../Models/CustomerCustomAttributeFilters.php | 83 + .../square/src/Models/CustomerDetails.php | 104 + .../square/src/Models/CustomerFilter.php | 315 + .../square/src/Models/CustomerGroup.php | 138 + .../src/Models/CustomerInclusionExclusion.php | 22 + .../square/src/Models/CustomerPreferences.php | 71 + .../square/src/Models/CustomerQuery.php | 84 + .../square/src/Models/CustomerSegment.php | 138 + .../square/square/src/Models/CustomerSort.php | 80 + .../square/src/Models/CustomerSortField.php | 23 + .../square/src/Models/CustomerTaxIds.php | 71 + .../square/src/Models/CustomerTextFilter.php | 112 + .../src/Models/DataCollectionOptions.php | 134 + .../Models/DataCollectionOptionsInputType.php | 21 + .../square/square/src/Models/DateRange.php | 114 + .../square/square/src/Models/DayOfWeek.php | 39 + ...okingCustomAttributeDefinitionResponse.php | 62 + .../DeleteBookingCustomAttributeResponse.php | 60 + .../src/Models/DeleteBreakTypeResponse.php | 59 + .../Models/DeleteCatalogObjectResponse.php | 117 + .../src/Models/DeleteCustomerCardResponse.php | 59 + ...tomerCustomAttributeDefinitionResponse.php | 58 + .../DeleteCustomerCustomAttributeResponse.php | 60 + .../Models/DeleteCustomerGroupResponse.php | 59 + .../src/Models/DeleteCustomerRequest.php | 65 + .../src/Models/DeleteCustomerResponse.php | 59 + .../Models/DeleteDisputeEvidenceResponse.php | 58 + .../DeleteInvoiceAttachmentResponse.php | 58 + .../src/Models/DeleteInvoiceRequest.php | 58 + .../src/Models/DeleteInvoiceResponse.php | 58 + ...ationCustomAttributeDefinitionResponse.php | 58 + .../DeleteLocationCustomAttributeResponse.php | 60 + .../Models/DeleteLoyaltyRewardResponse.php | 58 + ...chantCustomAttributeDefinitionResponse.php | 58 + .../DeleteMerchantCustomAttributeResponse.php | 60 + ...OrderCustomAttributeDefinitionResponse.php | 58 + .../DeleteOrderCustomAttributeResponse.php | 58 + .../src/Models/DeletePaymentLinkResponse.php | 105 + .../square/src/Models/DeleteShiftResponse.php | 59 + .../src/Models/DeleteSnippetResponse.php | 58 + .../DeleteSubscriptionActionResponse.php | 91 + .../DeleteWebhookSubscriptionResponse.php | 60 + ...ecatedCreateDisputeEvidenceFileRequest.php | 126 + ...catedCreateDisputeEvidenceFileResponse.php | 81 + ...ecatedCreateDisputeEvidenceTextRequest.php | 113 + ...catedCreateDisputeEvidenceTextResponse.php | 81 + .../square/square/src/Models/Destination.php | 79 + .../square/src/Models/DestinationDetails.php | 102 + .../DestinationDetailsCardRefundDetails.php | 128 + .../DestinationDetailsCashRefundDetails.php | 109 + ...estinationDetailsExternalRefundDetails.php | 150 + .../square/src/Models/DestinationType.php | 24 + .../square/square/src/Models/Device.php | 145 + .../square/src/Models/DeviceAttributes.php | 279 + .../src/Models/DeviceAttributesDeviceType.php | 12 + .../src/Models/DeviceCheckoutOptions.php | 195 + .../square/square/src/Models/DeviceCode.php | 319 + .../square/src/Models/DeviceCodeStatus.php | 27 + ...viceComponentDetailsApplicationDetails.php | 146 + .../DeviceComponentDetailsBatteryDetails.php | 87 + ...eviceComponentDetailsCardReaderDetails.php | 51 + .../DeviceComponentDetailsEthernetDetails.php | 98 + .../DeviceComponentDetailsExternalPower.php | 27 + .../DeviceComponentDetailsMeasurement.php | 62 + ...omponentDetailsNetworkInterfaceDetails.php | 62 + .../DeviceComponentDetailsWiFiDetails.php | 198 + .../square/src/Models/DeviceDetails.php | 137 + .../square/src/Models/DeviceMetadata.php | 470 + .../square/square/src/Models/DeviceStatus.php | 49 + .../src/Models/DeviceStatusCategory.php | 11 + .../src/Models/DigitalWalletDetails.php | 132 + .../square/src/Models/DisableCardResponse.php | 89 + .../src/Models/DisableEventsResponse.php | 62 + .../Models/DismissTerminalActionResponse.php | 80 + .../DismissTerminalCheckoutResponse.php | 80 + .../Models/DismissTerminalRefundResponse.php | 82 + .../square/square/src/Models/Dispute.php | 528 + .../square/src/Models/DisputeEvidence.php | 245 + .../square/src/Models/DisputeEvidenceFile.php | 104 + .../square/src/Models/DisputeEvidenceType.php | 134 + .../square/src/Models/DisputeReason.php | 72 + .../square/square/src/Models/DisputeState.php | 43 + .../square/src/Models/DisputedPayment.php | 65 + .../square/src/Models/EcomVisibility.php | 27 + .../square/square/src/Models/Employee.php | 361 + .../square/src/Models/EmployeeStatus.php | 21 + .../square/square/src/Models/EmployeeWage.php | 165 + .../src/Models/EnableEventsResponse.php | 62 + .../square/square/src/Models/Error.php | 145 + .../square/src/Models/ErrorCategory.php | 55 + .../square/square/src/Models/ErrorCode.php | 687 + .../square/square/src/Models/Event.php | 218 + .../square/square/src/Models/EventData.php | 167 + .../square/src/Models/EventMetadata.php | 104 + .../square/src/Models/EventTypeMetadata.php | 104 + .../square/src/Models/ExcludeStrategy.php | 28 + .../src/Models/ExternalPaymentDetails.php | 188 + .../square/square/src/Models/FilterValue.php | 156 + .../square/src/Models/FloatNumberRange.php | 101 + .../square/square/src/Models/Fulfillment.php | 360 + .../src/Models/FulfillmentDeliveryDetails.php | 878 + ...FulfillmentDeliveryDetailsScheduleType.php | 20 + .../Models/FulfillmentFulfillmentEntry.php | 223 + ...fillmentFulfillmentLineItemApplication.php | 20 + .../src/Models/FulfillmentPickupDetails.php | 647 + ...mentPickupDetailsCurbsidePickupDetails.php | 110 + .../FulfillmentPickupDetailsScheduleType.php | 20 + .../src/Models/FulfillmentRecipient.php | 250 + .../src/Models/FulfillmentShipmentDetails.php | 546 + .../square/src/Models/FulfillmentState.php | 36 + .../square/src/Models/FulfillmentType.php | 23 + .../Models/GetBankAccountByV1IdResponse.php | 87 + .../src/Models/GetBankAccountResponse.php | 87 + .../src/Models/GetBreakTypeResponse.php | 87 + .../src/Models/GetDeviceCodeResponse.php | 78 + .../square/src/Models/GetDeviceResponse.php | 78 + .../src/Models/GetEmployeeWageResponse.php | 89 + .../square/src/Models/GetInvoiceResponse.php | 87 + .../src/Models/GetPaymentRefundResponse.php | 88 + .../square/src/Models/GetPaymentResponse.php | 83 + .../square/src/Models/GetPayoutResponse.php | 82 + .../square/src/Models/GetShiftResponse.php | 89 + .../src/Models/GetTeamMemberWageResponse.php | 87 + .../src/Models/GetTerminalActionResponse.php | 80 + .../Models/GetTerminalCheckoutResponse.php | 80 + .../src/Models/GetTerminalRefundResponse.php | 82 + .../square/square/src/Models/GiftCard.php | 275 + .../square/src/Models/GiftCardActivity.php | 637 + .../src/Models/GiftCardActivityActivate.php | 271 + .../GiftCardActivityAdjustDecrement.php | 98 + .../GiftCardActivityAdjustDecrementReason.php | 29 + .../GiftCardActivityAdjustIncrement.php | 98 + .../GiftCardActivityAdjustIncrementReason.php | 24 + .../src/Models/GiftCardActivityBlock.php | 52 + .../Models/GiftCardActivityBlockReason.php | 15 + .../Models/GiftCardActivityClearBalance.php | 60 + .../GiftCardActivityClearBalanceReason.php | 26 + .../src/Models/GiftCardActivityDeactivate.php | 60 + .../GiftCardActivityDeactivateReason.php | 29 + .../src/Models/GiftCardActivityImport.php | 74 + .../Models/GiftCardActivityImportReversal.php | 72 + .../src/Models/GiftCardActivityLoad.php | 280 + .../src/Models/GiftCardActivityRedeem.php | 175 + .../Models/GiftCardActivityRedeemStatus.php | 30 + .../src/Models/GiftCardActivityRefund.php | 182 + .../GiftCardActivityTransferBalanceFrom.php | 99 + .../GiftCardActivityTransferBalanceTo.php | 98 + .../src/Models/GiftCardActivityType.php | 88 + .../src/Models/GiftCardActivityUnblock.php | 52 + .../Models/GiftCardActivityUnblockReason.php | 15 + ...GiftCardActivityUnlinkedActivityRefund.php | 134 + .../square/src/Models/GiftCardGANSource.php | 23 + .../square/src/Models/GiftCardStatus.php | 30 + .../square/square/src/Models/GiftCardType.php | 19 + .../square/src/Models/InventoryAdjustment.php | 666 + .../src/Models/InventoryAdjustmentGroup.php | 128 + .../square/src/Models/InventoryAlertType.php | 20 + .../square/src/Models/InventoryChange.php | 195 + .../square/src/Models/InventoryChangeType.php | 24 + .../square/src/Models/InventoryCount.php | 288 + .../src/Models/InventoryPhysicalCount.php | 467 + .../square/src/Models/InventoryState.php | 95 + .../square/src/Models/InventoryTransfer.php | 503 + .../square/square/src/Models/Invoice.php | 971 + .../Models/InvoiceAcceptedPaymentMethods.php | 252 + .../square/src/Models/InvoiceAttachment.php | 210 + .../Models/InvoiceAutomaticPaymentSource.php | 39 + .../square/src/Models/InvoiceCustomField.php | 134 + .../Models/InvoiceCustomFieldPlacement.php | 20 + .../src/Models/InvoiceDeliveryMethod.php | 30 + .../square/src/Models/InvoiceFilter.php | 112 + .../src/Models/InvoicePaymentReminder.php | 186 + .../Models/InvoicePaymentReminderStatus.php | 32 + .../src/Models/InvoicePaymentRequest.php | 564 + .../square/square/src/Models/InvoiceQuery.php | 85 + .../square/src/Models/InvoiceRecipient.php | 261 + .../src/Models/InvoiceRecipientTaxIds.php | 57 + .../src/Models/InvoiceRequestMethod.php | 71 + .../square/src/Models/InvoiceRequestType.php | 39 + .../square/square/src/Models/InvoiceSort.php | 77 + .../square/src/Models/InvoiceSortField.php | 19 + .../square/src/Models/InvoiceStatus.php | 60 + .../Models/ItemVariationLocationOverrides.php | 314 + .../square/square/src/Models/Job.php | 217 + .../square/src/Models/JobAssignment.php | 244 + .../src/Models/JobAssignmentPayType.php | 23 + .../Models/LinkCustomerToGiftCardRequest.php | 60 + .../Models/LinkCustomerToGiftCardResponse.php | 84 + .../src/Models/ListBankAccountsRequest.php | 162 + .../src/Models/ListBankAccountsResponse.php | 122 + ...okingCustomAttributeDefinitionsRequest.php | 124 + ...kingCustomAttributeDefinitionsResponse.php | 125 + .../ListBookingCustomAttributesRequest.php | 171 + .../ListBookingCustomAttributesResponse.php | 127 + .../square/src/Models/ListBookingsRequest.php | 296 + .../src/Models/ListBookingsResponse.php | 111 + .../src/Models/ListBreakTypesRequest.php | 143 + .../src/Models/ListBreakTypesResponse.php | 116 + .../square/src/Models/ListCardsRequest.php | 217 + .../square/src/Models/ListCardsResponse.php | 124 + .../ListCashDrawerShiftEventsRequest.php | 132 + .../ListCashDrawerShiftEventsResponse.php | 113 + .../Models/ListCashDrawerShiftsRequest.php | 229 + .../Models/ListCashDrawerShiftsResponse.php | 113 + .../square/src/Models/ListCatalogRequest.php | 197 + .../square/src/Models/ListCatalogResponse.php | 113 + ...tomerCustomAttributeDefinitionsRequest.php | 124 + ...omerCustomAttributeDefinitionsResponse.php | 125 + .../ListCustomerCustomAttributesRequest.php | 171 + .../ListCustomerCustomAttributesResponse.php | 127 + .../src/Models/ListCustomerGroupsRequest.php | 132 + .../src/Models/ListCustomerGroupsResponse.php | 125 + .../Models/ListCustomerSegmentsRequest.php | 131 + .../Models/ListCustomerSegmentsResponse.php | 125 + .../src/Models/ListCustomersRequest.php | 224 + .../src/Models/ListCustomersResponse.php | 164 + .../src/Models/ListDeviceCodesRequest.php | 182 + .../src/Models/ListDeviceCodesResponse.php | 119 + .../square/src/Models/ListDevicesRequest.php | 168 + .../square/src/Models/ListDevicesResponse.php | 115 + .../src/Models/ListDisputeEvidenceRequest.php | 74 + .../Models/ListDisputeEvidenceResponse.php | 116 + .../square/src/Models/ListDisputesRequest.php | 156 + .../src/Models/ListDisputesResponse.php | 116 + .../src/Models/ListEmployeeWagesRequest.php | 140 + .../src/Models/ListEmployeeWagesResponse.php | 115 + .../src/Models/ListEmployeesRequest.php | 160 + .../src/Models/ListEmployeesResponse.php | 107 + .../src/Models/ListEventTypesRequest.php | 68 + .../src/Models/ListEventTypesResponse.php | 122 + .../Models/ListGiftCardActivitiesRequest.php | 366 + .../Models/ListGiftCardActivitiesResponse.php | 121 + .../src/Models/ListGiftCardsRequest.php | 243 + .../src/Models/ListGiftCardsResponse.php | 121 + .../square/src/Models/ListInvoicesRequest.php | 147 + .../src/Models/ListInvoicesResponse.php | 120 + .../square/src/Models/ListJobsRequest.php | 71 + .../square/src/Models/ListJobsResponse.php | 117 + .../ListLocationBookingProfilesRequest.php | 101 + .../ListLocationBookingProfilesResponse.php | 111 + ...ationCustomAttributeDefinitionsRequest.php | 151 + ...tionCustomAttributeDefinitionsResponse.php | 125 + .../ListLocationCustomAttributesRequest.php | 198 + .../ListLocationCustomAttributesResponse.php | 125 + .../src/Models/ListLocationsResponse.php | 90 + .../Models/ListLoyaltyProgramsResponse.php | 87 + .../Models/ListLoyaltyPromotionsRequest.php | 144 + .../Models/ListLoyaltyPromotionsResponse.php | 121 + ...chantCustomAttributeDefinitionsRequest.php | 151 + ...hantCustomAttributeDefinitionsResponse.php | 125 + .../ListMerchantCustomAttributesRequest.php | 198 + .../ListMerchantCustomAttributesResponse.php | 125 + .../src/Models/ListMerchantsRequest.php | 65 + .../src/Models/ListMerchantsResponse.php | 112 + ...OrderCustomAttributeDefinitionsRequest.php | 152 + ...rderCustomAttributeDefinitionsResponse.php | 128 + .../ListOrderCustomAttributesRequest.php | 200 + .../ListOrderCustomAttributesResponse.php | 122 + .../src/Models/ListPaymentLinksRequest.php | 122 + .../src/Models/ListPaymentLinksResponse.php | 115 + .../src/Models/ListPaymentRefundsRequest.php | 401 + .../src/Models/ListPaymentRefundsResponse.php | 122 + .../square/src/Models/ListPaymentsRequest.php | 649 + .../src/Models/ListPaymentsResponse.php | 120 + .../src/Models/ListPayoutEntriesRequest.php | 150 + .../src/Models/ListPayoutEntriesResponse.php | 116 + .../square/src/Models/ListPayoutsRequest.php | 295 + .../square/src/Models/ListPayoutsResponse.php | 116 + .../square/src/Models/ListRefundsRequest.php | 207 + .../square/src/Models/ListRefundsResponse.php | 125 + .../square/src/Models/ListSitesResponse.php | 87 + .../Models/ListSubscriptionEventsRequest.php | 121 + .../Models/ListSubscriptionEventsResponse.php | 125 + .../ListTeamMemberBookingProfilesRequest.php | 176 + .../ListTeamMemberBookingProfilesResponse.php | 119 + .../src/Models/ListTeamMemberWagesRequest.php | 143 + .../Models/ListTeamMemberWagesResponse.php | 115 + .../src/Models/ListTransactionsRequest.php | 207 + .../src/Models/ListTransactionsResponse.php | 125 + .../Models/ListWebhookEventTypesRequest.php | 68 + .../Models/ListWebhookEventTypesResponse.php | 122 + .../ListWebhookSubscriptionsRequest.php | 189 + .../ListWebhookSubscriptionsResponse.php | 125 + .../src/Models/ListWorkweekConfigsRequest.php | 101 + .../Models/ListWorkweekConfigsResponse.php | 116 + .../square/square/src/Models/Location.php | 904 + .../src/Models/LocationBookingProfile.php | 138 + .../square/src/Models/LocationCapability.php | 23 + .../square/src/Models/LocationStatus.php | 20 + .../square/square/src/Models/LocationType.php | 19 + .../square/src/Models/LoyaltyAccount.php | 387 + .../LoyaltyAccountExpiringPointDeadline.php | 86 + .../src/Models/LoyaltyAccountMapping.php | 119 + .../src/Models/LoyaltyAccountMappingType.php | 15 + .../square/square/src/Models/LoyaltyEvent.php | 391 + .../Models/LoyaltyEventAccumulatePoints.php | 129 + .../LoyaltyEventAccumulatePromotionPoints.php | 138 + .../src/Models/LoyaltyEventAdjustPoints.php | 121 + .../src/Models/LoyaltyEventCreateReward.php | 113 + .../src/Models/LoyaltyEventDateTimeFilter.php | 68 + .../src/Models/LoyaltyEventDeleteReward.php | 113 + .../src/Models/LoyaltyEventExpirePoints.php | 86 + .../square/src/Models/LoyaltyEventFilter.php | 155 + .../src/Models/LoyaltyEventLocationFilter.php | 68 + .../LoyaltyEventLoyaltyAccountFilter.php | 60 + .../src/Models/LoyaltyEventOrderFilter.php | 60 + .../square/src/Models/LoyaltyEventOther.php | 86 + .../square/src/Models/LoyaltyEventQuery.php | 56 + .../src/Models/LoyaltyEventRedeemReward.php | 114 + .../square/src/Models/LoyaltyEventSource.php | 19 + .../square/src/Models/LoyaltyEventType.php | 46 + .../src/Models/LoyaltyEventTypeFilter.php | 70 + .../square/src/Models/LoyaltyProgram.php | 315 + .../src/Models/LoyaltyProgramAccrualRule.php | 200 + .../LoyaltyProgramAccrualRuleCategoryData.php | 62 + ...ltyProgramAccrualRuleItemVariationData.php | 64 + .../LoyaltyProgramAccrualRuleSpendData.php | 202 + .../LoyaltyProgramAccrualRuleTaxMode.php | 22 + .../Models/LoyaltyProgramAccrualRuleType.php | 31 + .../LoyaltyProgramAccrualRuleVisitData.php | 103 + .../Models/LoyaltyProgramExpirationPolicy.php | 66 + .../Models/LoyaltyProgramRewardDefinition.php | 245 + .../LoyaltyProgramRewardDefinitionScope.php | 26 + .../LoyaltyProgramRewardDefinitionType.php | 22 + .../src/Models/LoyaltyProgramRewardTier.php | 198 + .../src/Models/LoyaltyProgramStatus.php | 20 + .../src/Models/LoyaltyProgramTerminology.php | 86 + .../square/src/Models/LoyaltyPromotion.php | 472 + .../LoyaltyPromotionAvailableTimeData.php | 141 + .../src/Models/LoyaltyPromotionIncentive.php | 118 + ...tyPromotionIncentivePointsAdditionData.php | 67 + ...PromotionIncentivePointsMultiplierData.php | 183 + .../Models/LoyaltyPromotionIncentiveType.php | 22 + .../src/Models/LoyaltyPromotionStatus.php | 30 + .../Models/LoyaltyPromotionTriggerLimit.php | 96 + .../LoyaltyPromotionTriggerLimitInterval.php | 26 + .../square/src/Models/LoyaltyReward.php | 277 + .../square/src/Models/LoyaltyRewardStatus.php | 23 + .../square/square/src/Models/MBreak.php | 234 + .../square/src/Models/MeasurementUnit.php | 231 + .../square/src/Models/MeasurementUnitArea.php | 43 + .../src/Models/MeasurementUnitCustom.php | 88 + .../src/Models/MeasurementUnitGeneric.php | 12 + .../src/Models/MeasurementUnitLength.php | 43 + .../square/src/Models/MeasurementUnitTime.php | 31 + .../src/Models/MeasurementUnitUnitType.php | 36 + .../src/Models/MeasurementUnitVolume.php | 55 + .../src/Models/MeasurementUnitWeight.php | 35 + .../square/square/src/Models/Merchant.php | 283 + .../square/src/Models/MerchantStatus.php | 17 + .../src/Models/ModifierLocationOverrides.php | 135 + .../square/square/src/Models/Money.php | 107 + .../square/src/Models/ObtainTokenRequest.php | 466 + .../square/src/Models/ObtainTokenResponse.php | 329 + .../src/Models/OfflinePaymentDetails.php | 54 + .../square/square/src/Models/Order.php | 1189 ++ .../square/square/src/Models/OrderCreated.php | 183 + .../square/src/Models/OrderCreatedObject.php | 49 + .../square/square/src/Models/OrderEntry.php | 137 + .../square/src/Models/OrderFulfillment.php | 341 + .../OrderFulfillmentDeliveryDetails.php | 873 + ...FulfillmentDeliveryDetailsScheduleType.php | 20 + .../OrderFulfillmentFulfillmentEntry.php | 206 + ...fillmentFulfillmentLineItemApplication.php | 20 + .../Models/OrderFulfillmentPickupDetails.php | 644 + ...mentPickupDetailsCurbsidePickupDetails.php | 110 + ...erFulfillmentPickupDetailsScheduleType.php | 20 + .../src/Models/OrderFulfillmentRecipient.php | 238 + .../OrderFulfillmentShipmentDetails.php | 546 + .../src/Models/OrderFulfillmentState.php | 36 + .../src/Models/OrderFulfillmentType.php | 23 + .../src/Models/OrderFulfillmentUpdated.php | 248 + .../Models/OrderFulfillmentUpdatedObject.php | 49 + .../Models/OrderFulfillmentUpdatedUpdate.php | 115 + .../square/src/Models/OrderLineItem.php | 969 + .../Models/OrderLineItemAppliedDiscount.php | 146 + .../OrderLineItemAppliedServiceCharge.php | 138 + .../src/Models/OrderLineItemAppliedTax.php | 146 + .../src/Models/OrderLineItemDiscount.php | 506 + .../src/Models/OrderLineItemDiscountScope.php | 25 + .../src/Models/OrderLineItemDiscountType.php | 39 + .../src/Models/OrderLineItemItemType.php | 25 + .../src/Models/OrderLineItemModifier.php | 392 + .../Models/OrderLineItemPricingBlocklists.php | 124 + ...neItemPricingBlocklistsBlockedDiscount.php | 147 + ...derLineItemPricingBlocklistsBlockedTax.php | 147 + .../square/src/Models/OrderLineItemTax.php | 428 + .../src/Models/OrderLineItemTaxScope.php | 25 + .../src/Models/OrderLineItemTaxType.php | 30 + .../square/src/Models/OrderMoneyAmounts.php | 214 + .../square/src/Models/OrderPricingOptions.php | 109 + .../square/src/Models/OrderQuantityUnit.php | 197 + .../square/square/src/Models/OrderReturn.php | 345 + .../square/src/Models/OrderReturnDiscount.php | 383 + .../square/src/Models/OrderReturnLineItem.php | 818 + .../Models/OrderReturnLineItemModifier.php | 340 + .../src/Models/OrderReturnServiceCharge.php | 589 + .../square/src/Models/OrderReturnTax.php | 339 + .../square/src/Models/OrderReturnTip.php | 174 + .../square/square/src/Models/OrderReward.php | 87 + .../src/Models/OrderRoundingAdjustment.php | 140 + .../square/src/Models/OrderServiceCharge.php | 682 + .../OrderServiceChargeCalculationPhase.php | 37 + .../src/Models/OrderServiceChargeScope.php | 26 + .../OrderServiceChargeTreatmentType.php | 14 + .../src/Models/OrderServiceChargeType.php | 10 + .../square/square/src/Models/OrderSource.php | 68 + .../square/square/src/Models/OrderState.php | 30 + .../square/square/src/Models/OrderUpdated.php | 208 + .../square/src/Models/OrderUpdatedObject.php | 49 + .../square/src/Models/PaginationCursor.php | 69 + .../src/Models/PauseSubscriptionRequest.php | 223 + .../src/Models/PauseSubscriptionResponse.php | 119 + .../square/src/Models/PayOrderRequest.php | 150 + .../square/src/Models/PayOrderResponse.php | 94 + .../square/square/src/Models/Payment.php | 1381 ++ ...ymentBalanceActivityAppFeeRefundDetail.php | 134 + ...mentBalanceActivityAppFeeRevenueDetail.php | 98 + ...tBalanceActivityAutomaticSavingsDetail.php | 98 + ...ActivityAutomaticSavingsReversedDetail.php | 98 + .../PaymentBalanceActivityChargeDetail.php | 62 + ...PaymentBalanceActivityDepositFeeDetail.php | 62 + ...alanceActivityDepositFeeReversedDetail.php | 62 + .../PaymentBalanceActivityDisputeDetail.php | 98 + .../PaymentBalanceActivityFeeDetail.php | 71 + ...entBalanceActivityFreeProcessingDetail.php | 62 + ...entBalanceActivityHoldAdjustmentDetail.php | 62 + ...aymentBalanceActivityOpenDisputeDetail.php | 98 + ...ntBalanceActivityOtherAdjustmentDetail.php | 62 + .../PaymentBalanceActivityOtherDetail.php | 62 + .../PaymentBalanceActivityRefundDetail.php | 98 + ...BalanceActivityReleaseAdjustmentDetail.php | 62 + ...aymentBalanceActivityReserveHoldDetail.php | 62 + ...entBalanceActivityReserveReleaseDetail.php | 62 + ...anceActivitySquareCapitalPaymentDetail.php | 62 + ...vitySquareCapitalReversedPaymentDetail.php | 62 + ...nceActivitySquarePayrollTransferDetail.php | 62 + ...itySquarePayrollTransferReversedDetail.php | 62 + .../PaymentBalanceActivityTaxOnFeeDetail.php | 98 + ...mentBalanceActivityThirdPartyFeeDetail.php | 62 + ...lanceActivityThirdPartyFeeRefundDetail.php | 98 + .../square/square/src/Models/PaymentLink.php | 341 + .../Models/PaymentLinkRelatedResources.php | 106 + .../square/src/Models/PaymentOptions.php | 239 + .../src/Models/PaymentOptionsDelayAction.php | 22 + .../square/src/Models/PaymentRefund.php | 563 + .../square/src/Models/PaymentSortField.php | 11 + .../square/square/src/Models/Payout.php | 405 + .../square/square/src/Models/PayoutEntry.php | 834 + .../square/square/src/Models/PayoutFee.php | 127 + .../square/src/Models/PayoutFeeType.php | 19 + .../square/square/src/Models/PayoutStatus.php | 23 + .../square/square/src/Models/PayoutType.php | 23 + .../square/square/src/Models/Phase.php | 173 + .../square/square/src/Models/PhaseInput.php | 96 + .../square/src/Models/PrePopulatedData.php | 133 + .../square/src/Models/ProcessingFee.php | 138 + .../square/square/src/Models/Product.php | 51 + .../square/square/src/Models/ProductType.php | 9 + .../src/Models/PublishInvoiceRequest.php | 113 + .../src/Models/PublishInvoiceResponse.php | 87 + .../square/src/Models/QrCodeOptions.php | 114 + .../square/src/Models/QuantityRatio.php | 110 + .../square/square/src/Models/QuickPay.php | 126 + .../square/square/src/Models/Range.php | 107 + .../square/src/Models/ReceiptOptions.php | 141 + .../src/Models/RedeemLoyaltyRewardRequest.php | 88 + .../Models/RedeemLoyaltyRewardResponse.php | 87 + .../square/square/src/Models/Refund.php | 343 + .../src/Models/RefundPaymentRequest.php | 541 + .../src/Models/RefundPaymentResponse.php | 89 + .../square/square/src/Models/RefundStatus.php | 27 + .../src/Models/RegisterDomainRequest.php | 61 + .../src/Models/RegisterDomainResponse.php | 86 + .../Models/RegisterDomainResponseStatus.php | 19 + .../RemoveGroupFromCustomerResponse.php | 60 + .../src/Models/ResumeSubscriptionRequest.php | 91 + .../src/Models/ResumeSubscriptionResponse.php | 119 + ...ookingCustomAttributeDefinitionRequest.php | 62 + ...okingCustomAttributeDefinitionResponse.php | 88 + .../RetrieveBookingCustomAttributeRequest.php | 109 + ...RetrieveBookingCustomAttributeResponse.php | 87 + .../src/Models/RetrieveBookingResponse.php | 84 + ...RetrieveBusinessBookingProfileResponse.php | 80 + .../src/Models/RetrieveCardResponse.php | 89 + .../Models/RetrieveCashDrawerShiftRequest.php | 57 + .../RetrieveCashDrawerShiftResponse.php | 86 + .../Models/RetrieveCatalogObjectRequest.php | 206 + .../Models/RetrieveCatalogObjectResponse.php | 135 + ...stomerCustomAttributeDefinitionRequest.php | 62 + ...tomerCustomAttributeDefinitionResponse.php | 88 + ...RetrieveCustomerCustomAttributeRequest.php | 110 + ...etrieveCustomerCustomAttributeResponse.php | 88 + .../Models/RetrieveCustomerGroupResponse.php | 92 + .../src/Models/RetrieveCustomerResponse.php | 86 + .../RetrieveCustomerSegmentResponse.php | 92 + .../RetrieveDisputeEvidenceResponse.php | 81 + .../src/Models/RetrieveDisputeResponse.php | 85 + .../src/Models/RetrieveEmployeeResponse.php | 84 + .../Models/RetrieveGiftCardFromGANRequest.php | 64 + .../RetrieveGiftCardFromGANResponse.php | 84 + .../RetrieveGiftCardFromNonceRequest.php | 62 + .../RetrieveGiftCardFromNonceResponse.php | 84 + .../src/Models/RetrieveGiftCardResponse.php | 84 + .../RetrieveInventoryAdjustmentResponse.php | 82 + .../RetrieveInventoryChangesRequest.php | 113 + .../RetrieveInventoryChangesResponse.php | 117 + .../Models/RetrieveInventoryCountRequest.php | 113 + .../Models/RetrieveInventoryCountResponse.php | 119 + ...RetrieveInventoryPhysicalCountResponse.php | 86 + .../RetrieveInventoryTransferResponse.php | 82 + .../square/src/Models/RetrieveJobResponse.php | 88 + ...RetrieveLocationBookingProfileResponse.php | 82 + ...cationCustomAttributeDefinitionRequest.php | 62 + ...ationCustomAttributeDefinitionResponse.php | 88 + ...RetrieveLocationCustomAttributeRequest.php | 110 + ...etrieveLocationCustomAttributeResponse.php | 88 + .../src/Models/RetrieveLocationResponse.php | 84 + .../RetrieveLocationSettingsResponse.php | 78 + .../Models/RetrieveLoyaltyAccountResponse.php | 87 + .../Models/RetrieveLoyaltyProgramResponse.php | 93 + .../RetrieveLoyaltyPromotionResponse.php | 89 + .../Models/RetrieveLoyaltyRewardResponse.php | 89 + ...rchantCustomAttributeDefinitionRequest.php | 62 + ...chantCustomAttributeDefinitionResponse.php | 88 + ...RetrieveMerchantCustomAttributeRequest.php | 110 + ...etrieveMerchantCustomAttributeResponse.php | 88 + .../src/Models/RetrieveMerchantResponse.php | 83 + .../RetrieveMerchantSettingsResponse.php | 78 + ...eOrderCustomAttributeDefinitionRequest.php | 58 + ...OrderCustomAttributeDefinitionResponse.php | 85 + .../RetrieveOrderCustomAttributeRequest.php | 106 + .../RetrieveOrderCustomAttributeResponse.php | 85 + .../src/Models/RetrieveOrderResponse.php | 90 + .../Models/RetrievePaymentLinkResponse.php | 78 + .../src/Models/RetrieveSnippetResponse.php | 85 + .../Models/RetrieveSubscriptionRequest.php | 78 + .../Models/RetrieveSubscriptionResponse.php | 90 + ...trieveTeamMemberBookingProfileResponse.php | 82 + .../src/Models/RetrieveTeamMemberResponse.php | 83 + .../Models/RetrieveTokenStatusResponse.php | 167 + .../Models/RetrieveTransactionResponse.php | 94 + .../src/Models/RetrieveVendorResponse.php | 83 + .../Models/RetrieveWageSettingResponse.php | 86 + .../RetrieveWebhookSubscriptionResponse.php | 91 + .../square/src/Models/RevokeTokenRequest.php | 185 + .../square/src/Models/RevokeTokenResponse.php | 80 + .../square/src/Models/RiskEvaluation.php | 82 + .../src/Models/RiskEvaluationRiskLevel.php | 24 + .../square/src/Models/SaveCardOptions.php | 127 + .../src/Models/SearchAvailabilityFilter.php | 210 + .../src/Models/SearchAvailabilityQuery.php | 60 + .../src/Models/SearchAvailabilityRequest.php | 57 + .../src/Models/SearchAvailabilityResponse.php | 84 + .../src/Models/SearchCatalogItemsRequest.php | 321 + .../SearchCatalogItemsRequestStockLevel.php | 19 + .../src/Models/SearchCatalogItemsResponse.php | 142 + .../Models/SearchCatalogObjectsRequest.php | 376 + .../Models/SearchCatalogObjectsResponse.php | 171 + .../src/Models/SearchCustomersRequest.php | 158 + .../src/Models/SearchCustomersResponse.php | 168 + .../square/src/Models/SearchEventsFilter.php | 182 + .../square/src/Models/SearchEventsQuery.php | 79 + .../square/src/Models/SearchEventsRequest.php | 124 + .../src/Models/SearchEventsResponse.php | 153 + .../square/src/Models/SearchEventsSort.php | 79 + .../src/Models/SearchEventsSortField.php | 16 + .../src/Models/SearchInvoicesRequest.php | 120 + .../src/Models/SearchInvoicesResponse.php | 120 + .../Models/SearchLoyaltyAccountsRequest.php | 114 + ...altyAccountsRequestLoyaltyAccountQuery.php | 133 + .../Models/SearchLoyaltyAccountsResponse.php | 120 + .../src/Models/SearchLoyaltyEventsRequest.php | 114 + .../Models/SearchLoyaltyEventsResponse.php | 119 + .../Models/SearchLoyaltyRewardsRequest.php | 112 + ...oyaltyRewardsRequestLoyaltyRewardQuery.php | 85 + .../Models/SearchLoyaltyRewardsResponse.php | 116 + .../src/Models/SearchOrdersCustomerFilter.php | 77 + .../src/Models/SearchOrdersDateTimeFilter.php | 142 + .../square/src/Models/SearchOrdersFilter.php | 187 + .../Models/SearchOrdersFulfillmentFilter.php | 127 + .../square/src/Models/SearchOrdersQuery.php | 83 + .../square/src/Models/SearchOrdersRequest.php | 181 + .../src/Models/SearchOrdersResponse.php | 154 + .../square/src/Models/SearchOrdersSort.php | 86 + .../src/Models/SearchOrdersSortField.php | 30 + .../src/Models/SearchOrdersSourceFilter.php | 78 + .../src/Models/SearchOrdersStateFilter.php | 66 + .../square/src/Models/SearchShiftsRequest.php | 104 + .../src/Models/SearchShiftsResponse.php | 114 + .../src/Models/SearchSubscriptionsFilter.php | 151 + .../src/Models/SearchSubscriptionsQuery.php | 58 + .../src/Models/SearchSubscriptionsRequest.php | 154 + .../Models/SearchSubscriptionsResponse.php | 125 + .../src/Models/SearchTeamMembersFilter.php | 139 + .../src/Models/SearchTeamMembersQuery.php | 66 + .../src/Models/SearchTeamMembersRequest.php | 106 + .../src/Models/SearchTeamMembersResponse.php | 114 + .../Models/SearchTerminalActionsRequest.php | 107 + .../Models/SearchTerminalActionsResponse.php | 119 + .../Models/SearchTerminalCheckoutsRequest.php | 105 + .../SearchTerminalCheckoutsResponse.php | 117 + .../Models/SearchTerminalRefundsRequest.php | 101 + .../Models/SearchTerminalRefundsResponse.php | 117 + .../src/Models/SearchVendorsRequest.php | 112 + .../src/Models/SearchVendorsRequestFilter.php | 112 + .../src/Models/SearchVendorsRequestSort.php | 79 + .../Models/SearchVendorsRequestSortField.php | 19 + .../src/Models/SearchVendorsResponse.php | 120 + .../square/src/Models/SegmentFilter.php | 95 + .../square/square/src/Models/SelectOption.php | 83 + .../square/src/Models/SelectOptions.php | 136 + .../square/square/src/Models/Shift.php | 481 + .../square/square/src/Models/ShiftFilter.php | 271 + .../square/src/Models/ShiftFilterStatus.php | 19 + .../square/square/src/Models/ShiftQuery.php | 81 + .../square/square/src/Models/ShiftSort.php | 79 + .../square/src/Models/ShiftSortField.php | 27 + .../square/square/src/Models/ShiftStatus.php | 19 + .../square/square/src/Models/ShiftWage.php | 165 + .../square/square/src/Models/ShiftWorkday.php | 127 + .../square/src/Models/ShiftWorkdayMatcher.php | 23 + .../square/square/src/Models/ShippingFee.php | 105 + .../square/src/Models/SignatureImage.php | 78 + .../square/src/Models/SignatureOptions.php | 112 + .../square/square/src/Models/Site.php | 212 + .../square/square/src/Models/Snippet.php | 161 + .../square/src/Models/SnippetResponse.php | 82 + .../square/square/src/Models/SortOrder.php | 19 + .../square/src/Models/SourceApplication.php | 132 + .../src/Models/SquareAccountDetails.php | 105 + .../src/Models/StandardUnitDescription.php | 130 + .../Models/StandardUnitDescriptionGroup.php | 105 + .../src/Models/SubmitEvidenceResponse.php | 85 + .../square/square/src/Models/Subscription.php | 644 + .../square/src/Models/SubscriptionAction.php | 227 + .../src/Models/SubscriptionActionType.php | 31 + .../square/src/Models/SubscriptionCadence.php | 63 + .../square/src/Models/SubscriptionEvent.php | 228 + .../src/Models/SubscriptionEventInfo.php | 90 + .../src/Models/SubscriptionEventInfoCode.php | 35 + ...SubscriptionEventSubscriptionEventType.php | 39 + .../square/src/Models/SubscriptionPhase.php | 240 + .../square/src/Models/SubscriptionPricing.php | 131 + .../src/Models/SubscriptionPricingType.php | 19 + .../square/src/Models/SubscriptionSource.php | 71 + .../square/src/Models/SubscriptionStatus.php | 31 + .../src/Models/SubscriptionTestResult.php | 183 + .../square/src/Models/SwapPlanRequest.php | 112 + .../square/src/Models/SwapPlanResponse.php | 119 + .../square/src/Models/TaxCalculationPhase.php | 19 + .../square/square/src/Models/TaxIds.php | 170 + .../square/src/Models/TaxInclusionType.php | 24 + .../square/square/src/Models/TeamMember.php | 395 + .../Models/TeamMemberAssignedLocations.php | 94 + ...mMemberAssignedLocationsAssignmentType.php | 21 + .../src/Models/TeamMemberBookingProfile.php | 171 + .../src/Models/TeamMemberInvitationStatus.php | 23 + .../square/src/Models/TeamMemberStatus.php | 20 + .../square/src/Models/TeamMemberWage.php | 239 + .../square/square/src/Models/Tender.php | 581 + .../src/Models/TenderBankAccountDetails.php | 57 + .../Models/TenderBankAccountDetailsStatus.php | 23 + .../Models/TenderBuyNowPayLaterDetails.php | 75 + .../TenderBuyNowPayLaterDetailsBrand.php | 10 + .../TenderBuyNowPayLaterDetailsStatus.php | 24 + .../square/src/Models/TenderCardDetails.php | 106 + .../Models/TenderCardDetailsEntryMethod.php | 33 + .../src/Models/TenderCardDetailsStatus.php | 27 + .../square/src/Models/TenderCashDetails.php | 103 + .../src/Models/TenderSquareAccountDetails.php | 52 + .../TenderSquareAccountDetailsStatus.php | 24 + .../square/square/src/Models/TenderType.php | 58 + .../square/src/Models/TerminalAction.php | 610 + .../src/Models/TerminalActionActionType.php | 52 + .../square/src/Models/TerminalActionQuery.php | 72 + .../src/Models/TerminalActionQueryFilter.php | 164 + .../src/Models/TerminalActionQuerySort.php | 51 + .../square/src/Models/TerminalCheckout.php | 711 + .../src/Models/TerminalCheckoutQuery.php | 72 + .../Models/TerminalCheckoutQueryFilter.php | 140 + .../src/Models/TerminalCheckoutQuerySort.php | 51 + .../square/src/Models/TerminalRefund.php | 432 + .../square/src/Models/TerminalRefundQuery.php | 72 + .../src/Models/TerminalRefundQueryFilter.php | 137 + .../src/Models/TerminalRefundQuerySort.php | 68 + .../Models/TestWebhookSubscriptionRequest.php | 71 + .../TestWebhookSubscriptionResponse.php | 90 + .../square/square/src/Models/TimeRange.php | 111 + .../square/square/src/Models/TipSettings.php | 255 + .../square/square/src/Models/Transaction.php | 394 + .../square/src/Models/TransactionProduct.php | 43 + .../square/src/Models/TransactionType.php | 13 + .../UnlinkCustomerFromGiftCardRequest.php | 60 + .../UnlinkCustomerFromGiftCardResponse.php | 84 + ...ookingCustomAttributeDefinitionRequest.php | 103 + ...okingCustomAttributeDefinitionResponse.php | 88 + .../src/Models/UpdateBookingRequest.php | 97 + .../src/Models/UpdateBookingResponse.php | 84 + .../src/Models/UpdateBreakTypeRequest.php | 62 + .../src/Models/UpdateBreakTypeResponse.php | 87 + .../src/Models/UpdateCatalogImageRequest.php | 65 + .../src/Models/UpdateCatalogImageResponse.php | 106 + ...stomerCustomAttributeDefinitionRequest.php | 103 + ...tomerCustomAttributeDefinitionResponse.php | 88 + .../src/Models/UpdateCustomerGroupRequest.php | 67 + .../Models/UpdateCustomerGroupResponse.php | 92 + .../src/Models/UpdateCustomerRequest.php | 509 + .../src/Models/UpdateCustomerResponse.php | 87 + .../src/Models/UpdateInvoiceRequest.php | 161 + .../src/Models/UpdateInvoiceResponse.php | 87 + .../Models/UpdateItemModifierListsRequest.php | 147 + .../UpdateItemModifierListsResponse.php | 82 + .../src/Models/UpdateItemTaxesRequest.php | 149 + .../src/Models/UpdateItemTaxesResponse.php | 82 + .../square/src/Models/UpdateJobRequest.php | 64 + .../square/src/Models/UpdateJobResponse.php | 88 + ...cationCustomAttributeDefinitionRequest.php | 103 + ...ationCustomAttributeDefinitionResponse.php | 88 + .../src/Models/UpdateLocationRequest.php | 54 + .../src/Models/UpdateLocationResponse.php | 83 + .../Models/UpdateLocationSettingsRequest.php | 55 + .../Models/UpdateLocationSettingsResponse.php | 78 + ...rchantCustomAttributeDefinitionRequest.php | 103 + ...chantCustomAttributeDefinitionResponse.php | 88 + .../Models/UpdateMerchantSettingsRequest.php | 55 + .../Models/UpdateMerchantSettingsResponse.php | 78 + ...eOrderCustomAttributeDefinitionRequest.php | 104 + ...OrderCustomAttributeDefinitionResponse.php | 85 + .../square/src/Models/UpdateOrderRequest.php | 177 + .../square/src/Models/UpdateOrderResponse.php | 94 + .../src/Models/UpdatePaymentLinkRequest.php | 55 + .../src/Models/UpdatePaymentLinkResponse.php | 78 + .../src/Models/UpdatePaymentRequest.php | 94 + .../src/Models/UpdatePaymentResponse.php | 84 + .../square/src/Models/UpdateShiftRequest.php | 64 + .../square/src/Models/UpdateShiftResponse.php | 89 + .../src/Models/UpdateSubscriptionRequest.php | 61 + .../src/Models/UpdateSubscriptionResponse.php | 90 + .../src/Models/UpdateTeamMemberRequest.php | 54 + .../src/Models/UpdateTeamMemberResponse.php | 84 + .../square/src/Models/UpdateVendorRequest.php | 114 + .../src/Models/UpdateVendorResponse.php | 83 + .../src/Models/UpdateWageSettingRequest.php | 62 + .../src/Models/UpdateWageSettingResponse.php | 86 + .../UpdateWebhookSubscriptionRequest.php | 56 + .../UpdateWebhookSubscriptionResponse.php | 90 + ...WebhookSubscriptionSignatureKeyRequest.php | 69 + ...ebhookSubscriptionSignatureKeyResponse.php | 89 + .../Models/UpdateWorkweekConfigRequest.php | 62 + .../Models/UpdateWorkweekConfigResponse.php | 87 + .../UpsertBookingCustomAttributeRequest.php | 102 + .../UpsertBookingCustomAttributeResponse.php | 87 + .../src/Models/UpsertCatalogObjectRequest.php | 129 + .../Models/UpsertCatalogObjectResponse.php | 135 + .../UpsertCustomerCustomAttributeRequest.php | 102 + .../UpsertCustomerCustomAttributeResponse.php | 87 + .../UpsertLocationCustomAttributeRequest.php | 102 + .../UpsertLocationCustomAttributeResponse.php | 87 + .../UpsertMerchantCustomAttributeRequest.php | 102 + .../UpsertMerchantCustomAttributeResponse.php | 87 + .../UpsertOrderCustomAttributeRequest.php | 104 + .../UpsertOrderCustomAttributeResponse.php | 85 + .../src/Models/UpsertSnippetRequest.php | 62 + .../src/Models/UpsertSnippetResponse.php | 85 + .../square/square/src/Models/V1Device.php | 87 + .../square/src/Models/V1ListOrdersRequest.php | 126 + .../src/Models/V1ListOrdersResponse.php | 53 + .../square/square/src/Models/V1Money.php | 92 + .../square/square/src/Models/V1Order.php | 853 + .../square/src/Models/V1OrderHistoryEntry.php | 77 + .../src/Models/V1OrderHistoryEntryAction.php | 15 + .../square/square/src/Models/V1OrderState.php | 14 + .../square/src/Models/V1PhoneNumber.php | 86 + .../square/square/src/Models/V1Tender.php | 535 + .../square/src/Models/V1TenderCardBrand.php | 20 + .../square/src/Models/V1TenderEntryMethod.php | 15 + .../square/square/src/Models/V1TenderType.php | 16 + .../src/Models/V1UpdateOrderRequest.php | 202 + .../src/Models/V1UpdateOrderRequestAction.php | 11 + .../square/square/src/Models/Vendor.php | 342 + .../square/src/Models/VendorContact.php | 234 + .../square/square/src/Models/VendorStatus.php | 20 + .../square/src/Models/VisibilityFilter.php | 26 + .../src/Models/VoidTransactionResponse.php | 59 + .../square/square/src/Models/WageSetting.php | 228 + .../square/src/Models/WebhookSubscription.php | 324 + .../square/square/src/Models/Weekday.php | 39 + .../square/src/Models/WorkweekConfig.php | 197 + .../square/square/src/Server.php | 12 + .../square/square/src/SquareClient.php | 675 + .../square/square/src/SquareClientBuilder.php | 145 + .../src/Utils/CompatibilityConverter.php | 42 + .../square/square/src/Utils/FileWrapper.php | 19 + .../square/src/Utils/WebhooksHelper.php | 43 + .../vendor_prefixed/stripe/stripe-php/LICENSE | 21 + .../stripe-php/data/ca-certificates.crt | 3347 ++++ .../stripe/stripe-php/init.php | 386 + .../stripe/stripe-php/lib/Account.php | 467 + .../stripe/stripe-php/lib/AccountLink.php | 41 + .../stripe/stripe-php/lib/AccountSession.php | 45 + .../stripe-php/lib/ApiOperations/All.php | 25 + .../stripe-php/lib/ApiOperations/Create.php | 29 + .../stripe-php/lib/ApiOperations/Delete.php | 28 + .../lib/ApiOperations/NestedResource.php | 121 + .../stripe-php/lib/ApiOperations/Request.php | 119 + .../stripe-php/lib/ApiOperations/Retrieve.php | 29 + .../stripe-php/lib/ApiOperations/Search.php | 25 + .../lib/ApiOperations/SingletonRetrieve.php | 28 + .../stripe-php/lib/ApiOperations/Update.php | 52 + .../stripe/stripe-php/lib/ApiRequestor.php | 542 + .../stripe/stripe-php/lib/ApiResource.php | 101 + .../stripe/stripe-php/lib/ApiResponse.php | 40 + .../stripe/stripe-php/lib/ApplePayDomain.php | 93 + .../stripe/stripe-php/lib/Application.php | 14 + .../stripe/stripe-php/lib/ApplicationFee.php | 116 + .../stripe-php/lib/ApplicationFeeRefund.php | 54 + .../stripe/stripe-php/lib/Apps/Secret.php | 96 + .../stripe/stripe-php/lib/Balance.php | 49 + .../stripe-php/lib/BalanceTransaction.php | 113 + .../stripe/stripe-php/lib/BankAccount.php | 147 + .../stripe-php/lib/BaseStripeClient.php | 387 + .../lib/BaseStripeClientInterface.php | 46 + .../stripe/stripe-php/lib/Billing/Alert.php | 119 + .../stripe-php/lib/Billing/AlertTriggered.php | 17 + .../lib/Billing/CreditBalanceSummary.php | 33 + .../lib/Billing/CreditBalanceTransaction.php | 57 + .../stripe-php/lib/Billing/CreditGrant.php | 134 + .../stripe/stripe-php/lib/Billing/Meter.php | 149 + .../stripe-php/lib/Billing/MeterEvent.php | 39 + .../lib/Billing/MeterEventAdjustment.php | 40 + .../lib/Billing/MeterEventSummary.php | 21 + .../lib/BillingPortal/Configuration.php | 101 + .../stripe-php/lib/BillingPortal/Session.php | 56 + .../stripe/stripe-php/lib/Capability.php | 88 + .../stripe/stripe-php/lib/Card.php | 163 + .../stripe/stripe-php/lib/CashBalance.php | 52 + .../stripe/stripe-php/lib/Charge.php | 256 + .../stripe-php/lib/Checkout/Session.php | 212 + .../stripe/stripe-php/lib/Climate/Order.php | 134 + .../stripe/stripe-php/lib/Climate/Product.php | 55 + .../stripe-php/lib/Climate/Supplier.php | 55 + .../stripe/stripe-php/lib/Collection.php | 265 + .../stripe-php/lib/ConfirmationToken.php | 52 + .../lib/ConnectCollectionTransfer.php | 17 + .../stripe/stripe-php/lib/CountrySpec.php | 58 + .../stripe/stripe-php/lib/Coupon.php | 143 + .../stripe/stripe-php/lib/CreditNote.php | 207 + .../stripe-php/lib/CreditNoteLineItem.php | 30 + .../stripe/stripe-php/lib/Customer.php | 454 + .../lib/CustomerBalanceTransaction.php | 80 + .../lib/CustomerCashBalanceTransaction.php | 40 + .../stripe/stripe-php/lib/CustomerSession.php | 46 + .../stripe/stripe-php/lib/Discount.php | 28 + .../stripe/stripe-php/lib/Dispute.php | 132 + .../lib/Entitlements/ActiveEntitlement.php | 50 + .../Entitlements/ActiveEntitlementSummary.php | 17 + .../stripe-php/lib/Entitlements/Feature.php | 93 + .../stripe/stripe-php/lib/EphemeralKey.php | 54 + .../stripe/stripe-php/lib/ErrorObject.php | 235 + .../stripe/stripe-php/lib/Event.php | 570 + ...lingMeterErrorReportTriggeredEventData.php | 14 + .../V1BillingMeterNoMeterFoundEventData.php | 14 + ...1BillingMeterErrorReportTriggeredEvent.php | 34 + .../V1BillingMeterNoMeterFoundEvent.php | 20 + .../lib/Exception/ApiConnectionException.php | 12 + .../lib/Exception/ApiErrorException.php | 192 + .../lib/Exception/AuthenticationException.php | 11 + .../lib/Exception/BadMethodCallException.php | 7 + .../lib/Exception/CardException.php | 70 + .../lib/Exception/ExceptionInterface.php | 22 + .../lib/Exception/IdempotencyException.php | 11 + .../Exception/InvalidArgumentException.php | 7 + .../lib/Exception/InvalidRequestException.php | 49 + .../Exception/OAuth/ExceptionInterface.php | 10 + .../OAuth/InvalidClientException.php | 12 + .../Exception/OAuth/InvalidGrantException.php | 13 + .../OAuth/InvalidRequestException.php | 11 + .../Exception/OAuth/InvalidScopeException.php | 10 + .../Exception/OAuth/OAuthErrorException.php | 18 + .../OAuth/UnknownOAuthErrorException.php | 12 + .../OAuth/UnsupportedGrantTypeException.php | 11 + .../UnsupportedResponseTypeException.php | 11 + .../lib/Exception/PermissionException.php | 11 + .../lib/Exception/RateLimitException.php | 12 + .../SignatureVerificationException.php | 65 + .../TemporarySessionExpiredException.php | 8 + .../Exception/UnexpectedValueException.php | 7 + .../Exception/UnknownApiErrorException.php | 12 + .../stripe/stripe-php/lib/ExchangeRate.php | 75 + .../stripe/stripe-php/lib/File.php | 110 + .../stripe/stripe-php/lib/FileLink.php | 96 + .../lib/FinancialConnections/Account.php | 154 + .../lib/FinancialConnections/AccountOwner.php | 21 + .../FinancialConnections/AccountOwnership.php | 17 + .../lib/FinancialConnections/Session.php | 61 + .../lib/FinancialConnections/Transaction.php | 60 + .../stripe-php/lib/Forwarding/Request.php | 90 + .../stripe-php/lib/FundingInstructions.php | 23 + .../lib/HttpClient/ClientInterface.php | 23 + .../stripe-php/lib/HttpClient/CurlClient.php | 659 + .../HttpClient/StreamingClientInterface.php | 23 + .../lib/Identity/VerificationReport.php | 72 + .../lib/Identity/VerificationSession.php | 167 + .../stripe/stripe-php/lib/Invoice.php | 450 + .../stripe/stripe-php/lib/InvoiceItem.php | 143 + .../stripe/stripe-php/lib/InvoiceLineItem.php | 67 + .../lib/InvoiceRenderingTemplate.php | 89 + .../stripe-php/lib/Issuing/Authorization.php | 141 + .../stripe/stripe-php/lib/Issuing/Card.php | 124 + .../stripe-php/lib/Issuing/CardDetails.php | 19 + .../stripe-php/lib/Issuing/Cardholder.php | 112 + .../stripe/stripe-php/lib/Issuing/Dispute.php | 149 + .../lib/Issuing/PersonalizationDesign.php | 104 + .../stripe-php/lib/Issuing/PhysicalBundle.php | 58 + .../stripe/stripe-php/lib/Issuing/Token.php | 88 + .../stripe-php/lib/Issuing/Transaction.php | 101 + .../stripe/stripe-php/lib/LineItem.php | 25 + .../stripe/stripe-php/lib/LoginLink.php | 16 + .../stripe/stripe-php/lib/Mandate.php | 46 + .../stripe/stripe-php/lib/OAuth.php | 75 + .../stripe-php/lib/OAuthErrorObject.php | 29 + .../stripe/stripe-php/lib/PaymentIntent.php | 282 + .../stripe/stripe-php/lib/PaymentLink.php | 150 + .../stripe/stripe-php/lib/PaymentMethod.php | 239 + .../lib/PaymentMethodConfiguration.php | 148 + .../stripe-php/lib/PaymentMethodDomain.php | 114 + .../stripe/stripe-php/lib/Payout.php | 191 + .../stripe/stripe-php/lib/Person.php | 117 + .../stripe/stripe-php/lib/Plan.php | 150 + .../stripe/stripe-php/lib/Price.php | 137 + .../stripe/stripe-php/lib/Product.php | 206 + .../stripe/stripe-php/lib/ProductFeature.php | 18 + .../stripe/stripe-php/lib/PromotionCode.php | 104 + .../stripe/stripe-php/lib/Quote.php | 227 + .../lib/Radar/EarlyFraudWarning.php | 67 + .../stripe/stripe-php/lib/Radar/ValueList.php | 132 + .../stripe-php/lib/Radar/ValueListItem.php | 95 + .../stripe/stripe-php/lib/Reason.php | 13 + .../stripe-php/lib/RecipientTransfer.php | 36 + .../stripe/stripe-php/lib/Refund.php | 153 + .../stripe/stripe-php/lib/RelatedObject.php | 15 + .../stripe-php/lib/Reporting/ReportRun.php | 82 + .../stripe-php/lib/Reporting/ReportType.php | 62 + .../stripe-php/lib/RequestTelemetry.php | 31 + .../stripe-php/lib/ReserveTransaction.php | 16 + .../stripe/stripe-php/lib/Review.php | 99 + .../stripe/stripe-php/lib/SearchResult.php | 206 + .../lib/Service/AbstractService.php | 98 + .../lib/Service/AbstractServiceFactory.php | 25 + .../lib/Service/AccountLinkService.php | 28 + .../stripe-php/lib/Service/AccountService.php | 390 + .../lib/Service/AccountSessionService.php | 27 + .../lib/Service/ApplePayDomainService.php | 70 + .../lib/Service/ApplicationFeeService.php | 123 + .../lib/Service/Apps/AppsServiceFactory.php | 21 + .../lib/Service/Apps/SecretService.php | 68 + .../stripe-php/lib/Service/BalanceService.php | 29 + .../lib/Service/BalanceTransactionService.php | 49 + .../lib/Service/Billing/AlertService.php | 101 + .../Service/Billing/BillingServiceFactory.php | 27 + .../Billing/CreditBalanceSummaryService.php | 26 + .../CreditBalanceTransactionService.php | 41 + .../Service/Billing/CreditGrantService.php | 100 + .../Billing/MeterEventAdjustmentService.php | 26 + .../lib/Service/Billing/MeterEventService.php | 26 + .../lib/Service/Billing/MeterService.php | 117 + .../BillingPortalServiceFactory.php | 22 + .../BillingPortal/ConfigurationService.php | 73 + .../Service/BillingPortal/SessionService.php | 26 + .../stripe-php/lib/Service/ChargeService.php | 120 + .../Checkout/CheckoutServiceFactory.php | 21 + .../lib/Service/Checkout/SessionService.php | 106 + .../Service/Climate/ClimateServiceFactory.php | 23 + .../lib/Service/Climate/OrderService.php | 93 + .../lib/Service/Climate/ProductService.php | 41 + .../lib/Service/Climate/SupplierService.php | 41 + .../lib/Service/ConfirmationTokenService.php | 27 + .../lib/Service/CoreServiceFactory.php | 163 + .../lib/Service/CountrySpecService.php | 41 + .../stripe-php/lib/Service/CouponService.php | 103 + .../lib/Service/CreditNoteService.php | 152 + .../lib/Service/CustomerService.php | 474 + .../lib/Service/CustomerSessionService.php | 28 + .../stripe-php/lib/Service/DisputeService.php | 83 + .../Entitlements/ActiveEntitlementService.php | 41 + .../EntitlementsServiceFactory.php | 22 + .../Service/Entitlements/FeatureService.php | 70 + .../lib/Service/EphemeralKeyService.php | 44 + .../stripe-php/lib/Service/EventService.php | 46 + .../lib/Service/ExchangeRateService.php | 43 + .../lib/Service/FileLinkService.php | 70 + .../stripe-php/lib/Service/FileService.php | 64 + .../FinancialConnections/AccountService.php | 120 + .../FinancialConnectionsServiceFactory.php | 23 + .../FinancialConnections/SessionService.php | 43 + .../TransactionService.php | 41 + .../Forwarding/ForwardingServiceFactory.php | 21 + .../lib/Service/Forwarding/RequestService.php | 55 + .../Identity/IdentityServiceFactory.php | 22 + .../Identity/VerificationReportService.php | 41 + .../Identity/VerificationSessionService.php | 144 + .../lib/Service/InvoiceItemService.php | 92 + .../InvoiceRenderingTemplateService.php | 78 + .../stripe-php/lib/Service/InvoiceService.php | 397 + .../Service/Issuing/AuthorizationService.php | 104 + .../lib/Service/Issuing/CardService.php | 73 + .../lib/Service/Issuing/CardholderService.php | 74 + .../lib/Service/Issuing/DisputeService.php | 98 + .../Service/Issuing/IssuingServiceFactory.php | 28 + .../Issuing/PersonalizationDesignService.php | 72 + .../Service/Issuing/PhysicalBundleService.php | 42 + .../lib/Service/Issuing/TokenService.php | 57 + .../Service/Issuing/TransactionService.php | 60 + .../stripe-php/lib/Service/MandateService.php | 27 + .../stripe-php/lib/Service/OAuthService.php | 124 + .../lib/Service/PaymentIntentService.php | 272 + .../lib/Service/PaymentLinkService.php | 88 + .../PaymentMethodConfigurationService.php | 70 + .../Service/PaymentMethodDomainService.php | 96 + .../lib/Service/PaymentMethodService.php | 133 + .../stripe-php/lib/Service/PayoutService.php | 125 + .../stripe-php/lib/Service/PlanService.php | 90 + .../stripe-php/lib/Service/PriceService.php | 93 + .../stripe-php/lib/Service/ProductService.php | 172 + .../lib/Service/PromotionCodeService.php | 75 + .../stripe-php/lib/Service/QuoteService.php | 174 + .../Radar/EarlyFraudWarningService.php | 45 + .../lib/Service/Radar/RadarServiceFactory.php | 23 + .../Service/Radar/ValueListItemService.php | 74 + .../lib/Service/Radar/ValueListService.php | 92 + .../stripe-php/lib/Service/RefundService.php | 105 + .../Service/Reporting/ReportRunService.php | 56 + .../Service/Reporting/ReportTypeService.php | 42 + .../Reporting/ReportingServiceFactory.php | 22 + .../stripe-php/lib/Service/ReviewService.php | 59 + .../lib/Service/ServiceNavigatorTrait.php | 48 + .../lib/Service/SetupAttemptService.php | 26 + .../lib/Service/SetupIntentService.php | 143 + .../lib/Service/ShippingRateService.php | 70 + .../Sigma/ScheduledQueryRunService.php | 41 + .../lib/Service/Sigma/SigmaServiceFactory.php | 21 + .../stripe-php/lib/Service/SourceService.php | 110 + .../lib/Service/SubscriptionItemService.php | 148 + .../Service/SubscriptionScheduleService.php | 111 + .../lib/Service/SubscriptionService.php | 215 + .../lib/Service/Tax/CalculationService.php | 59 + .../lib/Service/Tax/RegistrationService.php | 73 + .../lib/Service/Tax/SettingsService.php | 41 + .../lib/Service/Tax/TaxServiceFactory.php | 24 + .../lib/Service/Tax/TransactionService.php | 71 + .../stripe-php/lib/Service/TaxCodeService.php | 43 + .../stripe-php/lib/Service/TaxIdService.php | 70 + .../stripe-php/lib/Service/TaxRateService.php | 71 + .../Service/Terminal/ConfigurationService.php | 85 + .../Terminal/ConnectionTokenService.php | 28 + .../lib/Service/Terminal/LocationService.php | 88 + .../lib/Service/Terminal/ReaderService.php | 161 + .../Terminal/TerminalServiceFactory.php | 24 + .../TestHelpers/ConfirmationTokenService.php | 26 + .../Service/TestHelpers/CustomerService.php | 27 + .../Issuing/AuthorizationService.php | 118 + .../TestHelpers/Issuing/CardService.php | 93 + .../Issuing/IssuingServiceFactory.php | 24 + .../Issuing/PersonalizationDesignService.php | 60 + .../Issuing/TransactionService.php | 55 + .../lib/Service/TestHelpers/RefundService.php | 27 + .../TestHelpers/Terminal/ReaderService.php | 28 + .../Terminal/TerminalServiceFactory.php | 21 + .../Service/TestHelpers/TestClockService.php | 86 + .../TestHelpers/TestHelpersServiceFactory.php | 27 + .../Treasury/InboundTransferService.php | 63 + .../Treasury/OutboundPaymentService.php | 80 + .../Treasury/OutboundTransferService.php | 80 + .../Treasury/ReceivedCreditService.php | 28 + .../Treasury/ReceivedDebitService.php | 28 + .../Treasury/TreasuryServiceFactory.php | 25 + .../stripe-php/lib/Service/TokenService.php | 46 + .../stripe-php/lib/Service/TopupService.php | 88 + .../lib/Service/TransferService.php | 157 + .../Treasury/CreditReversalService.php | 57 + .../Service/Treasury/DebitReversalService.php | 55 + .../Treasury/FinancialAccountService.php | 118 + .../Treasury/InboundTransferService.php | 70 + .../Treasury/OutboundPaymentService.php | 72 + .../Treasury/OutboundTransferService.php | 72 + .../Treasury/ReceivedCreditService.php | 42 + .../Service/Treasury/ReceivedDebitService.php | 42 + .../Treasury/TransactionEntryService.php | 41 + .../Service/Treasury/TransactionService.php | 41 + .../Treasury/TreasuryServiceFactory.php | 30 + .../V2/Billing/BillingServiceFactory.php | 24 + .../Billing/MeterEventAdjustmentService.php | 26 + .../Service/V2/Billing/MeterEventService.php | 28 + .../V2/Billing/MeterEventSessionService.php | 28 + .../V2/Billing/MeterEventStreamService.php | 32 + .../Service/V2/Core/CoreServiceFactory.php | 27 + .../V2/Core/EventDestinationService.php | 130 + .../lib/Service/V2/Core/EventService.php | 41 + .../lib/Service/V2/V2ServiceFactory.php | 22 + .../lib/Service/WebhookEndpointService.php | 96 + .../stripe/stripe-php/lib/SetupAttempt.php | 46 + .../stripe/stripe-php/lib/SetupIntent.php | 195 + .../stripe/stripe-php/lib/ShippingRate.php | 102 + .../lib/Sigma/ScheduledQueryRun.php | 63 + .../stripe-php/lib/SingletonApiResource.php | 28 + .../stripe/stripe-php/lib/Source.php | 222 + .../lib/SourceMandateNotification.php | 27 + .../stripe-php/lib/SourceTransaction.php | 46 + .../stripe/stripe-php/lib/Stripe.php | 242 + .../stripe/stripe-php/lib/StripeClient.php | 98 + .../stripe-php/lib/StripeClientInterface.php | 21 + .../stripe/stripe-php/lib/StripeObject.php | 519 + .../lib/StripeStreamingClientInterface.php | 11 + .../stripe/stripe-php/lib/Subscription.php | 280 + .../stripe-php/lib/SubscriptionItem.php | 146 + .../stripe-php/lib/SubscriptionSchedule.php | 147 + .../stripe/stripe-php/lib/Tax/Calculation.php | 85 + .../lib/Tax/CalculationLineItem.php | 24 + .../stripe-php/lib/Tax/Registration.php | 104 + .../stripe/stripe-php/lib/Tax/Settings.php | 77 + .../stripe/stripe-php/lib/Tax/Transaction.php | 99 + .../lib/Tax/TransactionLineItem.php | 28 + .../stripe/stripe-php/lib/TaxCode.php | 51 + .../stripe-php/lib/TaxDeductedAtSource.php | 16 + .../stripe/stripe-php/lib/TaxId.php | 200 + .../stripe/stripe-php/lib/TaxRate.php | 128 + .../stripe-php/lib/Terminal/Configuration.php | 114 + .../lib/Terminal/ConnectionToken.php | 39 + .../stripe-php/lib/Terminal/Location.php | 115 + .../stripe/stripe-php/lib/Terminal/Reader.php | 203 + .../stripe-php/lib/TestHelpers/TestClock.php | 111 + .../stripe/stripe-php/lib/ThinEvent.php | 27 + .../stripe/stripe-php/lib/Token.php | 86 + .../stripe/stripe-php/lib/Topup.php | 128 + .../stripe/stripe-php/lib/Transfer.php | 179 + .../stripe-php/lib/TransferReversal.php | 66 + .../lib/Treasury/CreditReversal.php | 85 + .../stripe-php/lib/Treasury/DebitReversal.php | 84 + .../lib/Treasury/FinancialAccount.php | 153 + .../lib/Treasury/FinancialAccountFeatures.php | 22 + .../lib/Treasury/InboundTransfer.php | 105 + .../lib/Treasury/OutboundPayment.php | 112 + .../lib/Treasury/OutboundTransfer.php | 110 + .../lib/Treasury/ReceivedCredit.php | 72 + .../stripe-php/lib/Treasury/ReceivedDebit.php | 72 + .../stripe-php/lib/Treasury/Transaction.php | 72 + .../lib/Treasury/TransactionEntry.php | 87 + .../stripe/stripe-php/lib/UsageRecord.php | 24 + .../stripe-php/lib/UsageRecordSummary.php | 20 + .../stripe/stripe-php/lib/Util/ApiVersion.php | 9 + .../lib/Util/CaseInsensitiveArray.php | 85 + .../stripe-php/lib/Util/DefaultLogger.php | 26 + .../stripe/stripe-php/lib/Util/EventTypes.php | 12 + .../stripe-php/lib/Util/LoggerInterface.php | 34 + .../stripe-php/lib/Util/ObjectTypes.php | 166 + .../stripe-php/lib/Util/RandomGenerator.php | 34 + .../stripe-php/lib/Util/RequestOptions.php | 151 + .../stripe/stripe-php/lib/Util/Set.php | 41 + .../stripe/stripe-php/lib/Util/Util.php | 293 + .../stripe-php/lib/V2/Billing/MeterEvent.php | 20 + .../lib/V2/Billing/MeterEventAdjustment.php | 21 + .../lib/V2/Billing/MeterEventSession.php | 17 + .../stripe/stripe-php/lib/V2/Collection.php | 90 + .../stripe/stripe-php/lib/V2/Event.php | 21 + .../stripe-php/lib/V2/EventDestination.php | 34 + .../stripe/stripe-php/lib/Webhook.php | 37 + .../stripe/stripe-php/lib/WebhookEndpoint.php | 132 + .../stripe-php/lib/WebhookSignature.php | 111 + .../css-selector/CssSelectorConverter.php | 54 + .../Exception/ExceptionInterface.php | 23 + .../Exception/ExpressionErrorException.php | 23 + .../Exception/InternalErrorException.php | 23 + .../css-selector/Exception/ParseException.php | 23 + .../Exception/SyntaxErrorException.php | 66 + .../symfony/css-selector/LICENSE | 19 + .../css-selector/Node/AbstractNode.php | 36 + .../css-selector/Node/AttributeNode.php | 70 + .../symfony/css-selector/Node/ClassNode.php | 51 + .../Node/CombinedSelectorNode.php | 58 + .../symfony/css-selector/Node/ElementNode.php | 52 + .../css-selector/Node/FunctionNode.php | 67 + .../symfony/css-selector/Node/HashNode.php | 51 + .../css-selector/Node/NegationNode.php | 51 + .../css-selector/Node/NodeInterface.php | 28 + .../symfony/css-selector/Node/PseudoNode.php | 51 + .../css-selector/Node/SelectorNode.php | 51 + .../symfony/css-selector/Node/Specificity.php | 64 + .../Parser/Handler/CommentHandler.php | 43 + .../Parser/Handler/HandlerInterface.php | 28 + .../Parser/Handler/HashHandler.php | 51 + .../Parser/Handler/IdentifierHandler.php | 51 + .../Parser/Handler/NumberHandler.php | 47 + .../Parser/Handler/StringHandler.php | 66 + .../Parser/Handler/WhitespaceHandler.php | 41 + .../symfony/css-selector/Parser/Parser.php | 278 + .../css-selector/Parser/ParserInterface.php | 32 + .../symfony/css-selector/Parser/Reader.php | 73 + .../Parser/Shortcut/ClassParser.php | 46 + .../Parser/Shortcut/ElementParser.php | 44 + .../Parser/Shortcut/EmptyStringParser.php | 43 + .../Parser/Shortcut/HashParser.php | 46 + .../symfony/css-selector/Parser/Token.php | 94 + .../css-selector/Parser/TokenStream.php | 146 + .../Parser/Tokenizer/Tokenizer.php | 56 + .../Parser/Tokenizer/TokenizerEscaping.php | 56 + .../Parser/Tokenizer/TokenizerPatterns.php | 80 + .../XPath/Extension/AbstractExtension.php | 60 + .../Extension/AttributeMatchingExtension.php | 73 + .../XPath/Extension/CombinationExtension.php | 56 + .../XPath/Extension/ExtensionInterface.php | 61 + .../XPath/Extension/FunctionExtension.php | 135 + .../XPath/Extension/HtmlExtension.php | 100 + .../XPath/Extension/NodeExtension.php | 150 + .../XPath/Extension/PseudoClassExtension.php | 86 + .../symfony/css-selector/XPath/Translator.php | 188 + .../XPath/TranslatorInterface.php | 34 + .../symfony/css-selector/XPath/XPathExpr.php | 85 + .../src/Css/Processor.php | 63 + .../src/Css/Property/Processor.php | 106 + .../src/Css/Property/Property.php | 77 + .../src/Css/Rule/Processor.php | 114 + .../src/Css/Rule/Rule.php | 76 + .../src/CssToInlineStyles.php | 194 + .../vendor_prefixed/true/punycode/LICENSE | 19 + .../Exception/DomainOutOfBoundsException.php | 12 + .../Exception/LabelOutOfBoundsException.php | 12 + .../src/Exception/OutOfBoundsException.php | 12 + .../true/punycode/src/Punycode.php | 302 + wp-content/plugins/wpforms-lite/wpforms.php | 251 + wp-content/themes/homeproz/archive.php | 61 +- .../themes/homeproz/dist/assets/main.css | 2 +- .../themes/homeproz/dist/assets/main.js | 2 +- wp-content/themes/homeproz/functions.php | 32 + wp-content/themes/homeproz/home.php | 15 +- wp-content/themes/homeproz/inc/acf-fields.php | 381 +- .../themes/homeproz/inc/custom-post-types.php | 176 +- wp-content/themes/homeproz/inc/favicon.php | 0 .../themes/homeproz/inc/social-sharing.php | 359 + .../homeproz/inc/template-functions.php | 67 + .../themes/homeproz/inc/wpcf7-hooks.php | 31 +- wp-content/themes/homeproz/inc/yoast-seo.php | 0 wp-content/themes/homeproz/man/cms-fields.txt | 17 - .../@esbuild/linux-arm64/README.md | 0 .../@esbuild/linux-arm64/package.json | 0 .../@parcel/watcher-linux-arm64-glibc/LICENSE | 0 .../watcher-linux-arm64-glibc/README.md | 0 .../watcher-linux-arm64-glibc/package.json | 0 .../watcher-linux-arm64-glibc/watcher.node | Bin .../@parcel/watcher-linux-arm64-musl/LICENSE | 0 .../watcher-linux-arm64-musl/README.md | 0 .../watcher-linux-arm64-musl/package.json | 0 .../watcher-linux-arm64-musl/watcher.node | Bin .../@rollup/rollup-linux-arm64-gnu/README.md | 0 .../rollup-linux-arm64-gnu/package.json | 0 .../rollup.linux-arm64-gnu.node | Bin .../@rollup/rollup-linux-arm64-musl/README.md | 0 .../rollup-linux-arm64-musl/package.json | 0 .../rollup.linux-arm64-musl.node | Bin wp-content/themes/homeproz/page-about.php | 153 +- .../themes/homeproz/page-city-landing.php | 0 .../themes/homeproz/page-city-landing.scss | 0 .../themes/homeproz/page-property-inquiry.php | 119 +- wp-content/themes/homeproz/page-results.php | 126 + wp-content/themes/homeproz/page-team.php | 181 + wp-content/themes/homeproz/single-agent.php | 47 +- .../themes/homeproz/single-property.php | 268 - wp-content/themes/homeproz/single.php | 143 +- wp-content/themes/homeproz/src/main.scss | 4 +- .../template-parts/agent/single-agent.scss | 43 +- .../template-parts/content/content-about.scss | 85 +- .../content/content-property-inquiry.scss | 90 +- .../content/content-results.scss | 75 + .../template-parts/content/content-single.php | 13 + .../content/content-single.scss | 176 +- .../template-parts/content/content-team.scss | 71 + .../template-parts/footer/site-footer.php | 10 +- .../template-parts/header/site-header.php | 8 + .../template-parts/property/CLAUDE.md | 35 +- .../property/agent-card-minimal.php | 58 + .../template-parts/property/mobile-map.js | 601 +- .../template-parts/property/mobile-map.scss | 190 +- .../property/property-agent.php | 193 +- ...perty-card.php => property-card-agent.php} | 75 +- .../property/property-card-minimal.php | 39 +- .../property/property-card-mls.php | 40 +- .../property/property-filters.js | 55 +- .../property/property-filters.scss | 42 + .../property/property-gallery.js | 383 +- .../property/property-gallery.scss | 31 + .../property/single-property-mls.php | 237 +- .../property/single-property-mls.scss | 399 + .../property/single-property.scss | 710 - 5385 files changed, 838580 insertions(+), 2416 deletions(-) mode change 100644 => 100755 db_content_updates/2026-01-05_SEO_albert_lea_landing_page.md mode change 100644 => 100755 db_content_updates/2026-01-06_agent-testimonials.md mode change 100644 => 100755 db_content_updates/2026-01-06_favicon-management.md mode change 100644 => 100755 db_content_updates/2026-01-06_mls-ssl-skip-config.md create mode 100755 db_content_updates/2026-01-12_22-37_property-inquiry-form-reorder.md create mode 100755 db_content_updates/2026-01-12_agent-mls-id-assignments.md create mode 100755 db_content_updates/2026-01-20_remove-legacy-property-posts.md create mode 100755 db_content_updates/2026-01-21_17-34_split-about-team-pages.md create mode 100755 db_content_updates/2026-01-21_18-15_blog-enhancements.md create mode 100755 db_content_updates/2026-01-21_manual-property-system.md create mode 100644 db_content_updates/2026-01-23_about-page-acf-fields.md mode change 100644 => 100755 db_content_updates/README.md mode change 100644 => 100755 wordpress-20260104.sql.gz delete mode 100755 wp-content/cache/transformed-images/e5215a1698b82c652e6d53647619cac7.webp create mode 100755 wp-content/plugins/mls-by-hansonxyz/admin/css/manual-property.css create mode 100755 wp-content/plugins/mls-by-hansonxyz/admin/js/manual-property.js mode change 100644 => 100755 wp-content/plugins/mls-by-hansonxyz/includes/class-mls-garbage-collector.php create mode 100755 wp-content/plugins/mls-by-hansonxyz/includes/class-mls-geocoder.php create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/admin-bar.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/admin-notifications.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/admin-site-health.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/dashboard-widget.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/emails/summary-report-email.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/smtp-about.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/smtp-admin.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/smtp-smart-routing.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/vendor/flatpickr.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/vendor/jquery-confirm.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/css/vendor/lity.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/affiliatewp.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/duplicator-icon-large.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/edd.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/icon-full.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/icon-none.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/icon-partial.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-aioseo.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-charitable.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-mi.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-om.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-pushengage.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-rp.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-seedprod.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-smash-balloon-facebook-feeds.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-smash-balloon-instagram-feeds.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-smash-balloon-twitter-feeds.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-smash-balloon-youtube-feeds.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-trustpulse.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-wpcode.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-wpf.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/searchwp.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/sugar-calendar.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/team.jpg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/about/wp-simple-pay.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/screenshot-01.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/screenshot-02.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/thumbnail-01.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/thumbnail-02.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/error-icon.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/delivered.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/sent.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/total.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/unsent.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/delivered.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/sent.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/total.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/unsent.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/yes-green.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-01.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-02.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-03.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-01.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-02.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-03.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email/icon-check.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email/illustration-success.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email/signature.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email/wp-mail-smtp-whitelabel.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/email/wp-mail-smtp.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/facebook.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/life-ring.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/lightbulb.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/mascot.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/star.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/arrow-rotate-right-purple.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/cancel-red.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-dark-green.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-solid-green.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/clock-orange.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-regular-red.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-orange.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-red.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle-blue.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/arrow-up.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/badge-percent.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/check-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/check.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/close.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-pdf-grey.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-yes-alt-green.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/error.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/exclamation-circle.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/lightbulb.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/success.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/warning.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/icons/zoom.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-blue.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-white.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/logo-whitelabel.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/logo.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/logs/archive-thumbnail.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/logs/archive.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/logs/single-thumbnail.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/logs/single.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/menu-icon.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/pattie.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/pro-badge-small.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/pro-badge.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/brevo.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/elasticemail.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/mailersend.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/mailjet.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/mandrill.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost-smtp.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/postmark.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/resend.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/sendlayer.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp-com.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp2go.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/sparkpost.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/providers/zoho.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-arrow-down.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-arrow-up.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-check-gray.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-check.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-click.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-email.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-error.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-open.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo-dark-whitelabel.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo-dark.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo-whitelabel.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/reports/icon-note.png create mode 100755 wp-content/plugins/wp-mail-smtp/assets/images/wp-spinner.gif create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/connect.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/connect.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-dashboard-widget.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-dashboard-widget.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-notifications.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-notifications.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-tools-debug-events.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/smtp-tools-debug-events.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/chart.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/chartjs-adapter-moment.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/flatpickr.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery-confirm.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/js/vendor/lity.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/languages/wp-mail-smtp-vue.php create mode 100755 wp-content/plugins/wp-mail-smtp/assets/languages/wp-mail-smtp.pot create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/css/wizard.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/css/wizard.rtl.min.css create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/amazonses.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/arrow.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/brevo.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/check-circle-solid-white.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/check-circle-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/check-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/chevron-down-solid-grey.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/copy-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/elasticemail.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/exclamation-circle-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/gmail-sign-in-btn.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/gmail.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/info-circle-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/loading-blue.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/loading-pattie.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/loading-white.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/loading.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/lock-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/logo.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/long-arrow-alt-left-regular-grey.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/long-arrow-alt-left-regular.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/long-arrow-alt-right-regular-white.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/long-arrow-alt-right-regular.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/mailersend.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/mailgun.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/mailjet.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/mandrill.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/outlook-sign-in-btn.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/outlook.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/postmark.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/pro-badge.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/question-circle-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/resend.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/sendgrid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/sendlayer.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/smtp.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/smtp2go.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/smtpcom.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/sparkpost.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/star-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/thumbs-down-hover.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/thumbs-down.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/thumbs-up-hover.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/thumbs-up.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/times-solid-grey.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/times-solid.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/working.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/img/zoho.svg create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/js/chunk-vendors.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/assets/vue/js/wizard.min.js create mode 100755 wp-content/plugins/wp-mail-smtp/readme.txt create mode 100755 wp-content/plugins/wp-mail-smtp/src/AbstractConnection.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/AdminBarMenu.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Area.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/ConnectionSettings.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DashboardWidget.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DebugEvents/DebugEvents.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DebugEvents/Event.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DebugEvents/EventsCollection.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DebugEvents/Migration.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DebugEvents/Table.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/DomainChecker.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Education.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/FlyoutMenu.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Notifications.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/PageAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/PageInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/About.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AboutTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ActionSchedulerTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AdditionalConnectionsTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AlertsTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/AuthTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ControlTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/DebugEventsTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/EmailReports.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/EmailReportsTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/ExportTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/Logs.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/LogsTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/MiscTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/SettingsTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/SmartRoutingTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/TestTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/Tools.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Pages/VersusTab.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/ParentPageAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/PluginsInstallSkin.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/Review.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Admin/SetupWizard.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Compatibility.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/Admin2020.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/PluginAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/PluginInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/Polylang.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/PolylangPro.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/WPForms.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/WPFormsLite.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/WPML.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Compatibility/Plugin/WooCommerce.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Conflicts.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Connect.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Connection.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/ConnectionInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/ConnectionsManager.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Core.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/DBRepair.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Debug.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Geo.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Helpers/Crypto.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Helpers/DB.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Helpers/Helpers.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Helpers/PluginImportDataRetriever.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Helpers/UI.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/MailCatcher.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/MailCatcherInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/MailCatcherTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/MailCatcherV6.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Migration.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/MigrationAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Migrations.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/OptimizedEmailSending.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Processor.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/AmazonSES/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/AuthAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/AuthInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/ElasticEmail/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/ElasticEmail/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Auth.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Logger.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Gmail/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Loader.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mail/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/MailerAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/MailerInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/MailerSend/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/MailerSend/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mailgun/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mailjet/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mailjet/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mandrill/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Mandrill/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/OptionsAbstract.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/OptionsInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Outlook/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Outlook/Provider.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Pepipost/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/PepipostAPI/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Postmark/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Postmark/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Resend/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Resend/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SMTP/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SMTP2GO/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SMTP2GO/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SMTPcom/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SMTPcom/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendgrid/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Api.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendinblue/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendlayer/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Sendlayer/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SparkPost/Mailer.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/SparkPost/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Providers/Zoho/Options.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Queue/Attachments.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Queue/Email.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Queue/Migration.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Queue/Queue.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Reports/Emails/Summary.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Reports/Reports.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/SiteHealth.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/DebugEventsCleanupTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Meta.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/NotificationsUpdateTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Queue/CleanupQueueTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Queue/ProcessQueueTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Queue/SendEnqueuedEmailTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Reports/SummaryEmailTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Task.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Tasks/Tasks.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Upgrade.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/Uploads.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/UsageTracking/SendUsageTask.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/UsageTracking/UsageTracking.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/WP.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/WPMailArgs.php create mode 100755 wp-content/plugins/wp-mail-smtp/src/WPMailInitiator.php create mode 100755 wp-content/plugins/wp-mail-smtp/uninstall.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/autoload.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/ClassLoader.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/InstalledVersions.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_classmap.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_files.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_namespaces.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_psr4.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_real.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/autoload_static.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/composer/installed.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/paragonie/random_compat/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/paragonie/random_compat/lib/random.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/paragonie/random_compat/other/build_phar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/paragonie/random_compat/psalm-autoload.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/action-scheduler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/changelog.txt create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionClaim.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_AdminView.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_Compatibility.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DataController.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_Exception.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_FatalErrorMonitor.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_InvalidActionException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ListTable.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_LogEntry.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_NullLogEntry.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_OptionLock.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_RecurringActionScheduler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_SystemInformation.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_Versions.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/ActionScheduler_wcSystemStatus.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Cancel_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Create_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Delete_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Generate_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Get_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/List_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Next_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Run_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Clean_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/Migration_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/ProgressBar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/WP_CLI/System_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Lock.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_WPCLI_Command.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_Action.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_NullAction.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/ActionMigrator.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/BatchFetcher.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/Config.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/Controller.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/DryRun_ActionMigrator.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/DryRun_LogMigrator.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/LogMigrator.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/Runner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/migration/Scheduler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_Schedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_SimpleSchedule.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_AdminView_Deprecated.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_Schedule_Deprecated.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/functions.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/functions.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/WP_Async_Request.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_HoursField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MonthField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_YearField.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/lib/cron-expression/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/license.txt create mode 100755 wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/readme.txt create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/AutoForwarding.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/BatchDeleteMessagesRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/BatchModifyMessagesRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/CseIdentity.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/CseKeyPair.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/CsePrivateKeyMetadata.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Delegate.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/DisableCseKeyPairRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Draft.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/EnableCseKeyPairRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Filter.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/FilterAction.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/FilterCriteria.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ForwardingAddress.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/HardwareKeyMetadata.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/History.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/HistoryLabelAdded.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/HistoryLabelRemoved.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/HistoryMessageAdded.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/HistoryMessageDeleted.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ImapSettings.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/KaclsKeyMetadata.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Label.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/LabelColor.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/LanguageSettings.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListCseIdentitiesResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListCseKeyPairsResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListDelegatesResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListDraftsResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListFiltersResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListForwardingAddressesResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListHistoryResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListLabelsResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListMessagesResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListSendAsResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListSmimeInfoResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ListThreadsResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Message.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/MessagePart.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/MessagePartBody.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/MessagePartHeader.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ModifyMessageRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ModifyThreadRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/ObliterateCseKeyPairRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/PivKeyMetadata.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/PopSettings.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Profile.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/Users.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersDrafts.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersHistory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersLabels.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersMessages.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersMessagesAttachments.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettings.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsCse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsCseIdentities.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsCseKeypairs.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsDelegates.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsFilters.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsForwardingAddresses.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsSendAs.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersSettingsSendAsSmimeInfo.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Resource/UsersThreads.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/SendAs.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/SignAndEncryptKeyPairs.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/SmimeInfo.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/SmtpMsa.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/Thread.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/VacationSettings.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/WatchRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient-services/src/Gmail/WatchResponse.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/AccessToken/Revoke.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/AccessToken/Verify.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/AuthHandler/AuthHandlerFactory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/AuthHandler/Guzzle6AuthHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/AuthHandler/Guzzle7AuthHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Client.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Collection.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Exception.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Http/Batch.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Http/MediaFileUpload.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Http/REST.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Model.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Service.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Service/Exception.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Service/Resource.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Task/Composer.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Task/Exception.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Task/Retryable.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Task/Runner.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/Utils/UriTemplate.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/apiclient/src/aliases.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/autoload.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/AccessToken.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/ApplicationDefaultCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Cache/InvalidArgumentException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Cache/Item.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Cache/MemoryCacheItemPool.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Cache/SysVCacheItemPool.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Cache/TypedItem.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/CacheTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/CredentialSource/AwsNativeSource.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/CredentialSource/FileSource.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/CredentialSource/UrlSource.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/AppIdentityCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/ExternalAccountCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/GCECredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/IAMCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/InsecureCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/ServiceAccountCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Credentials/UserRefreshCredentials.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/CredentialsLoader.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/ExternalAccountCredentialSourceInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/FetchAuthTokenCache.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/FetchAuthTokenInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/GCECache.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/GetQuotaProjectInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/GetUniverseDomainInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/HttpHandler/Guzzle6HttpHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/HttpHandler/Guzzle7HttpHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/HttpHandler/HttpClientCache.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/HttpHandler/HttpHandlerFactory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Iam.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/IamSignerTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Middleware/AuthTokenMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/Middleware/SimpleMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/OAuth2.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/ProjectIdProviderInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/ServiceAccountSignerTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/SignBlobInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/UpdateMetadataInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/google/auth/src/UpdateMetadataTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizer.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizerInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Client.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/ClientInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/ClientTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/HandlerStack.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatterInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Middleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Pool.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/RequestOptions.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/Utils.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/functions.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/functions_include.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/AggregateException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/CancellationException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/Coroutine.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/Create.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/Each.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/EachPromise.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/FulfilledPromise.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/Is.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/Promise.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/PromiseInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/PromisorInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/RejectedPromise.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/RejectionException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/TaskQueue.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/Utils.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/AppendStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/BufferStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/CachingStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/DroppingStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Exception/MalformedUriException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/FnStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Header.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/HttpFactory.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/InflateStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/LimitStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Message.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/MessageTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/MimeType.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/MultipartStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/NoSeekStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/PumpStream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Query.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Request.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Response.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Rfc7230.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/ServerRequest.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Stream.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/StreamWrapper.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/UploadedFile.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Uri.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/UriComparator.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/UriNormalizer.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/UriResolver.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/psr7/src/Utils.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/LICENSE.txt create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Base32.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Base32Hex.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Base64.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Base64DotSlash.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Base64UrlSafe.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Binary.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/EncoderInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Encoding.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/Hex.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/paragonie/constant_time_encoding/src/RFC4648.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/cache/src/CacheException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/cache/src/CacheItemInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/cache/src/CacheItemPoolInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/cache/src/InvalidArgumentException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-client/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-client/src/ClientExceptionInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-client/src/ClientInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-client/src/NetworkExceptionInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-client/src/RequestExceptionInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/src/RequestFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/src/ResponseFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/src/StreamFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-factory/src/UriFactoryInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/MessageInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/RequestInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/ResponseInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/ServerRequestInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/StreamInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/UploadedFileInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/http-message/src/UriInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/AbstractLogger.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/InvalidArgumentException.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/LogLevel.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/LoggerInterface.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/LoggerTrait.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/psr/log/Psr/Log/NullLogger.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/deprecation-contracts/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/deprecation-contracts/function.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Idn.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Info.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/Regex.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/deviation.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/ignored.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/mapped.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/Resources/unidata/virama.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/bootstrap.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-intl-idn/bootstrap80.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/LICENSE create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/Mbstring.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/bootstrap.php create mode 100755 wp-content/plugins/wp-mail-smtp/vendor_prefixed/symfony/polyfill-mbstring/bootstrap80.php create mode 100755 wp-content/plugins/wp-mail-smtp/wp-mail-smtp.php create mode 100755 wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-bar.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-bar.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-integrations.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-integrations.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-list-table-ext.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-list-table-ext.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-notifications.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-notifications.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-wp5.7-colors.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin-wp5.7-colors.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin/admin-form-templates.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin/admin-form-templates.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin/admin-splash-modal.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin/admin-splash-modal.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin/edit-post-education.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/admin/edit-post-education.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-alerts.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-alerts.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-basic.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-basic.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-fields-min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-fields-types.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-fields-types.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-fields.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-fields.min-min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-fields.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-overlay.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-overlay.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-panels.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-panels.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-scrollbars.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-scrollbars.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-subsystems.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-subsystems.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-third-party.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-third-party.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-ui-general.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/builder-ui-general.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/content-editor.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/builder/content-editor.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/challenge.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/challenge.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/choices.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/choices.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/dashboard-widget.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/dashboard-widget.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/classic.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/classic.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/compact.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/compact.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/corrupted-data-report.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/corrupted-data-report.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/general.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/general.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/classic_media_queries.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/classic_media_queries.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/compact_media_queries.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/compact_media_queries.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/media_queries.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/media_queries.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/summary_media_queries.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/partials/summary_media_queries.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/summary.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/emails/summary.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/form-embed-wizard.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/form-embed-wizard.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/classic/wpforms-base.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/classic/wpforms-base.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/classic/wpforms-full.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/classic/wpforms-full.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/modern/wpforms-base.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/modern/wpforms-base.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/modern/wpforms-full.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/modern/wpforms-full.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/wpforms-dashicons.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/wpforms-dashicons.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/wpforms-form-preview.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/wpforms-form-preview.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/wpforms-no-styles.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/frontend/wpforms-no-styles.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/ai-forms.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/ai-forms.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/chat-element.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/chat-element.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/form-templates-page.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/form-templates-page.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/modal.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/ai/modal.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/choices.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/choices.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-classic-base.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-classic-base.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-classic-full.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-classic-full.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-modern-base.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-modern-base.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-modern-full.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/divi/wpforms-modern-full.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/admin-settings-square.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/admin-settings-square.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/divi/wpforms-square-card-placeholder.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/divi/wpforms-square-card-placeholder.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/divi/wpforms-square.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/divi/wpforms-square.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/wpforms-square-card-placeholder.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/wpforms-square-card-placeholder.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/wpforms-square.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/square/wpforms-square.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/admin-settings-stripe.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/admin-settings-stripe.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/builder-stripe-common.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/builder-stripe-common.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/builder-stripe.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/builder-stripe.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/wpforms-stripe.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/stripe/wpforms-stripe.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/woocommerce/notifications.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/integrations/woocommerce/notifications.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/logger.css create mode 100755 wp-content/plugins/wpforms-lite/assets/css/logger.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/fonts/wpforms.eot create mode 100755 wp-content/plugins/wpforms-lite/assets/fonts/wpforms.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/fonts/wpforms.ttf create mode 100755 wp-content/plugins/wpforms-lite/assets/fonts/wpforms.woff create mode 100755 wp-content/plugins/wpforms-lite/assets/fonts/wpforms.woff2 create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/complete-guide-to-wpforms-settings.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/how-choose-right-form-field.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/how-create-gdpr-compliant-forms.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/how-install-activate-wpforms-addons.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/icon-full.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/icon-none.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/icon-partial.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-affwp.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-aioseo.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-charitable.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-duplicator.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-edd.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-mi.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-om.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-pushengage.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-rp.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-sb-fb.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-sb-instagram.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-sb-twitter.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-sb-youtube.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-searchwp.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-seedprod.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-smtp.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-sugarcalendar.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-trustpulse.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-wp-simple-pay.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/plugin-wpcode.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/about/team.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-activecampaign.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-airtable.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-authorize-net.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-aweber.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-brevo.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-calculations.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-campaign-monitor.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-captcha.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-conditional-logic.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-constant-contact.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-conversational-forms.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-convertkit.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-coupons.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-drip.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-dropbox.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-entry-automation.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-form-abandonment.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-form-locker.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-form-pages.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-form-templates-pack.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-geolocation.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-getresponse.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-google-calendar.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-google-drive.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-google-sheets.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-hubspot.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-kit.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-lead-forms.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-mailchimp.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-mailerlite.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-mailpoet.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-make.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-n8n.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-notion.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-offline-forms.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-paypal-commerce.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-paypal-standard.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-pdf.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-pipedrive.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-post-submissions.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-salesforce.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-save-resume.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-sendinblue.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-signatures.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-slack.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-square.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-stripe.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-surveys-polls.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-twilio.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-user-journey.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-user-registration.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-webhooks.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-zapier.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/addon-icon-zoho-crm.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/admin-flyout-menu/sullie-active.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/admin-flyout-menu/sullie-default.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/akismet.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/cloudflare.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/country-filter.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/custom-captcha.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/hcaptcha.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/keyword-filter.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/anti-spam/recaptcha.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/brand.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder-default-arrow.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/back.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/check-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/default-arrow.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/ie-logo.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/illustration-marketing.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/illustration-payments.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/image-upload-placeholder.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/loading-avatar.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/loading-spinner.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/placeholder-200x125.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/builder/toggle-tab-bg.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/bar-bg.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/chevron-circle-down-regular.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/confetti.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/getting-started.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/party-popper.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/popup-contact.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/red-arrow.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/sullie-circle.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/challenge/times-circle-regular.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/check-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/check-solid.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/announcements.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/announcements@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/dev-docs.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/dev-docs@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/suggest.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/suggest@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/vip-circle.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/vip-circle@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/wpbeginner.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/wpbeginner@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/youtube.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/community/youtube@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/constant-contact/cc-about-logo.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/constant-contact/cc-about-logo@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/constant-contact/cc-about-step1.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/constant-contact/cc-about-step2.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/constant-contact/cc-about-step3.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/constant-contact/cc-about-step4.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/coupons-education/coupons-addon-screenshot-01.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/coupons-education/coupons-addon-screenshot-02.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/coupons-education/coupons-addon-thumbnail-01.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/coupons-education/coupons-addon-thumbnail-02.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/cross-inverse.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/cross.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/dashicons-arrow-right-alt.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/duplicator/screenshot-full@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/duplicator/screenshot-tnail.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/duplicator/screenshot-tnail@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/duplicator/wpforms-duplicator.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/edit-post-education-page-1.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/edit-post-education-page-2.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/icon-downward.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/icon-overview.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/icon-upward.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/info-block-icon.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/notification-block-icon.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-classic.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-compact.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-elegant.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-modern.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-placeholder.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-plaintext.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/email/template-tech.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/no-entries.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/no-fields.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/no-form-elementor.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/no-forms.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/no-user-templates.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/payments/get-started-lite.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/payments/get-started-pro.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/payments/no-payments.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/empty-states/waving-hand-emoji.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/entry-automation/education.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/exclamation-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/exclamation-triangle-orange.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/exclamation-triangle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/file-code.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/frontend/file-download/lock-alt.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/frontend/file-download/triangle-exclamation.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/geolocation-education/address-autocomplete.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/geolocation-education/address-autocomplete@2x.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/geolocation-education/entry-location.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/geolocation-education/entry-location@2x.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/geolocation-education/smart-address-field.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/geolocation-education/smart-address-field@2x.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/gutenberg/panel-background.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/gutenberg/panel-button.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/gutenberg/panel-container.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/gutenberg/panel-field.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/gutenberg/panel-label.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/gutenberg/panel-themes.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-chart-smaller.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-chart.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-file.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-graph.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-provider-constant-contact.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-provider-uncanny-automator.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-tags.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-user-template.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/icon-wpforms.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/ai-answer-icon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/ai-error-icon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/ai-feature-icon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/ai-feature.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/ai-form-empty-state.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/ai-warning-icon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/back.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/bulb-orange.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/bulb-red.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/close.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/flag-usa.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/globe-americas.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-design.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-market.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-pizza.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-restaurant.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-send-blue.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-send-purple.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-send.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-stop-sign.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-stop.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-sullie.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/icon-ticket.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/insert.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/leaf-maple.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/pin-chat.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/store.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/thumbs-down-hover.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/thumbs-down-inactive.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/thumbs-down-solid.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/thumbs-down.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/thumbs-up.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/tree-palm.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/ai/unpin-chat.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/divi/wpforms-icon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/elementor/font/icon-wpforms.eot create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/elementor/font/icon-wpforms.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/elementor/font/icon-wpforms.ttf create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/elementor/font/icon-wpforms.woff create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/elementor/font/icon-wpforms.woff2 create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/elementor/wpforms-icon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/gutenberg/block-preview.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/stripe/cc-preview.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/integrations/woocommerce/mail.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/jquery.minicolors.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/check-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/cloud.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/envelope.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/info-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/lock-ai.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/lock-alt.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/raised-hand.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-connect/wait.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-settings-access/screenshot-access-controls.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-settings-access/screenshot-access-controls@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-settings-access/screenshot-members.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-settings-access/screenshot-members@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-settings-access/screenshot-user-role-editor.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/lite-settings-access/screenshot-user-role-editor@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/logo-negative.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/logo.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/page-plugin/arrow-right.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/chevron.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/icon-exclamation.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/icon-total-coupons.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/icon-total-payments.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/icon-total-refunded.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/icon-total-sales.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/icon-total-subscription.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-coupon.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-cycle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-date.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-lifetime-total.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-method.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-one-time.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-subscription.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/icon-total.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/single/info-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/star.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-active.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-cancelled.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-completed.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-failed.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-n-a.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-not-synced.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-partrefund.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-pending.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-processed.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/payments/status/icon-refunded.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/pdf-education/pdf.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/phone/us-flag.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/privacy-compliance/screenshot-full.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/privacy-compliance/screenshot-full@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/privacy-compliance/screenshot-tnail.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/privacy-compliance/screenshot-tnail@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/privacy-compliance/wpforms-wpconsent.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/recaptcha-placeholder.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/richtext/tinymce-toolbar-basic-mb.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/richtext/tinymce-toolbar-basic.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/richtext/tinymce-toolbar-full-mb.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/richtext/tinymce-toolbar-full.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/search.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-captcha-addon.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-captcha-cloudflare.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-captcha-hcaptcha.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-captcha-none.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-captcha-recaptcha.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-email-html.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/settings-email-plaintext.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/arrow-right.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/pattie-2.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/pattie.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/screenshot-full.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/screenshot-tnail.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/wpforms-wpmailsmtp.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/smtp/wpforms-wpmailsmtp@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/spinner-blue.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/spinner-white.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/spinner.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/splash/sullie.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/step-1.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/step-2.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/step-3.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/step-complete.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/stripe/stripe-connect.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/submit-spin.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sugar-calendar/screenshot-full@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sugar-calendar/screenshot-tnail.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sugar-calendar/screenshot-tnail@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sugar-calendar/wpforms-sugar-calendar.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sullie-alt.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sullie-builder-mobile.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sullie-edit-post-education.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sullie-vc.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/sullie.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/thumbnail-simple-contact-form-template.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/times-circle.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/trash-red.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/trash.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/uncanny-automator/screenshot-full@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/uncanny-automator/screenshot-tnail.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/uncanny-automator/screenshot-tnail@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/uncanny-automator/wpforms-uncanny-automator.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-1.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-10.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-2.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-3.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-4.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-5.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-6.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-7.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-8.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-feature-icon-9.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-testimonial-bill.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-testimonial-david.jpg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/welcome-video.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/wpconsent/screenshot-full@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/wpconsent/screenshot-tnail.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/wpconsent/screenshot-tnail@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/images/wpconsent/wpforms-wpconsent.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/wpforms-logo.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/images/zoom.svg create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/admin-editor.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/admin-editor.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/admin-notifications.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/admin-notifications.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/admin.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/admin.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/chocolate-choices.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/chocolate-choices.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/choices-list.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/choices-list.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/context-menu.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/context-menu.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/drag-fields.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/drag-fields.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/field-map.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/field-map.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/fields/internal-information.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/fields/internal-information.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/fields/numbers.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/fields/numbers.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/fields/rating.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/fields/rating.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/form-templates.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/form-templates.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/help.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/help.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/image-upload.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/image-upload.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/providers.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/providers.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/search-fields.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/search-fields.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/settings.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/settings.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/setup.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/setup.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/smart-tags.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/smart-tags.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/templates.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/templates.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/builder-themes-no-access.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/builder-themes-no-access.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/builder-themes.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/builder-themes.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/advanced-settings.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/advanced-settings.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/background.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/background.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/common.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/common.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/stock-photos.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/stock-photos.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/themes.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/themes/modules/themes.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/wpforms-choicesjs.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/builder/wpforms-choicesjs.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-admin.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-admin.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-builder.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-builder.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-core.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-core.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-embed.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/challenge/challenge-embed.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/core.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/core.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/edit-post.es5.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/edit-post.es5.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/edit-post.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/pdf.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/pdf.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/pointers/payment.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/education/pointers/payment.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/email/settings.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/email/settings.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/form-embed-wizard.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/form-embed-wizard.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/forms/overview.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/forms/overview.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/logger/logger.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/logger/logger.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/notices.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/notices.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/common.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/common.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/form-templates.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/form-templates.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/privacy-compliance.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/privacy-compliance.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/smtp.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/pages/smtp.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/payments/overview.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/payments/overview.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/payments/single.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/payments/single.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/admin-utils.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/admin-utils.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/contrast-checker.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/contrast-checker.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/list-table-ext.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/list-table-ext.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/xor.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/share/xor.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/splash/modal.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/admin/splash/modal.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/fields/address.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/fields/address.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/fields/text-limit.es5.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/fields/text-limit.es5.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/fields/text-limit.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/wpforms-confirmation.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/wpforms-confirmation.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/wpforms-modern.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/wpforms-modern.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/wpforms.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/frontend/wpforms.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-dock.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-dock.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.es5.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.es5.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-modern.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-modern.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/frontend.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/frontend.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/advanced-settings.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-preview.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-styles.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/button-styles.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/common.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/container-styles.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/education.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/field-styles.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/themes-panel.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/builder-square.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/builder-square.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/settings-square.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/settings-square.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-modern-stripe.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-modern-stripe.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-stripe-card-field.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-stripe-card-field.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-stripe.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-stripe.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-settings-stripe.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-settings-stripe.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/wpforms-stripe-elements.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/wpforms-stripe-elements.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/wpforms-stripe-payment-element.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/wpforms-stripe-payment-element.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/woocommerce/notifications.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/woocommerce/notifications.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/wpcode/wpcode.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/integrations/wpcode/wpcode.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/share/utils.js create mode 100755 wp-content/plugins/wpforms-lite/assets/js/share/utils.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/languages/wpforms-lite.pot create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/chart.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/chartjs-adapter-moment.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/choices.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/conditions.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/flatpickr/flatpickr.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/flatpickr/flatpickr.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/font-awesome/css/all.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/font-awesome/css/v4-shims.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-brands-400.woff2 create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-regular-400.woff2 create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-solid-900.woff2 create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-v4compatibility.woff2 create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/htmx.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.inputmask.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.insert-at-caret.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.tooltipster/jquery.tooltipster.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.tooltipster/jquery.tooltipster.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/jquery.validate.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/list.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/lity/lity.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/lity/lity.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/mailcheck.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/md5.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/punycode.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/purify.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/wpforms-multiselect/wpforms-multiselect-checkboxes.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lib/wpforms-multiselect/wpforms-multiselect-checkboxes.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/admin.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/admin.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/admin/entries/entry-list.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/admin/entries/entry-list.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/admin/entries/view-entry.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/admin/entries/view-entry.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/builder-education.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/builder-education.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/dashboard-education.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/css/dashboard-education.min.css create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/images/sample/flag.png create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/images/sample/flag@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/images/sample/map.png create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/images/sample/map@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/images/sample/signature.png create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/images/sample/signature@2x.png create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/builder/admin-builder-lite.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/builder/admin-builder-lite.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/connect.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/connect.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/dashboard-widget.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/dashboard-widget.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/core.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/core.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/integrations/elementor/themes.json create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/formselector.es5.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/formselector.es5.min.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/formselector.js create mode 100755 wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/themes.json create mode 100755 wp-content/plugins/wpforms-lite/changelog.txt create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/admin.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/ajax-actions.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/class-builder.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/functions.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-base.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-fields.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-payments.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-providers.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-revisions.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-settings.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-setup.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-about.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-editor.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-menu.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-notices.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-review.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-settings.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/class-welcome.php create mode 100755 wp-content/plugins/wpforms-lite/includes/admin/settings-api.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-db.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-fields.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-form.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-install.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-process.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-providers.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-templates.php create mode 100755 wp-content/plugins/wpforms-lite/includes/class-widget.php create mode 100755 wp-content/plugins/wpforms-lite/includes/deprecated.php create mode 100755 wp-content/plugins/wpforms-lite/includes/emails/class-emails.php create mode 100755 wp-content/plugins/wpforms-lite/includes/emails/templates/body-default.php create mode 100755 wp-content/plugins/wpforms-lite/includes/emails/templates/default.php create mode 100755 wp-content/plugins/wpforms-lite/includes/emails/templates/field-default.php create mode 100755 wp-content/plugins/wpforms-lite/includes/emails/templates/footer-default.php create mode 100755 wp-content/plugins/wpforms-lite/includes/emails/templates/header-default.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-base.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-checkbox.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-email.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-gdpr-checkbox.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-internal-information.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-name.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-number-slider.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-number.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-radio.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-select.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-text.php create mode 100755 wp-content/plugins/wpforms-lite/includes/fields/class-textarea.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions-list.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/access.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/builder.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/checks.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/colors.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/data-presets.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/date-time.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/debug.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/education.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/escape-sanitize.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/filesystem-media.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/form-fields.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/forms.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/list.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/payments.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/plugins.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/privacy.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/providers.php create mode 100755 wp-content/plugins/wpforms-lite/includes/functions/utilities.php create mode 100755 wp-content/plugins/wpforms-lite/includes/integrations.php create mode 100755 wp-content/plugins/wpforms-lite/includes/providers/class-base.php create mode 100755 wp-content/plugins/wpforms-lite/includes/providers/class-constant-contact.php create mode 100755 wp-content/plugins/wpforms-lite/includes/templates/class-base.php create mode 100755 wp-content/plugins/wpforms-lite/includes/templates/class-blank.php create mode 100755 wp-content/plugins/wpforms-lite/includes/templates/class-simple-contact-form.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/addons.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/notice.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/actions.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/bulk-actions.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/entry-list.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/header.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/modal.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/table.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/admin/entries/single/entry.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/builder/context-menu.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/admin/did-you-know.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/challenge-popup-footer.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/dashboard-widget-before.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/admin/notice-bar.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/admin/settings/integrations-item.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/builder/did-you-know.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/ai-modal.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/top-bar.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/builder/providers-item.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/builder/settings-item.php create mode 100755 wp-content/plugins/wpforms-lite/lite/templates/education/lite-connect-modal.php create mode 100755 wp-content/plugins/wpforms-lite/lite/wpforms-lite.php create mode 100755 wp-content/plugins/wpforms-lite/readme.txt create mode 100755 wp-content/plugins/wpforms-lite/src/API.php create mode 100755 wp-content/plugins/wpforms-lite/src/Access/Capabilities.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Addons/Addons.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Addons/AddonsCache.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/AdminBarMenu.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/DataObjects/ColumnBase.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/Facades/ColumnsBase.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Blocks/Links.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Addons.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/PanelLoader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/SaveForm.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/AntiSpam.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/ContextMenu.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Help.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/HelpCache.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/ImageUpload.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Notifications/Advanced/EmailTemplate.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Settings/Themes.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Shortcuts.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplateSingleCache.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/Templates.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplatesCache.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Challenge.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Dashboard/Widget.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/AddonsItemBase.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/AddonsListBase.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/EditPost.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Geolocation.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Integrations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/SMTP.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Tools/EntryAutomation.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Calculations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Captcha.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Fields.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Geolocation.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/PDF.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Panel.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Payments.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Providers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Core.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/EducationInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Fields.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Helpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Payment.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Pointer.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Education/StringsTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/FlyoutMenu.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/FormEmbedWizard.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Ajax/Columns.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Ajax/Tags.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/BulkActions.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/ListTable.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Page.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Search.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Table/DataObjects/Column.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Table/Facades/Columns.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Tags.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/UserTemplates.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Forms/Views.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Helpers/Chart.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Helpers/Datepicker.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Loader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Notice.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Notifications/EventDriven.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Notifications/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/Community.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/ConstantContact.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/Duplicator.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/Page.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/PrivacyCompliance.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/SMTP.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/SugarCalendar.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/Templates.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Pages/UncannyAutomator.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Payments.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/ScreenOptions.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Coupons/Education.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Ajax.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/BulkActions.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Chart.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Coupon.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Filters.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Helpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/ModeToggle.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Page.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Search.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Table.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Overview/Traits/ResetNotices.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/PaymentsViewsInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Payments/Views/Single.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Revisions.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Captcha/Captcha.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Captcha/HCaptcha.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Captcha/Page.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Captcha/ReCaptcha.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Captcha/Turnstile.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Email.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/ModernMarkup.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Settings/Payments.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/SiteHealth.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Splash/SplashCache.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Splash/SplashScreen.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Splash/SplashTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Splash/SplashUpgrader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Importers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Importers/Base.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Importers/ContactForm7.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Importers/ImporterInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Importers/NinjaForms.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Importers/PirateForms.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Tools.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/ActionScheduler.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/ActionSchedulerList.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/CodeSnippets.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/EntryAutomation.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/Export.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/Import.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/Importer.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/Logs.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/System.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Tools/Views/View.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Traits/FormTemplates.php create mode 100755 wp-content/plugins/wpforms-lite/src/Admin/Traits/HasScreenOptions.php create mode 100755 wp-content/plugins/wpforms-lite/src/Db/Payments/Meta.php create mode 100755 wp-content/plugins/wpforms-lite/src/Db/Payments/Payment.php create mode 100755 wp-content/plugins/wpforms-lite/src/Db/Payments/Queries.php create mode 100755 wp-content/plugins/wpforms-lite/src/Db/Payments/UpdateHelpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Db/Payments/ValueValidator.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Helpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/InfoBlocks.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Mailer.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/NotificationBlocks.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Preview.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Styler.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Summaries.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Tasks/FetchInfoBlocksTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Templates/Classic.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Templates/Compact.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Templates/General.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Templates/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Templates/Plain.php create mode 100755 wp-content/plugins/wpforms-lite/src/Emails/Templates/Summary.php create mode 100755 wp-content/plugins/wpforms-lite/src/ErrorHandler.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Akismet.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/AntiSpam.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Coupon/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/LikertScale/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/NetPromoterScore/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Signature/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Frontend.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Base/Frontend.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Camera/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Content/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/CreditCard/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/CustomCaptcha/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/DateTime/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Divider/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/EntryPreview/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/FileUpload/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Helpers/RequirementsAlerts.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Hidden/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Html/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Pagebreak/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Password/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentCheckbox/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentMultiple/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSelect/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSingle/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentTotal/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Phone/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Rating/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Richtext/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/AccessRestrictionsTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/CameraTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ContentInput.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileDisplayTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileEntriesEditTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileMethodsTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/NumberField.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ProField.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ReadOnlyField.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Fields/Url/Field.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Honeypot.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/IconChoices.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Locator.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Preview.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Submission.php create mode 100755 wp-content/plugins/wpforms-lite/src/Forms/Token.php create mode 100755 wp-content/plugins/wpforms-lite/src/Frontend/Amp.php create mode 100755 wp-content/plugins/wpforms-lite/src/Frontend/CSSVars.php create mode 100755 wp-content/plugins/wpforms-lite/src/Frontend/Captcha.php create mode 100755 wp-content/plugins/wpforms-lite/src/Frontend/Classic.php create mode 100755 wp-content/plugins/wpforms-lite/src/Frontend/Frontend.php create mode 100755 wp-content/plugins/wpforms-lite/src/Frontend/Modern.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/CacheBase.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/Chain.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/Crypto.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/DB.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/File.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/Form.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/PluginSilentUpgrader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/Templates.php create mode 100755 wp-content/plugins/wpforms-lite/src/Helpers/Transient.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/AI.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/API/API.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Choices.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Forms.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Request.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Response.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Base.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Choices.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Forms.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Enqueues.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/FieldOption.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Forms.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Pages/Templates.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/AI/Helpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Api.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Request.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Response.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Auth.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/ConstantContact.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Core.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Migration/Migration.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Process.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FieldMapping.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FormBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/PageIntegrations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/DefaultContent/DefaultContent.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/DefaultThemes/DefaultThemes.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Divi/Divi.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Divi/WPFormsSelector.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Elementor/Controls/WPFormsThemes.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Elementor/Elementor.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Elementor/RestApi.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Elementor/ThemesData.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Elementor/Widget.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Elementor/WidgetModern.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Gutenberg/FormSelector.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Gutenberg/RestApi.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Gutenberg/ThemesData.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/IntegrationInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/LiteConnect/API.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/LiteConnect/Integration.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/LiteConnect/LiteConnect.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/LiteConnect/RefreshAccessTokenTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Loader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/SMTP/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/SolidCentral/SolidCentral.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/AddonCompatibility.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Builder/Enqueues.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Builder/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Builder/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Builder/Traits/Content.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Connect.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Entries.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Notices.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Payments/SingleActionsHandler.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Admin/WebhookSettings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Api.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/WebhookEvent.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/WebhookRoute.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Webhooks/Base.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Webhooks/PaymentCreated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Webhooks/PaymentUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Webhooks/RefundUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Webhooks/SubscriptionCreated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/Webhooks/SubscriptionUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Api/WebhooksManager.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Connection.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/CurlCompatibility.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Fields/Square.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Frontend.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Helpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Integrations/BlockEditor.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Integrations/Divi.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Integrations/Elementor.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Integrations/IntegrationInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Integrations/Loader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Process.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Square.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/Tasks.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Square/WebhooksHealthCheck.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Builder/Enqueues.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Builder/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Builder/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Connect.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Notices.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Admin/WebhookSettings.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/ApiInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Common.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/DomainManager.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/PaymentIntents.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/WebhookRoute.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/Base.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/ChargeRefundUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/ChargeRefunded.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/ChargeSucceeded.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/CustomerSubscriptionCreated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/CustomerSubscriptionDeleted.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/CustomerSubscriptionUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/Exceptions/AmountMismatchException.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/InvoiceCreated.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/Webhooks/InvoicePaymentSucceeded.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Api/WebhooksManager.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/DomainHealthCheck.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Fields/PaymentElementCreditCard.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Fields/StripeCreditCard.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Fields/Traits/CreditCard.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Frontend.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Helpers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Process.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/RateLimit.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/Stripe.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/StripeAddonCompatibility.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/WebhooksHealthCheck.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/Stripe/apple-developer-merchantid-domain-association create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/UncannyAutomator/UncannyAutomator.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/UsageTracking/SendUsageTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/UsageTracking/UsageTracking.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/WPCode/RegisterLibrary.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/WPCode/WPCode.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/WPMailSMTP/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/WPorg/Translations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Integrations/WooCommerce/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Connect.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/ConnectSkin.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/DashboardWidget.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Admin/DidYouKnow.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Admin/NoticeBar.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Builder/Confirmations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Builder/DidYouKnow.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Builder/Fields.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Builder/Notifications.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/Core.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Education/LiteConnect.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Pages/Addons.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Admin/Settings/Access.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Emails/Summaries.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Integrations/Elementor/ThemesData.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Integrations/Gutenberg/FormSelector.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Integrations/Gutenberg/ThemesData.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Integrations/LiteConnect/Integration.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Integrations/LiteConnect/LiteConnect.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Integrations/LiteConnect/SendEntryTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Lite/Reports/EntriesCount.php create mode 100755 wp-content/plugins/wpforms-lite/src/Loader.php create mode 100755 wp-content/plugins/wpforms-lite/src/Logger/ListTable.php create mode 100755 wp-content/plugins/wpforms-lite/src/Logger/Log.php create mode 100755 wp-content/plugins/wpforms-lite/src/Logger/Record.php create mode 100755 wp-content/plugins/wpforms-lite/src/Logger/RecordQuery.php create mode 100755 wp-content/plugins/wpforms-lite/src/Logger/Records.php create mode 100755 wp-content/plugins/wpforms-lite/src/Logger/Repository.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Base.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Migrations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Tasks/UpgradeBaseTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade159.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1672.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade168.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade175.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1751.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade177.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade182.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade183.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade184.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade186.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade187.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_1.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_2.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_7.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_8_6.php create mode 100755 wp-content/plugins/wpforms-lite/src/Migrations/UpgradeBase.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Core.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Process.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilderInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrations.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrationsInterface.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Provider/Status.php create mode 100755 wp-content/plugins/wpforms-lite/src/Providers/Providers.php create mode 100755 wp-content/plugins/wpforms-lite/src/Requirements/Requirements.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AdminEmail.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorDisplay.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorEmail.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/Date.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldHtmlId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldValueId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FormId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FormName.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/Generic.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/OrderSummary.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageTitle.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageUrl.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/QueryVar.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/SiteName.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/SmartTag.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UniqueValue.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlLogin.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlLogout.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlLostPassword.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlReferer.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlRegister.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserDisplay.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserEmail.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFirstName.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFullName.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserId.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserIp.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserLastName.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserMeta.php create mode 100755 wp-content/plugins/wpforms-lite/src/SmartTags/SmartTags.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/AsyncRequestTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/DomainAutoRegistrationTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsMetaCleanupTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/FormsLocatorScanTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/IconChoicesFontAwesomeUpgradeTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration173Task.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration175Task.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/PurgeSpamTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/SquareSubscriptionTransactionIDTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/StripeLinkSubscriptionsTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Actions/WebhooksAutoConfigurationTask.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Meta.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Task.php create mode 100755 wp-content/plugins/wpforms-lite/src/Tasks/Tasks.php create mode 100755 wp-content/plugins/wpforms-lite/src/WPForms.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin-bar-menu.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/challenge/builder.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/challenge/embed.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/challenge/modal.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/challenge/welcome.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/components/chart.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/components/datepicker.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/dashboard/widget/settings.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/dashboard/widget/welcome.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/empty-states/no-forms.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/empty-states/no-user-templates.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/get-started.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/no-payments.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/popup.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/tooltip.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/forms/bulk-edit-tags.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/forms/search-box.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/forms/search-reset.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/notifications.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/pages/constant-contact.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/hidden-field.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/mode-toggle.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/reports.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/reset-filter-notice.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/advanced-details.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/details.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/entry-details.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/field.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/heading-navigation.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/log.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/no-payment.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-details.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-history.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/tablenav-filter-multiselect.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/payments/tablenav-filters.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/promotion.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/settings/email-heading.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/settings/hcaptcha-description.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/settings/recaptcha-description.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/settings/specific-note.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/settings/turnstile-description.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/splash/footer.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/splash/header.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/splash/modal.php create mode 100755 wp-content/plugins/wpforms-lite/templates/admin/splash/section.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/antispam/also-available.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/field-context-menu.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/fullscreen/abort-message.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/fullscreen/ie-notice.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/fullscreen/mobile-notice.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/help.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/notifications/email-template-link.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/notifications/email-template-modal.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/payment/recurring/item.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/payment/sidebar.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/revisions/list.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-disabled.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-limited.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/templates-item.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/themes/notices.php create mode 100755 wp-content/plugins/wpforms-lite/templates/builder/themes/preview.php create mode 100755 wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/classic-notice.php create mode 100755 wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/notice.php create mode 100755 wp-content/plugins/wpforms-lite/templates/education/admin/page.php create mode 100755 wp-content/plugins/wpforms-lite/templates/education/admin/payments/single-page.php create mode 100755 wp-content/plugins/wpforms-lite/templates/education/admin/settings/smtp-notice.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/classic-body.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/classic-field.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/classic-footer.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/classic-header.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/classic-queries.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/classic-style.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/compact-body.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/compact-field.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/compact-footer.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/compact-header.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/compact-queries.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/compact-style.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/general-body-plain.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/general-body.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/general-footer.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/general-header.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/general-queries.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/general-style.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-body-plain.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-body.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-footer-plain.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-footer.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-header.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-queries.php create mode 100755 wp-content/plugins/wpforms-lite/templates/emails/summary-style.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/content/action-buttons.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/file-upload/file-upload-backend.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/internal-information/icon-expanded.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/internal-information/icon-lightbulb.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/internal-information/icon-not-expanded.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/number-slider/builder-preview.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/number-slider/frontend.php create mode 100755 wp-content/plugins/wpforms-lite/templates/fields/total/summary-preview.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/constant-contact-v3/builder/connection.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/constant-contact-v3/builder/error.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/constant-contact-v3/builder/select-field.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/elementor/form-selector.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/elementor/no-forms.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/elementor/popup.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/stripe/builder/custom-metadata.php create mode 100755 wp-content/plugins/wpforms-lite/templates/integrations/wpcode/code-snippets.php create mode 100755 wp-content/plugins/wpforms-lite/uninstall.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/autoload.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/ClassLoader.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/InstalledVersions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/autoload_classmap.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/autoload_files.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/autoload_namespaces.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/autoload_psr4.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/autoload_real.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/autoload_static.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/installed.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/composer/platform_check.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/LogLevel.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/psr/log/Psr/Log/NullLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Iconv.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/Resources/charset/translit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/bootstrap.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-iconv/bootstrap80.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/Php80.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/PhpToken.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/symfony/polyfill-php80/bootstrap.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/action-scheduler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionClaim.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_AdminView.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_Compatibility.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DataController.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_Exception.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_FatalErrorMonitor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_InvalidActionException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ListTable.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_LogEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_NullLogEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_OptionLock.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_RecurringActionScheduler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_SystemInformation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_Versions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_wcSystemStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Cancel_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Create_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Delete_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Generate_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Get_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/List_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Next_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action/Run_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Clean_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Action_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/Migration_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/ProgressBar.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/WP_CLI/System_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Lock.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_WPCLI_Command.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_Action.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/actions/ActionScheduler_NullAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/ActionMigrator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/BatchFetcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/Config.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/Controller.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/DryRun_ActionMigrator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/DryRun_LogMigrator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/LogMigrator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/Runner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/migration/Scheduler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_Schedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schedules/ActionScheduler_SimpleSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_AdminView_Deprecated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_Schedule_Deprecated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/functions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/functions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/WP_Async_Request.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_HoursField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MonthField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/CronExpression_YearField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/lib/cron-expression/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/license.txt create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Authentication/AuthGroup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Authentication/AuthInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/ContextInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Format.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Logger/ApiLoggerInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/NonEmptyParamInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/ParamInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/RequestArraySerialization.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/RequestInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/RequestMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/RequestSetterInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Request/TypeValidatorInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Core/Response/ResponseInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Http/HttpClientInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Http/HttpConfigurations.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Http/RetryOption.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Sdk/ConverterInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core-interfaces/src/Sdk/ExceptionInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/ApiCall.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Authentication/Auth.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Authentication/CoreAuth.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Client.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/ClientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Exceptions/AuthValidationException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/ApiLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/Configuration/BaseHttpLoggingConfiguration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/Configuration/LoggingConfiguration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/Configuration/RequestConfiguration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/Configuration/ResponseConfiguration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/ConsoleLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/LoggerConstants.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Logger/NullApiLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/AdditionalFormParams.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/AdditionalHeaderParams.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/AdditionalQueryParams.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/BodyParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/EncodedParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/FormParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/HeaderParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/MultipleParams.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/Parameter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/QueryParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Parameters/TemplateParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/Request.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Request/RequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/Context.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/ResponseError.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/ResponseHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/Types/DeserializableType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/Types/ErrorType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/Types/ResponseMultiType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Response/Types/ResponseType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/BodyMatchers/BodyComparator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/BodyMatchers/BodyMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/BodyMatchers/KeysAndValuesBodyMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/BodyMatchers/KeysBodyMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/BodyMatchers/NativeBodyMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/BodyMatchers/RawBodyMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/CoreTestCase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/HeadersMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/StatusCodeMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/TestCase/TestParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/CallbackCatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/Sdk/CoreApiResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/Sdk/CoreCallback.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/Sdk/CoreContext.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/Sdk/CoreFileWrapper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/Sdk/CoreRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Types/Sdk/CoreResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Utils/CoreHelper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Utils/DateHelper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Utils/JsonHelper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Utils/XmlDeserializer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/core/src/Utils/XmlSerializer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/example/Address.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/example/Contact.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/example/run.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/src/AnyOfValidationException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/src/JsonMapper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/src/JsonMapperException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/src/OneOfValidationException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/jsonmapper/src/TypeCombination.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/unirest-php/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/unirest-php/src/Configuration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/unirest-php/src/HttpClient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/unirest-php/src/Request/Body.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/unirest-php/src/Request/Request.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/apimatic/unirest-php/src/Response.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.auto.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.autoload-legacy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.composer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.func.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.includes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.kses.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.path.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Config.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Context.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Language.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Length.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Node.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URI.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/php-jsonpointer/php-jsonpointer/src/Rs/Json/Pointer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/php-jsonpointer/php-jsonpointer/src/Rs/Json/Pointer/InvalidJsonException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/php-jsonpointer/php-jsonpointer/src/Rs/Json/Pointer/InvalidPointerException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/php-jsonpointer/php-jsonpointer/src/Rs/Json/Pointer/NonWalkableJsonException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/php-jsonpointer/php-jsonpointer/src/Rs/Json/Pointer/NonexistentValueReferencedException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/example-autoload.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/ApiHelper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/ApplePayApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/BankAccountsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/BaseApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/BookingCustomAttributesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/BookingsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CardsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CashDrawersApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CatalogApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CheckoutApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CustomerCustomAttributesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CustomerGroupsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CustomerSegmentsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/CustomersApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/DevicesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/DisputesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/EmployeesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/EventsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/GiftCardActivitiesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/GiftCardsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/InventoryApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/InvoicesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/LaborApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/LocationCustomAttributesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/LocationsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/LoyaltyApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/MerchantCustomAttributesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/MerchantsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/MobileAuthorizationApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/OAuthApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/OrderCustomAttributesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/OrdersApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/PaymentsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/PayoutsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/RefundsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/SitesApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/SnippetsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/SubscriptionsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/TeamApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/TerminalApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/TransactionsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/V1TransactionsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/VendorsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Apis/WebhookSubscriptionsApi.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Authentication/BearerAuthCredentialsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Authentication/BearerAuthManager.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/BearerAuthCredentials.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/ConfigurationDefaults.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/ConfigurationInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Environment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Exceptions/ApiException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Http/ApiResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Http/HttpCallBack.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Http/HttpContext.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Http/HttpMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Http/HttpRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Http/HttpResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ACHDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AcceptDisputeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AcceptedPaymentMethods.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AccumulateLoyaltyPointsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AccumulateLoyaltyPointsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ActionCancelReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ActivityType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AddGroupToCustomerResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AdditionalRecipient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Address.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AdjustLoyaltyPointsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AdjustLoyaltyPointsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AfterpayDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ApplicationDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ApplicationDetailsExternalSquareProduct.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ApplicationType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/AppointmentSegment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ArchivedState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Availability.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BankAccount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BankAccountPaymentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BankAccountStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BankAccountType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchChangeInventoryRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchChangeInventoryResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchDeleteCatalogObjectsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchDeleteCatalogObjectsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveCatalogObjectsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveCatalogObjectsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveInventoryChangesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveInventoryChangesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveInventoryCountsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveInventoryCountsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveOrdersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchRetrieveOrdersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchUpsertCatalogObjectsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BatchUpsertCatalogObjectsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Booking.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingBookingSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingCreatorDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingCreatorDetailsCreatorType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingCustomAttributeDeleteRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingCustomAttributeDeleteResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingCustomAttributeUpsertRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingCustomAttributeUpsertResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BookingStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BreakType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ACHDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AcceptDisputeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AcceptedPaymentMethodsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AccumulateLoyaltyPointsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AccumulateLoyaltyPointsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AddGroupToCustomerResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AdditionalRecipientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AddressBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AdjustLoyaltyPointsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AdjustLoyaltyPointsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AfterpayDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ApplicationDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AppointmentSegmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/AvailabilityBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BankAccountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BankAccountPaymentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchChangeInventoryRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchChangeInventoryResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchDeleteCatalogObjectsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchDeleteCatalogObjectsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveCatalogObjectsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveCatalogObjectsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveInventoryChangesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveInventoryChangesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveInventoryCountsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveInventoryCountsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveOrdersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchRetrieveOrdersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchUpsertCatalogObjectsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BatchUpsertCatalogObjectsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BookingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BookingCreatorDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BookingCustomAttributeDeleteRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BookingCustomAttributeDeleteResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BookingCustomAttributeUpsertRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BookingCustomAttributeUpsertResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BreakTypeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateCustomerDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateCustomersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateCustomersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateTeamMembersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateTeamMembersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateVendorsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkCreateVendorsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteBookingCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteBookingCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteCustomersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteCustomersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteLocationCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteLocationCustomAttributesRequestLocationCustomAttributeDeleteRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteLocationCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteLocationCustomAttributesResponseLocationCustomAttributeDeleteResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteMerchantCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteMerchantCustomAttributesRequestMerchantCustomAttributeDeleteRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteMerchantCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteMerchantCustomAttributesResponseMerchantCustomAttributeDeleteResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteOrderCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteOrderCustomAttributesRequestDeleteCustomAttributeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkDeleteOrderCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveBookingsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveBookingsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveCustomersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveCustomersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveTeamMemberBookingProfilesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveTeamMemberBookingProfilesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveVendorsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkRetrieveVendorsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkSwapPlanRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkSwapPlanResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateCustomerDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateCustomersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateCustomersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateTeamMembersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateTeamMembersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateVendorsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpdateVendorsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertBookingCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertBookingCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertCustomerCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertCustomerCustomAttributesRequestCustomerCustomAttributeUpsertRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertCustomerCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertCustomerCustomAttributesResponseCustomerCustomAttributeUpsertResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertLocationCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertLocationCustomAttributesRequestLocationCustomAttributeUpsertRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertLocationCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertLocationCustomAttributesResponseLocationCustomAttributeUpsertResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertMerchantCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertMerchantCustomAttributesRequestMerchantCustomAttributeUpsertRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertMerchantCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertMerchantCustomAttributesResponseMerchantCustomAttributeUpsertResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertOrderCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertOrderCustomAttributesRequestUpsertCustomAttributeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BulkUpsertOrderCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BusinessAppointmentSettingsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BusinessBookingProfileBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BusinessHoursBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BusinessHoursPeriodBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/BuyNowPayLaterDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CalculateLoyaltyPointsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CalculateLoyaltyPointsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CalculateOrderRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CalculateOrderResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelBookingRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelBookingResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelInvoiceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelInvoiceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelLoyaltyPromotionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelPaymentByIdempotencyKeyRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelPaymentByIdempotencyKeyResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelPaymentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelTerminalActionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelTerminalCheckoutResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CancelTerminalRefundResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CaptureTransactionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CardPaymentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CardPaymentTimelineBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CashAppDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CashDrawerDeviceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CashDrawerShiftBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CashDrawerShiftEventBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CashDrawerShiftSummaryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CashPaymentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogAvailabilityPeriodBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCategoryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCustomAttributeDefinitionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCustomAttributeDefinitionNumberConfigBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCustomAttributeDefinitionSelectionConfigBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCustomAttributeDefinitionSelectionConfigCustomAttributeSelectionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCustomAttributeDefinitionStringConfigBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogCustomAttributeValueBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogDiscountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogEcomSeoDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogIdMappingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogImageBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogInfoResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogInfoResponseLimitsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemFoodAndBeverageDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemFoodAndBeverageDetailsDietaryPreferenceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemFoodAndBeverageDetailsIngredientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemModifierListInfoBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemOptionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemOptionForItemBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemOptionValueBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemOptionValueForItemVariationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogItemVariationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogMeasurementUnitBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogModifierBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogModifierListBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogModifierOverrideBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogObjectBatchBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogObjectBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogObjectCategoryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogObjectReferenceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogPricingRuleBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogProductSetBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryExactBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryItemVariationsForItemOptionValuesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryItemsForItemOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryItemsForModifierListBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryItemsForTaxBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryPrefixBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryRangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQuerySetBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQuerySortedAttributeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQueryTextBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQuickAmountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogQuickAmountsSettingsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogStockConversionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogSubscriptionPlanBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogSubscriptionPlanVariationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogTaxBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogTimePeriodBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CatalogV1IdBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CategoryPathToRootNodeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ChangeBillingAnchorDateRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ChangeBillingAnchorDateResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ChargeRequestAdditionalRecipientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ChargeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ChargeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutLocationSettingsBrandingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutLocationSettingsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutLocationSettingsCouponsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutLocationSettingsPolicyBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutLocationSettingsTippingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutMerchantSettingsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutMerchantSettingsPaymentMethodsAfterpayClearpayBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutMerchantSettingsPaymentMethodsAfterpayClearpayEligibilityRangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutMerchantSettingsPaymentMethodsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutMerchantSettingsPaymentMethodsPaymentMethodBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CheckoutOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ClearpayDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CloneOrderRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CloneOrderResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CollectedDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CompletePaymentRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CompletePaymentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ComponentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ConfirmationDecisionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ConfirmationOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CoordinatesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateBookingCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateBookingCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateBookingRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateBookingResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateBreakTypeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateBreakTypeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCatalogImageRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCatalogImageResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCheckoutRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCheckoutResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerCardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerGroupRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerGroupResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateCustomerResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateDeviceCodeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateDeviceCodeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateDisputeEvidenceFileRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateDisputeEvidenceFileResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateDisputeEvidenceTextRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateDisputeEvidenceTextResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateGiftCardActivityRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateGiftCardActivityResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateGiftCardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateGiftCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateInvoiceAttachmentRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateInvoiceAttachmentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateInvoiceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateInvoiceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateJobRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateJobResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLocationCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLocationCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLocationRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLocationResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLoyaltyAccountRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLoyaltyAccountResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLoyaltyPromotionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLoyaltyPromotionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLoyaltyRewardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateLoyaltyRewardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateMerchantCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateMerchantCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateMobileAuthorizationCodeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateMobileAuthorizationCodeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateOrderCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateOrderCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateOrderRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateOrderResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreatePaymentLinkRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreatePaymentLinkResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreatePaymentRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreatePaymentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateRefundRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateRefundResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateShiftRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateShiftResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTeamMemberRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTeamMemberResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTerminalActionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTerminalActionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTerminalCheckoutRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTerminalCheckoutResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTerminalRefundRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateTerminalRefundResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateVendorRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateVendorResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateWebhookSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CreateWebhookSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomAttributeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomAttributeDefinitionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomAttributeFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomFieldBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerAddressFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerCreationSourceFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerCustomAttributeFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerCustomAttributeFilterValueBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerCustomAttributeFiltersBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerGroupBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerPreferencesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerSegmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerSortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerTaxIdsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/CustomerTextFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DataCollectionOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DateRangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteBookingCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteBookingCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteBreakTypeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCatalogObjectResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCustomerCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCustomerCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCustomerCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCustomerGroupResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCustomerRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteCustomerResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteDisputeEvidenceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteInvoiceAttachmentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteInvoiceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteInvoiceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteLocationCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteLocationCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteLoyaltyRewardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteMerchantCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteMerchantCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteOrderCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteOrderCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeletePaymentLinkResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteShiftResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteSnippetResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteSubscriptionActionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeleteWebhookSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeprecatedCreateDisputeEvidenceFileRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeprecatedCreateDisputeEvidenceFileResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeprecatedCreateDisputeEvidenceTextRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeprecatedCreateDisputeEvidenceTextResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DestinationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DestinationDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DestinationDetailsCardRefundDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DestinationDetailsCashRefundDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DestinationDetailsExternalRefundDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceAttributesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceCheckoutOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceCodeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsApplicationDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsBatteryDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsCardReaderDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsEthernetDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsMeasurementBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsNetworkInterfaceDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceComponentDetailsWiFiDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceMetadataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DeviceStatusBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DigitalWalletDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DisableCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DisableEventsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DismissTerminalActionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DismissTerminalCheckoutResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DismissTerminalRefundResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DisputeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DisputeEvidenceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DisputeEvidenceFileBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/DisputedPaymentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EmployeeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EmployeeWageBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EnableEventsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ErrorBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EventBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EventDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EventMetadataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/EventTypeMetadataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ExternalPaymentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FilterValueBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FloatNumberRangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentDeliveryDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentFulfillmentEntryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentPickupDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentPickupDetailsCurbsidePickupDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentRecipientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/FulfillmentShipmentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetBankAccountByV1IdResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetBankAccountResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetBreakTypeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetDeviceCodeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetDeviceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetEmployeeWageResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetInvoiceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetPaymentRefundResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetPaymentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetPayoutResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetShiftResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetTeamMemberWageResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetTerminalActionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetTerminalCheckoutResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GetTerminalRefundResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityActivateBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityAdjustDecrementBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityAdjustIncrementBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityBlockBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityClearBalanceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityDeactivateBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityImportBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityImportReversalBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityLoadBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityRedeemBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityRefundBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityTransferBalanceFromBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityTransferBalanceToBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityUnblockBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardActivityUnlinkedActivityRefundBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/GiftCardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InventoryAdjustmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InventoryAdjustmentGroupBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InventoryChangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InventoryCountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InventoryPhysicalCountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InventoryTransferBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceAcceptedPaymentMethodsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceAttachmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceCustomFieldBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoicePaymentReminderBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoicePaymentRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceRecipientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceRecipientTaxIdsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/InvoiceSortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ItemVariationLocationOverridesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/JobAssignmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/JobBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LinkCustomerToGiftCardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LinkCustomerToGiftCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBankAccountsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBankAccountsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBookingCustomAttributeDefinitionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBookingCustomAttributeDefinitionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBookingCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBookingCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBookingsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBookingsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBreakTypesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListBreakTypesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCardsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCardsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCashDrawerShiftEventsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCashDrawerShiftEventsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCashDrawerShiftsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCashDrawerShiftsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCatalogRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCatalogResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerCustomAttributeDefinitionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerCustomAttributeDefinitionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerGroupsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerGroupsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerSegmentsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomerSegmentsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListCustomersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDeviceCodesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDeviceCodesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDevicesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDevicesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDisputeEvidenceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDisputeEvidenceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDisputesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListDisputesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListEmployeeWagesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListEmployeeWagesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListEmployeesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListEmployeesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListEventTypesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListEventTypesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListGiftCardActivitiesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListGiftCardActivitiesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListGiftCardsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListGiftCardsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListInvoicesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListInvoicesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListJobsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListJobsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationBookingProfilesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationBookingProfilesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationCustomAttributeDefinitionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationCustomAttributeDefinitionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLocationsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLoyaltyProgramsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLoyaltyPromotionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListLoyaltyPromotionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListMerchantCustomAttributeDefinitionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListMerchantCustomAttributeDefinitionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListMerchantCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListMerchantCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListMerchantsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListMerchantsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListOrderCustomAttributeDefinitionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListOrderCustomAttributeDefinitionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListOrderCustomAttributesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListOrderCustomAttributesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPaymentLinksRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPaymentLinksResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPaymentRefundsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPaymentRefundsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPaymentsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPaymentsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPayoutEntriesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPayoutEntriesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPayoutsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListPayoutsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListRefundsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListRefundsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListSitesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListSubscriptionEventsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListSubscriptionEventsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListTeamMemberBookingProfilesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListTeamMemberBookingProfilesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListTeamMemberWagesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListTeamMemberWagesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListTransactionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListTransactionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListWebhookEventTypesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListWebhookEventTypesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListWebhookSubscriptionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListWebhookSubscriptionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListWorkweekConfigsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ListWorkweekConfigsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LocationBookingProfileBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LocationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyAccountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyAccountExpiringPointDeadlineBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyAccountMappingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventAccumulatePointsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventAccumulatePromotionPointsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventAdjustPointsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventCreateRewardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventDateTimeFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventDeleteRewardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventExpirePointsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventLocationFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventLoyaltyAccountFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventOrderFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventOtherBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventRedeemRewardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyEventTypeFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramAccrualRuleBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramAccrualRuleCategoryDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramAccrualRuleItemVariationDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramAccrualRuleSpendDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramAccrualRuleVisitDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramExpirationPolicyBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramRewardDefinitionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramRewardTierBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyProgramTerminologyBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyPromotionAvailableTimeDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyPromotionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyPromotionIncentiveBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyPromotionIncentivePointsAdditionDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyPromotionIncentivePointsMultiplierDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyPromotionTriggerLimitBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/LoyaltyRewardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/MBreakBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/MeasurementUnitBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/MeasurementUnitCustomBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/MerchantBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ModifierLocationOverridesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/MoneyBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ObtainTokenRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ObtainTokenResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OfflinePaymentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderCreatedBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderCreatedObjectBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderEntryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentDeliveryDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentFulfillmentEntryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentPickupDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentPickupDetailsCurbsidePickupDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentRecipientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentShipmentDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentUpdatedBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentUpdatedObjectBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderFulfillmentUpdatedUpdateBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemAppliedDiscountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemAppliedServiceChargeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemAppliedTaxBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemDiscountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemModifierBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemPricingBlocklistsBlockedDiscountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemPricingBlocklistsBlockedTaxBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemPricingBlocklistsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderLineItemTaxBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderMoneyAmountsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderPricingOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderQuantityUnitBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnDiscountBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnLineItemBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnLineItemModifierBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnServiceChargeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnTaxBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderReturnTipBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderRewardBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderRoundingAdjustmentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderServiceChargeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderSourceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderUpdatedBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/OrderUpdatedObjectBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaginationCursorBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PauseSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PauseSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PayOrderRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PayOrderResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityAppFeeRefundDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityAppFeeRevenueDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityAutomaticSavingsDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityAutomaticSavingsReversedDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityChargeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityDepositFeeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityDepositFeeReversedDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityDisputeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityFeeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityFreeProcessingDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityHoldAdjustmentDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityOpenDisputeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityOtherAdjustmentDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityOtherDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityRefundDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityReleaseAdjustmentDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityReserveHoldDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityReserveReleaseDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivitySquareCapitalPaymentDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivitySquareCapitalReversedPaymentDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivitySquarePayrollTransferDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivitySquarePayrollTransferReversedDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityTaxOnFeeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityThirdPartyFeeDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBalanceActivityThirdPartyFeeRefundDetailBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentLinkBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentLinkRelatedResourcesBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PaymentRefundBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PayoutBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PayoutEntryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PayoutFeeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PhaseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PhaseInputBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PrePopulatedDataBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ProcessingFeeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PublishInvoiceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/PublishInvoiceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/QrCodeOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/QuantityRatioBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/QuickPayBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ReceiptOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RedeemLoyaltyRewardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RedeemLoyaltyRewardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RefundBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RefundPaymentRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RefundPaymentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RegisterDomainRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RegisterDomainResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RemoveGroupFromCustomerResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ResumeSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ResumeSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveBookingCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveBookingCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveBookingCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveBookingCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveBookingResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveBusinessBookingProfileResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCashDrawerShiftRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCashDrawerShiftResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCatalogObjectRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCatalogObjectResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerGroupResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveCustomerSegmentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveDisputeEvidenceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveDisputeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveEmployeeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveGiftCardFromGANRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveGiftCardFromGANResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveGiftCardFromNonceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveGiftCardFromNonceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveGiftCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryAdjustmentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryChangesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryChangesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryCountRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryCountResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryPhysicalCountResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveInventoryTransferResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveJobResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationBookingProfileResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLocationSettingsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLoyaltyAccountResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLoyaltyProgramResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLoyaltyPromotionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveLoyaltyRewardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveMerchantCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveMerchantCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveMerchantCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveMerchantCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveMerchantResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveMerchantSettingsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveOrderCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveOrderCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveOrderCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveOrderCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveOrderResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrievePaymentLinkResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveSnippetResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveTeamMemberBookingProfileResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveTeamMemberResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveTokenStatusResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveTransactionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveVendorResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveWageSettingResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RetrieveWebhookSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RevokeTokenRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RevokeTokenResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/RiskEvaluationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SaveCardOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchAvailabilityFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchAvailabilityQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchAvailabilityRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchAvailabilityResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchCatalogItemsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchCatalogItemsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchCatalogObjectsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchCatalogObjectsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchCustomersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchCustomersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchEventsFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchEventsQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchEventsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchEventsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchEventsSortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchInvoicesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchInvoicesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyAccountsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyAccountsRequestLoyaltyAccountQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyAccountsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyEventsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyEventsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyRewardsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyRewardsRequestLoyaltyRewardQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchLoyaltyRewardsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersCustomerFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersDateTimeFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersFulfillmentFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersSortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersSourceFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchOrdersStateFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchShiftsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchShiftsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchSubscriptionsFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchSubscriptionsQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchSubscriptionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchSubscriptionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTeamMembersFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTeamMembersQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTeamMembersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTeamMembersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTerminalActionsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTerminalActionsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTerminalCheckoutsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTerminalCheckoutsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTerminalRefundsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchTerminalRefundsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchVendorsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchVendorsRequestFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchVendorsRequestSortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SearchVendorsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SegmentFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SelectOptionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SelectOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShiftBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShiftFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShiftQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShiftSortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShiftWageBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShiftWorkdayBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/ShippingFeeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SignatureImageBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SignatureOptionsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SiteBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SnippetBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SnippetResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SourceApplicationBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SquareAccountDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/StandardUnitDescriptionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/StandardUnitDescriptionGroupBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubmitEvidenceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionActionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionEventBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionEventInfoBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionPhaseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionPricingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionSourceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SubscriptionTestResultBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SwapPlanRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/SwapPlanResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TaxIdsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TeamMemberAssignedLocationsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TeamMemberBookingProfileBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TeamMemberBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TeamMemberWageBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TenderBankAccountDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TenderBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TenderBuyNowPayLaterDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TenderCardDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TenderCashDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TenderSquareAccountDetailsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalActionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalActionQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalActionQueryFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalActionQuerySortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalCheckoutBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalCheckoutQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalCheckoutQueryFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalCheckoutQuerySortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalRefundBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalRefundQueryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalRefundQueryFilterBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TerminalRefundQuerySortBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TestWebhookSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TestWebhookSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TimeRangeBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TipSettingsBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/TransactionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UnlinkCustomerFromGiftCardRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UnlinkCustomerFromGiftCardResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateBookingCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateBookingCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateBookingRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateBookingResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateBreakTypeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateBreakTypeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCatalogImageRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCatalogImageResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCustomerCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCustomerCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCustomerGroupRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCustomerGroupResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCustomerRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateCustomerResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateInvoiceRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateInvoiceResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateItemModifierListsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateItemModifierListsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateItemTaxesRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateItemTaxesResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateJobRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateJobResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateLocationCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateLocationCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateLocationRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateLocationResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateLocationSettingsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateLocationSettingsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateMerchantCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateMerchantCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateMerchantSettingsRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateMerchantSettingsResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateOrderCustomAttributeDefinitionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateOrderCustomAttributeDefinitionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateOrderRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateOrderResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdatePaymentLinkRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdatePaymentLinkResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdatePaymentRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdatePaymentResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateShiftRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateShiftResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateTeamMemberRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateTeamMemberResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateVendorRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateVendorResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWageSettingRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWageSettingResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWebhookSubscriptionRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWebhookSubscriptionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWebhookSubscriptionSignatureKeyRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWebhookSubscriptionSignatureKeyResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWorkweekConfigRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpdateWorkweekConfigResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertBookingCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertBookingCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertCatalogObjectRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertCatalogObjectResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertCustomerCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertCustomerCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertLocationCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertLocationCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertMerchantCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertMerchantCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertOrderCustomAttributeRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertOrderCustomAttributeResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertSnippetRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/UpsertSnippetResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1DeviceBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1ListOrdersRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1ListOrdersResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1MoneyBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1OrderBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1OrderHistoryEntryBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1PhoneNumberBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1TenderBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/V1UpdateOrderRequestBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/VendorBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/VendorContactBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/VoidTransactionResponseBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/WageSettingBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/WebhookSubscriptionBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Builders/WorkweekConfigBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateCustomerData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateCustomersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateCustomersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateTeamMembersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateTeamMembersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateVendorsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkCreateVendorsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteBookingCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteBookingCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteCustomersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteCustomersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteLocationCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteLocationCustomAttributesRequestLocationCustomAttributeDeleteRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteLocationCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteLocationCustomAttributesResponseLocationCustomAttributeDeleteResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteMerchantCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteMerchantCustomAttributesRequestMerchantCustomAttributeDeleteRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteMerchantCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteMerchantCustomAttributesResponseMerchantCustomAttributeDeleteResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteOrderCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteOrderCustomAttributesRequestDeleteCustomAttribute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkDeleteOrderCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveBookingsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveBookingsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveCustomersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveCustomersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveTeamMemberBookingProfilesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveTeamMemberBookingProfilesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveVendorsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkRetrieveVendorsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkSwapPlanRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkSwapPlanResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateCustomerData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateCustomersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateCustomersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateTeamMembersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateTeamMembersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateVendorsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpdateVendorsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertBookingCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertBookingCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertCustomerCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertCustomerCustomAttributesRequestCustomerCustomAttributeUpsertRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertCustomerCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertCustomerCustomAttributesResponseCustomerCustomAttributeUpsertResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertLocationCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertLocationCustomAttributesRequestLocationCustomAttributeUpsertRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertLocationCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertLocationCustomAttributesResponseLocationCustomAttributeUpsertResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertMerchantCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertMerchantCustomAttributesRequestMerchantCustomAttributeUpsertRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertMerchantCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertMerchantCustomAttributesResponseMerchantCustomAttributeUpsertResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertOrderCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertOrderCustomAttributesRequestUpsertCustomAttribute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BulkUpsertOrderCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessAppointmentSettings.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessAppointmentSettingsAlignmentTime.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessAppointmentSettingsBookingLocationType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessAppointmentSettingsCancellationPolicy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessAppointmentSettingsMaxAppointmentsPerDayLimitType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessBookingProfile.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessBookingProfileBookingPolicy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessBookingProfileCustomerTimezoneChoice.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessHours.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BusinessHoursPeriod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/BuyNowPayLaterDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CalculateLoyaltyPointsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CalculateLoyaltyPointsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CalculateOrderRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CalculateOrderResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelBookingRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelBookingResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelInvoiceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelInvoiceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelLoyaltyPromotionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelPaymentByIdempotencyKeyRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelPaymentByIdempotencyKeyResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelPaymentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelTerminalActionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelTerminalCheckoutResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CancelTerminalRefundResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CaptureTransactionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Card.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CardBrand.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CardCoBrand.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CardPaymentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CardPaymentTimeline.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CardPrepaidType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CardType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashAppDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashDrawerDevice.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashDrawerEventType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashDrawerShift.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashDrawerShiftEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashDrawerShiftState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashDrawerShiftSummary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CashPaymentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogAvailabilityPeriod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCategory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCategoryType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionAppVisibility.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionNumberConfig.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionSelectionConfig.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionSelectionConfigCustomAttributeSelection.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionSellerVisibility.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionStringConfig.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeDefinitionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogCustomAttributeValue.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogDiscount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogDiscountModifyTaxBasis.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogDiscountType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogEcomSeoData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogIdMapping.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogImage.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogInfoResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogInfoResponseLimits.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemFoodAndBeverageDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemFoodAndBeverageDetailsDietaryPreference.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemFoodAndBeverageDetailsDietaryPreferenceStandardDietaryPreference.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemFoodAndBeverageDetailsDietaryPreferenceType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemFoodAndBeverageDetailsIngredient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemFoodAndBeverageDetailsIngredientStandardIngredient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemModifierListInfo.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemOption.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemOptionForItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemOptionValue.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemOptionValueForItemVariation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemProductType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogItemVariation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogMeasurementUnit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogModifier.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogModifierList.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogModifierListModifierType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogModifierListSelectionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogModifierOverride.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogObjectBatch.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogObjectCategory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogObjectReference.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogObjectType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogPricingRule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogPricingType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogProductSet.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryExact.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryItemVariationsForItemOptionValues.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryItemsForItemOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryItemsForModifierList.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryItemsForTax.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryPrefix.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryRange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuerySet.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuerySortedAttribute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQueryText.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuickAmount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuickAmountType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuickAmountsSettings.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogQuickAmountsSettingsOption.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogStockConversion.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogSubscriptionPlan.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogSubscriptionPlanVariation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogTax.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogTimePeriod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CatalogV1Id.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CategoryPathToRootNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ChangeBillingAnchorDateRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ChangeBillingAnchorDateResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ChangeTiming.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ChargeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ChargeRequestAdditionalRecipient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ChargeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Checkout.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettings.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettingsBranding.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettingsBrandingButtonShape.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettingsBrandingHeaderType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettingsCoupons.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettingsPolicy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutLocationSettingsTipping.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutMerchantSettings.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutMerchantSettingsPaymentMethods.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutMerchantSettingsPaymentMethodsAfterpayClearpay.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutMerchantSettingsPaymentMethodsAfterpayClearpayEligibilityRange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutMerchantSettingsPaymentMethodsPaymentMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CheckoutOptionsPaymentType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ClearpayDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CloneOrderRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CloneOrderResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CollectedData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CompletePaymentRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CompletePaymentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Component.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ComponentComponentType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ConfirmationDecision.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ConfirmationOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Coordinates.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Country.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateBookingCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateBookingCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateBookingRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateBookingResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateBreakTypeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateBreakTypeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCatalogImageRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCatalogImageResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCheckoutRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCheckoutResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerCardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerGroupRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerGroupResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateCustomerResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateDeviceCodeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateDeviceCodeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateDisputeEvidenceFileRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateDisputeEvidenceFileResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateDisputeEvidenceTextRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateDisputeEvidenceTextResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateGiftCardActivityRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateGiftCardActivityResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateGiftCardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateGiftCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateInvoiceAttachmentRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateInvoiceAttachmentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateInvoiceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateInvoiceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateJobRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateJobResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLocationCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLocationCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLocationRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLocationResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLoyaltyAccountRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLoyaltyAccountResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLoyaltyPromotionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLoyaltyPromotionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLoyaltyRewardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateLoyaltyRewardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateMerchantCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateMerchantCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateMobileAuthorizationCodeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateMobileAuthorizationCodeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateOrderCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateOrderCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateOrderRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateOrderResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreatePaymentLinkRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreatePaymentLinkResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreatePaymentRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreatePaymentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateRefundRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateRefundResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateShiftRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateShiftResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTeamMemberRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTeamMemberResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTerminalActionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTerminalActionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTerminalCheckoutRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTerminalCheckoutResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTerminalRefundRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateTerminalRefundResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateVendorRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateVendorResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateWebhookSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CreateWebhookSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Currency.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomAttribute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomAttributeDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomAttributeDefinitionVisibility.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomAttributeFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Customer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerAddressFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerCreationSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerCreationSourceFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerCustomAttributeFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerCustomAttributeFilterValue.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerCustomAttributeFilters.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerGroup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerInclusionExclusion.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerPreferences.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerSegment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerSort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerTaxIds.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/CustomerTextFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DataCollectionOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DataCollectionOptionsInputType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DateRange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DayOfWeek.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteBookingCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteBookingCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteBreakTypeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCatalogObjectResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCustomerCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCustomerCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCustomerCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCustomerGroupResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCustomerRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteCustomerResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteDisputeEvidenceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteInvoiceAttachmentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteInvoiceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteInvoiceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteLocationCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteLocationCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteLoyaltyRewardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteMerchantCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteMerchantCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteOrderCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteOrderCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeletePaymentLinkResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteShiftResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteSnippetResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteSubscriptionActionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeleteWebhookSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeprecatedCreateDisputeEvidenceFileRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeprecatedCreateDisputeEvidenceFileResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeprecatedCreateDisputeEvidenceTextRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeprecatedCreateDisputeEvidenceTextResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Destination.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DestinationDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DestinationDetailsCardRefundDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DestinationDetailsCashRefundDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DestinationDetailsExternalRefundDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DestinationType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Device.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceAttributes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceAttributesDeviceType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceCheckoutOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceCode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceCodeStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsApplicationDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsBatteryDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsCardReaderDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsEthernetDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsExternalPower.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsMeasurement.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsNetworkInterfaceDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceComponentDetailsWiFiDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceMetadata.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DeviceStatusCategory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DigitalWalletDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisableCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisableEventsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DismissTerminalActionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DismissTerminalCheckoutResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DismissTerminalRefundResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Dispute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisputeEvidence.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisputeEvidenceFile.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisputeEvidenceType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisputeReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisputeState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/DisputedPayment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EcomVisibility.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Employee.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EmployeeStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EmployeeWage.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EnableEventsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Error.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ErrorCategory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ErrorCode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Event.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EventData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EventMetadata.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/EventTypeMetadata.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ExcludeStrategy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ExternalPaymentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FilterValue.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FloatNumberRange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Fulfillment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentDeliveryDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentDeliveryDetailsOrderFulfillmentDeliveryDetailsScheduleType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentFulfillmentEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentFulfillmentLineItemApplication.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentPickupDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentPickupDetailsCurbsidePickupDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentPickupDetailsScheduleType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentRecipient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentShipmentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/FulfillmentType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetBankAccountByV1IdResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetBankAccountResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetBreakTypeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetDeviceCodeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetDeviceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetEmployeeWageResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetInvoiceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetPaymentRefundResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetPaymentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetPayoutResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetShiftResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetTeamMemberWageResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetTerminalActionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetTerminalCheckoutResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GetTerminalRefundResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCard.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivity.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityActivate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityAdjustDecrement.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityAdjustDecrementReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityAdjustIncrement.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityAdjustIncrementReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityBlock.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityBlockReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityClearBalance.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityClearBalanceReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityDeactivate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityDeactivateReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityImport.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityImportReversal.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityLoad.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityRedeem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityRedeemStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityRefund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityTransferBalanceFrom.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityTransferBalanceTo.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityUnblock.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityUnblockReason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardActivityUnlinkedActivityRefund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardGANSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/GiftCardType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryAdjustment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryAdjustmentGroup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryAlertType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryChange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryChangeType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryCount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryPhysicalCount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InventoryTransfer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Invoice.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceAcceptedPaymentMethods.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceAttachment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceAutomaticPaymentSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceCustomField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceCustomFieldPlacement.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceDeliveryMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoicePaymentReminder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoicePaymentReminderStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoicePaymentRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceRecipient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceRecipientTaxIds.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceRequestMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceRequestType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceSort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/InvoiceStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ItemVariationLocationOverrides.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Job.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/JobAssignment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/JobAssignmentPayType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LinkCustomerToGiftCardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LinkCustomerToGiftCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBankAccountsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBankAccountsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBookingCustomAttributeDefinitionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBookingCustomAttributeDefinitionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBookingCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBookingCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBookingsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBookingsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBreakTypesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListBreakTypesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCardsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCardsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCashDrawerShiftEventsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCashDrawerShiftEventsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCashDrawerShiftsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCashDrawerShiftsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCatalogRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCatalogResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerCustomAttributeDefinitionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerCustomAttributeDefinitionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerGroupsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerGroupsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerSegmentsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomerSegmentsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListCustomersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDeviceCodesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDeviceCodesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDevicesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDevicesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDisputeEvidenceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDisputeEvidenceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDisputesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListDisputesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListEmployeeWagesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListEmployeeWagesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListEmployeesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListEmployeesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListEventTypesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListEventTypesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListGiftCardActivitiesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListGiftCardActivitiesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListGiftCardsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListGiftCardsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListInvoicesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListInvoicesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListJobsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListJobsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationBookingProfilesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationBookingProfilesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationCustomAttributeDefinitionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationCustomAttributeDefinitionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLocationsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLoyaltyProgramsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLoyaltyPromotionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListLoyaltyPromotionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListMerchantCustomAttributeDefinitionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListMerchantCustomAttributeDefinitionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListMerchantCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListMerchantCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListMerchantsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListMerchantsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListOrderCustomAttributeDefinitionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListOrderCustomAttributeDefinitionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListOrderCustomAttributesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListOrderCustomAttributesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPaymentLinksRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPaymentLinksResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPaymentRefundsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPaymentRefundsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPaymentsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPaymentsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPayoutEntriesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPayoutEntriesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPayoutsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListPayoutsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListRefundsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListRefundsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListSitesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListSubscriptionEventsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListSubscriptionEventsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListTeamMemberBookingProfilesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListTeamMemberBookingProfilesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListTeamMemberWagesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListTeamMemberWagesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListTransactionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListTransactionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListWebhookEventTypesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListWebhookEventTypesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListWebhookSubscriptionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListWebhookSubscriptionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListWorkweekConfigsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ListWorkweekConfigsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Location.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LocationBookingProfile.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LocationCapability.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LocationStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LocationType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyAccount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyAccountExpiringPointDeadline.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyAccountMapping.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyAccountMappingType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventAccumulatePoints.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventAccumulatePromotionPoints.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventAdjustPoints.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventCreateReward.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventDateTimeFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventDeleteReward.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventExpirePoints.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventLocationFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventLoyaltyAccountFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventOrderFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventOther.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventRedeemReward.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyEventTypeFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgram.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRuleCategoryData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRuleItemVariationData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRuleSpendData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRuleTaxMode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRuleType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramAccrualRuleVisitData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramExpirationPolicy.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramRewardDefinition.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramRewardDefinitionScope.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramRewardDefinitionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramRewardTier.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyProgramTerminology.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotion.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionAvailableTimeData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionIncentive.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionIncentivePointsAdditionData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionIncentivePointsMultiplierData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionIncentiveType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionTriggerLimit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyPromotionTriggerLimitInterval.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyReward.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/LoyaltyRewardStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MBreak.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitArea.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitCustom.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitGeneric.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitLength.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitTime.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitUnitType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitVolume.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MeasurementUnitWeight.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Merchant.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/MerchantStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ModifierLocationOverrides.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Money.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ObtainTokenRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ObtainTokenResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OfflinePaymentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Order.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderCreated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderCreatedObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentDeliveryDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentDeliveryDetailsScheduleType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentFulfillmentEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentFulfillmentLineItemApplication.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentPickupDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentPickupDetailsCurbsidePickupDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentPickupDetailsScheduleType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentRecipient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentShipmentDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentUpdatedObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderFulfillmentUpdatedUpdate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemAppliedDiscount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemAppliedServiceCharge.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemAppliedTax.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemDiscount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemDiscountScope.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemDiscountType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemItemType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemModifier.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemPricingBlocklists.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemPricingBlocklistsBlockedDiscount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemPricingBlocklistsBlockedTax.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemTax.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemTaxScope.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderLineItemTaxType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderMoneyAmounts.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderPricingOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderQuantityUnit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturn.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturnDiscount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturnLineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturnLineItemModifier.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturnServiceCharge.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturnTax.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReturnTip.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderReward.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderRoundingAdjustment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderServiceCharge.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderServiceChargeCalculationPhase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderServiceChargeScope.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderServiceChargeTreatmentType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderServiceChargeType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderUpdated.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/OrderUpdatedObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaginationCursor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PauseSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PauseSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayOrderRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayOrderResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Payment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityAppFeeRefundDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityAppFeeRevenueDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityAutomaticSavingsDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityAutomaticSavingsReversedDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityChargeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityDepositFeeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityDepositFeeReversedDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityDisputeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityFeeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityFreeProcessingDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityHoldAdjustmentDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityOpenDisputeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityOtherAdjustmentDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityOtherDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityRefundDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityReleaseAdjustmentDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityReserveHoldDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityReserveReleaseDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivitySquareCapitalPaymentDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivitySquareCapitalReversedPaymentDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivitySquarePayrollTransferDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivitySquarePayrollTransferReversedDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityTaxOnFeeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityThirdPartyFeeDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentBalanceActivityThirdPartyFeeRefundDetail.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentLink.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentLinkRelatedResources.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentOptionsDelayAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentRefund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PaymentSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Payout.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayoutEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayoutFee.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayoutFeeType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayoutStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PayoutType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Phase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PhaseInput.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PrePopulatedData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ProcessingFee.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Product.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ProductType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PublishInvoiceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/PublishInvoiceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/QrCodeOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/QuantityRatio.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/QuickPay.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Range.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ReceiptOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RedeemLoyaltyRewardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RedeemLoyaltyRewardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Refund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RefundPaymentRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RefundPaymentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RefundStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RegisterDomainRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RegisterDomainResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RegisterDomainResponseStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RemoveGroupFromCustomerResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ResumeSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ResumeSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveBookingCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveBookingCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveBookingCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveBookingCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveBookingResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveBusinessBookingProfileResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCashDrawerShiftRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCashDrawerShiftResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCatalogObjectRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCatalogObjectResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerGroupResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveCustomerSegmentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveDisputeEvidenceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveDisputeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveEmployeeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveGiftCardFromGANRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveGiftCardFromGANResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveGiftCardFromNonceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveGiftCardFromNonceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveGiftCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryAdjustmentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryChangesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryChangesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryCountRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryCountResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryPhysicalCountResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveInventoryTransferResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveJobResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationBookingProfileResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLocationSettingsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLoyaltyAccountResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLoyaltyProgramResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLoyaltyPromotionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveLoyaltyRewardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveMerchantCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveMerchantCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveMerchantCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveMerchantCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveMerchantResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveMerchantSettingsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveOrderCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveOrderCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveOrderCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveOrderCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveOrderResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrievePaymentLinkResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveSnippetResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveTeamMemberBookingProfileResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveTeamMemberResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveTokenStatusResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveTransactionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveVendorResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveWageSettingResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RetrieveWebhookSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RevokeTokenRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RevokeTokenResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RiskEvaluation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/RiskEvaluationRiskLevel.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SaveCardOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchAvailabilityFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchAvailabilityQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchAvailabilityRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchAvailabilityResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCatalogItemsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCatalogItemsRequestStockLevel.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCatalogItemsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCatalogObjectsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCatalogObjectsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCustomersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchCustomersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchEventsFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchEventsQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchEventsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchEventsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchEventsSort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchEventsSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchInvoicesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchInvoicesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyAccountsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyAccountsRequestLoyaltyAccountQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyAccountsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyEventsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyEventsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyRewardsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyRewardsRequestLoyaltyRewardQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchLoyaltyRewardsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersCustomerFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersDateTimeFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersFulfillmentFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersSort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersSourceFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchOrdersStateFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchShiftsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchShiftsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchSubscriptionsFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchSubscriptionsQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchSubscriptionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchSubscriptionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTeamMembersFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTeamMembersQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTeamMembersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTeamMembersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTerminalActionsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTerminalActionsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTerminalCheckoutsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTerminalCheckoutsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTerminalRefundsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchTerminalRefundsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchVendorsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchVendorsRequestFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchVendorsRequestSort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchVendorsRequestSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SearchVendorsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SegmentFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SelectOption.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SelectOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Shift.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftFilterStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftSort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftSortField.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftWage.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftWorkday.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShiftWorkdayMatcher.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/ShippingFee.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SignatureImage.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SignatureOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Site.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Snippet.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SnippetResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SortOrder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SourceApplication.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SquareAccountDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/StandardUnitDescription.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/StandardUnitDescriptionGroup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubmitEvidenceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Subscription.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionActionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionCadence.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionEventInfo.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionEventInfoCode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionEventSubscriptionEventType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionPhase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionPricing.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionPricingType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SubscriptionTestResult.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SwapPlanRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/SwapPlanResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TaxCalculationPhase.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TaxIds.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TaxInclusionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMember.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMemberAssignedLocations.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMemberAssignedLocationsAssignmentType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMemberBookingProfile.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMemberInvitationStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMemberStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TeamMemberWage.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Tender.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderBankAccountDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderBankAccountDetailsStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderBuyNowPayLaterDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderBuyNowPayLaterDetailsBrand.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderBuyNowPayLaterDetailsStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderCardDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderCardDetailsEntryMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderCardDetailsStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderCashDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderSquareAccountDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderSquareAccountDetailsStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TenderType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalActionActionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalActionQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalActionQueryFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalActionQuerySort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalCheckout.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalCheckoutQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalCheckoutQueryFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalCheckoutQuerySort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalRefund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalRefundQuery.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalRefundQueryFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TerminalRefundQuerySort.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TestWebhookSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TestWebhookSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TimeRange.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TipSettings.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Transaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TransactionProduct.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/TransactionType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UnlinkCustomerFromGiftCardRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UnlinkCustomerFromGiftCardResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateBookingCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateBookingCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateBookingRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateBookingResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateBreakTypeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateBreakTypeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCatalogImageRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCatalogImageResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCustomerCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCustomerCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCustomerGroupRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCustomerGroupResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCustomerRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateCustomerResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateInvoiceRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateInvoiceResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateItemModifierListsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateItemModifierListsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateItemTaxesRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateItemTaxesResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateJobRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateJobResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateLocationCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateLocationCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateLocationRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateLocationResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateLocationSettingsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateLocationSettingsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateMerchantCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateMerchantCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateMerchantSettingsRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateMerchantSettingsResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateOrderCustomAttributeDefinitionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateOrderCustomAttributeDefinitionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateOrderRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateOrderResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdatePaymentLinkRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdatePaymentLinkResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdatePaymentRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdatePaymentResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateShiftRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateShiftResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateTeamMemberRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateTeamMemberResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateVendorRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateVendorResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWageSettingRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWageSettingResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWebhookSubscriptionRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWebhookSubscriptionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWebhookSubscriptionSignatureKeyRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWebhookSubscriptionSignatureKeyResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWorkweekConfigRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpdateWorkweekConfigResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertBookingCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertBookingCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertCatalogObjectRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertCatalogObjectResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertCustomerCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertCustomerCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertLocationCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertLocationCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertMerchantCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertMerchantCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertOrderCustomAttributeRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertOrderCustomAttributeResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertSnippetRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/UpsertSnippetResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1Device.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1ListOrdersRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1ListOrdersResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1Money.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1Order.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1OrderHistoryEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1OrderHistoryEntryAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1OrderState.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1PhoneNumber.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1Tender.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1TenderCardBrand.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1TenderEntryMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1TenderType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1UpdateOrderRequest.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/V1UpdateOrderRequestAction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Vendor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/VendorContact.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/VendorStatus.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/VisibilityFilter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/VoidTransactionResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/WageSetting.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/WebhookSubscription.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/Weekday.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Models/WorkweekConfig.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Server.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/SquareClient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/SquareClientBuilder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Utils/CompatibilityConverter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Utils/FileWrapper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/square/square/src/Utils/WebhooksHelper.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/data/ca-certificates.crt create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/init.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Account.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/AccountLink.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/AccountSession.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/All.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/Create.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/Delete.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/NestedResource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/Request.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/Retrieve.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/Search.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiOperations/Update.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiRequestor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiResource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApiResponse.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApplePayDomain.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Application.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApplicationFee.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ApplicationFeeRefund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Apps/Secret.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Balance.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/BalanceTransaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/BankAccount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/BaseStripeClient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/BaseStripeClientInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/Alert.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/AlertTriggered.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/CreditBalanceSummary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/CreditBalanceTransaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/CreditGrant.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/Meter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/MeterEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/MeterEventAdjustment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Billing/MeterEventSummary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/BillingPortal/Configuration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/BillingPortal/Session.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Capability.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Card.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CashBalance.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Charge.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Checkout/Session.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Climate/Order.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Climate/Product.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Climate/Supplier.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Collection.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ConfirmationToken.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ConnectCollectionTransfer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CountrySpec.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Coupon.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CreditNote.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CreditNoteLineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Customer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CustomerBalanceTransaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/CustomerSession.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Discount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Dispute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Entitlements/ActiveEntitlement.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Entitlements/Feature.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/EphemeralKey.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ErrorObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Event.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/ApiConnectionException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/ApiErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/AuthenticationException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/BadMethodCallException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/CardException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/ExceptionInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/IdempotencyException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/InvalidArgumentException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/InvalidRequestException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/InvalidClientException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/InvalidGrantException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/InvalidRequestException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/InvalidScopeException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/OAuthErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/PermissionException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/RateLimitException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/SignatureVerificationException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/TemporarySessionExpiredException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/UnexpectedValueException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Exception/UnknownApiErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ExchangeRate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/File.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FileLink.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FinancialConnections/Account.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FinancialConnections/AccountOwnership.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FinancialConnections/Session.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FinancialConnections/Transaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Forwarding/Request.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/FundingInstructions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/HttpClient/ClientInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/HttpClient/CurlClient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Identity/VerificationReport.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Identity/VerificationSession.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Invoice.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/InvoiceItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/InvoiceLineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/InvoiceRenderingTemplate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/Authorization.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/Card.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/CardDetails.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/Cardholder.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/Dispute.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/PersonalizationDesign.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/PhysicalBundle.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/Token.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Issuing/Transaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/LineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/LoginLink.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Mandate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/OAuth.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/OAuthErrorObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/PaymentIntent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/PaymentLink.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/PaymentMethod.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/PaymentMethodConfiguration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/PaymentMethodDomain.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Payout.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Person.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Plan.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Price.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Product.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ProductFeature.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/PromotionCode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Quote.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Radar/ValueList.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Radar/ValueListItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Reason.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/RecipientTransfer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Refund.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/RelatedObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Reporting/ReportRun.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Reporting/ReportType.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/RequestTelemetry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ReserveTransaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Review.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SearchResult.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/AbstractService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/AbstractServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/AccountLinkService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/AccountService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/AccountSessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ApplePayDomainService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ApplicationFeeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Apps/SecretService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/BalanceService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/BalanceTransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/AlertService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/BillingServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/CreditGrantService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/MeterEventService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Billing/MeterService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ChargeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Checkout/SessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Climate/ClimateServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Climate/OrderService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Climate/ProductService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Climate/SupplierService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ConfirmationTokenService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/CoreServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/CountrySpecService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/CouponService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/CreditNoteService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/CustomerService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/CustomerSessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/DisputeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Entitlements/FeatureService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/EphemeralKeyService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/EventService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ExchangeRateService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/FileLinkService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/FileService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/FinancialConnections/TransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Forwarding/RequestService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/InvoiceItemService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/InvoiceRenderingTemplateService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/InvoiceService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/CardService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/CardholderService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/DisputeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/PhysicalBundleService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/TokenService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Issuing/TransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/MandateService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/OAuthService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PaymentIntentService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PaymentLinkService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PaymentMethodConfigurationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PaymentMethodDomainService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PaymentMethodService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PayoutService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PlanService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PriceService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ProductService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/PromotionCodeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/QuoteService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Radar/ValueListService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/RefundService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ReviewService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ServiceNavigatorTrait.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/SetupAttemptService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/SetupIntentService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/ShippingRateService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/SourceService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/SubscriptionItemService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/SubscriptionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Tax/CalculationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Tax/RegistrationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Tax/SettingsService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Tax/TransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TaxCodeService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TaxIdService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TaxRateService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Terminal/LocationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Terminal/ReaderService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TokenService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TopupService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/TransferService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/TransactionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Billing/MeterEventService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Core/EventDestinationService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/Core/EventService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/V2/V2ServiceFactory.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Service/WebhookEndpointService.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SetupAttempt.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SetupIntent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ShippingRate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SingletonApiResource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Source.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SourceMandateNotification.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SourceTransaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Stripe.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/StripeClient.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/StripeClientInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/StripeObject.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/StripeStreamingClientInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Subscription.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SubscriptionItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/SubscriptionSchedule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Tax/Calculation.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Tax/CalculationLineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Tax/Registration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Tax/Settings.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Tax/Transaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Tax/TransactionLineItem.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/TaxCode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/TaxDeductedAtSource.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/TaxId.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/TaxRate.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Terminal/Configuration.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Terminal/ConnectionToken.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Terminal/Location.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Terminal/Reader.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/TestHelpers/TestClock.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/ThinEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Token.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Topup.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Transfer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/TransferReversal.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/CreditReversal.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/DebitReversal.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/FinancialAccount.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/InboundTransfer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/OutboundPayment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/OutboundTransfer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/ReceivedCredit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/ReceivedDebit.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/Transaction.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Treasury/TransactionEntry.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/UsageRecord.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/UsageRecordSummary.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/ApiVersion.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/CaseInsensitiveArray.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/DefaultLogger.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/EventTypes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/LoggerInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/ObjectTypes.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/RandomGenerator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/RequestOptions.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/Set.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Util/Util.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/V2/Billing/MeterEvent.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/V2/Billing/MeterEventAdjustment.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/V2/Billing/MeterEventSession.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/V2/Collection.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/V2/Event.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/V2/EventDestination.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/Webhook.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/WebhookEndpoint.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/stripe/stripe-php/lib/WebhookSignature.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/CssSelectorConverter.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Exception/ExceptionInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Exception/ExpressionErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Exception/InternalErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Exception/ParseException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Exception/SyntaxErrorException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/AbstractNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/AttributeNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/ClassNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/CombinedSelectorNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/ElementNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/FunctionNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/HashNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/NegationNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/NodeInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/PseudoNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/SelectorNode.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Node/Specificity.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/CommentHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/HandlerInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/HashHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/IdentifierHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/NumberHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/StringHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Handler/WhitespaceHandler.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Parser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/ParserInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Reader.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Shortcut/ClassParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Shortcut/ElementParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Shortcut/HashParser.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Token.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/TokenStream.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Tokenizer/Tokenizer.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/AbstractExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/CombinationExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/ExtensionInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/FunctionExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/HtmlExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/NodeExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Extension/PseudoClassExtension.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/Translator.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/TranslatorInterface.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/symfony/css-selector/XPath/XPathExpr.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/true/punycode/LICENSE create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/true/punycode/src/Exception/DomainOutOfBoundsException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/true/punycode/src/Exception/LabelOutOfBoundsException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/true/punycode/src/Exception/OutOfBoundsException.php create mode 100755 wp-content/plugins/wpforms-lite/vendor_prefixed/true/punycode/src/Punycode.php create mode 100755 wp-content/plugins/wpforms-lite/wpforms.php mode change 100644 => 100755 wp-content/themes/homeproz/inc/favicon.php create mode 100644 wp-content/themes/homeproz/inc/social-sharing.php mode change 100644 => 100755 wp-content/themes/homeproz/inc/yoast-seo.php mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/README.md mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/package.json mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/LICENSE mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/README.md mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/package.json mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/watcher.node mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/LICENSE mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/README.md mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/package.json mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/watcher.node mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/README.md mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/package.json mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/rollup.linux-arm64-gnu.node mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/README.md mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/package.json mode change 100644 => 100755 wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/rollup.linux-arm64-musl.node mode change 100644 => 100755 wp-content/themes/homeproz/page-city-landing.php mode change 100644 => 100755 wp-content/themes/homeproz/page-city-landing.scss create mode 100755 wp-content/themes/homeproz/page-results.php create mode 100755 wp-content/themes/homeproz/page-team.php delete mode 100755 wp-content/themes/homeproz/single-property.php create mode 100755 wp-content/themes/homeproz/template-parts/content/content-results.scss create mode 100755 wp-content/themes/homeproz/template-parts/content/content-team.scss create mode 100755 wp-content/themes/homeproz/template-parts/property/agent-card-minimal.php mode change 100644 => 100755 wp-content/themes/homeproz/template-parts/property/mobile-map.js mode change 100644 => 100755 wp-content/themes/homeproz/template-parts/property/mobile-map.scss rename wp-content/themes/homeproz/template-parts/property/{property-card.php => property-card-agent.php} (62%) create mode 100755 wp-content/themes/homeproz/template-parts/property/single-property-mls.scss delete mode 100755 wp-content/themes/homeproz/template-parts/property/single-property.scss diff --git a/.claude/settings.local.json b/.claude/settings.local.json index bea9a805..df07712a 100755 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -70,7 +70,10 @@ "Bash(git -C /var/www/html add:*)", "Bash(git -C /var/www/html diff --cached --stat)", "Bash(git -C /var/www/html commit -m \"$\\(cat <<''EOF''\nAdd 6 reusable page templates with ACF integration\n\nIntroduces layout-focused templates for marketing pages:\n- Content with Sidebar: 70/30 grid with callout boxes\n- Alternating Blocks: Zigzag image/text sections\n- Service Detail: Hero + features grid + FAQ accordion\n- Card Grid: Configurable 2/3/4 column card layouts\n- Long-Form Article: Clean reading layout with related links\n- Landing Page: Conversion-focused with benefits and testimonial\n\nEach template has corresponding ACF field groups for content\nmanagement. Sample pages created under /page-template-examples/.\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", - "Bash(cat:*)" + "Bash(cat:*)", + "Bash(rsync -av /var/www/vhosts/homeprozrealestate.com/httpdocs/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-query.php /var/www/vhosts/homeprozrealestate.com/staging/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-query.php && rsync -av /var/www/vhosts/homeprozrealestate.com/httpdocs/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php /var/www/vhosts/homeprozrealestate.com/staging/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php)", + "Bash(crontab:*)", + "Bash(rsync:*)" ], "deny": [], "ask": [] diff --git a/.gitignore b/.gitignore index 5a473d30..af4cdfd7 100755 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,15 @@ Thumbs.db # Debug wp-content/debug.log +wp-content/debug.log.* + +# Runtime image caches (regenerable, capped by mls-image-cache-cap) +wp-content/cache/transformed-images/ +wp-content/uploads/mls-thumbnails/ +wp-content/uploads/mls-listings/ + +# Local Claude CLI tooling +node_modules/claude-cli/ # Vite *.local diff --git a/CLAUDE.md b/CLAUDE.md index ed2ed1da..5da1b8f0 100755 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,6 +13,18 @@ Custom WordPress theme for HomeProz Real Estate (Albert Lea, MN). Dark/rust bran 7. **No custom animations** - keep it static and fast 8. **ASK before architectural decisions** 9. **No git commits unless asked** - commits are for checkpoints before major work or major milestones, not for small single-file changes +10. **Sync to staging** - after modifying theme or plugin files, sync them to `/var/www/vhosts/homeprozrealestate.com/staging/` using rsync + +## Version Control Policy + +Git is a snapshot tool and the historical record of what changed on the site. **If it's not in git, it may as well not exist.** + +When asked to commit, commit **everything except build artifacts** — do not pick a "scope" or hand-select files. The point is the snapshot. + +- **Commit:** all source (PHP, SCSS, JS), configs, `package.json`/`package-lock.json`, `db_content_updates/`, `node_modules/`, `dist/`, DB snapshots (`*.sql.gz`), plugins, themes, `CLAUDE.md`. `node_modules/` and `dist/` are tracked intentionally — see comments in `.gitignore`. +- **Do not commit:** runtime caches (`wp-content/cache/transformed-images/`), log files (`wp-content/debug.log*`), and other transient/regenerable runtime output. These belong in `.gitignore`. + +If you find untracked files in scope of a commit, include them. If something looks ambiguous, default to committing it — under-tracking loses history; over-tracking is reversible. ## Build @@ -73,3 +85,23 @@ $url = add_query_arg('property', urlencode($title), home_url('/contact/')); ## Page Classes `Home_Page`, `Properties_Archive`, `Single_Property`, `About_Page`, `Contact_Page`, `Blog_Archive`, `Single_Post`, `Agents_Archive`, `Single_Agent`, `Search_Page`, `Error_404` + +## MLS Property Overrides + +### Force a non-HomeProz listing to appear as HomeProz + +Some properties (e.g., LandProz listings) may need to appear on the HomeProz site. The `is_homeproz` flag overrides the office name check. + +1. Find the property's `listing_key`: +```bash +wp --allow-root db query "SELECT listing_key, listing_id, street_name, city, list_office_name, is_homeproz FROM wp_mls_properties WHERE listing_id LIKE '%%'" +``` + +2. Set the override flag: +```bash +wp --allow-root db query "UPDATE wp_mls_properties SET is_homeproz = 1 WHERE listing_key = ''" +``` + +3. Document the change in `db_content_updates/` per the Database Content Changes policy. + +**Example**: 121 Main St, Glenville (NST7785198) is listed under "LandProz Real Estate, LLC" but appears on HomeProz via `is_homeproz = 1`. diff --git a/db_content_updates/2026-01-05_SEO_albert_lea_landing_page.md b/db_content_updates/2026-01-05_SEO_albert_lea_landing_page.md old mode 100644 new mode 100755 diff --git a/db_content_updates/2026-01-06_agent-testimonials.md b/db_content_updates/2026-01-06_agent-testimonials.md old mode 100644 new mode 100755 diff --git a/db_content_updates/2026-01-06_favicon-management.md b/db_content_updates/2026-01-06_favicon-management.md old mode 100644 new mode 100755 diff --git a/db_content_updates/2026-01-06_mls-ssl-skip-config.md b/db_content_updates/2026-01-06_mls-ssl-skip-config.md old mode 100644 new mode 100755 diff --git a/db_content_updates/2026-01-12_22-37_property-inquiry-form-reorder.md b/db_content_updates/2026-01-12_22-37_property-inquiry-form-reorder.md new file mode 100755 index 00000000..6c10a124 --- /dev/null +++ b/db_content_updates/2026-01-12_22-37_property-inquiry-form-reorder.md @@ -0,0 +1,138 @@ +# Property Inquiry Form Field Reorder + +**Date:** 2026-01-12 +**Purpose:** Reorder Contact Form 7 "Property Inquiry Form" fields so Additional Comments appears after Name/Email/Phone +**Status:** Applied to dev on 2026-01-12 + +## Background + +The property inquiry form should have this field order: +1. Your Inquiry (readonly display message) +2. Your Name +3. Email / Phone (side by side) +4. Additional Comments +5. Submit button + +Previously, Additional Comments was above the contact fields. + +## Changes Required + +### Via WP Admin (Recommended) + +1. Go to WP Admin > Contact > Forms +2. Edit "Property Inquiry Form" +3. Reorder the form fields as shown below +4. Save the form + +### New Form Structure + +``` +
+ +
+
+ +[hidden listing-key] +[hidden listing-id] +[hidden property-address] +[hidden property-price] +[hidden property-url] +[hidden default-message] +[hidden agent-email] +[hidden agent-name] + +
+
+ + [text* your-name] +
+
+ +
+
+ + [email* your-email] +
+
+ + [tel* your-phone] +
+
+ +
+ + [textarea comments placeholder "Any specific questions or information you'd like to know..."] +
+ +[submit class:btn class:btn-primary class:btn-lg "Send Inquiry"] +``` + +### Via SQL (Alternative) + +**Important:** CF7 stores the form structure in `wp_postmeta._form`, not `wp_posts.post_content`. + +First, find the form ID: +```sql +SELECT ID, post_title FROM wp_posts +WHERE post_type = 'wpcf7_contact_form' +AND post_title = 'Property Inquiry Form'; +-- Result: ID = 156 (in dev) +``` + +Then update the `_form` meta with the new form structure: +```sql +UPDATE wp_postmeta +SET meta_value = '
+ +
+
+ +[hidden listing-key] +[hidden listing-id] +[hidden property-address] +[hidden property-price] +[hidden property-url] +[hidden default-message] +[hidden agent-email] +[hidden agent-name] + +
+
+ + [text* your-name] +
+
+ +
+
+ + [email* your-email] +
+
+ + [tel* your-phone] +
+
+ +
+ + [textarea comments placeholder "Any specific questions or information you would like to know..."] +
+ +[submit class:btn class:btn-primary class:btn-lg "Send Inquiry"]' +WHERE post_id = (SELECT ID FROM wp_posts WHERE post_type = 'wpcf7_contact_form' AND post_title = 'Property Inquiry Form') +AND meta_key = '_form'; +``` + +## Related Code Changes + +The following theme files were also updated to support this change: +- `page-property-inquiry.php` - Updated fallback form field order, added agent lookup, split display vs submission messages +- `inc/wpcf7-hooks.php` - Updated HomeProz listing detection to use office name +- `template-parts/property/property-agent.php` - Updated to use listing key for inquiry URL + +## Why + +- Better UX: Users should enter their contact info before typing additional comments +- The display message shown to users no longer includes MLS# (cleaner) +- The submitted message includes MLS#, property URL, and user comments for agent reference diff --git a/db_content_updates/2026-01-12_agent-mls-id-assignments.md b/db_content_updates/2026-01-12_agent-mls-id-assignments.md new file mode 100755 index 00000000..7fc5e08a --- /dev/null +++ b/db_content_updates/2026-01-12_agent-mls-id-assignments.md @@ -0,0 +1,35 @@ +# Agent MLS ID Assignments + +**Date:** 2026-01-12 +**Purpose:** Assign HomeProz agent MLS IDs to agent profiles + +## Changes Made + +Updated `agent_mls_id` ACF field for agents to match MLS Grid listing agent IDs. + +## SQL Commands + +```sql +-- Assign NST503517070 to Davy Villarreal (ID 129) and Jordan Mullenbach (ID 130) +UPDATE wp_postmeta +SET meta_value = 'NST503517070' +WHERE post_id IN (129, 130) +AND meta_key = 'agent_mls_id'; +``` + +## Final State + +| Agent ID | Agent Name | MLS ID | +|----------|------------|--------| +| 128 | Anna Rahn | NST503517068 | +| 129 | Davy Villarreal | NST503517070 | +| 130 | Jordan Mullenbach | NST503517070 | +| 131 | Lily Dulitz | NST503517068 | + +## Why + +HomeProz has 2 listing agent MLS IDs in the MLS Grid data: +- NST503517068 (2 properties) +- NST503517070 (2 properties) + +These were assigned to agents so property cards can display the correct agent information. diff --git a/db_content_updates/2026-01-20_remove-legacy-property-posts.md b/db_content_updates/2026-01-20_remove-legacy-property-posts.md new file mode 100755 index 00000000..71de7b49 --- /dev/null +++ b/db_content_updates/2026-01-20_remove-legacy-property-posts.md @@ -0,0 +1,65 @@ +# Remove Legacy Property Posts + +**Date**: 2026-01-20 +**Type**: Content Deletion +**Priority**: Required before or after code deployment + +## Summary + +The legacy manual property entry system has been deprecated. All properties now come exclusively from the MLS sync. This requires deleting the manually-created property posts and their associated data. + +## What Changed + +The following legacy system components were removed from the codebase: +- `property` custom post type registration +- `single-property.php` template +- `property-card.php` template part +- ACF "Property Details" field group +- Agent listings section from `single-agent.php` + +## Database Changes Required on Production + +### 1. Delete Legacy Property Posts + +Run this WP-CLI command to delete the legacy property posts: + +```bash +wp --allow-root post delete 24 35 60 85 125 --force +``` + +These were the legacy posts: +- ID 24: "Geneva, MN - Double Lot with Shop" +- ID 35: "115 N Newton Ave, Albert Lea, MN" +- ID 60: "411 Court St, Albert Lea, MN" +- ID 85: "1224 Saint Joseph Ave, Albert Lea, MN" +- ID 125: "15131 800th Ave, Glenville, MN" + +### 2. Clean Up Orphaned Post Meta + +After deleting the posts, clean up any orphaned meta data: + +```bash +wp --allow-root db query "DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts p ON pm.post_id = p.ID WHERE p.ID IS NULL" +``` + +### 3. Flush Rewrite Rules + +After code deployment, flush rewrite rules to remove the property slug: + +```bash +wp --allow-root rewrite flush +``` + +## Verification + +After completing these steps, verify: + +1. The `/properties/` archive page still works (MLS-based) +2. Agent profile pages no longer show a "Current Listings" section (expected - removed) +3. No 404 errors from old property URLs (will naturally 404 since posts deleted) + +## Notes + +- The `/properties/` URL now exclusively serves MLS data via `archive-property.php` +- Individual property URLs use the `?listing=XXXXX` query parameter for MLS listings +- Agent pages no longer display properties; this was intentional as the legacy linking system is deprecated diff --git a/db_content_updates/2026-01-21_17-34_split-about-team-pages.md b/db_content_updates/2026-01-21_17-34_split-about-team-pages.md new file mode 100755 index 00000000..d87afe35 --- /dev/null +++ b/db_content_updates/2026-01-21_17-34_split-about-team-pages.md @@ -0,0 +1,130 @@ +# Split About and Team Pages + Blog Menu + +**Date**: 2026-01-21 +**Type**: Page Template Split + New Page Creation + Menu Updates +**Status**: IMPLEMENTED IN DEV + +## Summary + +The About page has been split into two separate pages: +- **About Page** - Company story, additional WYSIWYG content area, and CTA +- **Team Page** - Agent grid, broker info, and CTA + +Additionally: +- **Blog** added to navigation menu +- Blog templates updated to use consistent archive-hero styling + +## Code Changes + +- Created `page-team.php` - New Team Page template +- Modified `page-about.php` - Removed team/broker sections, added WYSIWYG content section +- Created `template-parts/content/content-team.scss` - Team page styles +- Updated `template-parts/content/content-about.scss` - Added styles for additional content section +- Updated `inc/template-functions.php` - Added Team_Page body class +- Updated `src/main.scss` - Added team SCSS import +- Updated `home.php` - Blog index uses archive-hero for consistency +- Updated `archive.php` - Category/tag archives use archive-hero for consistency +- Created `page-results.php` - Results Page template for sold properties +- Created `template-parts/content/content-results.scss` - Results page styles + +## Database Changes (Already Applied in Dev) + +The following changes were made directly to the dev database and need to be replicated in production: + +### 1. Team Page Created + +**Page ID**: 256 +**Title**: Our Team +**Slug**: team +**Template**: page-team.php + +```sql +-- Create page +INSERT INTO wp_posts (post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_name, post_type, post_modified, post_modified_gmt, to_ping, pinged, post_content_filtered) +VALUES (1, NOW(), UTC_TIMESTAMP(), '', 'Our Team', '', 'publish', 'closed', 'closed', 'team', 'page', NOW(), UTC_TIMESTAMP(), '', '', ''); + +-- Set page template (use the actual page ID from above) +INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (LAST_INSERT_ID(), '_wp_page_template', 'page-team.php'); +``` + +### 2. Menu Item Added to Primary Menu + +Team added after About in the Primary Menu: + +**Menu Order**: +1. Properties (0) +2. About (3) +3. Team (4) - NEW +4. Results (5) - NEW +5. Resources (6) +6. Blog (7) - NEW +7. Contact (8) + +```sql +-- Shift existing items down (adjust IDs for production) +-- Resources menu item: update menu_order from 4 to 5 +-- Contact menu item: update menu_order from 5 to 6 + +-- Create nav_menu_item for Team (adjust page ID for production) +INSERT INTO wp_posts (post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_name, post_type, menu_order, post_modified, post_modified_gmt, to_ping, pinged, post_content_filtered) +VALUES (1, NOW(), UTC_TIMESTAMP(), '', 'Team', '', 'publish', 'closed', 'closed', 'team-menu', 'nav_menu_item', 4, NOW(), UTC_TIMESTAMP(), '', '', ''); + +-- Add to Primary Menu term relationship +-- Add required meta: _menu_item_type, _menu_item_object_id, _menu_item_object, etc. +``` + +### 3. Blog Menu Item Added + +Blog page (ID 9, already exists) added to Primary Menu. + +### 4. Results Page Created + +**Page ID**: 259 +**Title**: Our Results +**Slug**: results +**Template**: page-results.php + +Displays sold/closed properties from MLS sync and manual entries, sorted by close date (most recent first). + +## Production Deployment Steps + +1. Deploy code changes (theme files) +2. Run `npm run build` in theme directory +3. Either: + - **Option A**: Manually create Team page in WordPress admin, assign template, add to menu + - **Option B**: Run SQL statements above with adjusted IDs + +### Manual Steps (Option A - Recommended) + +1. Go to **Pages > Add New** +2. Title: `Our Team` +3. Slug: `team` +4. Template: **Team Page** +5. Publish + +6. Go to **Appearance > Menus** +7. Select Primary Menu +8. Add "Our Team" page (set custom label to "Team") +9. Add "Blog" page +10. Order: Properties, About, Team, Resources, Blog, Contact +11. Save Menu + +## Optional ACF Fields for Team Page + +| Field | Default Value | +|-------|---------------| +| `hero_title` | "Our Team" | +| `hero_subtitle` | "A dedicated group of real estate professionals committed to your success." | +| `hero_background` | (none) | +| `broker_title` | "Broker Information" | +| `broker_text` | HomeProz broker details | +| `cta_title` | "Ready to Work With Us?" | +| `cta_text` | "Contact our team today..." | +| `cta_button_text` | "Get in Touch" | +| `cta_button_url` | /contact/ | + +## Notes + +- Agent ordering on Team page respects the `menu_order` field (drag-drop sortable in admin) +- Disabled agents are automatically excluded +- The About page retains its existing ACF fields diff --git a/db_content_updates/2026-01-21_18-15_blog-enhancements.md b/db_content_updates/2026-01-21_18-15_blog-enhancements.md new file mode 100755 index 00000000..bc6ab2f0 --- /dev/null +++ b/db_content_updates/2026-01-21_18-15_blog-enhancements.md @@ -0,0 +1,67 @@ +# Blog Enhancements + +**Date**: 2026-01-21 +**Type**: Template Updates + ACF Field Addition +**Status**: IMPLEMENTED IN DEV + +## Summary + +Enhanced single blog post pages with additional sections and added Agent author capability. + +## Code Changes + +### Templates +- `single.php` - Added three new sections below post content: + 1. Enhanced Next/Prev navigation with thumbnails + 2. Related Posts section (always shows, falls back to recent posts) + 3. Featured Properties section (3 active MLS listings) + +- `template-parts/content/content-single.php` - Added agent author display in post meta + +- `template-parts/content/content-single.scss` - Added styles for: + - Post navigation with thumbnails + - Featured properties grid + - Author meta styling + +### ACF Fields +- Added "Post Author" field group for blog posts: + - Field: `post_agent_author` (post_object linking to Agent CPT) + - Location: Sidebar of post edit screen + - Only shows active (non-disabled) agents in dropdown + +### Functions +- Added `homeproz_filter_agent_post_object()` filter to exclude disabled agents from author dropdown +- Removed comments functionality site-wide + +## Features + +### Agent Author on Blog Posts +- In post editor sidebar, select an agent as the post author +- Author name displays in post meta with link to agent profile +- If agent is later disabled, name still shows but link is removed +- Only active agents appear in the dropdown selector + +### Enhanced Post Navigation +- Shows Previous/Next post with thumbnail images +- Falls back to placeholder icon if no featured image +- Responsive grid layout + +### Related Posts +- Shows 3 posts from same category +- Falls back to 3 recent posts if no category matches +- Always displays something (unless only 1 post exists) + +### Featured Properties +- Shows 3 active MLS listings below blog content +- "View All Properties" button links to /properties/ +- Helps drive traffic from blog to listings + +## Agent Disabled Flag Behavior + +The existing `agent_disabled` ACF field controls: +1. **Team Page**: Disabled agents hidden from grid +2. **Agent Archive**: Disabled agents excluded +3. **Agent Profile**: Returns 404 for disabled agents +4. **Property Cards**: Shows office contact instead of disabled agent +5. **Blog Author Dropdown**: Only active agents shown (NEW) +6. **Blog Author Display**: Disabled agent names show without link (NEW) diff --git a/db_content_updates/2026-01-21_manual-property-system.md b/db_content_updates/2026-01-21_manual-property-system.md new file mode 100755 index 00000000..6122dd2a --- /dev/null +++ b/db_content_updates/2026-01-21_manual-property-system.md @@ -0,0 +1,77 @@ +# Manual Property Entry System + +**Date**: 2026-01-21 +**Type**: Schema Change + New Feature + +## Summary + +Added the ability to manually enter properties that integrate seamlessly with MLS-synced listings. Manual properties can override MLS listings (same MLS ID), support cloning from existing MLS data, and include geocoding for addresses. + +## Schema Changes + +New table `wp_mls_properties_manual` created automatically by the MLS plugin on activation/upgrade. + +The table will be created automatically when the plugin runs - no manual SQL needed. + +## New Custom Post Type + +**CPT**: `manual_property` +**Menu**: "Manual Properties" in WordPress admin + +## ACF Field Group + +ACF fields are registered programmatically (no JSON import needed). Fields will appear automatically on the Manual Property edit screen. + +## How to Use + +### Add a Manual Property + +1. Go to **Manual Properties > Add Property** in WordPress admin +2. Fill in property details across the tabs: + - Basic Info: Status, Price, Type, HomeProz checkbox, Featured toggle + - Location: Address (geocoded automatically), City, State, ZIP + - Details: Beds, Baths, Square Feet, etc. + - Description: Public remarks + - Media: Upload property photos + - Agent: Select from Agent CPT + - Dates: List date, close date, etc. +3. Publish the property + +### Clone from MLS + +1. Go to **Manual Properties > Add Property** +2. Enter an MLS # in the "Clone from MLS Listing" box +3. Click "Clone Listing" +4. Images will be downloaded and fields pre-populated +5. Review and modify as needed, then publish + +### Override an MLS Listing + +1. Create a manual property +2. Set the MLS # field to the MLS ID you want to override +3. Publish +4. The manual version will appear in search results instead of the MLS-synced version + +## Dependencies + +- ACF Pro (already installed) +- MLS by HansonXyz plugin (updated in this release) + +## Files Changed + +Plugin files (MLS plugin): +- `mls-by-hansonxyz.php` - Added table constant, class includes +- `includes/class-mls-db.php` - Added manual properties table schema +- `includes/class-mls-query.php` - Modified to include manual properties in queries +- `includes/class-mls-image-endpoint.php` - Handle manual property images +- `includes/class-mls-manual-property.php` - NEW: CPT, ACF fields, sync logic +- `includes/class-mls-geocoder.php` - NEW: Address geocoding via Nominatim +- `admin/js/manual-property.js` - NEW: Clone from MLS functionality +- `admin/css/manual-property.css` - NEW: Admin styles + +## Notes + +- Manual properties use WordPress Media Library for images (not MLS media cache) +- Geocoding uses free Nominatim API (rate limited, cached for 30 days) +- Manual property listing keys follow format: `MANUAL-{post_id}` +- Properties with `listing_id` set will override MLS listings with matching ID diff --git a/db_content_updates/2026-01-23_about-page-acf-fields.md b/db_content_updates/2026-01-23_about-page-acf-fields.md new file mode 100644 index 00000000..73fbdef1 --- /dev/null +++ b/db_content_updates/2026-01-23_about-page-acf-fields.md @@ -0,0 +1,37 @@ +# About Page ACF Fields Update + +**Date:** 2026-01-23 +**Author:** Claude Code + +## Summary + +Added a new ACF WYSIWYG field to the About page to separate the second content section from the main page body. Previously, the page body content was appearing in both sections (duplicate content). + +## Changes + +### Content Structure (After) + +- **Top Story Section** (next to image): Uses standard WordPress page body content (`the_content()`) +- **Additional Content Section** (below): Uses new ACF field `about_additional_content` + +### ACF Field Added + +**Additional Content** - `about_additional_content` +- WYSIWYG field +- Displayed in a separate section below the story section +- For extended company information + +## Production Sync Instructions + +1. Deploy the updated files: + - `wp-content/themes/homeproz/inc/acf-fields.php` + - `wp-content/themes/homeproz/page-about.php` + +2. In WordPress Admin, edit the About page: + - Keep the main story content in the standard WordPress page body editor + - Add any additional content to the new "Additional Content" ACF field below + +## Files Modified + +- `wp-content/themes/homeproz/inc/acf-fields.php` - Added `about_additional_content` field +- `wp-content/themes/homeproz/page-about.php` - Top section now uses `the_content()`, bottom section uses ACF field diff --git a/db_content_updates/README.md b/db_content_updates/README.md old mode 100644 new mode 100755 diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index be757be2..d2842b1d 100755 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,5 +1,5 @@ { - "name": "html", + "name": "httpdocs", "lockfileVersion": 3, "requires": true, "packages": { @@ -19,6 +19,13 @@ "node": ">=18" } }, + "node_modules/claude-cli": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/claude-cli/-/claude-cli-1.0.5.tgz", + "integrity": "sha512-v/8f6BKedfus1npGTyX8AIYp0ldRo5FMwzRbPCen0zv2m+00Qrna46czEoYK6tupJcrbnzVwrQYRbKOxmhv36A==", + "deprecated": "The official Claude Code package is available at @anthropic-ai/claude-code", + "license": "ISC" + }, "node_modules/playwright": { "version": "1.57.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", diff --git a/package-lock.json b/package-lock.json index 683130cf..4331746c 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,12 @@ { - "name": "html", + "name": "httpdocs", "lockfileVersion": 3, "requires": true, "packages": { "": { + "dependencies": { + "claude-cli": "^1.0.5" + }, "devDependencies": { "@playwright/test": "^1.57.0" } @@ -24,6 +27,13 @@ "node": ">=18" } }, + "node_modules/claude-cli": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/claude-cli/-/claude-cli-1.0.5.tgz", + "integrity": "sha512-v/8f6BKedfus1npGTyX8AIYp0ldRo5FMwzRbPCen0zv2m+00Qrna46czEoYK6tupJcrbnzVwrQYRbKOxmhv36A==", + "deprecated": "The official Claude Code package is available at @anthropic-ai/claude-code", + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", diff --git a/package.json b/package.json index a67ae416..6cc7620f 100755 --- a/package.json +++ b/package.json @@ -1,5 +1,8 @@ { "devDependencies": { "@playwright/test": "^1.57.0" + }, + "dependencies": { + "claude-cli": "^1.0.5" } } diff --git a/wordpress-20260104.sql.gz b/wordpress-20260104.sql.gz old mode 100644 new mode 100755 diff --git a/wp-content/cache/transformed-images/e5215a1698b82c652e6d53647619cac7.webp b/wp-content/cache/transformed-images/e5215a1698b82c652e6d53647619cac7.webp deleted file mode 100755 index 63e6c16c6262de841b5100d7780d44e09ca6eeee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996208 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
el4a%QhE`OrS0g=Ah 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
@4h%CSK6Lc9{hZ(`OubcGyxXbt)8eYJ?Sa~()N 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

Wb2^&7Jf)SZwGv$qrJi@o|cS)Z` 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�hVkghbO_(jh1FdcUkYzp+-E*0fl}yC1bD`WsuRNjQ*Sw6ivm%dVE(2l9 z(sP`tJ5&p%et7{mFXiu8?vG9{d-E-j|HBciIU~$}SOj>YoObHZ;X!B0)Ss8#=(q~Z zM~1G+#Nr)_{yjvYF(T9{TYPogo|#S_v3QHh3gS?07?XZQ8MGSXXq;_aHcap+FGHEh ztyusj|Gx>YS$%)M7slvww;w+LxN~#od}Dl6!&QApc`>96{rwv7b;%KutP(0zE)sdJ zJkOGrY1{(%ZT_zsfhKH3r{ox8XOmD?CKeQ3^ft>KbU|sGolFG&7&g$-$0pi3CV{M6 zai<1`eBhL$W@5Z0%T}+L^seP(Q}+WRG$DeoPA0353IC=iO&+uE#F|Q%?RfjvaYOE+ zbiyg{s!=&xQ}~nO8$B}cZfIjo7D9!0Lk)UzRhl0}DM}CZXUa zO0``JA~4P6sPfKPUphTocF&tdmBEP9I@1y5_TdR^-d^42ntR_{`18v(NR zxD?M7hsfOvSd|T-=zaog-!fXNucM&HDP@}L`}Ry(mxmBEwzX%zn1FpmINyQ7oaw?R zlotN=!%lS)2zH1RrG5N+86ayGH0twJSL9&CA5g@Ju50UrCj@;vBDBSAwO$bZLJj}W zF#N_Kr*TA~?R7Y>{9+njZeSp&?$ z?h-2Duo^nic1z*PudApk!78>o93p&ZX9@;+aj$U&>Gtgf9Z`V<=-HmVm|dTT&~oEg`jI%90HRwM-M+SovO zS<1!1wyQFh5_Af$^sJFcKxlHS-oAPX^kPYk9mV|u(INwtIBP=@%rANmfm`pa*@E** zpPb(`eT9=du$h7l>{NajsYXQsW@u_KIGTBefmN^le`C20A)!?Xqqx|OAnv4sd<4a@ zdJhMpvlArH@rZL15yvsm!9!L*!>v^*?SQmDNnPC-SL;0RLuHS>gAWjfL z8P|b0NSKK@q{B6RsAw}jC|zi#gX`8W+&i!oAe zgp;r>g1ILV2PqfG0-z&Dx2x6D=0VBB5uzqZj%hD>{f8rF6<fN}g0acwuV& zk316LN=t@*M?O4ex!cci+8kbcm>JP$A(D|rj_FLUFcIY-_0^ERZ41O=&(wpQiUhF6 zrxq9p^`;8AnP-?`syz<$qdx$;wIsaXc`-wXI7!l2+*E{TUT{+wd)G<{w04i4hB1FU zbK(AWn3Z@fmEtleHsOA3m=F>-{AZ-W+T%x~naiV$a;esRexQr9 z+zAq5hHo^%vz1q>8NVs5t{|!N9Iwq~5o?s?!MF5)tJ23=WSu$oCk&J^Hx(7#QoOVn z%c@`0K+4JWm1EQhcpm+YXvg5jfo&4!%7|Q+!=146(v>bx&0?MYmi+PER710=YH)JM z-5Q>d_qKw-PTHPz$$UQ%aC(?{-!2&Z{0eaVSpKuDZ8tOQlA*1n%|q9A9xhlNo8vr( z=!h?r!Vv00ne?AESwp%Z%Ma4{Y8?;r=WkLb!Iwg3EHo7%}S_NEX6q7-CbmEFYI+$bmpY@anmmTop z)bD4+Fi;@jy8?MZaa$(CuT1Rda+!`$$GmB+^EU)obT}u3y4U^4sJfsm5~XI4uKfGx z158%)a>>7!03GthoZrqUCSJj8XqLruV|CTXYadEp=Rv}xTB>As@@2{cZ4ubYwKTcI z?=X(Ro5GNH)%Gy!#vr7w7iw|zBMCq1POSv?O*4pu@b)IDf+Tz2D>Sqy`-aUO;eN~? z)?Gq0F$71XwO*4E(o`e+vwO#_J=lmW@J5**qu>R}Pef>lS_ceyP;OZ6NvA?i&Kx&B zEj1J(TIwmz@`>ElK#_zM7kPnc$ydi&$y~V+?E-!KV;so@;QFQ^!Sy|qEG!ju8*Qd{ z-;5jW@_j+Kxu$IuHQVFSWnm;{hA{=}6uphej}+i@bTpK_1n~~y@qFtGlRiUR2!R{< zy(1MSixQPxr!)kXMD`iygRSw<;$Y`(Z;`YKvcq*_2;0cWk!&R^73J*8+;u(J&Tk7# z%c=ICWNc)lofU;FxfVD#p~pP)}f zkYIa`Ui%f)b4gcJM)hxr2NiOM8H_6H{TUU(I;{Mwa78`NbK4_Uc4X2U*ps+gqY?Nt z%TqO+;-R9{R_+Zp!KN(7IL`A9x`d8nj7^%Y*6Mb@2LCvF2<9$Q>zHj9G5H;QA1e+2 zOZ$_&z-C3A=_X~27N`0GgXejd-xLDg<9Al_tkWrk8ty!_#ws4_s41nQ7edT@n#{7h zo9>jAswNNmDvs8=?j_yU;ld9aU-4qqrQ+$z|ENyl)P@_>_?_lq*RyzsHfU5S8a>r* zRr$sRkobVsJObCLbw%kwiWuk)@$b0+7J~6IxyZzwd_25r6ym?JqOoNGVmK|V8AzDX zjpq>u!#*}!Pug~KO#6(P_>=u#5%ooWh1@+Sd;v4D#HT2B&R^V*{~YShhw}ojEd~}< z8HI!KhAE>LKkgnswR~B1>Zo@TncXEoi78YtuS)+>hQw6(F}cW(lw`;~*Xox*SkccI zu@nehMNTU9AnUR`p>~(MoQlRNI(VYRWto0JT`${395exk*j>QC@buMUsE=yonBHi2 zH8P-^{9rf1`!%DStZMh@%RRoY^5&SMueGU(3S!_Y%c4ltty%gS)a4kNXt-SL)fQpA zH19Tq=$4iGkrDnEVR(JBAy|e#A-w@|xAtgiHaGHj8l9j=F0FazJSS{1$p0ul+@A7G zM*p|=djcQf&#DWk*n{K%aN zX=4Z6o^=5UXj-I1a?4%nqOk>XSho_ymTFh{^22D}qC;>l6c6`Rcpf~_@#;K+g`!UT2jF2>VSM_+@N>dSLEMX! z2`o(juD+7Mvh)7paJ+;o0a2+bw=+pn(nOCB4-ccT7pIB@(=tgT=P5_O)Pv{oKe`|F zbmf!*c0|9SUsFzF_+{E-QErzSeTeH?raJ?STeh-X9Ns!ccgpw|L79@SK7M%%lZ0=l zQsUD{ooLk%k=^24Q7UQ~*71;s&guk&SYF7glK{%gyePzKt|VkUWliwKfy?8C<0O6- zw$$%O;iwWlqhtUCF{qIL_dKovp&tn>z$m~x(}f6FUAQQ`9vDR%OcBBDX#6Te{khM^b_EDcAp)G~~yn>ee__S7aZ(yVv;};YiNVU6o?e?eS5N$nGgR2?6Wf z{1ZSuA!^RPwNX1bY$vFUkBNzOo&tdHy^?w2Zot|tecLk2&Tt_aLi6Ao+&Iz!5feh; zzo+2?psf7cW1H<&5^>IQI$cEbqseyjMX*6(tgK|q>PlkH<@3m;-cR09hiR_k#v(BY z(As+G$xa$m;-dME$)2tfYX z6%Z!()Azso?tO?gS=x|H*(R`|O9L0Dh zqb>iS`2#b}=)#beUwgYa#E_?_st?FFWhQKi3300kka2VRt~rby!UuuHRm{%@IZRqI z(=Ts(Q(yjgB>HSiaMR9Tn(yy-FR5Mo_pPqM!%D>Pjd$sYCUu7LV}|7~_#9{eLgr?= zytE8%jT?v>1=(;Df-u40Ec#>QT%41P&_Al$1XK@+6gs-ibHZ7mSX-pSvYAN-4{hESIU+JH8uoPv-kdWbvyLTxq!DCw&S&iYq?`gP$U=>tx ziOU`e#qq>vKGda~7Qz+JYkz+UkV;p;-(|L*dfJzU!BMv>uEneBq6&;ul9}5fdg2m` za7=n+yjj?fJ4qez7yBN;33;ul1?^bv~Cs3M

V(tInn>BXTxr{MuEtAxmu_r@Etqs$Hl)KS$4f4 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 z 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 z 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�M^$N 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

    ifEdq=kSjs)4H8mNKU%Ptr}zsFYZ_0 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

    >7_iLc$IjWrdyf#4ZIP~vrFJPzi7L|y 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

    1$4aqmiA;o`k2pqK@4oL!K?mR76|va-Q9d&` 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 b(n)UrgVTt#bTJw;%UCK%O++=^GU9&&*+7Ri literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-01.png b/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-01.png new file mode 100755 index 0000000000000000000000000000000000000000..d0e3bf1eaa3d507ef988ea90f49e51c8f7bfe71e GIT binary patch literal 16703 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-03.png b/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/thumbnail-03.png new file mode 100755 index 0000000000000000000000000000000000000000..0daa8def08dc9071f33f07364598b656e120999b GIT binary patch literal 13525 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email/icon-check.png b/wp-content/plugins/wp-mail-smtp/assets/images/email/icon-check.png new file mode 100755 index 0000000000000000000000000000000000000000..02e61da0ca40e2ccbb69c6e55ebc10d510cc5920 GIT binary patch literal 1092 zcmV-K1iSl*P)0=U}{=lahBUG*G-I4V`ne@G?+zXpB~jxMN#mScv<=r$n$4 z&wYBti334&M{tsolY0>GksSO75l_fUcLfnw_TgfI@e0oeh zAP?Y4URlRi@FdYs8fUKt@FsVRlYXprum(f=$v)O#$zEGa*3E|=jtArbxUx!ayrU-E%khHWN!<*CZ8KdQVAkyeH;;4x9hPo^4FRSr9k_4=kLx>G;%Bk5*cJPb1Y2~8BFOARvnQHPG|tDjz|VMUBIT(5y{|~ z_F>f#$>4}~VbhVxU_#sAI$9ZoY!5FzWH4kIMd~4gInQrOy$l+%tyC`)H|2h%S|)4C zL{qH{^2WTlRLWr4n5Cym8HCMehEgYke)9Oxx+ssAO_}*5vg?_gQ_? zdh$){GVYp52M!&FOkt@C7`aSl`>RkYgJWBX*GOd$T3dxe83fj9k`c;ej@nizlUX_{ zZAK)6p{wo}N@|OVvkGY>1?k*f6Aj%mDBTrWCYx zd}p8;JeYcZgK_U5W2iBk`#wdH|7fqJ^O!jL=$OrZ*Q8Ugiaw(YIYnQQvFg4+>!WPQ zM%S-PjQ9Gx0{%A_KK+q<6h?8wM0Yzxf5#+I-&N7ycwzn0_lVJZix$2Fq~QQf6!%HV z)*HW@QjEQCYeO|8Ly>_zz@_QB9qOBqNedV#0fJJiRxK1HqzV9-HL{0m;I?J}0000< KMNUMnLSTXvz4WF4 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email/illustration-success.svg b/wp-content/plugins/wp-mail-smtp/assets/images/email/illustration-success.svg new file mode 100755 index 00000000..783f52ee --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/email/illustration-success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email/signature.png b/wp-content/plugins/wp-mail-smtp/assets/images/email/signature.png new file mode 100755 index 0000000000000000000000000000000000000000..f8fff3125842ef99295f1122d8951c76f327daa6 GIT binary patch literal 7165 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%0D^R5nG9zM(7RR2u z;3s4B9w8L0In+SLW?!a5X3M8N4*_dBMvls$I0{bRReQ3n@Su z=@bh)Gtt7K-~%|y&nKI;-;-aST+8D~9*F>CxJc>~sw>w{%C_G#s^Gzd@en?C9{tCNDhd@x z|CE1~xDKEeKUj|1@GT+L_41PBoL4q_5Zf70*?z$M@G!h$lQbvhIy&SH?jR_k&7bBd zylw^`xCzcmlLuT=MtTlVf|WPShHU30UCG3>F5Y3LPqqtg`DuqiOW%Ncga7GVb-Hi( z8bOLB56Kt62zQvkNM7;seX^O0!C^vXdq|Y%89*BHL$4@L_|@D-^XvrW?w{XD_P*g| zj&j$Kw%0F33ym7!NN@60?}aF^L)0T%11YM!Ab{XjsCBqH?4cooWuHuXpw`UI8Z1ph$h!Z2?lJ&9tJ-4!)pVYBSl@#9+IM8vL&mi~nHcar4;uF$ zDFIy4BtuVztD&a@1NM{1i{FPJ{}~Y# zeis9zD-hy(a&|@*Fgi=JYJQ|D51y2WlGd66#qKYAe#kg}OcqVf-m}!-BHKAJf_+}N z*sUZ@;!D9t6GEU+*8e(kaN?KXjALi37S>QbJIm4R33=`pg6mRV8?Sg}12rmu7rd2# z-p^9nh;?o6dK}=$qZ9|Eh01iMqB#LVDkF(j9?iz6&X1rWn#%>&=tN7e$NMwuTHhE6 zF4n}t|C_I+9diOe89JzWZpV1VW4)wy{aP;UNJ8>%`PK91YF4o|+gHYn4h}9vR>i0K zGjop6Sx~B<^g|c|wKe$>1c^Sgbquqm!z-V1o&QdCg-ulr91POH#Zo_!-BeL9K zNMw$$%Smif$p|d^u~d6`wd3}%H|<&h#1Mu>KJldKF@OH9{ZQn?bzhF!BpZH`KtgrWkl$YqcLve z7+hGr;kuViKBBMy?j9*4oU<^Ak0~lkvNz_ z4hdej$_)NCb)KcrNfM*@`Xz3vFlQ`dAG_Fry`Qc0;!Dr<*ifgS>I zRFo9gm>C9b>jy+~G~9M`y1IW6^!%@Fr0BYi2;72mh`PjkyPUV>?UxvxapzW5{pQ{VFZ^}&``*Bypr+|pe!=qT%!)3ivoUqEc#2PL!X z;+1J8yJiiF1^&cIHNgMx;?u>|EEEBBrNJ#2yh?=IblzYhQgGePccra~>!gnj%t+J* zAchLHvU3<(9p3iSvS>qEB7Hjg;$T}04hv>kvJsf_DK98 zHchgWmOXwob$l{y6*9<0P5fW0&ZDPq?e=HapkvF*vEt;ykz{Y7CkruVBS}xRViT>} zsnH!fyxyzrTp19G8kVghDuX@#4cU_n<*s>t;dc3zr#ZeQTO#+ON zQMrOolXl*ai|@k+JF~0@n>D|FOlKYq1TYbW_VBDfv2B@uHrmI7S!rLshWcXJCld0@*eh#nR`ecdj&B>qe`B0_#JYwyh|ZH`K^2)Q;r7B6c;GTHZ5*6S;}T zRWP0R7tLTlKCq~GydMIX@#`VcU%CX=ri`Tt8OISbEywaS`d3A%lG-%U)uSs@um+D7 z&Le%=rw2)z7S;T;pZ340qN@A$+=0a_b~PXG!8cUX?U1b^RQ^QU)CDImVJ15w_q^Hw z*0Y{>mKq_y1WDyWY><7N^IJeSL+TbMD>q`PBe}Bmq`YjyA%G+3O6Tg|J{o;tOzOyG zp=+qpkAsy!VaNqY_;TlvZQ~y~*TIIT8QM3A{s{)k7#@CG7&S%GI z4L&X|6I68DkAahn9JS&u4ApsgkQVfor-C7()#X~bVm!_vszKP&L%t0MQWGuUox#2 z;T5nBs0KzG-J2Es>rpY4li3FB;U?O{#g3MQHFyId@&1*<)nIM zo?5nW-OWxGyZ%N`_NOyMPDReYZ~Jwu4H0OlEsag6Al$qOmk;!IwQoVmyn%j2RNZmv kJGv&_U;BlFY$*hJB`6f#z@A}w{x1h$YG`FprH{V%KfE7CzW@LL literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email/wp-mail-smtp.png b/wp-content/plugins/wp-mail-smtp/assets/images/email/wp-mail-smtp.png new file mode 100755 index 0000000000000000000000000000000000000000..6a452531baa2013b68df1675689838ab160ae785 GIT binary patch literal 10848 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 J)vCzI{{tqOPF?^2 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/facebook.svg b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/facebook.svg new file mode 100755 index 00000000..74095298 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/life-ring.svg b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/life-ring.svg new file mode 100755 index 00000000..21aa971d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/life-ring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/lightbulb.svg b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/lightbulb.svg new file mode 100755 index 00000000..42a28840 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/lightbulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/mascot.svg b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/mascot.svg new file mode 100755 index 00000000..6d9e8a03 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/mascot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/star.svg b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/star.svg new file mode 100755 index 00000000..85bf4f00 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/flyout-menu/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/arrow-rotate-right-purple.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/arrow-rotate-right-purple.svg new file mode 100755 index 00000000..c978648f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/arrow-rotate-right-purple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/cancel-red.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/cancel-red.svg new file mode 100755 index 00000000..a61ae98d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/cancel-red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-dark-green.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-dark-green.svg new file mode 100755 index 00000000..4fc508d5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-dark-green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-solid-green.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-solid-green.svg new file mode 100755 index 00000000..6be58277 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/check-circle-solid-green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/clock-orange.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/clock-orange.svg new file mode 100755 index 00000000..6236e6a8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/clock-orange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-regular-red.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-regular-red.svg new file mode 100755 index 00000000..e59ade4b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-regular-red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-orange.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-orange.svg new file mode 100755 index 00000000..26e742d7 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-orange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-red.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-red.svg new file mode 100755 index 00000000..8c9c1554 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/exclamation-circle-solid-red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle-blue.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle-blue.svg new file mode 100755 index 00000000..198fb614 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle-blue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle.svg b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle.svg new file mode 100755 index 00000000..8c80048e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/font-awesome/info-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/arrow-up.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/arrow-up.svg new file mode 100755 index 00000000..cfe6b880 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/badge-percent.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/badge-percent.svg new file mode 100755 index 00000000..6a08dd38 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/badge-percent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/check-solid.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/check-solid.svg new file mode 100755 index 00000000..230004ae --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/check-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/check.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/check.svg new file mode 100755 index 00000000..d407cb82 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/close.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/close.svg new file mode 100755 index 00000000..4ea6d124 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-pdf-grey.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-pdf-grey.svg new file mode 100755 index 00000000..02d7f56b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-pdf-grey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-yes-alt-green.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-yes-alt-green.svg new file mode 100755 index 00000000..c9bd25ca --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/dashicons/dashicons-yes-alt-green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/error.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/error.svg new file mode 100755 index 00000000..b084cd74 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/exclamation-circle.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/exclamation-circle.svg new file mode 100755 index 00000000..c0f26670 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/exclamation-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/lightbulb.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/lightbulb.svg new file mode 100755 index 00000000..46fb1eb0 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/lightbulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/success.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/success.svg new file mode 100755 index 00000000..9bed367e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/warning.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/warning.svg new file mode 100755 index 00000000..abc20f85 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/icons/zoom.svg b/wp-content/plugins/wp-mail-smtp/assets/images/icons/zoom.svg new file mode 100755 index 00000000..1389afdb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/icons/zoom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-blue.svg b/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-blue.svg new file mode 100755 index 00000000..5519045f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-blue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-white.svg b/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-white.svg new file mode 100755 index 00000000..ae6fe144 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading.svg b/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading.svg new file mode 100755 index 00000000..84178328 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/loaders/loading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/logo-whitelabel.svg b/wp-content/plugins/wp-mail-smtp/assets/images/logo-whitelabel.svg new file mode 100755 index 00000000..db8375b8 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/logo-whitelabel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/logo.svg b/wp-content/plugins/wp-mail-smtp/assets/images/logo.svg new file mode 100755 index 00000000..1295c813 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/logs/archive-thumbnail.png b/wp-content/plugins/wp-mail-smtp/assets/images/logs/archive-thumbnail.png new file mode 100755 index 0000000000000000000000000000000000000000..459b016b21a848ff17b888cfda9579e615f8f30c GIT binary patch literal 18748 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/logs/archive.png b/wp-content/plugins/wp-mail-smtp/assets/images/logs/archive.png new file mode 100755 index 0000000000000000000000000000000000000000..a3b024d3e5eb7d18f36ccd42376446170b0b9bc6 GIT binary patch literal 131390 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

    YKjGRssHZn4&dYIl!SBRPZ$yCtkD; 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/logs/single-thumbnail.png b/wp-content/plugins/wp-mail-smtp/assets/images/logs/single-thumbnail.png new file mode 100755 index 0000000000000000000000000000000000000000..231c421c57a08b6987cda3383e86b676cc1c4d21 GIT binary patch literal 34215 zcmZsCWmsF!({>2%E=7wJx8e@PN};%WaEg0z65J`JxO;JmJHaU~#VxqI`^)eDetpiB zFK1>mbI-lIGjsMN5h_ZbG0{lT0002y7ddG)0015e007BR;NK)zLHu9dZk|=XYRJ4M zGoPKEzkOc+cWn>V@9!TRAD?V(ZQnjUzscTIhnJ6c_xCrqw@**c`{xfA7Z)!t&ySB! z*Vi{ECnu+;XAch#w|93(N5`)zY*$xT$JbADa|@Su&(r^AUw@F!%+9Z_!7eW^Po7_| z7TPxsF5X|EZvbGh_4W0Q?c?j+ z)7zJq*Ok?^fx)5e?VZlT-h;4lfrMm%RgmZJpd5Ts_;z2hFVQUt@@;=2o)v3Y|TCV&W4$eIYtVX5f&B zps*-+FaPqY8vnphkcCZHR9tC!B`yi2Y@JGc^TO*!Z&7JQa(XrkmjE>*$HMyF>+Wb? z;qRKd#;TgSsJMiH@`*pATM;qwj=4h_+4*F&O!REr8=IR2#iezP&BC8PbMT44A!9Z+ zx2owFwYGPLM8*ydjVP+?$g5~_3rQeh;`572J-og)wRQ-qgD~*l$$V8CpPqgFMVFMC zp{%K|t#5q${3@rUflomX$^IiM{bm2)sJ*ib+TANItJneUk@})EyRy~Y+kbw2w|{c^ z8i93ue%;eI@cMLbl-$?V-TM-R_>jmtxU^q_h}b%_VU_t;>u0xIL#hTr|GA3mvkFCNQ+F280AUB{$jSRgm)Vy9Fls31%_D2qy znKAt43a|P1IGR;WN{YiF-onrSda`u9ys*{Q_FAq{&&XIi0F5eXd(D@g+?pL6pFN0X z8C;qW2xwX@Egkpv&ZsFj`VN*h{N|k)`=g*REIobh#}DtMqT4jhzW#yL##D#ENT--= z>)<368+V~9nYP~H7Jc&7)AcGz_%21oR~G=i%b(2oybdX;e?=iqae+O~!VeX0V?QkP z+s(H;D4I9h2Ai__{gr%&gC~doUabv6p;dQLq!tpd)o=R&%}q^7{o-QbV&QRdacRL; zLGNvs1S)@#{-oi#c$BICRo{XfTKt#tDLW&J+?)MFqM`_CMC6%Q1R`P&!9sWtp0iSD zxu1k(j>3opy9@#2gpEzSp$54uK3Bv+L6gc1a1B&n`iW-7yN-PD$?`01~pbt01K>do- zO7h>pkN?*|*Uu1{*!SU?L$g2@12ixg^%IV8JR72xw5PA-&O4mHZ)W4|C?L5Ecrl^k z$p4w4(?>0rP@)qNIl$bF??U)PyTAqPv0EESJYU$un8;@hoR6^kP(9>TOiwS%KpQ^} zp+zy>{SyL3^To+*H_c9^$UPKDcppbS9rotCw*N0Ck+I$hBXPkbwCmAOrLKa>?5TeJ$Y!d zpl;8&G`|dvIqnOCOtb&!bUAo_b6E+5E1NgDuQKS+7$&*7nV;aNei4JDKf|AP3CE!p zIjl&6N&W2kC}aK9R9<@EwD9;X=Ut`VSTX_K!{3R^G-ZG+v#UR>!n;ln}u5E^_vfx-`KFtIsY^^$3VGOUu8|T>5owR2Z|q) zMt8_8N1VcW!!4B{b2>sGmuRo4++WS9v9(+dh3|cA0On?Lle*)V%ScYYX3}BqH{NX} zz;U;aJN+-&qNqQ{#1LvtuN2(*rQoDQ9_GaoG{!gF3VwF=u3EZ65`PV}P0kZOBH?Qj zJy@=X@~Obw8Uwp8cjv#Ul%G+uzhCw4AToFo|Nc4|Oh~P_ZQJ zyu43{mu@*wE^MTqtYtrF98fTH#deXwb>22Ls-WyvJOPSM?~H|IY@BPJ44C<7B93FQl=c_1Y#b_ubvztf17z!>$M#2FD9 zr%m+=zQ$#%iGNc0{RKKnwFlm4=v!BHmqK@yk1$uXwL_U6+j2)5jxFf248ENHZtzCqm&b`d`CEM~i?g6ZnQHB!3v*MUUr68J)%`$H3sT9dXob z57KoJa}+;7KOiLK#>|)(JGDR!$CN_jYbW+kdQn)rrgu~PvyZ&cVHm>5WI%KmcwwXR zc>t6?4_e%!Q%o4?m!))D1hjPu*Zcu}3y>Q^=;_PMC0fguuys0krDw<00$}=rlpc)z z5kae_hHn`rdE6Rwzd$!XsFlF?KRyhp?`xzD4mtCamf?fQ{~F`3ou5 z;P!nb!Jj-EPfEfy#v{)7iBY~_d;kdFr! z0H?He)QQ2x1Vo~BSj3CESbqkV1VmIhdth%kEq9LyvSOu%y<_gztygXt`~HTr5$%a2 zTsNid6eFid?C#KcM_~?;5&`+f2QhY))hT&;|NMTr`~`)L z7S|_TAF-iZ^4}q*PnQq{dd%Y5%f&E<%I3bw@BR(YRwJDiYXi3EaTeF}y_2@McWDmv zB($=!a_r{dj;|ybN|G`Rw>pQ&ZpIOm2Nh07DVHmyLj@#R?#v;+5Wsk~P|tQof!`nW z(prUDzanJtPU7~)`&!R+MN-Waxx?1 zk5i9Mq-A%AS430-j!u$9!X_}_;6@YvU(3Sd-QPt-RyIV>ucwbJW(?8*#)~H8P2ey+ zPT~@Z-Jgjs;=NhBmJmYP38Z9(FzPx!Jnx&yZ2y=0sVI)8rynw+V z!pMkLo&t3q8%Sy8rqW<6-+vUEtO`sd!M)3?EyRfmZnHF|c&o1IC>U|bLEage5aeR3 zW2wvJfY;|+Dvnn{o*JScmSGb^SV+Mr{?t8>p?2SeL9R>}`p3(XujPt6e|ODUBj!X+ z+uRw6t%5+_OzH{QJ_xNv1dZEr4p#`tV@RC5OsTa(^ z`L8fs!ztLmqa&V5nh^h2O3V)5`-2~T9^OKH6nr}qC1kGFoAjE>Ua;tYK#?Lc#teYg zJC0}}%`Uu2jKFXTwh}y|y~V%>ojhJ_xwb?A>5T%Z`fPRfPm-TWaVVzT5G&eH=*|39 zv?x#A>xIP?F)gPKrg}{%!cpSB0<0b)aU!%AEI4%fz(dpNx&$lqgpQH_F@H`B~ZF@ZWw>;CJEP5 zOtz9BMSly7gCDItydAy-9(fD03V{%}8rQWi9Rc*wQY=_Fzj=b(erl%@iijCp#+!EvJtSJlr20s6GW< zcjnWk=w^_mVvq{|;ZgdGib|=; zJ2+dKJ2;q{ntBq9yBkNESUNlF65qXA>7->G-p!OcBO__ewrXqnygu0ayT3-U9O_co zSMZ9Sou|iEqDy`WgV|UoJYFgQf81vDN0|0^wNR>#GE!>XEjNfHj=OHpHs8@M`0AyB z+F^152NnUb5ws{9m20vWV=Cuy)VI0=Vp1x8AkL z)Dv44@rv>j<4&Q@G}Jk*7l-lR$2jXF102ZGp6v+iH=PI&m(L2cXI#ap7ndAFf;kW7 zWm;Y}dpZq$#$tP?xN(G1`S7IAitc^)FQ!>ZpN#OYW9J~k2;*xUS3*srWo;Qa?31#Ie_ z(&|OfFCw#CFeSV8zdC7HZZG9jstG3`RgOn24xKP@Lh!wa$_>VuKiy65Lz1f~+I(Gl6J zf`_iU3O*H-ko-01XS=MhrI9`5;N=Tse(%W ze9XUzuDEd>^lz?jVpI@W`Q=}(#^yrdTda94Tyt>OlJ~uW{1eXi57oeuRXHbTJNy8K zo=M#%_T=pkpKbLk>0As>pS%yC4RYn=%C-t` zG&EM|vpppSWnBtY`RKT2$d#|QKIB-=Umbg_g5qBEN&P-ZgbfkD*DxFX*@hF(fRwED z?^^9Je-=91WgBD4Rk=%!_Ov&)o3Ua0za^H)JpmoUYWbYMzL9yTG{}~<@iLHS)Ox#3C4G1<)q6|p*_)Z+^rEje*;^MeGS zOz?WQ^)m`9c{F-5A>6uWlA8jG6DEisca` zjFwHVh1L}MTtFO-$6VArKZFZcKRfR2Qd=#OMaXu4qI-MBN)GdC>iIN6$8b*N^F4Z+ z69W;{l*g(gPa|kgky!W}8Dtu$?u1ligit_9qrE>!h(?BY3yp~0RBMcvU;a1rs+ek2 zWXz$)`p#+xyQ$;bSCI~XUq|;&$EB+A#|XK*D@68@TyR-%AYi=(j+USL z=V3Q{z82YPn*#pGndRv^`fV<$_1`wVmxrWekq)%)%)6@1|2$n;DPu%rQLvl0jK1xn)MJ=&+ zPzAasAHAa*^hw5S%KS@}DEoe{BDOHkzR4>}K(KOa*vCIXib3>K-;@5{xZz+``DVwW zeX6*6fMI_A!zQ!2j+r3PGMi2Ek_`S3vUGx=DycFdw1%1Ai0Y_anvS(<&$bh@vGeI^ zAo!IDqzY>ggkX;a2Jy`dpUE<=cB-)+&{&?@J~yueoF)QRtAwqH9aCbA9GBYKJ)apq zlJy4I%p;#ABOfg_pT9F(n{0vKJ*5)%usibS*K>Pe=d!wWU;%wX0U*0``Ys&VN3Whp z6TB8!i%gme3>~CYW5brvpPk4IJi|hq>rS@H`kI@Y?-S|tcrJ;2h)x_Zb#P?jchfcr zsd7X_qwR2pE;A(C0^p&a$S#+J_z$1U^5+8h6)_*ppsu~ekonni$do7b<`?fC3Da;h-+;^?I@>I9k!isHqsR875g2o=JkB{C9 zJNz?*2gizh2m6>IdmpH-BC*{lc}M!sPLB)x0Gl>lKKm|Mav^Ziabn~}x2-+^jBEhT zBH1l~*n9pv?;@e!1uI&H_pi{U)z)zjxNy2fAnUAY5vBrNWa$qyRZZ1DLxFis`3n=8 zN*bC&NjPNmrI9qHG*weF4?M~|ir^xYNLChuXQo*7Jq8#&R9JXzUEx}G_NreJ!^UhIjG7vYX_8uZxkP5%<% z3QEmtmX!-3efC5z%0FnJJ|l2yF1_%TnWk%}*B7Z8mX-NOQMn8#|7Tu86WLP!4T}n} z+I5d<+~8j1t!_WQYF$vq;Aj2Y!Q<@$fj}wl;d~>cIg^_G3;80#KQY`t3oj_VQksZE zbw+?qYG||uZDDs$7YyD;zLeTKkoc*AY3PN(@@gU$*2%)Oc<^0g>f@aOv%#?vJ27~< zY*Rqp7rXpx9dc7>DZ75DrT)L)cBH?*c_3=8!W+1PQn+$cYaBG0f6(0)xi(lVm9m~= zLVYV(m*`I=l5&{fU=-<8#zMXeK4Zr*13Gyusm@O9LxFRH=vy@}Lud@>4oM(kDFhh!N38TsH@&``^Mop3uY0uW zx_R*9FP76a_b2yE<>Y^G56|N^4-W^GH$oyV!#{Y}_d`qqAS4D9{ zRh8p&!EG_A^0bu5@Gq{A5%TG8B0|6Rj~&c@@%1|~1pC3o`L~5yagQH>2X-A5*Mzgv zg@XIc24hxyW9LHX(xJvU z9uf)KItsCCMI|1#(}JF+CNkECvNWyHy66ibP(``IR&$f!yhXU5hy`i>{wB&hrMVhekR@xVl=UrfgS?9 zLCWCv#lqpYuUS18B_lLhVgsSBu=^-Le=?wrof4WkW#Di6?ZYG-NGf@VP6bv}4@=<~=0*c6*SYKM%Q<|q1WQU-?mzgSV%;&qQ zfBxkIwwDK!A^n_tYrnfVTi=1hFVp5S+k$sn9b%5;bA&#^2f1$6bF*dw@q6HEaoAGG z$b~4<-7=TX?plB!*+7(V!Ze0ci52Eq9r|4b@}0Wx0UlVtumSFp@Na{~XLq~5ze{6v zE16pg4lHAKJu{V-Y(~nN$f-4_+4Tc8Xn$6cka8@9eky17qeIJ+nZwXzNp=s}(;UE{ zKf@XcJAGIcY`IsUZKuWHs8_iD*j%|}SshQr8|3kUdw_kDzV9EWOh%-GlE5meNdQ!o z<-S=J>Fzqc3ZRq)kF>^N2w>+BJ$3vFqJrk)SN&eNi%MSifO8ETyo?--5K;9!HF|$S z>nIczn1f?l-+g%aknw*-J3x%Q1IbrhB+Ppn9e;D-Xv-5r-3o3C9dObi6g0ry*zXcmh_XYq=_agg>I{rA z^yoW5Jnf%3jhJxz_n`PYV4_WKPb%+=tRjX#R$GrvUozL?)jxj9p^3l4XH(6?MeGT~ z^A2~eOfQ}6EnUr6sUM3X+jU29<{GEnaBgMzo}1N{f}i1T#b1GXB8L~Poo#n_@2&YS zzU0_$5FPl9ZHsSRj=SQTGubV>5Z)?hNo;jLU33L4a8|~x_nN;Nzm8)>=ACsV>WI&` z2CeWx7}0W$Yh*x(b~7k3%P<+)QX1_)?GiQ~ChOseow;TH5}lnr=~k8^naJ^`!2@2m z*fjzz#NE;2TGkzhO<|7YqCIxAo`1f_SDwnZtY^>#ndOs|lHjD%uv6_A@3+NsX3K5_ zXNz@wQ@#~5yQVRkAL-a^v9^BCjp7WOfA0{bLsofs;e4;u?VFR0?>qJkBqJZ^SzE}| z8#BBW@{U-gI6I`fBo}V*(V26q9j-O$u7gEX{k!LNiS;cU8yzSy?%~%{^PRrd3NI=t zbFq3I*ETtM*)PLu=Pq6&=&urKaTIBgYs8f-*QyGWYM1jt8E`g6RrW1eIe+{ucv0xV zPxW1ttb^M|NL-G(U_+m&gJY=bMegEH%uQ7D{5XWA)1Cmtc87?nz;vSDmEI#p9Vh;w zJ(vNpyd&p{+s5DZb=6aiBAw%|5F4-j)%2dms2bhPzJ9XMRJXs1jnGWmKr6A-glAcW zH^X1S+k?mWXbhEq%$x7DGBR4Hz>AIUtJMVh@IoJ%p@;fHpw=hXP*?*J2H zRBn(`we!JTTPuxNLU?uov$4)t(yH^>lwx%FWcA{dA*Lf%>wP*^h$<)iPB5vJD0X|R ze1qhMTZ7nlN>q-RdEW9Op4n=nsqY9Trk~%8rBELvd*89$NJ`#sxbdynZc>ORnJiDK z^k^2MmXQ*nZ>V}UU;TPBhVZV`|M}3XU47|YmM_DE0-1*`N%9plg9lGiHCqatEAVTn z>&u1wdFD7{M|Gy=ecq}su)V;feBGp5_u_xJJ;R{iKi?Zgzhyd;4>XF-|D*!a@XPDWF-8ce*9EXt z+LZHC=&{<2*x9;QUgQM+(XR>ro-;=F52hv@<6d!`lzN4Ehjv5yfc0SKXf`KEz772( zzaZK5B(BilCa5b^b6WZ8ZU`=y{@sCk(L7w(RzH7Pfk;Z|(aF4)r|(-o?9?CZNRn$( zCr=gVTj_hT5v43P^HB@$pQF461*|1z!l_}%XDx4BJL$u^zi{2xQhu<1KU^(d{A`s= zn0HV7w@ZD76Tk6Gw*Cb{+wO~qx*Ea`Q;2M${sP_^+K7B;i}CIKcGOa|8=*tzpthJ7 zdyFqPy}>kdrsWscx`A*v+4MFPS7^EUy!pYo?t@bsCMl7ZcNRy9?=*hWX^5>}qTr%c zNGSC=wH#JTVlaBY75daW;e##TB?Z!V~;mI_?Lfercr9!#TDy? zJ#)P;FKW~@t5<9ivB?~wm2UQ%pS_X?&6sha0`A7Beci<;zQ4xW+BWw^^sLVcr8|2q z%muYg0w66Q&(hk~ey!!broDfnFXlt(Pg72kv5s&pw-n0nu{@<$Rm*kMaQRY z6#HL=hmS`uhpy}tZ*09+JnH{lG2Hp84cOXay7UeYN0qS`JpO{Wlws?+xn06oGPX)^ zyl=6*PXvnn$-SZzt2RjzFJJ$+aCB1COShr{;UVW_vHa_wuw)#E|1H`hx!rlDFhjI# zyz*-c60y80mq}C)okve)tcP;#oUuA0uRRp0KQc^4f2pHqbG$8BjT+#^6||(C7ONp@NU$e-C};<)7$7|HqZ=BIc2`6rQF*zXSf{9*?nJfpSmlr;vuWz6>t+;*+$p-qT@|C zHn6v&)j0=*z+3h)sdsu8l>SuCW;6BWi$ZS4#G2m5(D6(95H~sJC`V>O0l-Qj{GixL zZ{L};b;n9se#WQ6ZVQz-AgQnmUIDy8QDuKlEAW4NG0RBlXy4ikR~$WgA*;jO)E@XY z#f(y&LVk<1d|r=b(c>G=1}9+6;{ViwLtHLz3wCRwYVxFkd9!xP@e{m*Ti%%(U$?{D zwU?@st%X0_T+m?Lq$SVK|>^Lj=_ofSNfemir^`(_E1smaMgCmRLUNE1r zjnrDN9Nz3zq0@V^>fjFTt{RM8LW-)KMS*1)bapY;uh0YQ)`cDeh!{_RoUJ~-uk=S! zuIJaN+|kO~SX52mGI-%8YGje-R>3_P$Z!7cDRf%m3^o|G98tcMtJ{2o%;W&)sp>DJ z+_)+bj1|TU2%<3yNMXDpcm2aD+Qogo%!#8jKr)ldK~zkP#hIkvDe3a6A3}hny>Zv9 zw$FbGK2>##%{v9Z%ku;!-%u~*@S(8q07dd8Qm|r9f;v{zCzFlRI> zyyG13ub662`+~sq#aaY%;}-V-Q>0;nD@9eiUSe^mk}s0@G;SVQ30##LN4JTeg#gCs z@-nKHS?ylFOmD0VG|7^5z|?2Yk|_&xmuZn$*gq0A2TdFTvp?tY#s@t{xb=sga0Z{XCL9m1LVdw(a1xH0&C)s#KZNOZS+o1A>t z0+2G;Jf5;A9)%=dBS_P`9Mv=8N~{G@LK~9vBwjA`q(mD5E`!?($fM-EfjsN|=yrN5 zc~2R}P$RjMiPERt11%vW&O`$U88yN;%&(fLmM}?m zLSJVnuiKrurH3p+E8z1H$sHt`>|gm3G28&(+xZtozqRSL)(<3bkY~)gu1cI@S{ITb zcZEX!%}08<@4OG(q=KL%*UqVcbfU>BTK!ImEVxJNce#W)yhLS^;r`7XIC7}-uhB*T zY-=RwGy{~~9iHPi1&J1-$ZIv`nF<18u>nIwVC^v^Uz$KBzYaLSU$ExAeTfs|orfNN znrTS;EWJ?@qz^cdB#0RUC~vqS+&Al^*ukj1IOQSpzbT_F;$0wgx3-dz%!-}&2;{jc zbOOX3Hp_XNSpwHUTe!Rl&m$~z1%gEkT*S9YP07MU++zTRZ}g<(O`JJ^DM7NmC%HHd zIGEy#d13^s_aSF}aOtAFqoWm+dsTuelgkKA`Z3iRBRz-GiumQL@+d8{JF|zDa?HxH z88~jwLISJ2`LbaiyE0#GhV#j2|^1FCH@CuKT30=ULcbNJz7qY^b| zwLS9rKUSjb#$@3s*weoZtqp0D1lL@goRlSCs_ zmLQo=J^=d}sfww}ef~J`^h-PrYmXU#ateXVY42yJR89@vH*yDppADe5Odo{tto3QM ze4oD)TpvBoSWTP@D)Bqwbk6LBtEKsoYb<4Bk>-DirDN+7;9y&RRVlcg9Q~H&CENiO z2JZ!@9_l-b*M?spFX%?RZ`L4a5iVehK_`HriNby|yi$h)Ip^b^8j^LhaT%^n%P)UH znCn|{2c8N;T^8Moww^hV%e&!fT*wOR*#&9^7nPjwN0LeT zPWImt%>m)?nc;82W3|qQ+Z!KeC)|&>LW&K+`o9o8AF%2EBJ0R^-Xqx^I9Ruh2!L+R!##%8koUxM)l4*v-)}bqv*(>t zouNmYxcBtP*7xKO^cr6UDJ9T#vHoOja&3Ya268EK`q+NLF%$X3B2NIbC2fK1uP$Uu z7Nn)n;m+>lZHwsVT|}J)z$+qQt)?qDQ4te41JB7z)F@L)s+Mx|@Y2$;Q^>xA!;Dot zjjTZLx5j)T6-473AKBWtZw$N=Y7?bj{PXC*lJQ#GH`XPjgFf%5vHQWf^s8p`?9 z!$o#8)>AS%YOf$3`%w9n^n`}`lM~qp4&*97@@gT_5rWc3GS8*!@qLupP$fr)#;=&Z zVV&4F9X(4v+@1E0;vMcSlh^w1%wE0VW>?<}8n>sN92^{#6Q1nAs*GC&L7GrwQ%}St ze&gA3q#Mf4mG(}t5C|1LR_hDaNdSNQtMxXncTW%tStdE>aNG`32|lxIyu&d6MrzH& z^3x3kayeGh%gzwaP$z;nZ2-ukvzEcF_2$^d362bXPdAMcMY%Jj?}#3GAb1DGdyfxl_AI5Y}V9S+RHdWceB-@%7=uT)F zxq<73+Py(dy}`T zPEHkRD|XyJXT4qyx(ZuBh~TV9oKVL*@4!!K4ZhdNWR2O5zj*xB8dUREt<{rxSH~PR z#F^Fk8@AEAH8Uirer`1LfR!Hz-@aB|V4pARokffLZIqU2^C#baHOG0G(EY$uLj&G9 zN!X8gw??o!@!pdi!qX;4=kv|*Z5u^z?S$k>VJG6#i)yDX+T9#~)z8(Zp(P0f)~zg| z*JV_qnmY8WZTOe%nX>T&qxOf8Mlg!bAg>qTbpbVr*#gpW0WS164)8y^rb1hFlkr(< zPKiA6Ujph<1BqVJW09)cBm!h3d-DBj@y~7}{I>%G=o7^)DGg%Sx;3zCe4f2u7SD8! z_Ky}(0!)W|k^__wSf7l4f3Q-jCKx1OLcf|pev)0xwy5%_m63s=!q5WO%4Ps9dSC{K z4JH!?vw3|72p&KQ)bw`e$F3s<6nGo6%eS03pNTuv9S}9p&^4=!*NdL)G*@&c%7RA zZS$6<@13bZ`Do}W|+t)FrKVGgsgNN>tF3;J(E%j%C z?xPW=923oE*;FQfTs;Q!KeYC?#s_Bzdl9Oc#B-g~t4bj;=%gY&DYSqWPH(*$DWC@A z)__H;+x_r8s3lTHCQnQ%*n_!~>3xZ*g+1HEE8c?{+8)KQ*-|=ku04s-u>V&Y5cR;8 zKcUQDeq2(XL9A_mS1L{ow)weGkO&s19rxRM*Ny!*3|G4q#ZDMM#52v!XKBt)V1!yV zPNo}xQhxO5aMr9w@ojBrJ;0SGDp%LwoyF|}{hvi^B=IPFEC1jl%P23Oo}Fr%MAii@ zAVs?Yzawk6yJx5zz)_ZCR=4k_rt0z>5FVO+kU3-8jf*muNMS1-y|vqSX##>^Q=j7vw(BLW;^ATJEw)|XpA z*SWth`{lpJD5pskgFvf9`1?r=*|6+<75PSw~dq>v9>x^7SdF9{n>>s#3Dg;Y@a<~2LSk=rWc%$vsttFeVs#*J{KLE3HX z5cyaFCoSh72rVMB%YS^&Hp7)O^x5Adu-L*~UZ!hD3@{lhh{s-WJHp{s|KQ$5u6`K- z__JffSdpT4lKHb0u+7`OSp111uHeM2-4puZGGE^DWqjD3AHMCiNe4Er9Fepj6M_EXlG<`Ji=8f~;YQEvs@Rn%fQDomKE(jdGJf-m(qpygnj zc@eG19N8OBezWjrMz3{!g(c}g6bEH24NlXg{W&`Ej&U9uMq5(vvvDZh`?`CyG@NobVj^MzA4NhUivo**U#Z zby3N_4idcBv9CX0A1Tf)KB z*DG_t+uUwYAshH0r^;8YyYP512Y>%M1Yl?P96zJvk}>^HuOuSRv^BC2CSc<}h^2fA z_a>5l+dPr7F5cMt?cBFN>IVL!N%bua@{duN>|-Vl8f9RCaL@X}-!{3R4|YlE4>Ja1 znfnOoOhMf0w?an~v$chy&=OYgxoBD3_x$PpvZe-`eSOkB0YwLa)%^1!ZFwNjP&HS+ zaMJ1BoHX<=KX+XsYWIwf(T%~yMqgA<&+}4t1F?&Ix^{`Wbs@O<7d@`i#fsdtwtJrOvaFUtjyjQzCg~fJh(>(0X6FaV?yW~@^|isOzhxqeIn5aVA5Hx)ry&Gc ztzX*Z8gg%uJbjmjc6Z8TzDM>AFX!?KPD}^$_Kz|!@vQ}B2jRn^3+9Z8*M4FVEF5C# zh@>qKAadFdU&`(lo$7kcd-m*zso`GO@MCqvban&&PtERE^&xVd4ZwZ6c z^6S%w=`C(T6|eT61!TrH)(+O4Gs`a)tx2K6n3()cLT^MCZ~0%o+61vTrTyoCv*^R& z*TX;W%9iBN{C+3XHCAQe2OTm?`oBmHoXpP8K2V%RU)utrJ91)GMu?-wk$}h2W*rOA z()c4es_GUyGqX+Aj`s%l@9KW4hYWnyX-2)H)okrs^B!rR&igG{gxyyP__b;dtyyt? zF>n^)Qxzjjud<{eDuXA{jrzAyU3U_~Dx4&LY}EU)kpRVjfn^HW;PQO#wzH**=u&5J z=UpB98%<^4?0Xi?{2<|qpP7XwR|>;}H&jUF0Q`=`LlB7*<{s>1%NdHLeTq2|vs#np z&M3zsIrva1g&G8&4$%{Gen*kXO?LK^iUD=F1S*y{U-)oED)wNaa&Y0Zy z;!}nT#PvviYpx$(pbq;}-+i-NEc84I#;xF2Sb4m3b9rmOUF~oyIf8)WCR>5JS8Pl_Q zBoeE_=v-l1G`s$m4N18HhF_w_m1L)oMJPK1UZ+2^aQp81L4+T^J-zhbe3yQv0j;Z% zT}2H$Or#>)8Q3I7E9;j}Z&u)azfT3nq&&xRVxD8&*hx5@m;-O!eimR;zAtmt1QhZk z7lIXZkBu9-NCbQ^M^I%rfy=2mjvZLcv!Ntwr3wfJBQZw^Z3K{*1{e?3=M3X8*6h)j zv%y1Zf%iZn_S#PYhMxPFLYJt^_Vsi+aRFpZG9I)|U%jkvz_BoQ8l~!3MN`9&V~T@* zB2Z59(Di^sLVYB{^ytI}@ASbUH@TUt$YpIk20{md&N)52(Hi}y?PdD`m)h2szrMjm z6`=k08D9LPdLa~rH>h^zbbe4uS4Bm|^p)vBY?dwuvE!$fid{gf6auS3mzmB5Qf3d> zUA-cfpaMJc2k+;v)f9oTD#Xf?t&{OE@)rSw3Qn=s8VX(M(-nkJ#}2x0Q;mcq=wBrc z7b&j(Q0}eT06Y)M5ZrQe&?H*@r^7w0NBA37FcLZ>-g6@R@pnRI7UUgbu79LnVY}3A zD=galJBX>dB^$n=O574JRc%a+Sd#1RW2kQXMCBsy)AnhX6*RH`tJqCmjWCH=YB*U% zqY}QS7Y^$>hNzU5u3sWoXe3dac=SQHK%x^ChN-rb>;5>us9 z5Yb!R3pr9z*h-g^SK4QGm(jyLlX>f6$>Sdr;bpa)>OQ^IMcKEy__OU(b}Pax(cUlZ zhBujVC$Sz*4JRZH`HY(3Cx84~NtPo%tGMWwO?+=aQE?N5O&}v*Qi**lZlmQ?D&U3x zg%;R>aPB}yy~L9?og7JOqyOVeGL#0U@V13?iv-c`?h5mel)hED{SQ)r)#<9wl+Y$1 z_Vv}hTS5cFwIEHSQFFh}0Y5*poQ4bX!&!LwpST3^uizYb4$lhSH0$E?&{~D`JER-6 z8>}0(q5*H_W1ba+Z!4G7AL;3zZm-Xt#(KPhH(F7e)HtY^7Yjb+IugLGrJ(3A{+S!_ z&VCaWN#+V01Eau>k_fE7l4=l=;7_zJ(`pck1f-!fpxirlU{djfyP_iFzYDy#&Vc(( z_6yBYr&s|-N{|>s151CaqJ^3QJzO~|nH&%qD8Gv#6km7Dg5RrR)^mBFzJE9MGYu{i`iC{&7IxMyPaYAfItHBsL9+ z*e1?=clAZ(Fv~13Xi`p7>QFL`dlbtSvsCdFU|;b^QPDD&bX}=6#pLgjfS!tmXvgbl zW3jT;L%ELsU5Pe=0ge;hWSvmFo7pJltc++pPDDz7`qhD7l#?hMzIg6Q-?b8_JJVwZ z3#?g`ufr-R z_fC|!LN%J`AN>8Y5v$1=jUW}6_7mNgQYuIIF%wcdQWCVh3cgnA=6k42Rk~Od={gom zh6!(;=lxyB@+m{#1qZy?jUY{WrtecF);#fvo5b(YEf6DOW#4*7mYd;NimCC?nEk^| zS|+G|k%Bzz_pNpzUv0y|G}zE-j$zeb|q4qZC%sS`xKy&ZcgzlB&ZK3lO6Xg zlODPJsAnqw?)f}!ZSXmX0oKMtFoxh~?|b#;YyF#tR9)*#%(K_7^sjn=UaOQKmj41p#7th%Fy-U?E(2=5*fce+o5pPj;Yo!cA|322rlQ+;rfsy!*i zI;}ihLHT0ufgRJosIQhDt0~twte{>@7LuatDVzD<-JzR14G5mhLij&o^rGJvV#d_F zOEAYVjDorC6+lBy<30G;wkM-a2Xs}+uCS|dd~WW{*}cs{B?K|CG!D^X;8Ocat`4E38ej6+PfTTT5j)V5$sgjL+vX zsV|x_7;N=YP7*%LR=UGRv(j;AWFCI!WLppb5;OPfZ8!DR*enGL{Uw?Ncy4KKm2DU0f{{rmMZ6qjh$Dwim;@`9|G?YFccmJ-hWq!lb2~ zTu7a4qbwGQiodh+ySZt=Pcr@GN`>+q-#mP$o7Y42{+vl&Y+*&o#~?M9iD7s2KwH)t z(=rVXnlU7U{Ofna7p27(;1(f6BBzy&lzYoVKYfY6ET9@jZM-~lA=)LY70pij>xYJp z?0AVHCWQ`Gmacmes#Nhnoq;J|I7OxqMd8vui{OxPgM@*Xb{If7p@EaG7Y)QE1r=UF zj3vtI6TmqZ7OP^$pUUxJ@mnSu+-ep13qv{!hB~7EsFs4dcfdBF-71DFDie037vG&0 z@+Xx_wPxS9l?E}eL;>EOQp(-|i2!UngqS>4A|_0zm}S`1iL~6cL|DqvBd&XJNeR`H z*!@gPO=x|(EpHvlrptEY{V<`^>c^_u2THy|A|;}PE*airFIiwSH1?Gh1n-uCxZGA} z;ad5%dRyYgriJuqT6ta`;#?0`0N7V8UOM*Rtz|=A4xr>5om@#Jh@7`0`7wJ;5dW6D zQx8vQ5?Nq61tnZ5oVr0(NI%s$LipMST#;u9;s1QgG1;ahZ-LNak68d{qsn|Zs~5*+ zfh5{O+h8*mV#ohS!&ipI(KPMC;_mM5?oQAE!QB^kcV9F(3GOZl?kru>))&8q=(l;IOegrHe&H=%$T&WvD9yaCz1^hGY9zNw1^+BYk* zf>2=gN$A)3Xa=}2H`sVz5DM9u9=M@6bd>wy1JOKn<*GltW)FK_jI`?Jw|A7bs?kjW zzB}65tdOgHRl}p5atA@RaF1pJ-TS$h<#ufaj;Q|0 zFg4!*_8lLvalxl$9KL~G$Gand^ph9daVVvo!uMVH(F9dRr;?O$Bu8{bjq!m>7}o@3 z*P2_05iBBIC4-3A*%8SPM6-5;dZ{NIv4RB+iL#pSRbhWRarTG=1j*;e-A#HMFeA3uCYv^RH6X8_td7-H`|}h%=i|ovZ(8i1R&Byw7AFj{U)L}c z;l=0i^-4w#igi>JHQbvv^>dSL!1Rrj+xqZN4Q$F$nc-O^Q*3Aj(|`|x@VBq>7|u~p zA2{1f%3>H{Lz{j~7xakNoh!VhR2sZvepLmv3xVDZp+w$-ggrw#;r^dS=RZt(>iGZ5o&PE zuXi16qVIQZ=w3g=c46OM-<_nurfiK@1x)ZyFf~!2FVM{X(EC-NAzjdCOfCvY>yD)c zu>S872J+Nf5gPfEA}SU1TExMGo0gwSSgeJQD9fLrsXJ`WOLaCg8vqx(1*i7#AO^Pal-Z`4hVZTNdesD}LpX4xRkBIg+TpT48By_u+q!|)>H ze9_MJQnLu80OhJ#i>VF2zk9r&GK%SoFO>n#<^^};L z8>^?fBi?hlap1!@v40<@v+ z*RS&tzg5)5HP`YIK(rFG%Oc?~agErI7mWTafdzU$K+2Af#9R5b;(W%K?ubx}`Sf<+ zYtn>Dx|y zh}bEDn$LiTsuOc^Opn?${L$dd*9wq)Zt><7DE zxX7cmsqXfr>VQP%XSd2W6bkKn^T2GPy>SDTioc3i4 zVRXZ=Av(8=LXP;FSR7l1Xnn4@Pdra-OD_J>N)Q6SlQ@ttH3u1+)jwWkmej zrfdR!ElI;>sH*N)DZ_@K?^9Md)vg$|AHv&$*qX4K7Md%7++S(oTd1uz_Wh@gQbGu^ zr~;n6Uruucl5umXgpk2^u}e7kYjeHeN;utzlXM3e0^PVthz%+;U&m1o$QHpwBVS== z8TfOHS54Ga!=EZBo4vgSq>84Ft#Darqx(^%uCxnk)f?LnYkys&%@WqNVzAM42-1q- z#fJ{>3+tX7WIE$j=+E6ZQrO%OmgtdNVZz(9AHIqhDmKprASX-gI-P1`}20wW~xT8~TM&l9Zy8(@hr1_iA(QBWFjw$+$VqOlv>r0C&Lb?KKBUz7s zxh1QKj>?a)D}-}x&N9|0Gnc(hqhaAkZp&%b%bGkZ@XRySArayv2%&$J7bSps=Lm&% z@LpTe;E3qVcHWXA&QC@C0o5HLhG?ixA!@A+XRzQDvvWJcWE@-t+p~JIY_QB14wr*$ z@wdv}ms7U_ZI~FgC6Ft4egtbg_a8==(MzXBt9uH@qwtS=K&$?2YdcA3*u+xm;gkd0Zz8{vE9$hkAH615_i7fxuU59i0^d1n}mYubLxR9it%MsUgBw^0UN zDS+}s;l%xS45#+l>EXh&Y?KLN`{_}v87&|;Vm+*^kii z?I(~;-mLiEx3*x+LF>6x9qVjs*ufqDENjTv1A2>XvhphEIE2MA$08PO_T+pfS%%<6 zF^%M{kmh$?YkBwNU-Zv;2@1t-KZ$A~ztr&kO?G2F?$+%7qXeC8Jl`?s0lg+keL{~> zyIRb!g0LLTKXgl;+&h1+Ys8mGy z$KY*F=uqS*{}E70A4XO|!bQoS3JdVj7g%N-r3<4mD*ZZhuoc~ZP%kzMDER+B?(^nC z36KzIqaN5R3d~UHs+5_D#F-BDMttYlx}nEgj2hc`s*N(pLbg=H=<9Or9|7S&(P;G zu-(<;pyNQ=vt}@Z=cS^g1hx+Mc)++A2VbXf* zAomo$3@?=#dTGzCDIe|4U*KtDDIe?Ke+)FusEypPXAlQb)by%}mT0?L)*-|9_wuN4>64V~zi`{6R zJ^WmSFpE!HdNyN?40EhBhaat{;cj%W)4;sTAgy&b0rC(aj86g;v1xKK;x4T z^K&k<|MsL3_?|!QqRO#DJJ0|9#l1cu;nL;V0z5Yg5EYEEc*2ET@>+2XE9VD#AmtzU zV4o`{|4Ko&u*S#_|C`Ipx%k*!u=#w3NUoZ2RkvMC!G6o z^K0wK`}sh=hKc=$cU@bT$g?*2#8<{^{q(8Lo__f_4>yg-IPa8;2~nWD3x%p|!+ z+(P1xp|mcl&*5uF)6C1-;{KtTPP}&uY@fLDKie@2(8>p&TirH2<3I9_J~3XKT%Vok z;HJ7d`gFRa-$vR9R?evucX4=oz1w)q#-Z0w4_yOz+8|{l<8*l6W}h7c&&}GmGp|pb zdy^k@Jnr|a6TO%)jS7juakeg`!)>t`G@C7O#(@v*`H7=wv+`|mwmVfO$+ZZDwRbKg zBcn-IZ>dnDm{No89KU}WD?KsL(f~BlzOMYkH7_K{bux~*P z3Afs?P6xazClX*1oRZ_z+vK;T^0{#@Z1XdhVwC=vX2+DU>$=n5Rx?JvnUwI=wpWOI zH%Tvk8xv=QSXM)Rw8P09E>HJ|u^+siFaz?BN@3=ULBNKKh;*^-&0JS18^2$y&{wDR zTVU&aR3-D(8(+MC{EcHW4h*Vm`K{)do~pzXbI%p>q7R*o+F3LxVA~KUn3;|+P%eI~ zt1@z|58_i7H;lgixB#-JXIeC%rN`{)I>Usz=?@%18hsbAcI$;Mg3{N|%7QZFR(yovA{hQ388chiSa=rRz}Oz2-tDfm~}7SE7BzAj?*25S1K}$1jM{k z(~@au@#dSkp{KX(xbkRdr3UYzfNf(#4|$um{Y7Wpd%pdK)e}6-yH`QKv7!FWKft^= zTSdGAQivgRp0FfB_@m~RRQ^-EFBOY@Lyn65?u~0~pOL-i+uCvfaHbZ|nRpFi2D`-d zoJ1#YEx#Z;;5NzjR}gN<&{rB0qQ>{-K@M~9oU}^jtJDr%n6fEu#V<%Y;<~7a!=3bg zOCfCMdvi|W$9q`tmG1&kV3%b?b)CvDF>4?g;qJR?s`|-P9eb;vq~n$zUMbY+(7Ty0 z`Gftfhf_VmbV63{hX&2?4@d>PFDEJ4bcjI`=zP7>25?GioPgk;AQmbIT3MiPwcqET z_kdjI6@3U_gAD|*D%$d25NMnaiv4L-zkxrzS71;ys~>`W$4$T;ob1(J5h46Z@IRxI zI(>oU%RmNCu;t@dpgDEzKfB_JoS+gt{M``#8$I1;E!~q&V`e`f-7pqOpR5a(K_v)< zNTeU`?hnHo)51PG-oOr1?enW$qWhGn|I^*c-thf>#PCuD#(?KBC5*r8st_S7yia4a zhK`;~cQmbAx4b~e-yotZ7|Kt#BM;r_r4&RJV)01ZssZb7%L)Ab`CIw544Us0y?(90 z0&GS8iDJd7kWBy9p@}d!&8$D&%cnLvKAV?(r%&yg)`M1u z0qSTkm(ZK*Vq5@hOiy?AHBBcGTaF+M$nREtlupD??w8ER}X_N6?V-xRm%(;*m+Z-=)W%S zEF#>$ezKCD7laqv{TqyWL?LpuSg`r$AK3Db92G*x2|DDKCa<3Uat*MuqZ zrM_a>(3T7sVcC?wYHG3RC?sY>1g_@n$Eh0DjuZu zT`ClhXU}+S52jlfte8v>=P^<&e(=+&PHjTmQasRD?(na@%A5Ql;(BmV%>e1uXC^)& zkRsll;~?XEcQe=j`27K@xCi<4Lu7iPFqX%e+qmbe2ERDa%y6p5sfJ#}*AbdJ)@v-} z&x7Ql@{{QyEMgKGf>!ds%;qmxa|CJqoE0@dYSdSRrMVSBA}o)~2--B??UiX#nx&t) zuoZ7lM@=ZGz+m=cD@%sV8xpu2$h_VtRN>A=y3M3KVRy*&IX)X_umG32O+i+mV8<#| zLmC6W56>`$U3v}Alt?4BdJK&mP&`T~z|alNn2I&Rh9&f1^K9$ajaaNc{1*{lY~u?y zki9I1%0Sm)8x(`G0Ci%mpEgqs!`khWw>*Fo5{^-nEa0fQ>+%&NA8%V)^Di*9z@Wm5@D z5^}LuhDKJMGdreu8U+;?i5RaI0=4n*5e}=jLaLFhU#&gK~*O_2DI< zx={1&s&MnyrRsp{QMjoEG$yms;ZhkcI*v_;03#8Yq73Y5W9nRK_plt z1%oF4><0%}P=66*0d(@Z^AK7W{g8MMn-5Ptp&T; zso{53RD30Z6)bmkKIiY#U51NS;}qEy>q_k&?(x#!lQ!5t=ISv1UcxRZh!9BHHJ1cR zJ|G&j@uDY)x3LI)Sb$y<)un_4vJ)|IlGqjBjT{8QYh%95%^LH@W>;33yyO3C7V0!XsaE7AR zTC!VU(Bdg{`fN2_Yd?qtgX<_^cn|6N$!Oy!p-}Oiki`~UbF1F^0HFil-(%XX3ss86 z3!#P{ZU#|;i7w18{*zgmKe}Ss#=A~W7;rWs_4C`Z-6)wAs zl9(W8B&ffl?WC)ft^25AoGb|1;o+vW2v*o0yGOjqkD&_UYt-e^5+4ypB-U77%Re*& zCCdKqt|)l6I1qaaigzSP=|3RZ$DbMBSF>9nvmj)K8CvRI$gXDNohS^Z!voq3pOfMX zCk^@_VTPLkx!lo;zf7Y_qDdlg-#*(f*ydoCL5A4@6A$23nCxS)*?sE&gyx_QJ2F$gUnf{a$xxLhXhxpi~f7P>Z~x;L?m!i;~g;k@@{9kAf;4s4ULG z$-n{u|3-ZEjW_Gjv<)BHe-Pd`7C@UICDdDUxPU+k>n7A2fQH}9vnBCP-t37kM<&H< zT)44x)4rC1r3ISfJfy}`Te!OY$`hL-d{w|6A>J$6^!vXQr z)|7ZJr1i97k^c@K<{N2-ZYk_~Ch)Qm35aZ{Sb)}`h*C8>V9FZ{{#IL-qg4LJv@As{wq(~oy(CN?*B)lX8*XmfPci}}u< z9#z5S5RJ--e-J!DHi}o|fQV6{3g_uPgnZB_xiy`)aRyKXtkYUeyDTDWWr|TayM*8w zVk3f73L=xKQA?ENrB=tZtTEfj0vh6BeS_S(x1%gJt}LIv!D*E2j-g?@;(|+GB$~yp z)jEPi%L*xQk$9mgMua{8>xF2{+hefdM{;`ElPm>UF@zf$@l#deMT)LL=Z=_Yn@p=@k#4g(}SfGNtzf6(j;mL8B1Xw9A4A+u-%?Nt0s}@K&Yw7(I|v=NxPO zrEZpi-7wqfaT_qLgeqq8IWs+PFO^`7kx=hhvX@y6KonteTJ(R<&!M;e<={M273Z>C zAu}s4=RpgTLKlgl7Q{8#^oAmzkY`$=_tEMsW&-cMv?9RP7iJzLSGz%kSJBQsR8g#; z-e|%q83ytYXX*R*Fh?D*PxJvEyh2>@|>=f+ndn#f5c4C;QW)@ zD~C+mXXgnZUM^Yl?=ZeV@mFj*LY3Zu2eKjAbHhO99vGmqbYvt8xb3cbi0}vmoi{-Q z{+((gle_5ZX}MSEgiXaOCZhDkR~>BUB}gcJ%NF!^wfl;#0c_W1xoe_Hj4ETquqQRk>Pl9xrQI8?h@!^HQ^BOZG62w9SPEqUU*mK z(2+Fu$u1NWw5ApIS$k!n{`etq2bYc?5I8-Kkcxp~e-L#5&Z?X^Za-}KYarUlF^|v- zVRtl>^N3d$g3)<<&r}oVO`aB{xnb5Fz_dH2Oyu3EZ$EMt*l7(`!sU_y=n|rk(fgkH zFZLlYvC&7h$GVeSz*kJ?O5ggmky4p3blVjNI(VBrpeNb*+igD(u@w)JX#6z2#cjnR zw&bchLT;yn@QN4Oukn}c{6n|3D5LN20!W0?xvxyZA8Y#TNhLUL3tR>wyut(0gL@z- zGG*n)0+`=xSPL1p9RaA=!H*J8{Q~}PS`;xv2$mmLL{1?(P-NjMI!8Sb&&!x%CP#Tp zkhj4|AFv}wZZKrLPfZ23dK&USuG6F#_t(i$s-?pKahOnW%5<8fs$q@6A@O2&A8Ya2B6G62E|f zY#iIOmvz*Vcdqjx?H$ukpRafM(n)1vC+TkPANg>HChJNdE)KydjcyS!mJCzB=Q?fj()CGmpgG!kTOw)V%u#Wtm-w=q~e3 zn~oFN<0WvVEp(~00OGUnSKdC3vHI(O%&U6#C8- zh^WJ~xMEFz74X7#a(5lD{hIqH?jL2CJyfn^9e&Wk;-kRj`SPPH&0P%YV*S1OG#NDh zK-5K^{^m<)z`!i+1f_!ox$0G~#!@MFly1QjL?f1W)&tn??^tP`XMjvQ|Gmqd?vM_v z?bfUR`EgAwI>g!q=b0j`xvY9P)`u&~AX0U!=Bs%g4kTHi|4r-WZ?bOhw_<$&>zdP` zjq~}U@+EVaI~QIj%Qh4#3$8-ev<4*?4u9h3$)()CSVAO`=PI0^`e?}-K^27T?EB4v z^Ct~XX0p*QFAWUmqbroD_WSuG?|(#K9ILry2P`~`G&a4~&t72kg!^l1jn;l(1P~Od z^`~=7MAw7WkxcgnIE-lTupl&1Yl%x?ma1#Yze~gr93rJ`7iHSHa$)^ zhP?yZ37q|w*IlS866(kC-ftyva}PsWU^^iwuFmjvmV>+gkV8n`4=xW^Mc$4`PC$`P zXt+Yw3SxafgDFS1k`Yb#;;D&oRg~a8@1s%H*iBH&H86$M({P5F3i%Pp*IN5S6TOoM zsJJJJDKs$gzy(HH3#IdyU)N?j>6ORUi0^?Ct%mN^9PniB#+;xOTBqCYNXXspKOr#k z;)5bhAWzzmd4(NgHTz_vs&fsww?4QRTYKBh8^CTHeH|@{GaPQ&_bZKX5|RqLk4H-N zeZodj6FXB`BpAIE<`kXTHa3~7O5_Eh~52%R}>#W+2r3QN>Y z66NiW;oN7Ji7Y0*9csGV6zcKyGCJiPh=EM18!6oYRfqcBbg=_FLm zB3BC&x3;pj>41m9r|9I~i0MH-t`k^&C{a`7x&Sojafo>c#=fo(1eU*|y>6YNRe7nP z@sIB}9lg&ITGtu!FNRmm6*IY?X(`0w>E!!HW0;XxntP(08?DX1s*b>4D^^6EHSHz* zT+m@(Vf|l-1w~FpU%7y~1*VcX5oe_MG)ELwj7c7@C6sw+I6s7S0SYdFAB%MC7Vnr< z@{Q02S_UI}Y|>jR^xjBde;$-GhIvM9z(viOw5LGMH8^iID!QaAJ1XvS4Wq&mbiUv& zXh>eCEt;SsjqIHaeH{o%w#cv`l+y!IncW(Daxpq-sZ4hlT*RJ8D_2#wV%y5SWYv89 zJd-nms9PrH?u)3te!UF+PMdzhyk>TWE}JS3wivXzda=Y@qkbZTWOCiDNex8Sr2VTI z)Q+f{!(yq~c~ho<_U$KLMMku_pyHpqzXRoU{6THs%Hg%=Vbn)8tqTzSdO+dZN0(Ei zB7P4C37}cRzlg9{f)}dbMt73@F#0ib_7+%Lhy!s*dKoB=WCn;ApnpCT5W4W=O-lQC z##S$)kV#y+XQMM0mEPgr@D%p5;0NJpPTOE)>|@s6BWXJbiW$qCWZbm!%fNtAQbV15 z{ku!MKoGWq*3Z(hvo#K$LyFo)CmVAs9LSjVvJI=k9te8~Yvmd3WAi`Op-K_7b9n5| zpzc{}pklw289V7cQ1Be~{N7`gow!^`1_~_#P|JB1IwgCO5%5iv@BVwy7qSb;Bb_@_Yvf@iAX&E-4!-Y8F6uUoFjgDRGx#~kO3Zk4Xus?T&o>F#XUN)b>t1~T zdkndmRnPA-k`RtW0p-cs+nnTZZ=u^YXB*Se^WqT0*RM_)QgmiqgvY(%@?WIiYEBbj z?lrbdN%KqK^7{I_#mz?YDHN3o!lRFAHes$=Ma66UZnmk(7RlE!{+)2d_sW?*z!J09=W5JwR4|ZpT z*S>eq`Jc;{9w;R&Lh`8xEWw{fHzblKcyxIPn8EZ9h1jl~F@_Wvw4T|8VrSI&@_eXt z9H#fAZ15q)V&jJt`^iz8AHw&C1wvl08ELi5*^^cpP>VTiPm6K=BHUG@tEyn8o*=ky zk|t~Jgd7<7d;D2_M8g3+_`%XrI8FpR1+g%&>a8K)B$3sWRXD%B1aoOYRk8VJsbDA& zgm{`~yTB7j$)!F+-BT*=xfCm#o=m|vJD74Kl6v@-g?XW0k?lE=INwU3j@hfISW-Zk z$kfg5DR*S3KSd_CN`F z9J8233GqUAHk#7Dw_w?Ba8VOY!!U9zzZ{qAm&Lx+A8IoiDX`K59|?;!X}2_o?JkhrJklgYfydUyuJa4jm6cc~$oLeQ)Tq3j@J5eB8{xPgYD+b@~S zU@xRTpR{HocA<|qO_spG*N2V5q@*M=NDvR`Crv++V>a=ZGCN%R0>bO}S?fQJEgc(s zS;{T=wV3PgcNQztoyH^jaQG&It=ptu$|{gpm&`ZFe_3)4MU^}h-Hq}>S;jWyi8&?6 zbYJ?2JRV1yWpvkdI6~Q>`#=6DAmmB^a+ZBHzP9#Rv*DcVBA~xsRP@jy$Cz|5f2`f|s9){?)kzo_b8;K= z%Eqr{18$Ey=M%EJ%H+icxh$Iy8PB3m&PQ;{pHp=4-{vB^QG|XW(Fm&_M`bd5s4Za^ z!f&u>)?A$B6i$hoo!gbZLR-tL-(P8@RqhhN^y!Jw7I}N>e(Xwj3BBB^-!q0s;_)@h z$J{0C)B(JH+&ne0w1_g{OCmByu@?5WBxwE}3qud&beD`~>f{Hw1-##nRZJh?K>q+J zP)?-x+H3)XVsRIb7bs@$fA+>uUOo9*EIS4?&%@WT!lX*2)g2Xvnl=8WL?-zA?Ej&) zBaObiv}9a^sz3n$A)5N%98#gr$5`${BDy>r@xCGpW5_FC_)jILX-4(j9<#GY)sk{n_;lko)H1za?17Sl?rB>BnC}<&`QN- z!BQt?OgxjHEm^0Ai7#HxUaNhw(`mXyzN`2Pc@Eiv)#a*R1eoUq7YynS`I>SePWc=Z z342Q@;xHaEWLoAdZahEVB4|6k`(nS+@{uSz4`Wo62Ps^}20FXDHO}+MnZSLbn%=3Y zMWgq?kLYSJD}%m`d}#LS$?uju@d2FQ66rCWH6OGcl%Mz2mAhC>Mem(9e(0{MpFxxAUOjgkAK zWm<4u@!FL{r+217TLn)p5WvebMFPxGG0%&}rYQ3Gy{Fr)dZDv3N6XZbFiWyxv{)O{ zS8{pik|tiM7+}}wwK$76$a{;gFrU(U533jNP{GB@l53+?PA|ba?lxe?Hck#k?Bkzb zx_`ex5!X@uK1_+fXX^z5UiT3bYG7HwU8HVx6ANVJqLr!%`t~X@$o4$S?{;rIp<~+5 zPuW1s*)+k+O^97xNWkrOWjq1N?e4SAZ~tn3^%U`2DMcyF(Uiq+3i~42&O}VqC7PXN zr{zgLndxi0HW!1O-x^w<>HFUL=ft*1;>5{=We2Z1MzFa{N)p+{&862@95c*-tjQ=F z^}L7xR;I2Bv$+xxgzq;x-X!rRzrEu8P3VNF#LB0r(Jrn?;Jv$>p|=hDo>Ux;)Xr&G z^Y|a?AMpL`%Fqm|Nd_bwUUybW4ceixNptvp8al=NLXqHa6r&ewOLe;?ey>o+$X zz#gEHZ`<1k*SFFg*@m!{M@jDq*&3Z0icTeDFEnG9ov%6VH?v-T@t8g98C%%D5D{zJ zQs(YzQi%F8?D{Sbp`wj^!bhhL(za^|7k%%qaJ&phvvRYD-{pq-!9$@PaqV7?}B!n%sEDU&hNlm$F$~dainxETS;sh!Fv;GZK zOfREr;8p&{XSs&u0oP@w<)%jT(cjTHP;vivM`*!1nIwO!w?@#1X1GQ+5~8zj34-^% z!UN4DK=H}QZ(f6eLRhPAR)|ouc^?^##HAq3h{xXwv6#%*(W2RE8Y}3J)`sD;Ckk-B zCkr=wrKrduZj^vye)T*GESV=4mF)3m|BZ5lfre6(*|nQl^G14#K{BxP*(39ssZa{g zY#s{vsxOgb6QC{Ev0LWXsGh^BKpO4*dvum3iT_4u3q=%H``LjgqT$YG6f0 zy;t6l--UN zr>(%Js|$s>GUZS2d}e#A++4@>j9WK)+w*$0bFP2QTc@16?yHt_H^bLgwf?~T`~eRX zqi!B;+}x8h8dMf(c+RLbxJ1uwS9>?eb0>I_Ewb$37Znxd{rSgnx|Bz%L`mJQ^3QLI zOhpCM;iRENJOL^dyH(0#G8f<5l%J+65WI03nCvA|$q=ZVN8T+HPPi=u`n<5x zt!!FW#w1Rwt`_$r@^>BiMOzD9MC`OZLbBEKF1yv}VFd?%_{m2x0ir=y6(NxJgl*VB z#+621nB8xx@~tbYrJH#?*+bx8M^cW_%R3<)Se}i0ADMoR_myVadnvw17-jhQF*p7V zfuH*dF9Qt>|J_uA9+BzX)~X1W3vBj~Z3^jCO(oZg<}u4c7^!a}j&0DWF0MH9ywby< z!zbRkVD$eSNiQSuz5J`)93nummD4EBu&vF}P-oS{5wSvAeUwsEJqwtzfswXkQ;;^-}#PON|9(TIJK5rw}d&<1nwZ36A(N$q} z&XulGok^P;7V=fD75j+obB^R^n3beETIBZ+dkQ8HSu#8b_=wK)lk2<~-zMma?+~b6 zV0fKtOX=$Zwwj8~CDAz8_a)<3^k*f+R%1nowST}5~O|d@Yw-`Vz?b#Hr$Pl&(PlS5^ z{Q�aXdnoVMoJcr?4^9GWV_pO}d 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 \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/pattie.svg b/wp-content/plugins/wp-mail-smtp/assets/images/pattie.svg new file mode 100755 index 00000000..2966ee32 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/pattie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/pro-badge-small.svg b/wp-content/plugins/wp-mail-smtp/assets/images/pro-badge-small.svg new file mode 100755 index 00000000..99e058ac --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/pro-badge-small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/pro-badge.svg b/wp-content/plugins/wp-mail-smtp/assets/images/pro-badge.svg new file mode 100755 index 00000000..4e1ced24 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/pro-badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg new file mode 100755 index 00000000..0338816b --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/aws.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/brevo.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/brevo.svg new file mode 100755 index 00000000..473cf40a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/brevo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/elasticemail.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/elasticemail.svg new file mode 100755 index 00000000..96c1da44 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/elasticemail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg new file mode 100755 index 00000000..22150fc5 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailersend.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailersend.svg new file mode 100755 index 00000000..f1e715e9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailersend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg new file mode 100755 index 00000000..c76a86c2 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailgun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailjet.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailjet.svg new file mode 100755 index 00000000..37ba9162 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mailjet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/mandrill.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mandrill.svg new file mode 100755 index 00000000..690f0dd4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/mandrill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg new file mode 100755 index 00000000..1033de4c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/microsoft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost-smtp.png b/wp-content/plugins/wp-mail-smtp/assets/images/providers/pepipost-smtp.png new file mode 100755 index 0000000000000000000000000000000000000000..6f67bcda68afd5887bd2f2486d7a1d89f79c27bc GIT binary patch literal 3236 zcmV;V3|sSwP)+NOsS?30gXKq|VUV_76I?Sg|Or7PZqlq}A%w zL1$zzOh|I??tLT>PzPU7JC)LhQ)>$Y1ualsT5;rQLg+(p2VFsLOtfN~>Y#r5ny z0Jz%ZRjP3(2tn@qvcSLpb zanbPma=7jk?%Qo{;R0Z2(Uz{786`t3=6=Qwu|`V`H_)9p!$%F=P)W(U>$8RrsJ z;ZOQnxo$3q>*iSjaKd?s@%8=|)T=a&R6f3n9(EjX1I8`hKG5bdIl+wu*cbZIoDMmr z;r@uXPit_xn$XOJm~##0{F|klTP>CS#n#MdTr=mzCb2R3-T?+QGOk7%Bl5poKcai&BRpZJmfz`m85XU>Y@>qQFV#Bh=as~T!4$ty9 z_bASLA*8$I=fv_c{sXZ_5|#iY=?XQAG(uTepLf8LFvro9G)GDjvOG8Kg}fbEIgRa7 z=3N4rb*={46Y?Oknv#^?Q4$S?1MlVX2)1ZVsKGH3O9EEBgMOzuR)?TaD!aL?OsNjj5@=n73PG1}R$ziqJa1jZvon4S3l zRZ>7Ah1_VqoeD*^hG7%n7b=1vz6(Xxdn^tb`nM zb@MK_cwpQl3l05Vqw1GO@IQsimbDJxg{P-;Zj4D}tg{DJ^L=@Isw@_0C<&d%m80aQ`;w5zRkmAEOZTI(1%V4PCx;aB96pTn_LNUQvT`v8-P;l4@_4!Q zUP%$io#XE%9&n$NJ;Oj#Av?%^AkCFcMDPzyCzZ{b!+X;8W9WMicMq_^8j&Y7Py-E1bIT-56Ffhh^Mo6 z-P|45!w<=+&;=JUvkq7& z-1M8BT&6Mu7RG~EzAF*xTTm(l+-Zt(sbBf=DU=;sE#BZp+DPNT=6;SB&S{=dSKe0` zGlLMo5j%UH5BqB%Pal$t9jN7c!3BUnE-tuJOR<)H87^X;rZ7V}IDS8siTCV)@LoPe z{)JgUXl8qcoYvK1jwah>y61RaoCcZiVY8QP6$0+0F=Hm>PK7Gjrv_RQBTXkZn9+3O z6dg^`aTM6y=km3d;LNKA7;}lJtW8Oz2C?ksVuITdVpT#}`C5+ATAIPu@we=*Px!e{ z9zK?4tp#bJ&*9BipeRk0>Ul$?w~$f@xVSDERGyoM8NMXte&?y6F`$}hf#7Ze-KX4B z@;2w%b@t_=##~gNY$p|SLkH!MZmOY-l*t_BtF1YT9Fpa(&o206QmWjkCaa<{t(;AG zD{)?Mkqh5ixaAHKT+DO75Ng7$Mr|fy;@3Y}&1zyn1R57u+x*L66ih(ax!x!ZgjU+uo?movG+DV*^ui_ zN$bZN@9`K>vxlTD$uZ5SqJp~$i99y?eufES>F#{U-AguDNV1M%GI-!hNHoLP{yb>iS4$(2C<%$eJHFCAn z*@yqz=gq{8GjZmgx%bXzVzo6@NQfASaBy%)-l;0;;^5$-?%S<|5ARFJ=A$$moQF8t z@AZ}LyI3rC6h{?%haJaJxx?PwV6peaA2_N*xT@G2>;#VL-~-ijEOz!@<_bH7qk4(O z_B>MkiK9Azt9pjT_B~YXeWbd0&%MOX;ixX*s2*UkCs-`%p7IZi-NtqjsEpz$58)~| zkSPDOjl&*d3#nDG7;GD%3K00}Yzd`u6`69fh(Qyv^6l*{27|#~ z-0kh|tu*&Pd-jZ)np#6cgN%#}n?5xA!lt;mcoj#LlasT8Tp9V&>3#$x5;;0LnxCKV z1FMdIx(;ke)1_U`jzUPSZE%gD*KbDai`(nv{t0Z}$az-BXm(XeNy&|AI$#?<$ZI!F zpqd^D>|QwKZF-s`z34GFXq($ z^C@kK%Ncb`zE+DLmvukAJU^=&ISH-=*o_yXODwH(%7WT-Vpz-loxA23;=KgMjHzpm^!FhnN?zyHE>bzim-ShCwd;f(dr^cyU zLH4h}DU8(JB&J~9GAwRLWb7Yti6Bs_V+&TPA3`KqBsMa`8EmBjM2CF-xg?QG4eMKa#}`=g(A1-i-D1y%Nvlf=<2y4RIF}4Nn=B zb!7N7b8G_SuK2y690!x7Qt8`l(v9yS+f1FM zGX+3L?F6*zOwl8@QuW;f+g?lN4zQ2|ic9A7_mHQK<73;4W5WfpOw7K0_I35}s8nw2InM|BnNIX5mou^i>Pj69>m z$SEjS$Fd}|tt(6iU=tpEm}dEGa8tgC#7M*kYSHztve%Ff3O=7oRd+WT!;oufwl6!t zOiHJB6pN;+{kIKO9=yl>BKo?xRyjX0&q(e={^FhoePYSy*a|fIul04UQK@@pqO$Oa z)4#6THt83@N?aX8jtpRf)ea#%02>yHHwv=XK2t*nDLGF5d*3D>2(q1e2aFndbJ-p4=@I?8m z28#o5A=J^D+{pWlXe#rhAe=6Ti~w;I-~e-98x4Dl6RJ3oNk= z8RxUTESI1SSPW%`eh6Ivdw;4$F&d8S{L4-hIB_=-&Gj%Pc(h;XC(X`ITEq08=&Jzz z%=zH9|HcM0vhsD?T}EsBcg{1WCC1HU=-w&Dm_p$E^O)+|- znUcYhL5Sdgvm$rzlvGG6r9C)723FT(6WuOWi(jYu2>Mbf9`H&SjujZ`WFnuWn-E z?oNM2MP|a}Qa);s9~@rVqM*<4vY zUUh(_EQJgG3FLjO?vggIP6ksxRV^xQ3Kt-Z>DT`Bwa=dV!Nnt5*%T!ASF^^o6uLL5 zbiZ-CY=o#cseYx|^q$1^`HB!w6$N0Q@c$;M&HqjEIg4WDyIV#1=X346AKOeVL?oY~ zg^i+0QkGj_^H1oG>wBZ;19cIbR5fnOmp<+8S@EnKep9lzcWMCEJ-z%+aewCLxnXqQ zn5(+i^uB^TPd6Ec3xQ!i+8aetlgaLn;rVv(;+Ti^h#rDuXzKZV&=#!Kpz%iNW@eVdm6UG}I(YoOfUs!et zqaL#dOPI2Q5~E?v;+l!PXmVqokWdq3G+yfE@MlfO1HB3+VPb!t6BPx~@vRlajMVyE z6+ImE0c>WeH*e)>{8>daNrJHUNLyA3uqx?rxNX|>laFPi;BQ+FQl}btUryWP~pExq&{V@o#{y;D#7C?x|R7ZqdxI!&5(6t7r)m=4BXD}Gz;sOEJ zYWOg(-d@avH!k~oOrwMMX!zbQl+gGuma9?V)CG zYioZ?MSf6idE(lVh0~JCULV!mEPuW#BhHw279&&JMmBB_rXk z-$bBj;#%Bfg21kzcKkv5^|8;xl!W>`^bbI@7JZp9SAHBQRvKtcLZ>id39q32x&KW| z7vi8JAN-^<1!^#6C=i%e$rO6ic!$W`7{=@!FM{w)#-U;<8Cw&w!V%fX z@Y2d$&N>$X6}t&xUNPaC$d4FsZA6>Nvg5kgd-?exIQbP%CEkA@Hk_q`{IsV2##-Ox z^Jcc+2y=rv$x|Swsb3okMv$pZQV+lo3P8Pe(Vrgl{w1X&V|Sn|0jhpcLiB;7>lRov z9SXa{%$n-Sfzd($FFkmQrT(MBb3A7g!B?N475+D8X5i4k&gr}YURA2Rw0I7XJ~E`h zO9+?|QiFN7LYJRfGg^VE?TE*G#Ol6Epr3Ph+D_Xzo$m-RUxApV61?W+JCyuKxjl{4lACGL((>7J%)&1h$3H&Tx%G5y{D@lnsOXj-J)<36m^1c@u>h@S z>l(NGJ%=eus9&TTMP6ED_Jg$sE>na;BXz_4eLI7@$1+}9#(^n`gJd1jGS7y(-ugA%{6IZ863*Ew=D_@6nRxqO1AL?^#7lNK#b)*`F>% zKxJVmnBD*8kJ`GbU0{Wwg^ycvR>m~uhfQNa`zy7Xnsxsy3~GAI=`I#ZZ<)LWR9~IC zumAe6RH$I_DE+@rJ;+l(b~3J_@ShHd#PXK@TBB&)FT)n3Hm2*x7l4xfq1wWYy6%`A`(3^|XU6k=W9>!kCq4 z97FjSHCi*+g^2S>JVo(S>DDx2F zxX$^W-Bsy*p3Lj9wVfAJm3;#r%WAEex8RRM9I{C8vHM~3d(^6E`^`sv-Op2KeWLu} z?Cgmz0UC81+>2|eV_8@n-Y|&_UFocIi{X=4=uGkvo#XZOM;ai40dX%D8}GHG>rO&^AbG2^+_K3IMn zu`_sbe96MmFmT#3I^yJma2YHlKtsO@;7bla5Nx~nMG6mbV@o)GaVnfWTPS5%gGz+^ z8+O0m`BELjfZI3i{8}P?JN@wX~cxaaw z1Stkvj>hvIvVCH8Xu5TC&4s+s0wAI9QQx$b$v`~8x%_j5`mC7~0Z_HG()Y2BgyJhH zGk&RAMriRraVNE>HQWVd{7*+yj(2apa{hE!nV8J)%_+|a$%mu>Ls5FkmMh(X=NN8R zT3`rjNP+(?zfR+jFgJT*KN%8m6Rdq;&-+=@Q?JRDHTDmtyY7kzcL2b!>h!^1vzyeKt3g>nT{|iFN20lFJ$Mx} zqaJU$1YDnVlhTNZi3e6_xSE@onJMZnHvlCijg3{0X)S)m-RX0a!%dB{f<6#}Spz}6 z7^NYfjI^fBmb>NlulRD-d!&Y|#tPT|6u{&u5g_Ah4_^Kb9QF+{yjH{0H-~lkk~C$^ zy!0((qC*|dyd0)W_*q}%)#yo|_)H(ZKg6yxYS>m{*J-Zb12v~O)I z5uOfBfx?~w`g<@x@nUu)GCe>G|{HZspj*Hl1p@gxBcL7=;FNB8D&W2@RM z?6^y0_+VK5gtgAVTtflzG2UVeKC!!@*B92sZp~MYk6EC6-0NcEQYd|NyW{)wlAi|> zjIF#;XI{i6Q^Q3|p4VN<&QD6{R-GDEkv{t0pA=`I<~+8$J!z<9U_Zj$G`0_;{kauw zQ1PYia50Se(>LcO)BpU}Vn9qHAtO)CQ8C{pnR5cxaOO-YGn3|uw0HVlRO44f>45*n zFo5PHruyX|#!AK!lmvET2MYnw8MB+<#zE27WnfFAhTtYP4oBB-OJ1hEz}fFNhz~A? z4a;Ws3g7Y}wcC2^C|eIeZGv;yyVmSn z&eJ!m=70wyn#yVDL1&tkK}p;F<13W#Z9=gpu;PFjPp>luwLEdSU* zS0XqZI~~PVt{(zT$9yvNCNZfRV>GKcsJ{=3ruI@Ag0FLX(`i9nSN^%s&;B%|-x|)Q zPDha)M(>b?|3;972S>s{J}z*Wjrx2a7QC`!G*_L;a=31IMT}aj1xNKYDouAmSJQ~H zevz)bS}x*CD(n_%tlO|f9C7{^^DjZrr8Uy65gsMdv+&(h(1!qVLu;avkmSAu%osac z^2rEa=A9P|l$7s%=h&HahA3pV6R*+R^ijnGt4Nzk%-0{jVf6)XlngJ%YOV{pgT3)b zFrWjO6VvHk2)K{y+3-*jYJk_iTx1h<_SAy!L#yk1 ziz?j(OTF3v9~ycBBzyNYl!tq~4^t6=7EB1681~G|PvkW@WugGtJv*xse`ZT->q^iBnYGFsD9 zu=BAk0r0`4MecFtyDc%hXT0$3OkjLVG^EW@Ar)ySsj}YnTYTEXf$9_qnz&`kSR|PA z*|{mz<1TohI)vH1r9x>#)1l)5?|U;hgYX^I*J@;p2avK^tf*@7axfY*_Shd*urInb z_`d~{Px`pV@w%qC;m5-oTg+2oB=uo|OOHWPjv!x;3xuvABANkRcM&B)1X-C0Jf2Bo z-3{u-F@9@!Qu0|!nW0F*(XqJ_mL~!Fl5-~8rUZn^IXdrjaX54;kzYoUPVd=S{4tVz z#tF)oLPSqh?1j@6^(()TSlBwXQP=H~%m1(F-}d>*HQ(qY&P;ZwtFG)6s+b+}>y>Q~ zYk0lL*}NxGue>}GvspAwNx~u29aYH^_&#rmAo>qg1TTt`$_;8jDD9Z{YK?^&z+L5c z<#`E+Q-ewEtUS{F?8aF))JunotM0ORa8m`Rrt4P{A_t^!5l@zK|H z0duz%U%B88_&bJDu4uVo^4Gz~$FFl<7S*Syi#R(wZ|tkPJNFP+O0%7}UmwXfjzn3F z&v?L0WFzA&5Mqp7cY{+q$9@mPJJ@qZ*IilBMaP$VOx7#Vh`U&{oJE$oWMt{ApR_Ww zyUF4|^S|GQfW>0R;MTW|)al@zo-a@<+D)+eZ_YksH)KPQ$mT-c5FijCl93?UgIeLmZcb#FXR*4y6af9F z{A}x4v@xD>&rmv!h5N2av#yshBzHe$vR)-2t%4Gb5Hzpi%mAmvTf`gk$N|}_1a`p% zo6}B1-pUJ}j2#+7A-!EgZ^Dvy6pzV|nBJQ9COh*Xe`#!jMS?qg6zCp1B})jvkn@skm8bv`8d6Ypd}PalFsuR#XEk7CP*(jq67f!;g`gk;_Vd`_1O(Cy(ZKXUsaKCpir zkQgyVTLqFC|6}DIdF$U>kd)Z{2~1&s9&XVzV5c|lF(;Owai{xlC>+sDY z5S)+`0@3XdRaW1609!#wqA06Cy$dmSBt4##aoSAYY%2>@$5#!)-h z7hoAZU+QSyEKQ~SuKDfL*gs42ZFOT)D}5m{>w_VV2JOlmlM6PZMd$&dvCL(-X!NGG z0PtGw&eu6`&x2RBQ6ng|u+%$6VpbT5NM(X#Kz$UFbZz@8lf^UAamLcqL-v%v?7@+C z;(f_uK3DlJsHeyhqFx~I0?9Wrx==`fvV4a$l>pr~sdzSdLqR$MK)d~iy4&CJdmIZf zZv_EmJiVZzcyZgBMbZRl|1`;74VD$q5vnGCbOY)ZqhDtOTMrBv%8(@Wo4YgFDhZ8q z-1-OjKCDGzRl%HSWLK?>u@&H`A`OD2quKHy7Qt1jxlnrL{$*z%I(joOK?30dP>1o3 zLzh`TRO^51?(P}%8VR?bBC;p73!Dg)*_;pfQ>n;ANi-Kbfg zhGKA0cFo*SBJ=n{|Bjqao)|akVWeXx3?bnr`Dvso3zxz4VTe)OuyqPGg=mh0|3+Zf+Syr#gwo-qD0eJw z1Dt+)U)$@T^;`_9Hugou0 z9V&du%gepgbD`GMh$LQT>9qPpW88#KbjN*qgY1qkAp?)wf#>aWZ@%WED?PWQQ)0Hh zLzE(|t{WrJ@lp1!+aH$0jp;0=3qHpq|0^)19g0CQBvrBKBHr>($ z#|Siy0`QXRsQ;ctnR90^QW5?nb8_1zM2bI<#W{U3IkP-+Hd;IyVX2 zx%Ct_5FCE2Ge&bLXw}&A+dte-ZE40JD@~(eFTElGGyi2cqWamA-NE+j4-Mc-bp%n# z>GdD`Ycj+;)vWmT3ia$%DD z5lY{flIhih7k(_fT#U<${WC4#^|E4(_?J^0j3bK6qsKeAjZtAm`n40V+jBgVJWem* z=%)BbJrV()ka2>{2I+;cjR`&jt?zxq0cttES8jLGJs%_|3&uCR`F@>N0Nyq3a4OI# zMYOuBE^~MSwY+q)!0HGxz=4DlRqif6#8->FJw2j-;7 zN7uIH-)A?_On4}z+XgtBHDfsTVB3!I*9&`YqC!Vuq?#)r;RZOR%{w36MO^s_bl?PQ zJLPnSs|T?+oG9pg8~X$oE{?Uzp&nnQO}Z+C1+$fm1WggI_s3Pm-j3O4Ton$>ZMAH_ zX(}6FLkfEkV1h<^#>qq1dTuCRa|-eQlbOINTq%&1k~2^YIAPhgTyZ#7ZeS9+R-0Wu z5&Y7uNkWNIc@5f_3HsD9UsKA=fbwtg0D7KK=cC>4r_C`bcI6N|wMRV*&U0|I@6_l8 zXmyL?A=6$v?RpHhL+85ZqsZ=jQV^5*`ma{8c)!2Zu%u+h+3ju{O|QC00a%jJKO$=) zoO;Qe{3fvh3#(Z>;)gKpB5+f=RaxgT@Ki7l*4sSK6LNw(Mg6Z8_=Ru*=UuP zuERIyhC^Uoz;gqPw|&iNfRJ5PMG!dyhu|*_kUIFuk|;IcIF!~xC`)|XF73U)FE;7Z z8{IUs52kjVc&Hy>al>oHEk|HvHjC1kXG!QyVD~Aq>9rEkfj3>R{g>%6M02W)Jh_y9 zT@?I0q4XP50DQ1S-1(L{I6T`dat1w8-R7@v~(|rG+ zDo*SXgo~%p$zay8V0N}MU(QA0ckh?Y=7+JmEC^b#<9(PW+}TI z6CB$4y3}`QP7d z>`SQloXn1DFAL#khJfzvX6H$T{=S6osa!rKXJS6 zrp%ap55Q~11wI0jukBm*B7-eItorx~{ymzWXPpyM5s3brj-LON3jI3!PHR~_mmORH z@lGsW=x75)q321|0H1>I$kgikK1@&J6M%nfipKX70_`L!{c+OlHVk>v{bt-nr%a;n z)M3RmOnj}}CxI&pkbl8fI@yJpqU~1WmKlyNMV=mzCUvs(US;h3%PhpQ5*k-Er7YdG{7?~CB$zDT7zDsz+vSUW<*^5|3YwJsq3yZdgQW0XVa z=)bj!KIA8sEMG%}{75T=FP}43T3ZrnDNOGeCsy_qh*^++f4Zr%?$eEJ9{V+sSLQI? zDe$2_rjR83to+01QNx**pH{D-?FQJH_f!|y!fl$r&yO>pQvL7bo0QxEE^45S@~^yV z6gt}XC5ZgwEh5*m;nw##Er^M|SCe~k;R!f!ej#g{3mE`wEO+D%ly*uBmTex5Y#AFI zJWb=HHRmp_G+htTWWxKnqew+n#;jL1WY`q4=_6UdB2AZ92tu5#zDn8@0ODu=xy59HA-s(m+iIB1f*6IBVN8N?owr zr`cGo`)JDSh}q7*m&#OwMb&_k5#&tT(LCac^ok0Mr&GXtmA)1`E?b0@hL~;^BRmf4 z7gJdXC*qX|SIlj$yqsoA`1ReGk9L@I;kn#A;pu;dokI_|CV%*blng!(oqpV4|HCC= z@gOiCL$v{xFc*H@%ZrjBx&>D%KY8@&sKdb6CjaGmRimjpLF??hwbO5j;TJpFbde@B z4~JY9{*a%ww1!&QvKoZ8m#d^{auZSz2~{e3#s#bHS2^!4Kwt4?hMvyWR=V`JK{S8< zPWvDX5Q>Bdmkkrcg%E$t8j}zH>0+78Q5K|P8Zpk^X)(*%@2!s>zRjzhT#$7Fx@4~v zK$;3&&cG%Su=x@Q+}0;(xot=!18O(MB|!X5^JsGxW)|SX5a!>Oi$V_=f?l5b1{3uJ zvLu%>z_$kCSFb_R`if%@9Fr3RYUr%~{@~?EM8E zt)*$Ao&lpjq0>MC5gg+mn}W9&PClVcvEUYb?dz+FdWVJEu^nBK&+%U$lRnW))>i&x^ju-Y~_@#_}ul&kW=7|2D&OVZ&3rg4I1EH_j$80s}JH#VV zik1Tcb?M%aXW;g8Kadb|X@B}-)E)zE$kFCyc@^D@@^=<-p_JVXrQ7kOnlHHbUaeVc zceU5GggmqRw_z8+SK5)qLzpSq+CMW&rK?=LRk5%{$r{w|7fL?P8fYl<=yqn%@-4Y| z%d``t>pP?>0>4I=D2gIh`&+N&Q=r0Fq}gLOQ%{)x4DIKjvbv%!%#T??ASff)<({foZev$ z43G+>kZ0swF6lyCF;dKryZu{Pg833Kb|-)H01FrP@$ zG#nPSl}hF1%z;QgtRNuQ?XhI1{cPVJ3myiad~`~H$e*Rz#+yYmjAv`y9g7YD#aEA; zct174loBc8rSIWi=;V@=KA$(%Vua*xi4^R$`hlae&0A^_Dy_^N-4ZcuZPDSq@{!dLp&!Z*>_nD zk3v5bV_{n}7ynJ=iL=Uf z9s3x8b>bZY&l$=?h5I)I0*BfXttS%p*PZN&H`~kmtCXO+ z6wrmrB!TfuR63eIqJ`y3IbO7tzGhd=lxe%T>j0B%hp zG#L;0Cp#vV;?Dhd5v8#>w>waKT9>!={dKi5N4h!QWdelql_q0{)rV9`JJ{d94_wK- z#y6tM)r**~W&9m-MHT+p85KI09=vDF@S_-)mlV-h{QF;X)G{V!(iCGz7hhWoq7}IU zs+zmfgpG56#dC)Yq--jl)=gy^>wiI~9U>7Y7J4$Xi|9v9?96Q(H8kS@h=_rZl#Dj> zpsFe9UBJPhcbY43Q>}zrTa#tqiKvx2?-Pkd>xsQ0lU%TkweMq|@_7hXI(Z5Z_U3Yklzfl}m7dsO& zIP@{3?Cq2{?tu4lJ5a@yH6{gXD>g$JiF|9`$%ud;{~;H`Dg_Fv3Hd+222Ol@#R_Sx zQhFx9v=vjB?{BjRW>i~D&U6i09!1jL-u=jIU1Dmr1}rcJh5mx*DKilRC8;`);@6;s zQoAPVCF}yBzov=_Z#2|?iJLlF&sqDN#XMla;_p9Y>5E`)ufM%T^-sPzygN<6h5k;f z%q1Hd9B~9GCz*LOConm$?z|d)o>|ZMEcmDVA=eAf`iF0m2fA+l{bL~%!6`?EO;f(e zpp9O5vZzvhYU|&gh!*xYsj7Y=H(RQ+KPWB18Dp7O2id733-B9n<~U)HE4-%KOMM7` zE8flc2ytbwEm5dnsQ<>(kCsL6h_?J)G{SW2RHZM}TW;zv%jfU}tzoi1ZJQyEIIV+h z(-1tNf!8h~@~=jw5zAu$Uh@WpN&M#iD8t{_{jYWdjg*wFI7#%C&vVPIi`lYOpOl<# zJS)e2U_Nb4%vC1(z~~$BayjMPGDTy4Gav#ClVAulSN92f*Fu=w<^GsWW3uEsOwJxzQR_F~)^SRzlihXg39M_9!Tnq~7g!Q*wmI?wH~ z)z7`nd~qI0)VTbm=URlBjfUR_QFpnH!%WuE3hw;b9-;sB%lLT1=2|6ajV1@$=U-=0 zuZ0PRaDC!-kOnOhHW^I1jeoYvWAk5s(I>_z|9}_XJgI*&KvTH5tF6*D&xKOCaaUx< zK|RZ`dH&O?^qG^tc7WM0!ba+6z{s;?Z?662?)2}Peb)X-{uW6d}He1?Gb`eZDMtFQ%`c}9>)63PjKms?BB}1{jDsXosWcIiYzX_)Pt$!8r zE95)KRqLFoVDGM@nQls~MwKw>=@-JifNW?fQUBN{HF4u-0iu&nSZJ)_$qghnHM;vc znO`pjv;;_eZAZ^0UEx(nd%~ z40@vzocsW+F69uvQ^?kb@_*;Z-32ACnep%|?23YFoTg4@!XlV(9ixOqw>Lhb{BzY| z-Faz;f6B>rp>H%Nhc-5BMd$4^x_h>b`)h*v*MSJphflFgAf9NTVNl(Z<|EdrxzFMw zrly_hrYISZ*?wBFxwz0i=ib&@lK44(vb~fe3Kx~kZLiVcnrgXO4|#FKI8L?tQz@m3X%OjUI0`Zp1q%D3c0uyCCd~?>^=p$ z@EMdA-(-KE@^4G{%sWldk&Q4sdy-Z$MZ-IvI%Qa{+FNstcHcWRZ;l+SBWxsrs^phs zeT~Vl_V0Z41CwnLEAldwyvO%Xm8t${Sm1d4_IAWM-^jPxlKg={T1^2HTBpMY_&`5f zI7PHW-tSY8&c;Aa|9ZLvNk}~O`@BAWc!1Ewi}-n&#<6Rb))#;A!P22Vw=%;bz)c)s_pfrQoh$pYG@nO!Au$mk5vKZMJTuOQhgn7@!gE zDjR~bq%XX^rY9v;2CdUbHf?Td%e}xDue$yx`hXzOeW@}`GPuVDx4xaV`5}Y|WTS5S zdm&IV`jl{*5ad*iBk=|m`!92nXl(48IsuV3WsBT2>b*l4I;?|DEYq1B^@BpgUY~bL zqM7+getwER5dG7!;B==g)`Gu$ak$hNh(PXYasSGOHeXNij5R$N)vtDnHdOjy zzwX(daJP^DsAJH*4G`lPe#nyIDB%5sFnztwm@vHid*VPDIYVD0<$6xs#>GtTIqzY; zRJXB{pjB1QkTIAYWfuz-d|48u24dwD8>JTu*jjolvtFwBzH*z<0|T^0MJuHZAa(2_ z9ZyO0Cx^HDR*CI26g<6zD1w2Pbv9F54_E0%w4Sr+IGOq!fmaTD(c3q3(C@x3W8i%O z(E4j_b#@hNL5&+^Pz8F|kx9B2^@wGq&+z9)nN5z`DNUYS?j~=;nLfycGH{>n{lPr( z;p7AVWaQO6>kpZ2qYh;rP^r#>xo>5nwwuX()i8Tt_IgL+d;a?PqGjO+;6ZPQ`M%?m z2I>&rIRDH}mTcyj&vx^S{>ZuT z{I?fVv)kGkRivWeJhvuK?!c|TcscHOJO-~m3n=CMgFjHCQLhrb?chl;Lr<)to$|Z> zcK$fA<1@u|cLs$ZZO@Cwaz7&*05yp8?;NQ2mKp`0>#?8|Z@hn|qczKs9EvYd=8seE zeJ+(v*q{MLs>hg5mfAYTa^V=}_>k?HWXdapYW*sT3Vy8o`jl$4PWAn_6`XfUnu>LA Hts?#p9fcU; literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg new file mode 100755 index 00000000..e036c2a4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/php.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/postmark.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/postmark.svg new file mode 100755 index 00000000..720dc8b4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/postmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/resend.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/resend.svg new file mode 100755 index 00000000..c9d7529d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/resend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg new file mode 100755 index 00000000..194e8bcb --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendgrid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendlayer.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendlayer.svg new file mode 100755 index 00000000..59f14131 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sendlayer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp-com.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp-com.svg new file mode 100755 index 00000000..64b9351d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp-com.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg new file mode 100755 index 00000000..770be9b6 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp2go.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp2go.svg new file mode 100755 index 00000000..993a6043 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/smtp2go.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/sparkpost.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sparkpost.svg new file mode 100755 index 00000000..8039da5d --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/sparkpost.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/providers/zoho.svg b/wp-content/plugins/wp-mail-smtp/assets/images/providers/zoho.svg new file mode 100755 index 00000000..0bd65b4f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/providers/zoho.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg b/wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg new file mode 100755 index 00000000..a2c68d93 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/recommended.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-arrow-down.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-arrow-down.png new file mode 100755 index 0000000000000000000000000000000000000000..f9bec5cb0bde4fb751899f26cb0b798fc44c4daa GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoM!3-oVvX^}UQkDTeA+A8WprD|-y1Kl)ytK5m zs;a82tgN!KvZA5_$N&PMI5L2X{MNZ`0Msm0666=mARw<`U=R?WP*C46fB*UW@8AEL zDzFGBTkPrL7@~3h?gekLW(5J4i$*_kJuYnjf7HrBpf~4$)Hhqx7n8h>@rv21GCX9x zwA0>GT>PW?M;CQXr$tI~9doNJG)^-ea5rLDrew^ZHg`&j&B6eNLmNU1F8pHN7k*-` u%zP`A)xV*f) zw6wIUs;UeOfb5Ej3ZNj62P7c?nca82k`<_5xFpCgm_a~5Ucta1AU+`>zrJDq{`2?W z|9Kv44wNqOba4#PIDhrxX~6~s9+nHPANjQ|)vsr3Vw=Er$64qZuO)-R#(Rq-U)RoN zGU;6C$Y0~JV37=0SAlHExz!5$4Bv))GgNPr4BT+asg2jOr9_4&&eLQ;F=t%k!h?a= w`y5+Nyu1+F@3kQ0Bj3!BpUZW=xNnxp_i5*EcmdKI;Vst04Y#s%K!iX literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-check-gray.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-check-gray.png new file mode 100755 index 0000000000000000000000000000000000000000..45179aa9f847d2a3191a96bb2f8aa9bd7c685bbe GIT binary patch literal 886 zcmeAS@N?(olHy`uVBq!ia0vp^jzH|d!3-peN?%<9QdTO#j5qoR;*sOV(s$PK(v18%GFC( zu3f%z_41W#m#tW{V&&QutAPsEEL*i^`6{3|m|U|KWDZaS$OVfm14;qW3Wx|;8PJf` zYd~hM0;ycKY8{XPG!twHn1pBnlMlT2tpK{)x+KUim_a~5K*7Mkz`-FPK0YBKA-|xY zzPE(f!tfFom|;6+Vg@0Y*#PcM3F8vAQv{f4JHXFdHcX)x*dSv{W9 zS^v1w%tL>X!Rjr>i4yZ;AO3wk?f1PK9S{D@Y~XDSJlk^rmg@TY8hx(bz<8#a2O^|d zJXkLkDM*_$<@U_se9*?hRN%No=|WNS)h>>0``8>LuH~!U_X%m?wEEUD=ibv(maiOt zW`9hc?7<@DcHre16B8D{o;~Rc6=j0O=gaUps(3Wq``Epyk>7C-8`FyRdlwxG7=qK^ z-g)$S#_@Bv5??rOs}p7}s`0NaE_pXtn7vN#+E;n`bP0l+XkKq~pI4 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-check.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-check.png new file mode 100755 index 0000000000000000000000000000000000000000..1eaa6751e164996f0dc627bfbcf6ac95d10b06a3 GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Rs{HjxB}^d`3(j0`!nXZXUy+U zo!^x;zbj*YclN@*%=w*}^Lw%v0@*zoVDYSlJz&A^tc6`bcGmpPtohxU3%Y??vKMq` zFX#m_vgY?>E$GTx(49HI8%zQX0jlZBT+jm{fwDl;fVw~$K`OzD!ECSsh#*KW7y(TK zF>21N`wMidc}b98FoS@Af`Wm8gMUCke0)MeenCNfeM3V(5KNdbZ{Ga*3l^+fw|@Ql z4g2<=JAeM(z577$?*03J%KvQkFfcILc)B=-L>yiko|`<`K!8t0)ZEp5X`WH(YQI>s z7|Grz|Nk3DYh=dhPyhB);*-qxI&mka1*xAelohqFdwP~t*;8ZI#8r#;Yj1c{^V7fT z;{NpK7u*F;ujuG!sJ+Cr#8_|fgEwF9`wN6C{_Ax~dih;$dd8ina&_9m7j_9v`e7~W zx2^tI`sDwfYKJ>moiF#z6RWZ-iKz2^;davMU_)B{?`wukxd%R%{QtC|Wk&K&w@>je z8$Y;8PFd3MNc)f@>k_7KGBRgK8tmHU`B3*i-| zcvb!A+!lSdSIhc19X{!4EjXXc8O7jSd%NHav!NeKBEDWCbJQ4Gzdr`LvjJF_SAL;LR%PQNub8y-CRFfHKq zk=@;`)yK}AJyf*%c*lnam3M3Rmfv|K!QlUsNoM!NZF|iv#J@2lytw)>bD9zS!tJa6Kcht)4mZaVaF^@qis zd5`{x|6r5~PTGA+iQkp literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-click.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-click.png new file mode 100755 index 0000000000000000000000000000000000000000..737017592450ebfb0ceedd5db5e761dfd46f5973 GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TG)d4;su0VSJ{Q2wGuU`%V>zA)z zzjW!UrK=!d{jyc-maksDV#VrZ%T_L1xdte{eEHgCKsG8@2UG);1quQcfEYlLRcjA5(*0H>l+&S`+-i|zkmPv^XKp1zyJRI`=xJ-rvUYA^mK6y(Kvtg z@@=6e1(DW7U+Woj*Y;d`)9`Wsf8jF4l>#RBwxuVu{nU%7He)$>!0UYFi|Y~sb#ct+ z>z{qp?^8A6S+=sBb%N}|qR*lNTr=KGnX^MOf%S^n;xAcdx+i00rOdoHvrMZCbC_FM z`QP%okOrfkEnnWO-A^LzE0@H?Y>CZ{nNu1&U&iKr#g~l5p)YFwmd~!)8Y-cD^VXc% u%G$bdGw#IPzoxxOO|Em3wxRT=kN3{;S$5u9_oxNvcm_{bKbLh*2~7ZuYs)JD literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-email.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-email.png new file mode 100755 index 0000000000000000000000000000000000000000..e12acc1cd6799703123d472df2f752cca80aaf12 GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^u0ZU-!3-p;=XtFFQc(duAt1qq`Rf~|uLqL#v(`5N z5s*6@OwL)~IB#Ra-1Uv~H`dPuih$S+^EWiiTi-Bu1A;LRC<5Vv84&Kg4NHu2E&xrJ zEeY}qW)M(NFfcH1a0rM`$S$w`7JwMnL|zv&E4w&nwR1V3M(#vaEmhv8k_apFR*E zn>Xnk&^vcD)-rhAS(C-C-66H$zMmuOx?8c2+-Ba(J-vJB3t@&3%?WOdPs$!03Tlfz zf3)mO<&WmXDd7yQWl^ce%cms8^r@Elylg9P6g~N-eIR77k|8c zm7rwfX2~0$OcI2O{xM1m* z!`JVW{pM!oi^<&wExDqtHZJDoxMu2e_A#Tyu^e)0732k&_#aCL^mLq?g`QkJ`tMC1-EP3sTdBXwEKZ{Y_9zr|`xKB(<~ z?8U{Ykp0l5OZ!~rzq$Kd4q9C}^it%?&6wDwB3Djt=VEkS(ELeUql&%j*2`tP4zK;m zW*t*8Kl0L1Bc{sD&!_!a{p9%d$@402daZo?`cwT&@eo<#={~%FJb`=q6m9?j literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-error.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-error.png new file mode 100755 index 0000000000000000000000000000000000000000..22911743de0a49394b0cd413a64eeccaab87148a GIT binary patch literal 815 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!W(N3#xB}_(1_tL19L_s9oHwvI zZ((uW!s5KC)fH3I%O)0=Ei7)Bm|rqByJlv2-OS>Osl_#O^DE|-KoZEk3KRjdP0g=> zkR_0P)!gE`xy4nWGBXeZq}~jO%&(eR0!;v_zXlWm30ht?1!)8_zzTp`%t6QuC;~(v zT@SX0XaF5&R1)MD%pf2jprD{&VBp~39}p0qkY7+x-_YMbVZwxY^XAW=zhJ?-_3Jn6 z+kfu-`SbVgzkC1w{lBVfYp*ddFbR9QIEF+VUON45(k%m?R({p5)3!yMt=YO^qvLMV z#R*(5{>rZt*PLCiay+l}c;`Oh=#8zs8ihB{*5}I_Z@&HQvp?^uM_KPIxVGnbzvTXX zCTYj{v(*J@Y3c5|`%*q6ibU>tS!wd?+1vH*F8YaHqH@3a_W|H2gVrX~jRQmZ@`|r)K?n&AdEMNT_oCGk1m^Cv%KXeLj;L;dD{) z_-CakmnP?F>FhNcSz=u0b1oG2I-e5JDsMjI*JSM&1sJt5(%zwkT$ug{sc!{V}*?WybXdv|RKTo$@( z&iePg@i*5yF1z&K$=0f9eHQ<$kBesKy!!DwW&SnGKXV_&^7RLAjJzZIX!(3m-{42- zRfmo8=G@;JYOCL8>+7!9mo``WFMn`BxoLK#((;en|98*6@wntxeSUW#!-3;@7xUX* j|9|%{x_sr+y$lo19Gc_Ps5J$cxEMTL{an^LB{Ts50)u@c literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-open.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/icon-open.png new file mode 100755 index 0000000000000000000000000000000000000000..9f68a8a9f2c8bebff74697c6979d106338c10e86 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TG)d4;su0VP|2&@N!C#n8 zSFK;QYW=cR>y|HHy?piRWy@ABTe${^R<2pMbor_kE7q)7vwqo%waZqoUA}Vt@|CNX zuUxxq<=PcMw0bQ_*D5e~)!OB&)+}GW4k)q$$XE&F0@*-vEl?0huGG%k1hihGB*-tA zK|nx2LBYVlz}~?jARsdui}?2?1NCh8ba4#P zIKOuCO{pdY0k?YbQ$e>k^KMR>RQX^1&7u&e4SF`)pC^|!{O4S{Z0Yr7vu5rT$*X>7 zZc^w`_;}i)^y0H@Qw!Mh7M$U!c`nzgzG3cz19=`hE|u9BE2P?AmDm+l`}M^aC9CL7 z=L&Maibd4&o4Vb|v}5h)WpP(f+-xFr;GgnUo*Or(iaV^EF?02T*mXA}GzCsat)0Dk z_lN!LJ?A-R&di)Scji79rSe9W0FMd}0|SFVUJkB?f$DM?cy&^>zRLYKW5UaqSh3mON-2=S!ch_S2or_G zV-Csy{BDwI_+tsM6wi*dTb<%&po$%M5o7Jt?v$JiPo*gMC*=5gY^JT@6s)@z$Frx$Z!OmoJ-!;8dr!v0D?JISq5qJ=aY!oN*!?u0Y>lJHJ!;@k5-Ld&)gk6+QS%I)24;&hJ`mb}uK zAMmO=-iR7Xzc*^iWMH&e&wq@DjXZ++GZt0bYV$`zWg-*m^hpRt(9!Y z4aUBbH$(u^DLmS>vCaE(s_-A=xrZUxpCzi>wI7?(xZD1MB6%As7QEK*{&Pu^6EH|e zd{J|}uN^4chaGHq*F1>}syjc7%MSc6G*o8sYCYV3cCSeiH@0Gbrvew`VLvR=fAU5udh?vb-(aRto2<`}~Bb23n&?!PT)S;Oq1hI!BbGAkWMlM;KWHb(F zjZf%8O|aa=j3lLW3o9#hpiHOL822}V#`!@mLVcZ^9kY6$v(d`QF)_CH^8go(#2CQ|56V8|M;rN= ze%!Hla{?&gy>j9RcpXret3m4G#PgD@*&);KArug9(h~|(FT)weU6X8%$-JD zVF~;V00e(Q`HZSz)T_03GN2`r@UG1TbTT>Z%nh^hG5PLQSZ#m)56h4V!0y9MY22x3 zeIjK8$B|xt`dKLCqV=J>xvz_7D6SdX*G2Skf{ zdwZUCSn}f*hsKnp6Ncc2+dlv$9Tf~a>;9HAFH=EY_jth2A`1o3j?-rxO`P#R0IdKG zVVn~xu1*^Hz6ZDk)khnbDL<$R#4-$mG%7JQL$Cc55Lz=J3ZaN3j$fUol7Gx89p9W4 z{ICX+k}@8HbiZeTn9F$$o--hn79T?47l#f0l~KfXFL|w`@h}oe(TTfn-tx&{R_S&1 zIJgN*qh%Qmi02t)5*hkGLZkdQ+ix>PGB=-k@1RS;n zCBtfwq+w`@o)t_$#b-VKNARcy2ft!a;X{DXkX30(tpb0 zwzn(cyqThE07IpGs(!F;A=2R9dGjPh=#+LYD~-a#Y-qy4rc*n=lEvqil~8%|ZVnUE z%HkqhYY@o!Uvn)7Id4-pz3MSJt?@!6ZF~2VAu4+nUiW=V{qK8z0?+7ZfHOEX1AAhg z&EAu>PtCE+pQ76t5fF6#+F5lXT9(rpCQ38SF<40>L#IJZ#>j zWU`#HxEP`AJdD}{QAzIFVp_q$x7T_1i|&Ha-p3?dmV7Z}xUsf}(|sAYB$TnnL9zrCZ06Vh+nk=IqG&x^J}33gI~ zUw4jlqy!tPyW|diDK7@N?B2ea%u}JsTE)?K2e;;Wq_n^9Fwt+%Hm}*fSf$$d&hugA zTd=Yi%FtC}x+_{c$i6-_p)5{IaeApCH;~Wcz8<{X5D#v7bUhR|;2s{|DA^+&&z;5T z%e$vn@s7K*L}OmR?wvD_LD8G11_!sTCSIutCIn{rhOK3`J(Ger=hhn+id(YEA31jK zJ&Ux9_RHRv@E}v)z})!EPMS{IB9p5`O>*CQ^z+2>*qm?I=**-GQ$Z%8D}ipPMM-Wu zD@_R7yWZy4W9xkR?jWxH@z6qJ{i{r7sRq%5Q#ze=HdkE*?V>r#+x_s6$4pPJc)UyJzMSu(81Ly%PpkjvHUE-zW_I$&8ULv9GF;ao)Z~P5lx%e= z;>+>&>xXqV86~~SUm!wb2mfNttu%|`c0qp z(fG+I6+K^>trVb_l1apZ!x#Jbaf?icO9BO1sLekKb1v`wn=`>Jzanpq`%Bi}opT6(|QA>XbDxL1DYsQMj0ms_HS z0c4jvCc83$R&UzMpZUdS7qNg2h>WBFQB9<3&8dAs+}~f2H8rfCTZByA-<@7>&EM~P zqFMzG=Q*Fwj$nWQ0VbDj3M z6^z5J0?Nt;3U~2?7s&DZwxxsx#0wPkUhgrKt1NftACi-WS?lRrt17JjC2!eNr7{?M zEz7v#_`*0mzm*5hzN{BpPv zi7DLy@HI_Dm}wxez`nL!WM^2Z0=NZ@fNyYQWdp9?855J z5$Gq{PSx--XB@-JKAW@heP2iy*u`wDBb0lqv^(O zUKW#8g?!7!d;KJj5ve)YErkssU9P%{FJUJ^Hx3Thj)y-VywszL8>=qegflH9P2#}^ z((sANPBPhOE}_s|bHnuYyoGUD`}s-Z0t6 zM4KBIjXbZ|y9P!w{+ulCrC!Er!(2vW>A5QdYQy3&#NxdY6X_}gk`e@?KBncKi}-|_ zVol9OUqr1`$_F3lx=pJ^2l%&Is8Vpf0nu>((rF3Nue@;6KX(vY+)|cuNCul8lytGC zjA33gnXVTS{?v3XM8PevUIli@8&0nX3>!VM{|Y7%i?@@U60G|PA8;;~wUL!2A%fznSi6=vX|X7pM4R59M^kijgCv z&cz5@|6&1*)50sjhERaXluj1uU;xE}AF)i(Aj6l417CiV+#CJj(bIrY{jA<*fn68T zygZsy8NeTo# zi#o3PT)aWebN_Hu{qC;y0Bc@(TCv>Z+t1J_vmttqqYkyz{Rs&J75dN}wRAe&+`H?A zX4IjjSK@DxO6mIBZqA(X14W+3W9ofZr1I|UT5W3j?WJ+$_qb?J2gI8%|C9=|F9ua zBPyGUGE4~L`9w+HB8ne=G*V$ixwbq?;8dyZF*1hds zZ)fL_tfbco{6w=takGm)Gx^De#|#9<|A_0(1Iwi3X6;_4{Q0mL8d)A8-f2RKEjW3on5oC*ZzGzX+~-qa9W zyI7{T+11^~9~MH0FG-AI^3#9|wdwjQ`;8}|@fcbW=LS>n+<%K#t*c~)K(9Hc>j!(E^IO5%CGb7;^)f44Qj zz+-upo!xMlk=+>eRKZRv3SDz!ZI7n3CUIyvIP-gI_aC`?Vy%nVQr5a|Wd}}wn4`d! z`Z&-+RYni4-Kn`5uwVgsAlhs^Y>5~rZPfwXaI@%d?E^#*3pP>A!uIV(t6;-289?1= z^EGK#2LSZ*haFRP!0m9eZFTF)+H^w}E%WhPy=VC!bON#+ZRHKC@Eb1orW+gqw;X}a zZ8bwYhh^*Y=4BG-HxM=9LoH%2o{d68}T zp#g^8u+^VYYV$)ngj<%A;sGygp@m^_GBITOXFOP zrjbCsNkP{#|6Xond_s)7iJ~&Q*p4<_6{c5qff@}-;K6>zW3K*qmY2=atZ@{9#FKGq z)gEg8WWy!6^=w4d?F*NT-WMfxFnL>KXa#_ds`?tZS327Aex33ANy3#?1O+3zrr8uR z%v3+|9Xp04kD`L<&x9IJ04VeZp_F&QV&E0#zq%}5F9XScyWr5ee)?9RuQsKxngKbr zFOa2=7r!OKz4MF$Hzq5?!f^iB{V}sjyIuc@Ufka;VLz{|{R6swTks)4FrHSD*)#`f z!Sac{^ov(H`ejMZPX!=EtSN<7dJD&@pMHz2+WHB1^Vh zM8)y#)p|=sdfk=Hz0OAOtrs|vuwzWl!M{*+X@zoZoX>e30~E!uB4`gnkzObN=vlnX zCUe8i#u-Y}Ps;6D-!R$C7gD;O)MaQ&adWAW!f1^)l@}SsOWC(YRI4j0`8Q>>KVhq- z58v#393UF|+&vB(4$koJ%y_!&utt^CnK1PB%3*0P)0H+tb9SGoX(f-D|D4#dy3l`i zIo+$=Mh#Ch(VzMSq9-9+SyT}INogc zddYmF`mUI#6mxm_@fX^hz(A(2yMY8*c(uTJUU6HrP;29gC=`Q%Wc)13x?wh)%zeFrV!m<7W?vmNss*acipgBj#(Y zXkA4asqispF_21{CmlbX{>#te>46P-;?vjfPw$ouRJG5z2t2$CEMCs?2!rF~)_11KC&-(gb`)ft9B``+HPbb! z4_u}~S@BpIkn!bTTIWwl~Ir2iI_QUYtX5HHSRy=`8ke{z4kxC2BrSQ-;bT%}~ef7wew1`Z9K6 z(bXglap=@4KTBmY{;-qovz-2yL(&i#UmtU0eMR&pptg_o!W0M^x#!g==+xI~=);ES zGo=}D*q}1D&)49we=B@ydwV&M9L@EPBa-c9>`8LU$!FxWeVI_W{rVtN)K_^{Dz@br z<^H1nr#y+!FVRC}D3X6qY(RX^y_eRZnL3y5DD1BJ#^aTFYg<2gjdDHvb)Mcy@}|&Y z-ptF$daFqA$0xr~Jp)m%2tb<=u6!Xs@L=!4vu|p{Wn<5%ZE#BwAet8-75MWXncw(? zY67_54Ucop6MA5gfs|qm3d~ALKj-)#%Lirj_&Jhm2Lb*6sono;(R-{#sjt`-R&w)+ zeUw^Au$)FLHufmH`o${SV*h9Ep*ieHGg{o@XI{EDD_77pTrltFn5T+_%HzKdL)$#Q z)zm^_$A+6JiJCYq=Q@`}p|P&gi=2#QrqX~XxM?IohF9k_sY@iYWZ{tR1S5dxfg%p% zTRz}r&n10`E^VI$F+_)32_gmKy*N2`m!g)_j_59mJpFBJlyB}k zJm*v7xYPf9nX-8GnTGmkwrtK1GmUJZsCv(00|^SlDN#!oR7}l^k$UY`D%5 zlHjJ$fPOw>qMcRr$dOlTgvjna4lYmgg)J{H7qQ}|X%PNdzrjLaF(Y=~;3msp7M*u< z|2{G=NIHv|ZuoxtFUU{^Pv)IqYzD;FDD0y0s0FR%CH&a0DrDanF3-JvypCiH?5klnM4Ij`P9%||D!e`sz@eNR=zXngb1I6 z6_l->(1!s3?fP}n#aO~&bl)6x&7#(5okKFIROsImhE6yUMZ$Tab(YQF4y%}R zO!=OY`A#NsfG4ZxmIaIER?>i$OlD!fPC^h2{#?Q8%!=xW3?i~D4=!aussrq?R3+^| zO4%QNT~`QHVD(#+F3hz>Ar6?dw-fUR|FSKwY_F4mnsih9B(d!}{Ud|Rbz)8h=zcTF z=lB!A?M0g@xV7b;X;A874v$GoUDixJzrBU71FPFbS=Shl0=L9ef>qXt1`l4QDFaCm zZ25Xk$93-{>S!c`$Jo8ea`7zN4VcT0B=6r-Pq(?1HO6)7fASMVz)vgxGcs{FX$lAf5Zl0Wx4@hxdnhFnF=g76?eB%kFR=Y*OYx6WJ} z3?E>XO8nvKZD|Oqi;v@JB2ZK-F}?~2P$T1@Bp?_g8dcxG8y;di|gtrUhsTP6RXCi)V8q zm#f5i1RC)5tE#va>%#@ zv6)Nfi;5wd`Wt;QhrJg;43Hoo%ZT*zu*0=Q=d|W^LH$=%Kg_0opP!)M9D#gXME+2$ z*PA5{qK5Wkezy;@h> zv-&TD<{S|AE^6a%zdFjgY_eaw)=!iT)>71G_Xf&vFNF{eTp96DH51pe#W1?Ny*Fg)Jl&NY?_!TA$Id85Q>-Y zrAqzD*uBj7Vs#gFzTdPx(-t4wi|30omiTaxG_HZ2EX0HiGTenf_x%v1IbA*euGHja zY17r0SSRH33-(iDn*OcJ+$g&0XsOXJ>71t?=tSEM&aiHjiF;q_uTdG1fM7`|2lfq+ z&Uom4!im13Ay_|TftAjcTEdAy#jilc2trunXWqExC@!)fjfhJ{$6gj>z5KkP)W;O9 z;pQO2mY|G(H{!ON11Z$*-0UEy`u3p3>ImkW$<;~@U-XlEikzCXW9Jl(F3M67cUYQ$)Na=!`AO zHMk=}Cs`r{`6lax=){^;{k_m9)Bd3zoAgl4w=Vo)z~3Kv{j-^f9uY2Zo_e7>83Tfi zZ&zFW6d8Hla5J~kFAwua>6WWGR_h43ss1h}`gPRJ+UGUWl(}uo_8>qY1X+iQ`)5g@C zrnsIg%F*~r0{EDb!xdE~i1MmIy^fLT@>waFHBYm5&>7p8986mKMJT_o3W70DUDm}dlBv|{=xZB$~13*i*MX%YC3vNU~j7CQTpIKo0tw?*lXOxMy|ja z%5XG~Q$r0(nRb3+E`UMNrCroDu_gG-^&{t#pUW?DneZ?U5%x3jUpuF2JKx*B?er*^ zWej~F9^58uI7+6a58ArR1nOo|U5_)*`ae7IeB97PptTHH6E=)LjyFKuhm@k8xr>N{ zh0by`08NvI13wF8r3|7$8NEHVXXrzj8!)ZTN%d6JC3_KJza6za#mmNiYL-ud=8Akm z2hk+r1Tl(Iq&9sU8>fWkK3U|?nu81`8V5q4C{Ub?-hB6W2WhT> z`YIuUCq=R~JFh+F-gB>A)piWyM8uzI-cg_Za92*xPywLZw}K)aQ}n5OvvYJ>i-=YR zIGMIkzJAOv3PahDro8)oV-%ufw&Kf4zL+G}98pcnW$EXZ^p1UFypGE$|Iqe^p}nri zd2g#^y;?`Pl1a~e{`fPoSMnI9H}=bEYFi^3rCQ?*Ib0wybxX3%>&13hRkpd|kXQFv z_x8Vr?ummL(5UOZ+8Pd;D3-Kk?}9f4L~1CekLz6Zc%2U9!sgi$$0t6Yz&Blnz%X_j zSF3(TW24)_Tr`2&;Q75{DLF)IK#uC6A0c60$ou2zbN}Fo&cUNpSp{#el|=I@6Z?gg zkP5Xf-T?jZcr9>2%=u`Tq1GC9FtE!@OBSoBBb89sl2&~I|6!mvAQp^bH>aft-yx>W zAu@z;*C~A}QFdS&oyMQ=bdIXHg7`vmeKCVV-p`FP_o(4^-t(Oho&wuTk|?;n<$N0I zeC}Z8xM9i7{$dr^GWKv`*j@3u)}!Otm-k{;Q#l6w(8v^tpqQx3Vpduu6XfSk;;mI% zsfT>HiCn8qH1upwOBtVr4P~%@$Fx;Jdz}Z=kcZX~QkE%IdTcjD4}0Q@GJ4Uys``azBuzRpw@aF(FLQ_YtK$h`(^830+2LU=7_j zs81ZDcNt&$fY^!)oFa!H?6XAU%^_-j-b1HRag1G#9ng=`%(qJ;6qKLmaARq%(pv&H9D-$(u;c==WfDGm^|^dp9O}Jh$%#kw+?Wh1bFA(csSh4a4egin zvsMUs)t$Rm*&L6!dJq#7*PSy>KfP)Qtea~ob@gRgu5K%0BSw4lu_0pSVB73vBVGYZ zflA72{f}IXxOMB)s#LwoqQgt+Ab~mhL7vwm(g@V)wAL)6BPR;`A(L5xh{Ye`+<3}GJVnTNFfN#@1n48)!{}; zblxug#PzWU?^rt$A3jvr?95oRVtU^_&g7)J4m=afqXwCfJrL7!3FxB)n`#q298(?_ zU2i0(JmeiWg;7@WPETrw>0O?^S5$c5mMeS198(d$c`pvCrRCBPxKQT*QZfP7%du4E z%nirhEn$(0dti}A(yBk_Au`oF4eK2GyIxO;VcKo&By}X>pmm8Eq6XzY_$)lWJx|bu z%BSbWj}`|fQyG)U$HdFRzPxV258p#D#B6{gR9<^{cIx#^DRw%etEv%N9BB!4F5ndO zcAcIr{1ebUFlr@d^{z(Q5b@ab8H+hN8o?in-xYac@k4Ime0-N*SNhioO90-3sf7il zO@Ky)JjXXVh6h|6{!1$-l}sNs2IEgOW}iiv{u7VX;8SUk{K@ijDVrG~a(whU%f}RV zrZ*8iEEoi^+Wv)K1w`^Ngjj9}0)x5I^|)s5WrE}t;2}4%7_kU>*LyWWO=dpL52?9T zMPZfyw3&IA7siK$wx-esGWAdwzo9g@H6@PHkbfjg`gh1flEV+3j~Tiq<=hH|zj)!l z)}Fo7A7=ZWUCexCK13L)@i3f{pn{+{=HVqd4Fn#uGgnkIdXb@WJvpNq%Vs7^mOj?N zADQk!&Cx+%@N-8Khmp{p5KE(mW)BCZh6b}R)Zm%6C4fBT=sem9W1^4s1Lza&?Q zUs{fNn2>zn;^|AiWw5{X7EQ~mKZlc)v`fivHen(V*!*uA4!J}Xp z`VJ#W7WhQ4&%q5OiN5g(BK0q<7dmog@}cd^*LWQB7+nrA%D=+L6jYmoUKgmN?goh- zYB>Wl`;L>073HP$9r_N#iaTJOT7!oxCo%>_0nXk}4@%E2l)rvx&V&?HRY_Cbk7jX9 zeY+Ewf|ynzvHcy+uCa~%2^=0Fjq2e-)#^Lwq5J>5GFt9&HaluN)L{#P4-v{E-oQ(x H43Yl>xWZHV literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo-dark.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo-dark.png new file mode 100755 index 0000000000000000000000000000000000000000..13e704a04677447fc1ec4b5b596529d50f39ef42 GIT binary patch literal 13700 zcmdUW_cvVM_qQ+@EsW?bj1j%}ZZLZ9o#3vXwkc9QKCdI(OV*V5WPh_ zCERaqXY_h#uZ|K5-0d-l%92bsUMI}jo7goUx}=clP6fnEb5?P}D$s(hoLIe+wf z)PLLNM2KYA5Z5yJM)aA|nDPx#bnks#FcKO#yw-0f7aZsS$QCEPRO0JZf$4ebE^J*^_nRO81XQGBI)CE`Yl9ZxCG8?*q^B%rEPp7#|CK`|4phS*x_h(C70;Ql(aNFKi~=~ z_8l>InKUGNIyl$c2L)o6xJU6{-IdN*z2z2?0MN zD89UpXphk8Ta%s1_3Zy2AG!xwGO{atR$*XV50WHo^p+RXoG?M`kxwT5$H&MB1>E+k zhlMA5j>yvVRxbU`evER`(hyax3N+y zU+d6r-xT)aP-S2NL?5>kUdDPk2>}GBV`^9E`NEVmd%l|V4Dy+Q9#5*E$)Eo$fu{F_ zxUSaer7+d?MzzJ+zeDj+{u;}lT^ZYufjGv;vCvq1Q|eq78viu+-Hj?@6$o7wNN_R5 zr*Unkr?XM?D=5&CUZ~Bu z3f-s~SCOJZMoX}(cENFz0C*y#GXH`z?4N>@O^o)}B&gQ0HMHux8|z9l*~Dej##x0r z=(W^{&?icRgN7yK_frFQ5zgbkAywb`;xCO$Z^QsHp8zRulEd_M(TrI)6*8eaFJ7m! z+H-722YuS!n!#wG+5WKSYC1lvIqbhXg~6Q)u4C~}P!_VAo;eT=X%lPT=1ZWkBTZCR zM<5-ZV`Egq=$?%?O;LOB~lBv*t zv>|*io=Syt-po1i+sTpgHP;$@Z>;Xy=%AjKzhv=u4J;c2z2=s2;GxfL7Y1iP4xd4- z`3U%WZt%T)ysFF(#kb{?!S)yQ@Np@sxZt>6tF&O7Jk8gYLZ!cq%(ui1h3y23obB2&E5%H(359A zmf=8IESCuX!zgVJ;@xKcnr<2rN{(44J)T`Csqs??9hE4-9TADou;LrX;v)ufn{$Dw z+3bGL8f?($d@4|-xP8;MeZbo#FgAfwo+k&tSs)w$;XztjO{RJJB)_Qc`v+Gpj%K<& zCbc2S{nA+bORnhmYdr%e%&*Z~mv5!ckelgB`=g@UlFH}WRi_tC^gr9Og+OV^rpG=r zJNS?fI(${zrQb1@@}`i%a0HJ_=(0eJl{M&9c3@h6rq7}fgXcOcJ6FS(gI@X@{A^%d zmzSP0=4V)K9|dvz(`p}_*VOS|WV2Kpy3dEjNTAv0uT=Addup{=hDr1{E>$H2VnNN^ zjJ!!qb&h%cJD|Y*(L8ghA}*NL&lRe)za2UZ@RU`a74B!|4AsxFq0EDVG*|uAqTasB z5GGLE9@X>7AdSlD;DnrlxesZbesku?7y4$Yg7sjWVkMJKgq4<4HY%N2bq05NmPC`% z(X;_aEXf7v<@)4`%J%Gyt1pF3l|gZwvU@kD+OY>6O6B-e+ohQ4XZ3|?e4w-#tc2** z7s~#*X*Vf_ldFu)A@(WS9th-0=0Hlq8TwmNC{!h@#N!h)YL)7d^DIS(O*O(?FFW(! z??ie}nbF;4@jh|FyLRnFF+s69O33(oA2;itFR4n>B_Q_L*(b~|ey_b=VuUMX>q|Ha--W8+)v0#`s!L89mP+G>pz6_dh zV2LVVo{53~eGj9k#>fCY++Dgsh+w(;vjqbAz6^OT`FtoAX;u8HQxQX&R;0d#L4oK% zgD^0|fh~k_f`#LO&D`1;6Vy>*BHWM!reO6Udzs%xF@8o?>KfCNjNg}>l#ynZOTY}L zY7tg*o1FC78~r1Qdg}yS65Im>6){YyMX7e#X+C!hL5QC+1PFgt#WyE{ELN9lotj$Tlz*vPRC?!A-F9?yUiXChk#Mk8d zd6S3ZPZz6F^qQ3}Vw(j$i4TOoU)e2bchyh}RvPs2M#QNs9N>b>nmy!{f1CE%C~LfD zl0IC$5=sMn)`q?(5w;2t(VB(KG;bk3GUQ-1H%U6Dny#$*~{dXw1DaRyc zp$TT02`*-aT{W2XPl$X{)}V(I_2iKB)Vr>JIrHeW-sZM!q`vQ-lb>k6N2S?fJ;Nk$ zsSg<`{^ud|8EInSsGhK7OB>=5!dSDXjv7n<>iwje&F8xjO3}N+mhhC>oj3}P$vLsSD?>3Q^=Q(XifWmU1 z*IRZyr)OWn`3LRYLf4a_-nPHvW|7GOxlZyr^#P1#WxoB~R1luu}8qO753G!?56vw;CMdflLSgX zeQX$D{IlxgYQFZ#NEUhC@QD`43FWZ-g?;h3THDl$?s#9fawd@N96MFTIDqa{6hVJQ z^L~=%C1)TbLK%USP4k}1)a8E@pn6PhiLmmTD9Lz1q>Qev9r&j_#0lrMDOC|1;>&io z@eS$t??-^jvs^D-<%_qiPxRe^_OJ4x+n8?O#@v%)P^!=ccz=coy#S@r;)ovMk0-@f z{~{@tV)j?7NqLh*ol_GLMFL%KM-y6E++0LZ z&Yi|&nQk>Z2EBA{{#HnOi)zHQ4?ZZ)H$mm{;XB{FAVh2Ovyc=IXBfAH%fJ1;^>LBg z%+On#YP~}du`Dr=Ex{|#<*&k)ybtG@(uS9ZMVcWV$Ncw)%gZe}e1qRodUBq3ah<%% z7eq25k0&eN>HUO?XUr0Cxr6kS%oCW-7ge6i#Rzl>!x>2#rkLO*EBHd%<2b0?;pwa_ z1ANC8>>!6gx&ne^h4u+RaUlr-)qP*?@Zz`t8I87f{oA*sev9D7huLJxlwVs53vD^d zglElXv+Ue_SMisN@lV$pE7}=swfH3Sa8k+aJ4!ju==cYwnmrN7ohNMu_0sxa!V4b4 z7z75u{(@Ce#6F@lwrWaOUu6AoIruPkPqOPF(NoCB@02XFM7HJ|dzomPl+bhQmZ%zo z{9fYhj}~Ja&?>wyrz^|jg_~S%-G4u({My#gsbVVGOt!#{0u;w56PCF>&j5!e9|Xl& zM$yAhEu&UIi=sOL6N*Hz@Z<}Vs@Bjn;?nswuX!pb%F3-9g#PU&W=Dp2vE|Q~ z;zy>63<6Pw+3` zf<^)dRO&Kn!ktUrs-}Q#*1G&t{SA*^dT-sT+h3Ioj`7=MwiRGq)YvG`y^6((`}1wU zEGV_xlChL4Yu*2+a^S`YWkeQuETPYOL(ku3{{cPVbHc48&1O1~gN5 z))RXl&btfOn0wt-t|xY%d2chHUIunssm#4kRn*~zdvx6ic^7bXo}?~nPmj0j$tRiA zk?lY-lnC2N&mwM}2$U)n(@w{fD;djsXg*U4q!xHGOv}l>{Db)OqDmV8BizYA>;U9z z#ja?xDXqOgHG8b;%b+{dd#ue8$q@dH^@net772y@-S{){tb%WM8vA;sK#PDo&a;bx zhtZ(3%wq$pdm3N=KnbRo9b?kOOIuxoepzA(+2048&r4|1=;%_F@LCi|#+CWEV+KCa z!&B`MDKDJ-m9lz13fb-yC+Gug5)g8LPnq#RHNt}=ZvHo6IeINm5lDk?FG`Z}Si^De z(IZUm=8yHMcPlFs@YaTEH_)reY(t^L z=e1?)3t7GKs%dm&>4XTgKyE0AL;S$0{HH^O93Vo)?H43796>M70x*7|;>waJ$kqN!~l^EI_$rB4aRlsjq z@3hDSF5P1)4;^qwy5fT6rt>eD=sw@HPWR%1jc^xFH3rYrV(Ds`2;hCx5{0+_MDBpi z3KGm@P{5~v!@)83y>&asG>v1XV>9kt2lFo@Hn$B<$bi#Pg6OUr^;R zNu9ij!H68&#)oPNHvKEPQVY6PvFF5b(K6bXQID2P{u#;p{uu!yylbknV~)5_%KnWs54BlI+&=_-y{%g#3xB}^OKM@?`tug z7*UVWI6E!>yGp#}M2?@$f;m7e+Qc=A@tL5eJ75XanE_7kEHGKw42<0ePRkJPZJY;)5#vLHMzHK3`u+ zK{(+boeMIF&4pk1xV^L8%UDn(kOMHl1rwQQZbTp@et(G0X12eBBwnA`T2INeOqJQp z-8yDGn-l7~r)w9oUjM=nk`Gge{~ACmLJT$$CVDA(0Ga>5^f-w*C{9jG?dI0g3DnaJ zn8-zT^_s*Msm8wHmL~!O`=`FBkt~|N)+D_0U@V>Bmp()#o)^0H37rDpNTI7!G9FHp z>8#t1%f@-EX4`bwk>%T2ZXwayx@U}R_}f5E^;oA}>lESr0LmtVXfO*SfzDS4^(Jty za_q+2jSc~wOFN!vSHhG6hu{3~WKb)*AR>s<;~H4FM!WLp$c81v=i8|m{5yq}q}}hX zh9Y3-s{<;81wn3cZSkcR{>g2c&;K3_u58x+UA}_RiRjn_W7^I1*-*_frqUf%eWw9K(lZfN*aE0?Zr;T=m+e{R zXkIPVtO|+i3{mo`(a=ctq*XR}bc~YpoLq%aegf(&Eq0INd31hT8MrS^@Va^@=yi=s zf!PNwl51MQm`sf5A8u_U%`{!A*2);*xAIyHvA?RE6f7O*a%Rq!sKzHGo@66ZyyocP z&{d{glZCtu2j8ahC{seN9h!s6nZJV;zC255*}dTLN6)O7nE4DFet^fbQcre)IzqZu!QNUQNF0k4`wOf-FhyZSh#MrK1*i zI1*23DGC#Q?dyGqMXVQ{$Ydy<@bnZ3nzHOq)mNt=!qBZsKT?v_;W; z=jkT-;Z5{CX1UW%<;A7(aKYHv&saBz=ibb?1;o zsfOOcU(Ak&c~RJxjSF`IrE2yzpHabu1q2)08O4TwSm1>$# zE5Rf;j4zAI=x{bZ7MKaGcmHWjL%UtRBllez`D=V)$)-DdBA;Zamm_TT_UkzLd%cFf8p7CW^mXob2G-_SGY(u=v~X{n)& zab*4Od!HqH>TJJH+Wh3P^s+i}FC`;eXL^ZxZb8s>FFdhgx#kJyJn*h@!Z*D{U7V1p zND8J}A_d4}`7{uRrNBYS-=MJOHm%LKHtSUg>YHWB|D=k3&v(6P*)?*=I7BVV!QSQG z*`I5$UQ{Es2`;J`kT2vO*Y1ELA}$+wX-%18q`zt=eGG4J#Z$Pz~MMyk~O>EHirT7z4fIl~%mL0K%o z@8JuY3IkD|d~D>Qr5=m?JR%4oUgM*7f2Sv|R!iqsc(pLMX>2&qX3TF&8-rvQ>2wLS#le~MvhZ)VQTkKMEk3WJ zN;+O;u=A!O4&d9;Mt^2JyCj%@-VE`N54?0sn!y?sEAKIRwyS~{h#dzQPG+H6KtZn` z06KSLjs*rd=U0@!n*P~fXDzG!WRJ!D3~TTqAj#%+ERLG)LkpW#3Vz3E>F%Puc-bUc zXmxFCTUDB;#xA9fR;Yj>SQ5$3@37KV0#=f~bMOW2pz^u;4-Ji+7`~cxdBR6z1XO>sroDF zzg1f3u*hO|AHc)Tni1^P-)QmHgKg3bU+Ryc>we#clSl$eCzgHR6!`yHapI5i&r=mi zeFW~2YO}0cMs61ad7=_I#`f5f=x2c6Y0wZdsqsz8IA?~O*58!cT#XY+sO+WmC;!4x?Z>aK z?nnT~9v!n%DRn=5eHO~yM8KvE?cS(fOPb+^9}WP<9Uq5NvcZv;dI~BId9~I<3Xz4@ z3%uISN(*a?7yM{;@}s*+x3jk^T;n`R=NtdG0TJ!qf}`W)HLN9jN}O}T5aWmbW|3Q* z3{QneyUXO<91h6SfOpAX5Hlp>OI`Gae?g!AcRA<6?4V3HOiO@`fcL* zRcKR+N!R(l=*Pna6hhH%8LWt%&4_G~XduT>c$7@b{AW_~g9myglatTHX%)0X$tYvX9Tu~nQFHD)x>=BjntAN4gVRA5ndNZ zaTKy!Hv})8HT<)2I|;r{Ec(9kWd&Hr$O%_<$?#l;U-Ev%LT7 z%J?wB9W1)jTJ^N=hJQqtzLWR1O#=LBk#4n9fN1%WC5upfoMiZ)10?{t_@Z9F8-j27 z8Ne#aNY^;B9?m) zf?U~kuiqRtHQZG+S7A@&C)oYs`JW#2U;sO3;K1tI>OXx}9JP8gwUj1+=YI=FvVoPn zcMVJd<#};&Km(gFL^r2V2)Rz*qyEa^zyTg3+mRzl{Y-Y}V~OufXQo2vSB()q8DyYckKzk1%I9)G(^Dz3-Nh zHVqy5$$~QFqy`P43Z1h=ztU4r2x%y#YZ(NW72QVo0~z4))R?YKjG@*zjk!#4Q5r#%U;!`` zFuVUT3R%_};#;uFoP?EJ?6!QX_|%2;fBy0N+v){!rshY66eT~Hz{BNQ-q{g5lp+kTXPDVYIOKSSPbk4LWPx4a!CuUDWR-#`C( zPSAnAXNeNGT*g7$X^{$!Y7bT&ZMmNh)~IwhcLqw@lR6P`EEY9eWdMDB6MpQXNR?>v znQSlfMYx!x`gRl!EC7jQ1I3oh_megO^0lj3UntFU!L2C0OC&r+X{{fX;=7Xj_yhqH z9VZowcPl5K$$K0U3Q{tlD&;o)uWY{1vP^#$3@btjN$<<m;JmepAw1AHq4C3QvwA z>QRJTc^~|#&DebSnxM}jh7SVBWPg1}F1-4xkHF3Hb~=;Ky-)iIGQ1X2NTe^@)e)fn zYOG@?)UkS9$|}TfzGvZXRllgFpheQ>{B38=xyPgn3S5j22NQQRT%W0vlRcC+!7r*55yG%ML#NttNeZs6oB>@F}BVisPNvdJ^QUF7iax96IF4Gx6i zxeeZY^gb;b*-m3~+gs_q+4638^#6C|Uy?Gydkds1?E(MW?wVI-b*Q{@_f?TC1t_&W=)fRWqTXdXIHJ@dG+S3{JEhubdp{uIN5hEpyzTJ1nCd?@OB<dP zu@={AsI`Ir;dI;R6UrU&2i3FPY4)?OEe(Bu=iUl~pZQLPS+;1m>$tt@<+nJu^2W1~ zZH?)J6(6l9d#HGUDmJSP8&t;ey(eQWzq(d@ZhGKuQfK`YoTx;qj5K0$T>*{e=jTf{ zhpBrUL+;o2mW@)fo+erZHd)=Q2_0o>7@{$itZi~(2t)yOApEJrS`hvnp@SWRph7g3 z!iItk;qLC`pf~G?n}x|U-{r}N-}q08FAr(4f6tazm`UnHrt!hf^**K-A1{kXjRgi` zJNy=Qljcmk%wM|PNyw#j5kiI{0hl9h95|+5lB!t^&Z}zA8^(4r#wky`Gr+O`<}Hlw z4abT`b~Hxc98QbE66h-$SyP~juGI!aU%n|>9|Ri?Ysl?5r4H2FrQdfnG&C4%%cwIi zIlPz_6HmN@{K5Ttp;=|pMts3ftp})bGv9J=`CgJVhehwISKG&OKt$YqUbhrgN|<{k zEjk*XQnz&Utn}~-Rr3neZrx$OHzb=omhk`5(fy#cQFrY;VNa5h@ymKA)Lp9E)d1oi z3l7EibbSvZcx@s6`Mg1LZGO?oqUZv*yI(u@S`lSWfo}=20gRzrdyPDnSgf&*F^k`0 zWfi?;Bd|jnQuw%l22o#nPVArUO|mI9emXpVV7ab!WlJI*>A5D#~zM3+ zh3~^>Qg*&dDfrwm?$K*6U(@Ew_{Gdu0az&(hNp9t#xu6BeXDIc-9Pf{;#6g}aF|wz ziDT~_yE8s%a*+N3q#X)^`(Qh z>;lv3{3tO>Cs;>T8g{s|+RsYmVm6}wVWj(bgdSm5x6;uD)`8<^j{^6Rodvm?Rhte$z zzUdC;o)b=f0#ym#OXelx2Xa2r(=71UQd7Jq306@+^dx%inZB0ldoEpHrME&-!3!%L z(jFrq!Pu;^r2a03v#B1&=IaYuDR-&Ht3Mp!^)Rmq#OWv`_r0hsUjF`_BXTG>?!3CC z=K1{rsZ5L8ilEM-VJvoj{W zkL1^?tz$9_M~%D&4|Ip(_{1Vq0J6gz7vNa=_vT_Ph6aGPnryN{p}D?PMjPMacxE^| zrZ+X7d~N#44gZdYJ!e6?$ILwg47@;mcGDgpEn!U1 zWHW@h7p;$+GoK3u5aKYVe@L$0$&}Xje;Btp#n97u*sah1ToU|8^^=-6W5Jq&?2wqy ze8^!!4h^T8@T-IEAkrP^uyg8Myr@naVRi@{PI6i~U!Sp~l3M}9o$s{OurL5%-v4UV zrgD#+i)sAI3h!Wf?s9{^$R4}>vLt!P^Bq#SLLS|*2^!-aAnuYq=QH&?a5bx`<5Tc7 zpDKW~nl<3qKKme**>LS(I%Nq42I<9j+*}pN8xc*ln^;q`-;G{(w8pof78v~q`Y16* zwH)O#Nf(xYjUZv?bhnuyFDUV2{~SvAdd+!V=7}&eh3g$m(k`5?N=~pV)5E0o6Z(AE zKNqR78>V}7jJI5~8);)*QHvgbc*evhk{^=4Jov5^w4*ctz>rv(*D>$qf45^XM#VyG z0PtV-3t7zbGzOV<2KexM&sHLL8|h<>DoH^kF!IebXoiteERG=-CAdGIFd_bw(_9Z@Bxe7UcrUxAeZ}vAtj;bxm;5{b2<|bT08{A_cpT;R!^*UsU-ymgvw&W2$%3DoLEDS&T{Cp)it^KLV8pivOa5lH$TTVey zrT%B6G@GQJK4N8-OaVh>Uk;*op8l~?_(fr7Tc-K)<({Q*U@UB+La;yap&ScFJ5ir#nwyMKXGjNHS$|3 zfaJ%>?d_ALqBs61JYj0^RWKkML%)Ipu8y+K+cJ&>hp=H^+6X11U_hreQxeoez-2nO z&<>%MEG)Z_O8k^W*l!h|GLK|P+bUMTu@<2L`i0on%c6wR!_kUa*slHjR;ZN$`Z=yS z%_#=H5cRF#qm4AkW$E3Nxu7}UfOv1R!j-l+82^&shTZZ;rJ?355CZyj-q(N~&U1^c zkw0YN87a-CbPo_^48s0N1oeZ|7XvM-Ok_W<$=B9v_C&TaYH|-!bAST~VU3mZ_%~}a zFA%_llZ>qcYY>Y&4X6r8WaA(1l~xQiIVj{}Ja~P+6@hx$7nW_L1hzn4z-NWLbox8G zBHfFmf;{oB5z|M@H)iSz7Z9qi+&pf%RQ1n6N>Ly%iM_{!#K82<*=QwTG+kEt^7y zFoGV9H5OMVfL|H(8auaEfv#bn?3O7d^F_k+JhyA$tE)3Xa)Q@)*!5y9f%}0c3Lr&d zXnTQ`;Q{HtdhU#Kb)MTDf)1aZP&cvm^BS_7(kL7GBl~&ASv{!%+87!pL5>_vLwcjl zCJs24Mn!8hzxt|PnpDI~`6MR#m#|6hm$R8Xj=8I!Ln`&WmS8+_*Rp^oW#MHTtBHpy zW`NFntnzg_L4$j#_wqXXnYY)A!S|J9O*NKjC0ep2c~Oq^pCa12`6WDNU+IB<;bd|~ zHQZry{UQ&z90UC>_9#Now~T-IH3}{?2`JR=%ZQuuB0s?uoc|2Gg|t=jvl+cZohjWj zdj_URGl)i6p`;ASL{r}oUzU*o&0YL=G#9ZxuSniHJx+ zw#6#UeZVBs%6ujhD5wPjOZv{7B3wub2Fg&`YI!v$>*qE@cY7~Eze6>Iz(y(~{ylFd zxBP3qOB%f;Qr{Vf{X?1&(tNWrEh-0gdR^rE0hVN*P%Pp&0*8ZTXP^^%`s19^T{?u?vxpa}#?RyxWPrckMQRrfVR&8D*5QK7h8!AI8f& z&q+sHnJ2}t-wZ}4V2;&su)^_9X0c@WEtB#B5(-U7R^cndE#m}<^Li>quNWOPXa}=- zp_#yX)g~TrP&i0lb5=tZ@NOq_;?TOI8WOAWEf&ehtfO0nqwsy2Wz&^22FbnTKpuZt zJuwqnUz{RD$Ox~-pL%Wo&wDX*AU`<+)wruRyPf%1d7(QS$MB&+r<-G{&}G*0&62SN zSN|wDeQyoY?2!SCO=vSTTAdfYN;E!W_bx10?p%&w7D3Bt-8LvvG{Abka4!MTEJ7WE zWcnS z1%$d#fJmOkWx3lak}w<9@ETPAzK~LLfdUST11$nP0GTj<=TM5oFE!je!CKw zE-BPf#ZT5N;pGo}mP&3Hc*e5}&@ULLsM~b6g+-5JGQJnUGl{XxZjDz~j|eUPzmx8z z^bu1_`GnG}=KO!&(SG_o9i#z}q}hG4u~LTTiP%`&DsT}K4?O4L@4a#gSg;hb*GPWu ziO&F!Q?g0|o))WBAWuh?=ykg&z#>i@rgJ4M@X^g;FdY6bakJuXKW)J2UBJ^5tal=y z&kPo6Nw-5M5XLy*Enpl-G{rk-HdNuI40dU9owNdBQa0|;66UyM)x}rAZ6w*N#$rRf z66S3ercpLmww*Nt;yDS=8j)zD&AHXE3MND zQbB%l;va71uk7Tq=qT0{?a~Vx{L+BHQ6*|{j6Ls%G#(gZDPxMa%1)+vwgV1}+*=dY zSi9H0RKBKl;AaBrInQVXIBtgTR7Mt9t%+sU_#_TS7siOcATPAddnuO}7PGfH2V+j{ zBx>^A3+LOHf4UML9Q%sq?EznwPgfS~T@@M|ypBO?>eN?yi|^(jyv74d+|54KyN7c$ zwT*cF8+*HGF~R%8o!rKsv;GQnTzBc=un-z1gi^qol! z>ZBF;mi0Lb*&#^$y#b1Q@!nm4yy2Y0>k(z{V8jhZ>UThel;gdUr~ykmi`SORtL0s?zfF-{7IKs?wUC&hWWO?B!ITVX$8=t-l`UJ@G7g zQpwLgX2M6F4cs5Ev$Inae&nnU);26>h!Mj)iq@yrdoNFP9fQjVP!>Vq@Gu6o&tu0t zSiBUE+CoEmzO4;HeYZl0{@-IFV%4&GgOT|-v}WpO0>l)oR*ytz>RPsA3B*wxD)~z1 zgqR;5A$2t3l-{RBT4O`cfBiQ*a>-i692roRFPp$@ZB+6(6cUnFp|C{$NJ{@PsZ7)> zD}Ubo7ftwxIH(`a58Rp&;!Hfh>yYf74@i9GIci<|-xn8;JHSp=4rZb4e4q#FU1l$I1wx=}); zpNrq;{R5sK-e1n=o|$uI=1!cNiO^J6B*c4wck9+ILX;9h`_?TiH26IR#R1!epKk|l z-Qrk4A>g{+v%A^n9(pzzC6}aY8fm2-fuh9@>ff^H)^r`!BntBb@OGm{xJ9vM3GL|X z)#!f$Y*U^CHgdWyx4W1b7;Xc>7D~jZk1u=cjCXN7t2SxLYFo(3X<8iBkHybTs|6$^ z90L{`CeJ2k9rrJHN{c^P+wRx3xA6=IF75|(NbHSBx-7JwiZr;)Kfd@(X-*J$b-Hfg zAqon4>$Sbh!t;i7vDEW9i7x4tIG2uFA-Eu1vuh>GrR4+hLbI1+Q5w^oyEial|BS@W z2iXvwr@3JFR)0cAlc8EJkEJrg4m7Ct1owe397k;*1=oq%~8K+neX4g2EHpq({y#K#6UiUB3 z-zJ-J+}`$zy*l`+ReSV8LdL9WA4IB?}Q$cMg!xg*+#u{hchU0SOwd?o1c8 zZFkkxERDNw{@)Nu5k9sDjlPO1xsbJ}A7g8EL-V9Xv1jKM@|6N#z#%W8DYM^Y(@9Gb zWG#(dQ#sLHe>0l3Dj5ii?_2$&pu+W_L>bqwY}zfshV_*nb1m@nyvQ zg0+O6sc5WML8MzgXw6waF2%&d|FIN&S#||0)HW3LJo}5W%Qb(Cp-Xh25cmTkUqYYq zbNdf}VwG3C(-t;%qFUyjA0g18c}2|>5)dLEE%T4QkqUk$S;UIs9V8a=%zCqFL8nJi zQbV5+CRUI@1&#pCP(oogHDmvfFst3ue(#i~f1StQjb@wp#-o8WW^_stXY>{}@=mI= zS!FqwwEy0#nz!#6`H-r{_rVde5S^zRM`8`xDoGAMW9D~bwl5?%;slFh{(5r||2 zx^%0|Vv)Qe{>O`K4O^ePgovzqHB*?AxymDV%6@mBmi#y|5IyI6B2L(np{PrOpSaG$ zSIVLQ{ij(~%yD`4W0>Q15HgV>FhEz{-pJAWuv6W3`Rcjt{6IMm@6ODgkf)GD+)%nJ zSMX^}vCS2bb0Zo(8dvdlcYO@5%HdUj`ffkYjc0|EbR~n%ye%TVWO1`%A^5gTWZ#WE zg7J=jLo6x3tu4kSrD4*$iBgP(5?Y_|J`HY}yK(DAX{a;s?F$L>(KdhYgU=xPC6q;y zPLue)iq5UeS0hYvY+7F{ya1+h|l{{7y4K_jE z$;9?v{bqg8#*xpxXCOir(mjMbaf~~NHIOOnIR1(3H3+-~cvG_%jgY^xW+yMpFRwH( zQUb7kCVGaL3kpN~cwLBG5EHykOB^YRQ+0PNV9L$n7onzJU zvP3h*xtF_ilAUlOkVrBEnuJjIQB;atlshSWQ; zj7wGkrxAC$&!mH{89Z7!n@re^^=)KSQaSfvW}!u7oP;fJo%I7;j&qy+Jf<%o(Y9*m zAvgsvJd>!dw)e}0;BAXbWDf}$%Nk8K;ZQcQ{hYtSy_DQaQ_OCZye}vmE7jdhr?LM@1_(ouRk)Npe>-&<; z-hSLYf~N-t)0E$duGO1h#Tgzj!z}Q?rLOZ}gnmi!pN%FTHF!U)YCS z?b_x9tSzMJ2GNCfT!%}9yLwj-8<9p`Uk2^fUWtABxm2h!)Ue;QIA4E#C3BtX;rXnp z3}RBCIP{*cM~*!rw;@hznEAA&{?9$m9_ycCZEoXh(WXJv;SFjCu??T{-Ig-*)I4HO znb&R=@3J#D>U1i0F}XGcUEg${(hf(&DQO3ai?VT0k=cW;c07p5)xCZ0yu95ZzPv$u zkX88AF(w~9_IR!Br1GiA7#|;%QC8l<%At7>`g3Ml-)AMSaaCmqKCCaE+B5}FCGrn4 z*~7WA9F0>vCHUg+y7TLKaw0VH;c2!xOP3BFz=p+^M=#=PydIe~?DneaSJu$j?}>oi zVheK^Jkhb(Nj{~$F{KO|nU)Gt_wBOZ_;He8|rrh>lJ9>)p$Byg#k{ zX{U1WT}{CY%Tc@??hhL3TFzy>t^{64(q;=TdSB3%W@OKNQ>-vOr+@MDO8-ZM?Rl4x zH#~8wA^9pXDxMN`FrWI6!DYBO}tY0gIP zmUDpHfkd&|sziB-2w<3DUZnCE0`6<7s?2M9iVBMDdqHKh$&4L6ourBZ%e!a-?7f(_hu5j&L`EB8jHK$B8;3xH(a`(gKS!re=D|u;&!7PwweI~VK zNG|BL_M(RKE{s5YuY1QT1zDxJP~-Uql0D9HkiGKz$4MwTj6j2;y)~r(nxPNf-k^Di zr<#3+N;%q%;&5RNyi{2qY@y6>m+r}C>$ym`9!05+|Y#+)F1Bp)|!wC|geq0J|#SFM#n z4<5pz<@Af{lA@tu>69h;Zhn4wfcM(`qNqW|;xp;2+&B%S)f1F{0(K{6>Kv!AWLn%K zpd7=zAy$G>z=p^=zkL@iQL~5mF0|2Mkhs&^0|kS3CskoE-0zIq>t_tI7Mk6~QlPX! z+gXSEL1zf|pg@23?cpz4U3}!->p=m1vuU`AjuiUVzJ{z0+T;}L#~L|e)STQ-?&E*| zNS!oMZu6=3w!Kltie#2*7CL*Cv?BLnCwbr@TyJHtz(K+hpd#x$mP&D7e>q3{^w%`z zGHEG6aD7PZ+|SG{?zUKmsu`~;4*Z4sz;rSBZK8fm8YVY7KHAD~;&5jV|I%0Dg%?6R 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/email/wp-mail-smtp-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..8d135f11809ef434a3d2f3c132f1e8a2c53f6269 GIT binary patch literal 14229 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 AkN^Mx literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/reports/icon-note.png b/wp-content/plugins/wp-mail-smtp/assets/images/reports/icon-note.png new file mode 100755 index 0000000000000000000000000000000000000000..f3f324276bcfb4f7e6d69f4924c38fdbcda00552 GIT binary patch literal 1233 zcmV;?1TOoDP)~oQGLWjezs}e4&$745(8AHz-RkD5$-lD3%=P&B`uqFq@bcuJY~bnZ*5Tya z<>%4e;Fqwy@AUQV^zzKv-OSkCtIEIe&$j8Wh3c<=z0K6AzsT_P^`5oC=I!mr)!O#m z$%&@6`|swIuDjdh=*-{Q@5iYzKG>cB001F$QchC~WdtsK000AcNklc@GIIJjp5bo|c71IU)+pIJ#m$L%lI~9o2=+p|b zccom9IOLB%x@E(|n3nO#vzw5PdC2l(#46*T1q=LGLheVX+R75n{>&p!G9R99hFJOZ zua$f<@Z!ujA{6nTjZ{rolJb&x2#&M4FZi2AdsmqtIx7qBkQB=RyCtpg}M zus|^OvbmHsst^WK>W3bNX-FJX!&G`ofQ$4ysyH|Xq!v_VYdt(;N`*vqe2>BvEU`KM z_s_Kv{WOL;4{iNgfzX=ip0^|c!#L`Jpe0eYU{O}CfnX@mePxgC0>StgF zmdrewUoD~zsyu@n{s>bbE@z+WR~@dU`dwIZMfR%#wGri4i|yuEaHILJe+c3e|8(Uy()_R_c=kU*{nh;V z<;_q1G4p?xz2F?R{po&jjl=98vS00=CSre1a{0$%f0Fk9^)JD-x8U!0!KJt0-%mlj zy)N$kMW>H?!CM;z>VHBZt2tEV&ul;#t?tD=6c?NKhbr#=GhX?RP@Jpj5!)Xzp?>5M z3FO-`3vSB`9E~BU<%8*PNW4G$>iD<^2uS`3=J=8}tQga)<1iF;ApVf`L(=cqHQ^7Z zSiKK&_K~zz072hmXdD?Z!09Db`sa-i>hl0Sz%W5D>!;8C1U7Nm0X4uMrsxMg+{1p; zdxsCmN*DwX<7BZ;_wgUdR6<{`%s7A~eQy^Vz${P%qd}zHQz6&&B7oFog&$na7N`%P znqCGR5I$s~x$WJtg%2>CRA~d&90@f!fEgVVl4*4eX2tZ9w~T`8n7Z8Q^1BM2|Guw( z!5NX-UZ>Jps~b++WotUR{uUaX<-u5@EyK9}1OO3$X8Wb4N4(4Mywdc=25fI>`r-qW zUSSmC+cD~!FT z2{1|yFbfQ@o&$0PGK<_U7Uu0TURu0`}3tAP6vjzVFSSU~@<>ay|00000NkvXXu0mjfiJ*=n literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/wp-spinner.gif b/wp-content/plugins/wp-mail-smtp/assets/images/wp-spinner.gif new file mode 100755 index 0000000000000000000000000000000000000000..f4087c969ae0ca682bb03f748667b5e86d47bb78 GIT binary patch literal 3656 zcmbuCdr(t%7RT?sx#1zN5K>+OB_Rm`BNJY$u+RyRK!AWjbc<~0MvaIRvjJH_m+k}- zk*9>`@~V~~C_$7&aY2;jEfH{4tm1<%4@D@|h0^X|+Zp$UTI)C$%?QyN;9CHgn3y?_~}<3yHRh177BphxiB}yvS|He!f9o5WaP3#lB^EF>J8KG#Vrn(}IqK#b%uaJJM z37Hp06hU>y)r!$fv)b@F)$ZIQk8^Q*)kQ68xH=8D`cc%xX0d41RWe0Eb)Eu~lk5r<+k*x3PZ(JBUo&gsLP`Tdubug-ESPhCtP#{e!brFu_i8wd(lzoINC( z0TLZ*%aS#It~Djp{iKN=<==**pT){5uSRocRq6J)&=onV4phYSS^wKje5<4NV$PG27ObQVusCXYd-%Q1)hulJXrB34a*SH(2v zFCmSh9ywNjQ6vpyj?0RSNXRRw%D8J&CF$6J3)6d45|nW`F6|K5dJpe*DeB0Eutf6ImXgt zXz!lT|5AvSaq0HmI8bOR!WHEFD-AzQhI^T%O8?5?sdz*Pzi+%D)S^|$FF%l3hX~Po z;=V>>p&O#D)@#TG=|(U>*kl_Ja0~uJUy!?cVK+%SkwALN(56*{PJo$fA8*@kgcH_;j;7+G_^uWp zz7zItsF6@QQ^G6}z%DPxqFf4yM$k>djQ^?Azp)WhFID#L`}C=0uoOSwWM_Z_!z~M7 zbt9JAft@Fw1k5As=Ro7TM9fdX+(0Q07@hyB9T(krKw1LKR$O zb5~ZsFMT=;k!GZ8i~boLnDR8f2AB%0w~pAn^BWS9lWPXydc{D&#yP{0r5MY?FYcpH zb)EcpfpnG3)8;O7vhT_+9>a`3HQUHU&8dNk9VpC2@b;w@CcV~h}Kf;y1^>_F|p8{#`?imFM6TT z9BW{u2opGcR5lEzdR3*+BKCbV-Dw!3J|C8TL*!S%o^c_5hUInk*mu2yzT7EOH4 zdvIjV_PB|DLDDA!WJW{5lj>~4)caXK@WR0S!5!sv>(8&N6LQFnY}BQM8tz-3DZObz zFd0~|9H~B%^QY2H@K-lfAmHI$$j~IIk?Z!5R>jc#b11IOl6dAtnf(#EAS7{(YYH`d zJU~`Y%?P35xR2~5olh>`P9g+0KAZGA>UKKi0p2}M`YfLGB`F+{>TpMSk%Ap&GqTaMJJ>NqUpcqV^s?m#NVtgf>n3R{X zP)%eZIj@H2Q>O5gXOZ^i%a?^cWdDlArC+W>?CMKx?Kh1OX1a@!t4&ddKlq*fgMSas ufMTbBT0biW$7^dI+b*S^pIFVwE!~0`(sn?AWsj!D6((l79DTE5fBPRr)lDP- literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/connect.js b/wp-content/plugins/wp-mail-smtp/assets/js/connect.js new file mode 100755 index 00000000..938c2782 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/connect.js @@ -0,0 +1,178 @@ +/* globals wp_mail_smtp_connect */ + +/** + * Connect functionality - Upgrade plugin from Lite to Pro version. + * + * @since 2.6.0 + */ + +'use strict'; + +var WPMailSMTPConnect = window.WPMailSMTPConnect || ( function( document, window, $ ) { + + /** + * Elements reference. + * + * @since 2.6.0 + * + * @type {object} + */ + var el = { + $connectBtn: $( '#wp-mail-smtp-setting-upgrade-license-button' ), + $connectKey: $( '#wp-mail-smtp-setting-upgrade-license-key' ) + }; + + /** + * Public functions and properties. + * + * @since 2.6.0 + * + * @type {object} + */ + var app = { + + /** + * Start the engine. + * + * @since 2.6.0 + */ + init: function() { + + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 2.6.0 + */ + ready: function() { + + app.events(); + }, + + /** + * Register JS events. + * + * @since 2.6.0 + */ + events: function() { + + app.connectBtnClick(); + }, + + /** + * Register connect button event. + * + * @since 2.6.0 + */ + connectBtnClick: function() { + + el.$connectBtn.on( 'click', function() { + app.gotoUpgradeUrl(); + } ); + }, + + /** + * Get the alert arguments in case of Pro already installed. + * + * @since 2.6.0 + * + * @param {object} res Ajax query result object. + * + * @returns {object} Alert arguments. + */ + proAlreadyInstalled: function( res ) { + + return { + title: wp_mail_smtp_connect.text.almost_done, + content: res.data.message, + icon: '">"+t.status+" "+t.statusText+" "+t.responseText,icon:'">' + successText + '' ); + $plugin.find( 'span.status-label' ) + .removeClass( 'status-active status-inactive status-download' ) + .addClass( cssClass ) + .removeClass( 'button button-primary button-secondary disabled' ) + .text( statusText ); + $btn + .removeClass( 'status-active status-inactive status-download' ) + .removeClass( 'button button-primary button-secondary disabled' ) + .addClass( cssClass ).html( buttonText ); + } else { + isInstallSuccessful = false; + + if ( + res.hasOwnProperty( 'data' ) && + res.data.hasOwnProperty( 0 ) && + res.data[ 0 ].hasOwnProperty( 'code' ) + ) { + + // Specific server-returned error. + $plugin.find( '.actions' ).append( '

    ' ); + } else { + + // Generic error. + $plugin.find( '.actions' ).append( '
    ' + res.data + '
    ' ); + } + + $btn.html( wp_mail_smtp_about.plugin_download_btn ); + } + + if ( ! isInstallSuccessful ) { + $btn.removeClass( 'disabled' ); + } + $btn.removeClass( 'loading' ); + + // Automatically clear plugin messages after 3 seconds. + setTimeout( function() { + $( '.plugin-item .msg' ).remove(); + }, 3000 ); + + } ).fail( function( xhr ) { + console.log( xhr.responseText ); + } ); + } ); + } + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPMailSMTP.Admin.About.init(); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js new file mode 100755 index 00000000..e8c8279a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-about.min.js @@ -0,0 +1 @@ +"use strict";var WPMailSMTP=window.WPMailSMTP||{};WPMailSMTP.Admin=WPMailSMTP.Admin||{},WPMailSMTP.Admin.About=WPMailSMTP.Admin.About||function(a,t,d){var i={init:function(){d(i.ready)},ready:function(){i.pageHolder=d(".wp-mail-smtp-page-about"),i.bindActions(),d(".wp-mail-smtp-page").trigger("WPMailSMTP.Admin.About.ready")},bindActions:function(){jQuery(".wp-mail-smtp-admin-about-plugins .plugin-item .details").matchHeight(),d(a).on("click",".wp-mail-smtp-admin-about-plugins .plugin-item .action-button .button",function(a){a.preventDefault();var i=d(this);if(i.hasClass("disabled")||i.hasClass("loading"))return!1;var s,n,l,e,o,u=i.closest(".plugin-item"),a=i.attr("data-plugin");if(i.addClass("loading disabled"),i.text(wp_mail_smtp_about.plugin_processing),i.hasClass("status-inactive"))s="about_plugin_activate",n="status-active button button-secondary disabled",l=wp_mail_smtp_about.plugin_active,e=wp_mail_smtp_about.plugin_activated;else{if(!i.hasClass("status-download"))return i.hasClass("status-open")?(t.open(i.attr("href"),"_blank").focus(),i.removeClass("loading disabled"),void i.text(wp_mail_smtp_about.plugin_visit)):void 0;s="about_plugin_install",n="status-active button disabled",l=wp_mail_smtp_about.plugin_active,e=wp_mail_smtp_about.plugin_activated}a={action:"wp_mail_smtp_ajax",task:s,nonce:wp_mail_smtp_about.nonce,plugin:a};d.post(wp_mail_smtp_about.ajax_url,a,function(a){var t;a.success?(t=!0,"about_plugin_install"===s?(i.attr("data-plugin",a.data.basename),o=a.data.msg,a.data.is_activated||(n="button",l=wp_mail_smtp_about.plugin_inactive,e=wp_mail_smtp_about.plugin_activate)):o=a.data,u.find(".actions").append('
    '+o+"
    "),u.find("span.status-label").removeClass("status-active status-inactive status-download").addClass(n).removeClass("button button-primary button-secondary disabled").text(l),i.removeClass("status-active status-inactive status-download").removeClass("button button-primary button-secondary disabled").addClass(n).html(e)):(t=!1,a.hasOwnProperty("data")&&a.data.hasOwnProperty(0)&&a.data[0].hasOwnProperty("code")?u.find(".actions").append('
    '+wp_mail_smtp_about.plugin_install_error+"
    "):u.find(".actions").append('
    '+a.data+"
    "),i.html(wp_mail_smtp_about.plugin_download_btn)),t||i.removeClass("disabled"),i.removeClass("loading"),setTimeout(function(){d(".plugin-item .msg").remove()},3e3)}).fail(function(a){console.log(a.responseText)})})}};return i}(document,window,jQuery),WPMailSMTP.Admin.About.init(); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.js new file mode 100755 index 00000000..0f3a7aff --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.js @@ -0,0 +1,93 @@ +/* global wp_mail_smtp_admin_notices, ajaxurl */ + +/** + * WP Mail SMTP Admin Notices. + * + * @since 4.4.0 + */ + +'use strict'; + +var WPMailSMTPAdminNotices = window.WPMailSMTPAdminNotices || ( function( document, window, $ ) { + + /** + * Public functions and properties. + * + * @since 4.4.0 + * + * @type {object} + */ + var app = { + + /** + * Start the engine. + * + * @since 4.4.0 + */ + init: function() { + + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 4.4.0 + */ + ready: function() { + + app.events(); + }, + + /** + * Register JS events. + * + * @since 4.4.0 + */ + events: function() { + + $( '.wp-mail-smtp-notice.is-dismissible' ) + .on( 'click', '.notice-dismiss', app.dismiss ); + }, + + /** + * Click on the dismiss notice button. + * + * @since 4.4.0 + * + * @param {object} event Event object. + */ + dismiss: function( event ) { + + var $notice = $( this ).closest( '.wp-mail-smtp-notice' ); + + // If notice key is not defined, we can't dismiss it permanently. + if ( $notice.data( 'notice' ) === undefined ) { + return; + } + + var $button = $( this ); + + $.ajax( { + url: ajaxurl, + dataType: 'json', + type: 'POST', + data: { + action: 'wp_mail_smtp_ajax', + nonce: wp_mail_smtp_admin_notices.nonce, + task: 'notice_dismiss', + notice: $notice.data( 'notice' ), + }, + beforeSend: function() { + $button.prop( 'disabled', true ); + }, + } ); + }, + }; + + return app; + +}( document, window, jQuery ) ); + +// Initialize. +WPMailSMTPAdminNotices.init(); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.min.js new file mode 100755 index 00000000..c3b52f17 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin-notices.min.js @@ -0,0 +1 @@ +"use strict";var WPMailSMTPAdminNotices=window.WPMailSMTPAdminNotices||function(s){var i={init:function(){s(i.ready)},ready:function(){i.events()},events:function(){s(".wp-mail-smtp-notice.is-dismissible").on("click",".notice-dismiss",i.dismiss)},dismiss:function(i){var n,t=s(this).closest(".wp-mail-smtp-notice");void 0!==t.data("notice")&&(n=s(this),s.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",nonce:wp_mail_smtp_admin_notices.nonce,task:"notice_dismiss",notice:t.data("notice")},beforeSend:function(){n.prop("disabled",!0)}}))}};return i}((document,window,jQuery));WPMailSMTPAdminNotices.init(); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js new file mode 100755 index 00000000..b9b603bf --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.js @@ -0,0 +1,581 @@ +/* globals wp_mail_smtp, jconfirm, ajaxurl */ +'use strict'; + +var WPMailSMTP = window.WPMailSMTP || {}; +WPMailSMTP.Admin = WPMailSMTP.Admin || {}; + +/** + * WP Mail SMTP Admin area module. + * + * @since 1.6.0 + */ +WPMailSMTP.Admin.Settings = WPMailSMTP.Admin.Settings || ( function( document, window, $ ) { + + /** + * Public functions and properties. + * + * @since 1.6.0 + * + * @type {object} + */ + var app = { + + /** + * State attribute showing if one of the plugin settings + * changed and was not yet saved. + * + * @since 1.9.0 + * + * @type {boolean} + */ + pluginSettingsChanged: false, + + /** + * Start the engine. DOM is not ready yet, use only to init something. + * + * @since 1.6.0 + */ + init: function() { + + // Do that when DOM is ready. + $( app.ready ); + }, + + /** + * DOM is fully loaded. + * + * @since 1.6.0 + */ + ready: function() { + + app.pageHolder = $( '.wp-mail-smtp-tab-settings' ); + + app.settingsForm = $( '.wp-mail-smtp-connection-settings-form' ); + + // If there are screen options we have to move them. + $( '#screen-meta-links, #screen-meta' ).prependTo( '#wp-mail-smtp-header-temp' ).show(); + + app.bindActions(); + + app.setJQueryConfirmDefaults(); + + // Flyout Menu. + app.initFlyoutMenu(); + }, + + /** + * Process all generic actions/events, mostly custom that were fired by our API. + * + * @since 1.6.0 + */ + bindActions: function() { + + // Mailer selection. + $( '.wp-mail-smtp-mailer-image', app.settingsForm ).on( 'click', function() { + $( this ).parents( '.wp-mail-smtp-mailer' ).find( 'input' ).trigger( 'click' ); + } ); + + $( '.wp-mail-smtp-mailer input', app.settingsForm ).on( 'click', function() { + var $input = $( this ); + + if ( $input.prop( 'disabled' ) ) { + + // Educational Popup. + if ( $input.hasClass( 'educate' ) ) { + app.education.upgradeMailer( $input ); + } + + return false; + } + + // Deselect the current mailer. + $( '.wp-mail-smtp-mailer', app.settingsForm ).removeClass( 'active' ); + + // Select the correct one. + $( this ).parents( '.wp-mail-smtp-mailer' ).addClass( 'active' ); + + // Hide all mailers options and display for a currently clicked one. + $( '.wp-mail-smtp-mailer-option', app.settingsForm ).addClass( 'hidden' ).removeClass( 'active' ); + $( '.wp-mail-smtp-mailer-option-' + $( this ).val(), app.settingsForm ).addClass( 'active' ).removeClass( 'hidden' ); + } ); + + app.mailers.smtp.bindActions(); + + // Dismiss Pro banner at the bottom of the page. + $( '#wp-mail-smtp-pro-banner-dismiss', app.pageHolder ).on( 'click', function() { + $.ajax( { + url: ajaxurl, + dataType: 'json', + type: 'POST', + data: { + action: 'wp_mail_smtp_ajax', + task: 'pro_banner_dismiss', + nonce: wp_mail_smtp.nonce + } + } ) + .always( function() { + $( '#wp-mail-smtp-pro-banner', app.pageHolder ).fadeOut( 'fast' ); + } ); + } ); + + // Dissmis educational notices for certain mailers. + $( '.js-wp-mail-smtp-mailer-notice-dismiss', app.settingsForm ).on( 'click', function( e ) { + e.preventDefault(); + + var $btn = $( this ), + $notice = $btn.parents( '.inline-notice' ); + + if ( $btn.hasClass( 'disabled' ) ) { + return false; + } + + $.ajax( { + url: ajaxurl, + dataType: 'json', + type: 'POST', + data: { + action: 'wp_mail_smtp_ajax', + nonce: wp_mail_smtp.nonce, + task: 'notice_dismiss', + notice: $notice.data( 'notice' ), + mailer: $notice.data( 'mailer' ) + }, + beforeSend: function() { + $btn.addClass( 'disabled' ); + } + } ) + .always( function() { + $notice.fadeOut( 'fast', function() { + $btn.removeClass( 'disabled' ); + } ); + } ); + } ); + + // Show/hide debug output. + $( '#wp-mail-smtp-debug .error-log-toggle' ).on( 'click', function( e ) { + e.preventDefault(); + + $( '#wp-mail-smtp-debug .error-log' ).slideToggle(); + } ); + + // Copy debug output to clipboard. + $( '#wp-mail-smtp-debug .error-log-copy' ).on( 'click', function( e ) { + e.preventDefault(); + + var $self = $( this ); + + // Get error log. + var $content = $( '#wp-mail-smtp-debug .error-log' ); + + // Copy to clipboard. + if ( ! $content.is( ':visible' ) ) { + $content.addClass( 'error-log-selection' ); + } + var range = document.createRange(); + range.selectNode( $content[0] ); + window.getSelection().removeAllRanges(); + window.getSelection().addRange( range ); + document.execCommand( 'Copy' ); + window.getSelection().removeAllRanges(); + $content.removeClass( 'error-log-selection' ); + + $self.addClass( 'error-log-copy-copied' ); + + setTimeout( + function() { + $self.removeClass( 'error-log-copy-copied' ); + }, + 1500 + ); + } ); + + // Remove mailer connection. + $( '.js-wp-mail-smtp-provider-remove', app.settingsForm ).on( 'click', function() { + return confirm( wp_mail_smtp.text_provider_remove ); + } ); + + // Copy input text to clipboard. + $( '.wp-mail-smtp-setting-copy', app.settingsForm ).on( 'click', function( e ) { + e.preventDefault(); + + var target = $( '#' + $( this ).data( 'source_id' ) ).get( 0 ); + + target.select(); + document.execCommand( 'Copy' ); + + var $buttonIcon = $( this ).find( '.dashicons' ); + + $buttonIcon + .removeClass( 'dashicons-admin-page' ) + .addClass( 'wp-mail-smtp-dashicons-yes-alt-green wp-mail-smtp-success wp-mail-smtp-animate' ); + + setTimeout( + function() { + $buttonIcon + .removeClass( 'wp-mail-smtp-dashicons-yes-alt-green wp-mail-smtp-success wp-mail-smtp-animate' ) + .addClass( 'dashicons-admin-page' ); + }, + 1000 + ); + } ); + + // Notice bar: click on the dissmiss button. + $( '#wp-mail-smtp-notice-bar' ).on( 'click', '.dismiss', function() { + var $notice = $( this ).closest( '#wp-mail-smtp-notice-bar' ); + + $notice.addClass( 'out' ); + setTimeout( + function() { + $notice.remove(); + }, + 300 + ); + + $.post( + ajaxurl, + { + action: 'wp_mail_smtp_notice_bar_dismiss', + nonce: wp_mail_smtp.nonce, + } + ); + } ); + + app.triggerExitNotice(); + app.beforeSaveChecks(); + + // Register change event to show/hide plugin supported settings for currently selected mailer. + $( '.js-wp-mail-smtp-setting-mailer-radio-input', app.settingsForm ).on( 'change', this.processMailerSettingsOnChange ); + + // Disable multiple click on the Email Test tab submit button and display a loader icon. + $( '.wp-mail-smtp-tab-tools-test #email-test-form' ).on( 'submit', function() { + var $button = $( this ).find( '.wp-mail-smtp-btn' ); + + $button.attr( 'disabled', true ); + $button.find( 'span' ).hide(); + $button.find( '.wp-mail-smtp-loading' ).show(); + } ); + + $( '#wp-mail-smtp-setting-gmail-one_click_setup_enabled-lite' ).on( 'click', function( e ) { + e.preventDefault(); + + app.education.gmailOneClickSetupUpgrade(); + } ); + + $( '#wp-mail-smtp-setting-misc-rate_limit-lite' ).on( 'click', function( e ) { + e.preventDefault(); + + app.education.rateLimitUpgrade(); + } ); + + // Obfuscated fields + $( '.wp-mail-smtp-btn[data-clear-field]' ).on( 'click', function( e ) { + var $button = $( this ); + var fieldId = $button.attr( 'data-clear-field' ); + var $field = $( `#${fieldId}` ); + + $field.prop( 'disabled', false ); + $field.attr( 'name', $field.attr( 'data-name' ) ); + $field.removeAttr( 'value' ); + $field.focus(); + $button.remove(); + } ); + + $( '.email_test_tab_removal_notice' ).on( 'click', '.notice-dismiss', function() { + var $button = $( this ); + + $.ajax( { + url: ajaxurl, + dataType: 'json', + type: 'POST', + data: { + action: 'wp_mail_smtp_ajax', + nonce: wp_mail_smtp.nonce, + task: 'email_test_tab_removal_notice_dismiss', + }, + beforeSend: function() { + $button.prop( 'disabled', true ); + }, + } ); + } ); + }, + + education: { + upgradeMailer: function( $input ) { + + var mailerName = $input.data( 'title' ).trim(); + + app.education.upgradeModal( + wp_mail_smtp.education.upgrade_title.replace( /%name%/g, mailerName ), + wp_mail_smtp.education.upgrade_content.replace( /%name%/g, mailerName ), + $input.val() + ); + }, + + gmailOneClickSetupUpgrade: function() { + + app.education.upgradeModal( + wp_mail_smtp.education.gmail.one_click_setup_upgrade_title, + wp_mail_smtp.education.gmail.one_click_setup_upgrade_content, + 'gmail-one-click-setup' + ); + }, + + rateLimitUpgrade: function() { + + app.education.upgradeModal( + wp_mail_smtp.education.rate_limit.upgrade_title, + wp_mail_smtp.education.rate_limit.upgrade_content, + 'rate-limit-setting' + ); + }, + + upgradeModal: function( title, content, upgradeUrlUtmContent ) { + + $.alert( { + backgroundDismiss: true, + escapeKey: true, + animationBounce: 1, + type: 'blue', + closeIcon: true, + title: title, + icon: '">
    ' + wp_mail_smtp.education.upgrade_icon_lock + '' + wp_mail_smtp.education.upgrade_bonus + wp_mail_smtp.education.upgrade_doc + '' ); + this.$body.addClass( 'wp-mail-smtp-upgrade-mailer-education-modal' ); + }, + buttons: { + confirm: { + text: wp_mail_smtp.education.upgrade_button, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: function() { + var appendChar = /(\?)/.test( wp_mail_smtp.education.upgrade_url ) ? '&' : '?', + upgradeURL = wp_mail_smtp.education.upgrade_url + appendChar + 'utm_content=' + encodeURIComponent( upgradeUrlUtmContent ); + + window.open( upgradeURL, '_blank' ); + } + } + } + } ); + } + }, + + /** + * Individual mailers specific js code. + * + * @since 1.6.0 + */ + mailers: { + smtp: { + bindActions: function() { + + // Hide SMTP-specific user/pass when Auth disabled. + $( '#wp-mail-smtp-setting-smtp-auth' ).on( 'change', function() { + $( '#wp-mail-smtp-setting-row-smtp-user, #wp-mail-smtp-setting-row-smtp-pass' ).toggleClass( 'inactive' ); + } ); + + // Port default values based on encryption type. + $( '#wp-mail-smtp-setting-row-smtp-encryption input' ).on( 'change', function() { + + var $input = $( this ), + $smtpPort = $( '#wp-mail-smtp-setting-smtp-port', app.settingsForm ); + + if ( 'tls' === $input.val() ) { + $smtpPort.val( '587' ); + $( '#wp-mail-smtp-setting-row-smtp-autotls' ).addClass( 'inactive' ); + } else if ( 'ssl' === $input.val() ) { + $smtpPort.val( '465' ); + $( '#wp-mail-smtp-setting-row-smtp-autotls' ).removeClass( 'inactive' ); + } else { + $smtpPort.val( '25' ); + $( '#wp-mail-smtp-setting-row-smtp-autotls' ).removeClass( 'inactive' ); + } + } ); + } + } + }, + + /** + * Exit notice JS code when plugin settings are not saved. + * + * @since 1.9.0 + */ + triggerExitNotice: function() { + + var $settingPages = $( '.wp-mail-smtp-page-general' ); + + // Display an exit notice, if settings are not saved. + $( window ).on( 'beforeunload', function() { + if ( app.pluginSettingsChanged ) { + return wp_mail_smtp.text_settings_not_saved; + } + } ); + + // Set settings changed attribute, if any input was changed. + $( ':input:not( #wp-mail-smtp-setting-license-key, .wp-mail-smtp-not-form-input, #wp-mail-smtp-setting-gmail-one_click_setup_enabled, #wp-mail-smtp-setting-outlook-one_click_setup_enabled )', $settingPages ).on( 'change', function() { + app.pluginSettingsChanged = true; + } ); + + // Clear the settings changed attribute, if the settings are about to be saved. + $( 'form', $settingPages ).on( 'submit', function() { + app.pluginSettingsChanged = false; + } ); + }, + + /** + * Perform any checks before the settings are saved. + * + * Checks: + * - warn users if they try to save the settings with the default (PHP) mailer selected. + * + * @since 2.1.0 + */ + beforeSaveChecks: function() { + + app.settingsForm.on( 'submit', function() { + if ( $( '.wp-mail-smtp-mailer input:checked', app.settingsForm ).val() === 'mail' ) { + var $thisForm = $( this ); + + $.alert( { + backgroundDismiss: false, + escapeKey: false, + animationBounce: 1, + type: 'orange', + icon: '">' + wp_mail_smtp.default_mailer_notice.icon_alt + ' 0 ? $overlap.offset().top + $overlap.height() + 85 : 0, + viewTop = $( window ).scrollTop(), + viewBottom = viewTop + $( window ).height(); + + if ( wpfooterBottom <= viewBottom && wpfooterTop >= viewTop && overlapBottom > viewBottom ) { + $flyoutMenu.addClass( 'out' ); + } else { + $flyoutMenu.removeClass( 'out' ); + } + }, 50 ) ); + + $( window ).trigger( 'scroll' ); + } + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPMailSMTP.Admin.Settings.init(); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js new file mode 100755 index 00000000..b48efd30 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-admin.min.js @@ -0,0 +1 @@ +"use strict";var WPMailSMTP=window.WPMailSMTP||{};WPMailSMTP.Admin=WPMailSMTP.Admin||{},WPMailSMTP.Admin.Settings=WPMailSMTP.Admin.Settings||function(a,m,p){var n={pluginSettingsChanged:!1,init:function(){p(n.ready)},ready:function(){n.pageHolder=p(".wp-mail-smtp-tab-settings"),n.settingsForm=p(".wp-mail-smtp-connection-settings-form"),p("#screen-meta-links, #screen-meta").prependTo("#wp-mail-smtp-header-temp").show(),n.bindActions(),n.setJQueryConfirmDefaults(),n.initFlyoutMenu()},bindActions:function(){p(".wp-mail-smtp-mailer-image",n.settingsForm).on("click",function(){p(this).parents(".wp-mail-smtp-mailer").find("input").trigger("click")}),p(".wp-mail-smtp-mailer input",n.settingsForm).on("click",function(){var t=p(this);if(t.prop("disabled"))return t.hasClass("educate")&&n.education.upgradeMailer(t),!1;p(".wp-mail-smtp-mailer",n.settingsForm).removeClass("active"),p(this).parents(".wp-mail-smtp-mailer").addClass("active"),p(".wp-mail-smtp-mailer-option",n.settingsForm).addClass("hidden").removeClass("active"),p(".wp-mail-smtp-mailer-option-"+p(this).val(),n.settingsForm).addClass("active").removeClass("hidden")}),n.mailers.smtp.bindActions(),p("#wp-mail-smtp-pro-banner-dismiss",n.pageHolder).on("click",function(){p.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",task:"pro_banner_dismiss",nonce:wp_mail_smtp.nonce}}).always(function(){p("#wp-mail-smtp-pro-banner",n.pageHolder).fadeOut("fast")})}),p(".js-wp-mail-smtp-mailer-notice-dismiss",n.settingsForm).on("click",function(t){t.preventDefault();var e=p(this),i=e.parents(".inline-notice");if(e.hasClass("disabled"))return!1;p.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",nonce:wp_mail_smtp.nonce,task:"notice_dismiss",notice:i.data("notice"),mailer:i.data("mailer")},beforeSend:function(){e.addClass("disabled")}}).always(function(){i.fadeOut("fast",function(){e.removeClass("disabled")})})}),p("#wp-mail-smtp-debug .error-log-toggle").on("click",function(t){t.preventDefault(),p("#wp-mail-smtp-debug .error-log").slideToggle()}),p("#wp-mail-smtp-debug .error-log-copy").on("click",function(t){t.preventDefault();var e=p(this),i=p("#wp-mail-smtp-debug .error-log");i.is(":visible")||i.addClass("error-log-selection");t=a.createRange();t.selectNode(i[0]),m.getSelection().removeAllRanges(),m.getSelection().addRange(t),a.execCommand("Copy"),m.getSelection().removeAllRanges(),i.removeClass("error-log-selection"),e.addClass("error-log-copy-copied"),setTimeout(function(){e.removeClass("error-log-copy-copied")},1500)}),p(".js-wp-mail-smtp-provider-remove",n.settingsForm).on("click",function(){return confirm(wp_mail_smtp.text_provider_remove)}),p(".wp-mail-smtp-setting-copy",n.settingsForm).on("click",function(t){t.preventDefault(),p("#"+p(this).data("source_id")).get(0).select(),a.execCommand("Copy");var e=p(this).find(".dashicons");e.removeClass("dashicons-admin-page").addClass("wp-mail-smtp-dashicons-yes-alt-green wp-mail-smtp-success wp-mail-smtp-animate"),setTimeout(function(){e.removeClass("wp-mail-smtp-dashicons-yes-alt-green wp-mail-smtp-success wp-mail-smtp-animate").addClass("dashicons-admin-page")},1e3)}),p("#wp-mail-smtp-notice-bar").on("click",".dismiss",function(){var t=p(this).closest("#wp-mail-smtp-notice-bar");t.addClass("out"),setTimeout(function(){t.remove()},300),p.post(ajaxurl,{action:"wp_mail_smtp_notice_bar_dismiss",nonce:wp_mail_smtp.nonce})}),n.triggerExitNotice(),n.beforeSaveChecks(),p(".js-wp-mail-smtp-setting-mailer-radio-input",n.settingsForm).on("change",this.processMailerSettingsOnChange),p(".wp-mail-smtp-tab-tools-test #email-test-form").on("submit",function(){var t=p(this).find(".wp-mail-smtp-btn");t.attr("disabled",!0),t.find("span").hide(),t.find(".wp-mail-smtp-loading").show()}),p("#wp-mail-smtp-setting-gmail-one_click_setup_enabled-lite").on("click",function(t){t.preventDefault(),n.education.gmailOneClickSetupUpgrade()}),p("#wp-mail-smtp-setting-misc-rate_limit-lite").on("click",function(t){t.preventDefault(),n.education.rateLimitUpgrade()}),p(".wp-mail-smtp-btn[data-clear-field]").on("click",function(t){var e=p(this),i=e.attr("data-clear-field"),i=p(`#${i}`);i.prop("disabled",!1),i.attr("name",i.attr("data-name")),i.removeAttr("value"),i.focus(),e.remove()}),p(".email_test_tab_removal_notice").on("click",".notice-dismiss",function(){var t=p(this);p.ajax({url:ajaxurl,dataType:"json",type:"POST",data:{action:"wp_mail_smtp_ajax",nonce:wp_mail_smtp.nonce,task:"email_test_tab_removal_notice_dismiss"},beforeSend:function(){t.prop("disabled",!0)}})})},education:{upgradeMailer:function(t){var e=t.data("title").trim();n.education.upgradeModal(wp_mail_smtp.education.upgrade_title.replace(/%name%/g,e),wp_mail_smtp.education.upgrade_content.replace(/%name%/g,e),t.val())},gmailOneClickSetupUpgrade:function(){n.education.upgradeModal(wp_mail_smtp.education.gmail.one_click_setup_upgrade_title,wp_mail_smtp.education.gmail.one_click_setup_upgrade_content,"gmail-one-click-setup")},rateLimitUpgrade:function(){n.education.upgradeModal(wp_mail_smtp.education.rate_limit.upgrade_title,wp_mail_smtp.education.rate_limit.upgrade_content,"rate-limit-setting")},upgradeModal:function(t,e,i){p.alert({backgroundDismiss:!0,escapeKey:!0,animationBounce:1,type:"blue",closeIcon:!0,title:t,icon:'">'+wp_mail_smtp.education.upgrade_icon_lock+''+wp_mail_smtp.education.upgrade_bonus+wp_mail_smtp.education.upgrade_doc+""),this.$body.addClass("wp-mail-smtp-upgrade-mailer-education-modal")},buttons:{confirm:{text:wp_mail_smtp.education.upgrade_button,btnClass:"btn-confirm",keys:["enter"],action:function(){var t=/(\?)/.test(wp_mail_smtp.education.upgrade_url)?"&":"?",t=wp_mail_smtp.education.upgrade_url+t+"utm_content="+encodeURIComponent(i);m.open(t,"_blank")}}}})}},mailers:{smtp:{bindActions:function(){p("#wp-mail-smtp-setting-smtp-auth").on("change",function(){p("#wp-mail-smtp-setting-row-smtp-user, #wp-mail-smtp-setting-row-smtp-pass").toggleClass("inactive")}),p("#wp-mail-smtp-setting-row-smtp-encryption input").on("change",function(){var t=p(this),e=p("#wp-mail-smtp-setting-smtp-port",n.settingsForm);"tls"===t.val()?(e.val("587"),p("#wp-mail-smtp-setting-row-smtp-autotls").addClass("inactive")):("ssl"===t.val()?e.val("465"):e.val("25"),p("#wp-mail-smtp-setting-row-smtp-autotls").removeClass("inactive"))})}}},triggerExitNotice:function(){var t=p(".wp-mail-smtp-page-general");p(m).on("beforeunload",function(){if(n.pluginSettingsChanged)return wp_mail_smtp.text_settings_not_saved}),p(":input:not( #wp-mail-smtp-setting-license-key, .wp-mail-smtp-not-form-input, #wp-mail-smtp-setting-gmail-one_click_setup_enabled, #wp-mail-smtp-setting-outlook-one_click_setup_enabled )",t).on("change",function(){n.pluginSettingsChanged=!0}),p("form",t).on("submit",function(){n.pluginSettingsChanged=!1})},beforeSaveChecks:function(){n.settingsForm.on("submit",function(){if("mail"===p(".wp-mail-smtp-mailer input:checked",n.settingsForm).val()){var t=p(this);return p.alert({backgroundDismiss:!1,escapeKey:!1,animationBounce:1,type:"orange",icon:'">'+wp_mail_smtp.default_mailer_notice.icon_alt+' 1 ) { + --count; + el.$adminBarCounter.html( '' + count + '' ); + } else { + el.$adminBarCounter.remove(); + } + + // Remove notification. + var $nextMessage = el.$nextMessage.length < 1 ? el.$prevMessage : el.$nextMessage; + + if ( $nextMessage.length === 0 ) { + el.$notifications.remove(); + } else { + el.$currentMessage.remove(); + $nextMessage.addClass( 'current' ); + app.updateNavigation(); + } + } ); + }, + + /** + * Click on the Next notification button. + * + * @since 2.3.0 + * + * @param {object} event Event object. + */ + navNext: function( event ) { + + if ( el.$nextButton.hasClass( 'disabled' ) ) { + return; + } + + el.$currentMessage.removeClass( 'current' ); + el.$nextMessage.addClass( 'current' ); + + app.updateNavigation(); + }, + + /** + * Click on the Previous notification button. + * + * @since 2.3.0 + * + * @param {object} event Event object. + */ + navPrev: function( event ) { + + if ( el.$prevButton.hasClass( 'disabled' ) ) { + return; + } + + el.$currentMessage.removeClass( 'current' ); + el.$prevMessage.addClass( 'current' ); + + app.updateNavigation(); + }, + + /** + * Update navigation buttons. + * + * @since 2.3.0 + */ + updateNavigation: function() { + + el.$currentMessage = el.$notifications.find( '.wp-mail-smtp-notifications-message.current' ); + el.$nextMessage = el.$currentMessage.next( '.wp-mail-smtp-notifications-message' ); + el.$prevMessage = el.$currentMessage.prev( '.wp-mail-smtp-notifications-message' ); + + if ( el.$nextMessage.length === 0 ) { + el.$nextButton.addClass( 'disabled' ); + } else { + el.$nextButton.removeClass( 'disabled' ); + } + + if ( el.$prevMessage.length === 0 ) { + el.$prevButton.addClass( 'disabled' ); + } else { + el.$prevButton.removeClass( 'disabled' ); + } + }, + }; + + return app; + +}( document, window, jQuery ) ); + +// Initialize. +WPMailSMTPAdminNotifications.init(); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-notifications.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-notifications.min.js new file mode 100755 index 00000000..43ee87af --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-notifications.min.js @@ -0,0 +1 @@ +"use strict";var WPMailSMTPAdminNotifications=window.WPMailSMTPAdminNotifications||function(t){var a={$notifications:t("#wp-mail-smtp-notifications"),$nextButton:t("#wp-mail-smtp-notifications .navigation .next"),$prevButton:t("#wp-mail-smtp-notifications .navigation .prev"),$adminBarCounter:t("#wp-admin-bar-wp-mail-smtp-menu .wp-mail-smtp-admin-bar-menu-notification-counter")},i={init:function(){t(i.ready)},ready:function(){i.updateNavigation(),i.events()},events:function(){a.$notifications.on("click",".dismiss",i.dismiss).on("click",".next",i.navNext).on("click",".prev",i.navPrev)},dismiss:function(e){var n;0!==a.$currentMessage.length&&(n={action:"wp_mail_smtp_notification_dismiss",nonce:wp_mail_smtp.nonce,id:a.$currentMessage.data("message-id")},t.post(ajaxurl,n,function(e){e.success&&(1<(e=parseInt(a.$adminBarCounter.text(),10))?a.$adminBarCounter.html(""+--e+""):a.$adminBarCounter.remove(),0===(e=a.$nextMessage.length<1?a.$prevMessage:a.$nextMessage).length?a.$notifications.remove():(a.$currentMessage.remove(),e.addClass("current"),i.updateNavigation()))}))},navNext:function(e){a.$nextButton.hasClass("disabled")||(a.$currentMessage.removeClass("current"),a.$nextMessage.addClass("current"),i.updateNavigation())},navPrev:function(e){a.$prevButton.hasClass("disabled")||(a.$currentMessage.removeClass("current"),a.$prevMessage.addClass("current"),i.updateNavigation())},updateNavigation:function(){a.$currentMessage=a.$notifications.find(".wp-mail-smtp-notifications-message.current"),a.$nextMessage=a.$currentMessage.next(".wp-mail-smtp-notifications-message"),a.$prevMessage=a.$currentMessage.prev(".wp-mail-smtp-notifications-message"),0===a.$nextMessage.length?a.$nextButton.addClass("disabled"):a.$nextButton.removeClass("disabled"),0===a.$prevMessage.length?a.$prevButton.addClass("disabled"):a.$prevButton.removeClass("disabled")}};return i}((document,window,jQuery));WPMailSMTPAdminNotifications.init(); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/smtp-tools-debug-events.js b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-tools-debug-events.js new file mode 100755 index 00000000..9b4ae8d3 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/smtp-tools-debug-events.js @@ -0,0 +1,360 @@ +/* global wp_mail_smtp_tools_debug_events, ajaxurl, flatpickr */ +/** + * WPMailSMTP Debug Events functionality. + * + * @since 3.0.0 + */ + +'use strict'; + +var WPMailSmtpDebugEvents = window.WPMailSmtpDebugEvents || ( function( document, window, $ ) { + + /** + * Elements. + * + * @since 3.0.0 + * + * @type {object} + */ + var el = { + $debugEventsPage: $( '.wp-mail-smtp-tab-tools-debug-events' ), + $dateFlatpickr: $( '.wp-mail-smtp-filter-date-selector' ), + }; + + /** + * Public functions and properties. + * + * @since 3.0.0 + * + * @type {object} + */ + var app = { + + /** + * Start the engine. + * + * @since 3.0.0 + */ + init: function() { + + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 3.0.0 + */ + ready: function() { + + app.initDateRange(); + app.events(); + + // Open debug event popup from the query string. + var searchParams = new URLSearchParams( location.search ); + + if ( searchParams.has( 'debug_event_id' ) ) { + app.openDebugEventPopup( searchParams.get( 'debug_event_id' ) ); + } + }, + + /** + * Register JS events. + * + * @since 3.0.0 + */ + events: function() { + + el.$debugEventsPage.on( 'click', '#wp-mail-smtp-reset-filter .reset', app.resetFilter ); + el.$debugEventsPage.on( 'click', '#wp-mail-smtp-delete-all-debug-events-button', app.deleteAllDebugEvents ); + el.$debugEventsPage.on( 'click', '.js-wp-mail-smtp-debug-event-preview', app.eventClicked ); + }, + + /** + * Init Flatpickr at Date Range field. + * + * @since 3.0.0 + */ + initDateRange: function() { + + var langCode = wp_mail_smtp_tools_debug_events.lang_code, + flatpickrLocale = { + rangeSeparator: ' - ', + }; + + if ( + flatpickr !== 'undefined' && + Object.prototype.hasOwnProperty.call( flatpickr, 'l10ns' ) && + Object.prototype.hasOwnProperty.call( flatpickr.l10ns, langCode ) + ) { + flatpickrLocale = flatpickr.l10ns[ langCode ]; + flatpickrLocale.rangeSeparator = ' - '; + } + + el.$dateFlatpickr.flatpickr( { + altInput : true, + altFormat : 'M j, Y', + dateFormat: 'Y-m-d', + locale : flatpickrLocale, + mode : 'range' + } ); + }, + + /** + * Reset filter handler. + * + * @since 3.0.0 + */ + resetFilter: function() { + + var $form = $( this ).parents( 'form' ); + + $form.find( $( this ).data( 'scope' ) ).find( 'input,select' ).each( function() { + + var $this = $( this ); + if ( app.isIgnoredForResetInput( $this ) ) { + return; + } + app.resetInput( $this ); + } ); + + // Submit the form. + $form.submit(); + }, + + /** + * Reset input. + * + * @since 3.0.0 + * + * @param {object} $input Input element. + */ + resetInput: function( $input ) { + + switch ( $input.prop( 'tagName' ).toLowerCase() ) { + case 'input': + $input.val( '' ); + break; + case 'select': + $input.val( $input.find( 'option' ).first().val() ); + break; + } + }, + + /** + * Input is ignored for reset. + * + * @since 3.0.0 + * + * @param {object} $input Input element. + * + * @returns {boolean} Is ignored. + */ + isIgnoredForResetInput: function( $input ) { + + return [ 'submit', 'hidden' ].indexOf( ( $input.attr( 'type' ) || '' ).toLowerCase() ) !== -1 && + ! $input.hasClass( 'flatpickr-input' ); + }, + + /** + * Process the click on the delete all debug events button. + * + * @since 3.0.0 + * + * @param {object} event jQuery event. + */ + deleteAllDebugEvents: function( event ) { + + event.preventDefault(); + + var $btn = $( event.target ); + + $.confirm( { + backgroundDismiss: false, + escapeKey: true, + animationBounce: 1, + closeIcon: true, + type: 'orange', + icon: app.getModalIcon( 'exclamation-circle-solid-orange' ), + title: wp_mail_smtp_tools_debug_events.texts.notice_title, + content: wp_mail_smtp_tools_debug_events.texts.delete_all_notice, + buttons: { + confirm: { + text: wp_mail_smtp_tools_debug_events.texts.yes, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: function() { + app.executeAllDebugEventsDeletion( $btn ); + } + }, + cancel: { + text: wp_mail_smtp_tools_debug_events.texts.cancel, + btnClass: 'btn-cancel', + } + } + } ); + }, + + /** + * Process the click on the event item. + * + * @since 3.0.0 + * + * @param {object} event jQuery event. + */ + eventClicked: function( event ) { + + event.preventDefault(); + + app.openDebugEventPopup( $( this ).data( 'event-id' ) ); + }, + + /** + * Open debug event popup. + * + * @since 3.5.0 + * + * @param {int} eventId Debug event ID. + */ + openDebugEventPopup: function( eventId ) { + + var data = { + action: 'wp_mail_smtp_debug_event_preview', + id: eventId, + nonce: $( '#wp-mail-smtp-debug-events-nonce', el.$debugEventsPage ).val() + }; + + var popup = $.alert( { + backgroundDismiss: true, + escapeKey: true, + animationBounce: 1, + type: 'blue', + icon: app.getModalIcon( 'info-circle-blue' ), + title: false, + content: wp_mail_smtp_tools_debug_events.loader, + boxWidth: '550px', + buttons: { + confirm: { + text: wp_mail_smtp_tools_debug_events.texts.close, + btnClass: 'btn-confirm', + keys: [ 'enter' ] + } + }, + onOpenBefore: function() { + this.$contentPane.addClass( 'no-scroll' ); + } + } ); + + $.post( ajaxurl, data, function( response ) { + if ( response.success ) { + popup.setTitle( response.data.title ); + popup.setContent( response.data.content ); + } else { + popup.setIcon( app.getModalIcon( 'exclamation-circle-regular-red' ) ); + popup.setType( 'red' ); + popup.setContent( response.data ); + } + } ).fail( function() { + popup.setContent( wp_mail_smtp_tools_debug_events.texts.error_occurred ); + } ); + }, + + /** + * AJAX call for deleting all debug events. + * + * @since 3.0.0 + * + * @param {object} $btn jQuery object of the clicked button. + */ + executeAllDebugEventsDeletion: function( $btn ) { + + $btn.prop( 'disabled', true ); + + var data = { + action: 'wp_mail_smtp_delete_all_debug_events', + nonce: $( '#wp-mail-smtp-debug-events-nonce', el.$debugEventsPage ).val() + }; + + $.post( ajaxurl, data, function( response ) { + var message = response.data, + icon, + type, + callback; + + if ( response.success ) { + icon = 'check-circle-solid-green'; + type = 'green'; + callback = function() { + location.reload(); + return false; + }; + } else { + icon = 'exclamation-circle-regular-red'; + type = 'red'; + } + + app.displayModal( message, icon, type, callback ); + $btn.prop( 'disabled', false ); + } ).fail( function() { + app.displayModal( wp_mail_smtp_tools_debug_events.texts.error_occurred, 'exclamation-circle-regular-red', 'red' ); + $btn.prop( 'disabled', false ); + } ); + }, + + /** + * Display the modal with provided text and icon. + * + * @since 3.0.0 + * + * @param {string} message The message to be displayed in the modal. + * @param {string} icon The icon name from /assets/images/font-awesome/ to be used in modal. + * @param {string} type The type of the message (red, green, orange, blue, purple, dark). + * @param {Function} actionCallback The action callback function. + */ + displayModal: function( message, icon, type, actionCallback ) { + + type = type || 'default'; + actionCallback = actionCallback || function() {}; + + $.alert( { + backgroundDismiss: true, + escapeKey: true, + animationBounce: 1, + type: type, + closeIcon: true, + title: false, + icon: icon ? app.getModalIcon( icon ) : '', + content: message, + buttons: { + confirm: { + text: wp_mail_smtp_tools_debug_events.texts.ok, + btnClass: 'wp-mail-smtp-btn wp-mail-smtp-btn-md', + keys: [ 'enter' ], + action: actionCallback + } + } + } ); + }, + + /** + * Returns prepared modal icon. + * + * @since 3.0.0 + * + * @param {string} icon The icon name from /assets/images/font-awesome/ to be used in modal. + * + * @returns {string} Modal icon HTML. + */ + getModalIcon: function( icon ) { + + return '">{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function N(t){return!function(t){return"symbol"==typeof t||"object"==typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const n=e.length;let o=0,a=n;if(t._sorted){const{iScale:r,vScale:l,_parsed:h}=t,c=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null,d=r.axis,{min:u,max:f,minDefined:g,maxDefined:p}=r.getUserBounds();if(g){if(o=Math.min(it(h,d,u).lo,i?n:it(e,d,r.getPixelForValue(u)).lo),c){const t=h.slice(0,o+1).reverse().findIndex((t=>!s(t[l.axis])));o-=Math.max(0,t)}o=J(o,0,n-1)}if(p){let t=Math.max(it(h,r.axis,f,!0).hi+1,i?0:it(e,d,r.getPixelForValue(f),!0).hi+1);if(c){const e=h.slice(t-1).findIndex((t=>!s(t[l.axis])));t+=Math.max(0,e)}a=J(t,o,n)-o}else a=n-o}return{start:o,count:a}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class xt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var bt=new xt; + /*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function xe(t,e){return me(t).getPropertyValue(e)}const be=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=be[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=t&&ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};fe()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(t){}return t}();function Pe(t,e){const i=xe(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){const o=i||t;void 0===s&&(s=ti("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e="x"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const xi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,bi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(""+t).match(xi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:"y",right:"x",bottom:"y",left:"x"})}function wi(t){return vi(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(bi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Li(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hb||l(n,x,p)&&0!==r(n,x),v=()=>!b||0===r(o,p)||l(o,x,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==x&&(b=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r!s(t[e.axis])));n.lo-=Math.max(0,a);const r=i.slice(n.hi).findIndex((t=>!s(t[e.axis])));n.hi+=Math.max(0,r)}return n}if(o._sharedOptions){const t=a[0],s="function"==typeof t.getRange&&t.getRange(e);if(s){const t=r(a,e,i-s),n=r(a,e,i+s);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function $i(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t{t[a]&&t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Ki={evaluateInteractionItems:$i,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?Yi(t,n,o,s,a):Xi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?Yi(t,n,o,s,a):Xi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tYi(t,ve(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return Xi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>qi(t,ve(e,t),"x",i.intersect,s),y:(t,e,i,s)=>qi(t,ve(e,t),"y",i.intersect,s)}};const Gi=["left","top","right","bottom"];function Zi(t,e){return t.filter((t=>t.pos===e))}function Ji(t,e){return t.filter((t=>-1===Gi.indexOf(t.pos)&&t.box.axis===e))}function Qi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function ts(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Gi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function os(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Qi(Zi(e,"left"),!0),n=Qi(Zi(e,"right")),o=Qi(Zi(e,"top"),!0),a=Qi(Zi(e,"bottom")),r=Ji(e,"x"),l=Ji(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Zi(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);is(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=ts(l.concat(h),d);os(r.fullSize,g,d,p),os(l,g,d,p),os(h,g,d,p)&&os(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),rs(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,rs(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class hs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class cs extends hs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const ds="$chartjs",us={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},fs=t=>null===t||""===t;const gs=!!Se&&{passive:!0};function ps(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,gs)}function ms(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function xs(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ms(i.addedNodes,s),e=e&&!ms(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function bs(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ms(i.removedNodes,s),e=e&&!ms(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const _s=new Map;let ys=0;function vs(){const t=window.devicePixelRatio;t!==ys&&(ys=t,_s.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function Ms(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){_s.size||window.addEventListener("resize",vs),_s.set(t,e)}(t,o),a}function ws(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){_s.delete(t),_s.size||window.removeEventListener("resize",vs)}(t)}function ks(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=us[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t&&t.addEventListener(e,i,gs)}(s,e,n),n}class Ss extends hs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[ds]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",fs(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(fs(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[ds])return!1;const i=e[ds].initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[ds],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:xs,detach:bs,resize:Ms}[e]||ks;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:ws,detach:ws,resize:ws}[e]||ps)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=t&&ge(t);return!(!e||!e.isConnected)}}function Ps(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?cs:Ss}var Ds=Object.freeze({__proto__:null,BasePlatform:hs,BasicPlatform:cs,DomPlatform:Ss,_detectPlatform:Ps});const Cs="transparent",Os={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Cs),n=s.valid&&Qt(e||Cs);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class As{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Os[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new As(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(bt.add(this._chart,i),!0):void 0}}function Ls(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Es(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function Vs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Ws(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Ns=t=>"reset"===t||"none"===t,Hs=(t,e)=>e?t:Object.assign({},t);class js{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Is(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Ws(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Bs(t,"x")),o=e.yAxisID=l(i.yAxisID,Bs(t,"y")),a=e.rAxisID=l(i.rAxisID,Bs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Ws(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e)){const t=this._cachedMeta;this._data=function(t,e){const{iScale:i,vScale:s}=e,n="x"===i.axis?"x":"y",o="x"===s.axis?"x":"y",a=Object.keys(t),r=new Array(a.length);let l,h,c;for(l=0,h=a.length;l0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Es(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Hs(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Ts(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ns(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Ns(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ns(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function Ys(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for(Us(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,qs=(t,e)=>Math.min(e||t,t);function Ks(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Zs(t){return t.drawTicks?t.tickLength:0}function Js(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Qs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class tn extends $s{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Zs(t.grid)-e.padding-Js(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Js(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Zs(n)+o):(t.height=this.maxHeight,t.width=Zs(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Zs(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,x=function(t){return Ae(i,t,p)};let b,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)b=x(this.bottom),w=this.bottom-u,S=b-m,D=x(t.top)+m,O=t.bottom;else if("bottom"===a)b=x(this.top),D=t.top,O=x(t.bottom)-m,w=b+m,S=this.top+u;else if("left"===a)b=x(this.right),M=this.right-u,k=b-m,P=x(t.left)+m,C=t.right;else if("right"===a)b=x(this.left),P=t.left,C=x(t.right)-m,M=b+m,k=this.left+u;else if("x"===e){if("center"===a)b=x((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];b=x(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=b+m,S=w+u}else if("y"===e){if("center"===a)b=x((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];b=x(this.chart.scales[t].getPixelForValue(e))}M=b-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_0&&(o-=s/2)}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}x.push({label:v,font:P,textOffset:O,options:{rotation:m,color:i,strokeColor:o,strokeWidth:h,textAlign:f,textBaseline:A,translation:[M,w],backdrop:d}})}return x}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-$(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class sn{constructor(){this.controllers=new en(js,"datasets",!0),this.elements=new en($s,"elements"),this.plugins=new en(Object,"plugins"),this.scales=new en(tn,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function an(t,e){return e||!1!==t?!0===t?{}:t:null}function rn(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function ln(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function hn(t){if("x"===t||"y"===t||"r"===t)return t}function cn(t,...e){if(hn(t))return t;for(const s of e){const e=s.axis||("top"===(i=s.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&hn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function dn(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function un(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=ln(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=cn(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return dn(t,"x",i[0])||dn(t,"y",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?"_index_":"_value_"}(l,n),c=i.scales||{};a[e]=b(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||ln(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),b(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];b(e,[ue.scales[e.type],ue.scale])})),a}function fn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=un(t,e)}function gn(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const pn=new Map,mn=new Set;function xn(t,e){let i=pn.get(t);return i||(i=e(),pn.set(t,i),mn.add(i)),i}const bn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class _n{constructor(t){this._config=function(t){return(t=t||{}).data=gn(t.data),fn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=gn(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),fn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return xn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return xn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return xn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return xn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>bn(r,t,e)))),e.forEach((t=>bn(r,s,t))),e.forEach((t=>bn(r,re[n]||{},t))),e.forEach((t=>bn(r,ue,t))),e.forEach((t=>bn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),mn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=yn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||vn(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=yn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function yn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const vn=t=>o(t)&&Object.getOwnPropertyNames(t).some((e=>S(t[e])));const Mn=["top","bottom","left","right","chartArea"];function wn(t,e){return"top"===t||"bottom"===t||-1===Mn.indexOf(t)&&"x"===e}function kn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function Sn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function Pn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Dn(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Cn={},On=t=>{const e=Dn(t);return Object.values(Cn).filter((t=>t.canvas===e)).pop()};function An(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class Tn{static defaults=ue;static instances=Cn;static overrides=re;static registry=nn;static version="4.4.9";static getChart=On;static register(...t){nn.add(...t),Ln()}static unregister(...t){nn.remove(...t),Ln()}constructor(t,e){const s=this.config=new _n(e),n=Dn(t),o=On(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Ps(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new on,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Cn[this.id]=this,r&&l?(bt.listen(this,"complete",Sn),bt.listen(this,"progress",Pn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return nn}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return bt.stop(this),this}resize(t,e){bt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=cn(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=cn(o,n),r=l(n.type,e.dtype);void 0!==n.position&&wn(n.position,a)===wn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(nn.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{ls.configure(this,t,t.options),ls.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(kn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{ls.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){An(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ls.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i={meta:t,index:t.index,cancelable:!0},s=Ni(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&Ie(e,s),t.controller.draw(),s&&ze(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Ki.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),bt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Ln(){return u(Tn.instances,(t=>t._plugins.invalidate()))}function En(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Rn{static override(t){Object.assign(Rn.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return En()}parse(){return En()}format(){return En()}add(){return En()}diff(){return En()}startOf(){return En()}endOf(){return En()}}var In={_date:Rn};function zn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Vn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),x=g(C,h,d),b=g(C+E,c,u);s=(p-x)/2,n=(m-b)/2,o=-(p+x)/2,a=-(m+b)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),x=(i.width-o)/f,b=(i.height-o)/g,_=Math.max(Math.min(x,b)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Un=Object.freeze({__proto__:null,BarController:class extends js{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Vn(t,e,i,s)}parseArrayData(t,e,i,s){return Vn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=this._cachedMeta.controller.getParsed(e),l=r&&r[i.axis],h=t=>{const e=t._parsed.find((t=>t[i.axis]===l)),n=e&&e[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!h(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(x-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);x=Math.max(Math.min(x,h),o),d=x+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(x))}if(x===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;x+=t,u-=t}return{size:u,base:x,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=x?g:{};if(i=b){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),x||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends $n{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:Yn,RadarController:class extends js{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>x,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),b||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Xn(t,e,i,s){const n=vi(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function qn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Kn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,x=n-p-f,{outerStart:b,outerEnd:_,innerStart:y,innerEnd:v}=Xn(e,u,d,x-m),M=d-b,w=d-_,k=m+b/M,S=x-_/w,P=u+y,D=u+v,O=m+y/P,A=x-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=qn(w,S,a,r);t.arc(e.x,e.y,_,S,x+E)}const i=qn(D,x,a,r);if(t.lineTo(i.x,i.y),v>0){const e=qn(D,A,a,r);t.arc(e.x,e.y,v,x+E,A+Math.PI)}const s=(x-v/u+(m+y/u))/2;if(t.arc(a,r,u,x-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=qn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=qn(M,m,a,r);if(t.lineTo(n.x,n.y),b>0){const e=qn(M,k,a,r);t.arc(e.x,e.y,b,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Gn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f="inner"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let g=e.endAngle;if(o){Kn(t,e,i,s,g,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(Kn(t,e,i,s,g,n),t.stroke())}function Zn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Jn(t,e,i){t.lineTo(i.x,i.y)}function Qn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[b(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[b(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=s,x=0,f=g=i),p=i}_()}function io(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?eo:to}const so="function"==typeof Path2D;function no(t,e,i,s){so&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Zn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=io(e);for(const r of n)Zn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class oo extends $s{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||"monotone"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a),g=Z(n,a,r)&&a!==r,p=f>=O||g,m=tt(o,h+u,c+u);return p&&m}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){Kn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function mo(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,x=!s(a),b=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!x&&!b)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),x&&b&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=x?a:M,w=b?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(x&&(u&&M!==a?(i.push({value:a}),Mr)break;i.push({value:t})}return b&&u&&w!==r?i.length&&V(i[i.length-1].value,r,xo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):b&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&j(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class _o extends bo{static id="linear";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const yo=t=>Math.floor(z(t)),vo=(t,e)=>Math.pow(10,yo(t)+e);function Mo(t){return 1===t/Math.pow(10,yo(t))}function wo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function ko(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=yo(e);let o=function(t,e){let i=yo(e-t);for(;wo(t,e,i)>10;)i++;for(;wo(t,e,i)<10;)i--;return Math.min(i,yo(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:Mo(g),significand:u}),s}class So extends tn{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=bo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===vo(this.min,0)?vo(this.min,-1):vo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(vo(i,-1)),o(vo(s,1)))),i<=0&&n(vo(s,-1)),s<=0&&o(vo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=ko({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function Po(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Do(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Co(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Ao(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(h),u=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function To(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function Lo(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Eo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(Po(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/Po(this.options))}generateTickLabels(t){bo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Co(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));Lo(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash||[]),o.lineDashOffset=n.dashOffset,o.beginPath(),Eo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Io={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},zo=Object.keys(Io);function Fo(t,e){return t-e}function Vo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function Bo(t,e,i,s){const n=zo.length;for(let o=zo.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function No(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class Ho extends tn{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new In._date(t.adapters.date);s.init(e),b(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Vo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Bo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=zo.length-1;o>=zo.indexOf(i);o--){const i=zo[o];if(Io[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return zo[i?zo.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=zo.indexOf(t)+1,i=zo.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Bo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var $o=Object.freeze({__proto__:null,CategoryScale:class extends tn{static id="category";static defaults={ticks:{callback:mo}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:po(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return mo.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:_o,LogarithmicScale:So,RadialLinearScale:Ro,TimeScale:Ho,TimeSeriesScale:class extends Ho{static id="timeseries";static defaults=Ho.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=jo(e,this.min),this._tableRange=jo(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(jo(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return jo(this._table,i*this._tableRange+this._minPos,!0)}}});const Yo=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Uo=Yo.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Xo(t){return Yo[t%Yo.length]}function qo(t){return Uo[t%Uo.length]}function Ko(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n instanceof Yn?e=function(t,e){return t.backgroundColor=t.data.map((()=>qo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Xo(e),t.backgroundColor=qo(e),++e}(i,e))}}function Go(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Zo={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n,a=Go(s)||(r=n)&&(r.borderColor||r.backgroundColor)||o&&Go(o)||"rgba(0,0,0,0.1)"!==ue.borderColor||"rgba(0,0,0,0.1)"!==ue.backgroundColor;var r;if(!i.forceOverride&&a)return;const l=Ko(t);s.forEach(l)}};function Jo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Qo(t){t.data.datasets.forEach((t=>{Jo(t)}))}var ta={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Qo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Jo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const x=[],b=e+i-1,_=t[e].x,y=t[b].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&x.push({...t[e],x:p}),s!==u&&s!==i&&x.push({...t[s],x:p})}o>0&&i!==u&&x.push(t[i]),x.push(a),h=e,m=0,f=g=l,c=d=u=o}}return x}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Qo(t)}};function ea(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ia(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function sa(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function na(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ia(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new oo({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function oa(t){return t&&!1!==t.fill}function aa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function ra(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function la(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&ua(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;oa(i)&&ua(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;oa(s)&&"beforeDatasetDraw"===i.drawTime&&ua(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const ba=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class _a extends $s{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ba(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=ya(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ba(o,d),x=this.isHorizontal(),b=this._computeTitleHeight();f=x?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+b,line:0}:{x:this.left+c,y:ft(n,this.top+b+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),x?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+b+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,x?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),x)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=ya(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class Ma extends $s{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var wa={id:"title",_element:Ma,start(t,e,i){!function(t,e){const i=new Ma({ctx:t.ctx,options:e,chart:t});ls.configure(t,i,e),ls.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ls.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ls.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ka=new WeakMap;var Sa={id:"subtitle",start(t,e,i){const s=new Ma({ctx:t.ctx,options:i,chart:t});ls.configure(t,s,i),ls.addBox(t,s),ka.set(t,s)},stop(t){ls.removeBox(t,ka.get(t)),ka.delete(t)},beforeUpdate(t,e,i){const s=ka.get(t);ls.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Pa={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,o=0;for(e=0,i=t.length;et+e))/s.size,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i-1?t.split("\n"):t}function Oa(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Aa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,x=0,b=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){x=Math.max(x,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),x+=p.width,{width:x,height:m}}function Ta(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function La(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Ta(t,e,i,s),yAlign:s}}function Ea(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ra(t,e,i){const s=ki(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ia(t){return Da([],Ca(t))}function za(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const Fa={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=za(i,t);Da(e.before,Ca(Va(n,"beforeLabel",this,t))),Da(e.lines,Va(n,"label",this,t)),Da(e.after,Ca(Va(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ia(Va(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Va(i,"beforeFooter",this,t),n=Va(i,"footer",this,t),o=Va(i,"afterFooter",this,t);let a=[];return a=Da(a,Ca(s)),a=Da(a,Ca(n)),a=Da(a,Ca(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=za(t.callbacks,e);s.push(Va(i,"labelColor",this,e)),n.push(Va(i,"labelPointStyle",this,e)),o.push(Va(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Pa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Aa(this,i),a=Object.assign({},t,e),r=La(this.chart,i,a),l=Ea(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,b=_+o,y=_-o):(p=d+f,m=p+o,b=_-o,y=_+o),x=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(b=u,_=b-o,p=m-o,x=m+o):(b=u+g,_=b+o,p=m+o,x=m-o),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ra(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let x,b,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Ra(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Pa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Aa(this,t),a=Object.assign({},i,this._size),r=La(e,t,a),l=Ea(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e.filter((t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index)));const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Pa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Wa={id:"tooltip",_element:Ba,positioners:Pa,afterInit(t,e,i){i&&(t.tooltip=new Ba({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Fa},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return Tn.register(Un,$o,go,t),Tn.helpers={...Hi},Tn._adapters=In,Tn.Animation=As,Tn.Animations=Ts,Tn.animator=bt,Tn.controllers=nn.controllers.items,Tn.DatasetController=js,Tn.Element=$s,Tn.elements=go,Tn.Interaction=Ki,Tn.layouts=ls,Tn.platforms=Ds,Tn.Scale=tn,Tn.Ticks=ae,Object.assign(Tn,Un,$o,go,t,Ds),Tn.WPMailSMTPChart=Tn,"undefined"!=typeof window&&(window.WPMailSMTPChart=Tn),Tn})); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/vendor/chartjs-adapter-moment.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/chartjs-adapter-moment.min.js new file mode 100755 index 00000000..1454812e --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/chartjs-adapter-moment.min.js @@ -0,0 +1,10 @@ +/*! + * chartjs-adapter-moment v1.0.1 + * https://www.chartjs.org + * (c) 2022 chartjs-adapter-moment Contributors + * Released under the MIT license + * + * NOTE: This file was modified. Chart object was renamed to WPMailSMTPChart, to prevent JS library conflicts with other plugins. + * "Chart" was replaced with "WPMailSMTPChart" 1 time in this file. + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("moment"),require("chart.js")):"function"==typeof define&&define.amd?define(["moment","chart.js"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).moment,e.WPMailSMTPChart)}(this,(function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=n(e);const a={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};t._adapters._date.override("function"==typeof f.default?{_id:"moment",formats:function(){return a},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=f.default(e,t):e instanceof f.default||(e=f.default(e)),e.isValid()?e.valueOf():null},format:function(e,t){return f.default(e).format(t)},add:function(e,t,n){return f.default(e).add(t,n).valueOf()},diff:function(e,t,n){return f.default(e).diff(f.default(t),n)},startOf:function(e,t,n){return e=f.default(e),"isoWeek"===t?(n=Math.trunc(Math.min(Math.max(0,n),6)),e.isoWeekday(n).startOf("day").valueOf()):e.startOf(t).valueOf()},endOf:function(e,t){return f.default(e).endOf(t).valueOf()}}:{})})); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/vendor/flatpickr.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/flatpickr.min.js new file mode 100755 index 00000000..357a860a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/flatpickr.min.js @@ -0,0 +1,2 @@ +/* flatpickr v4.6.9,, @license MIT */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).flatpickr=t()}(this,(function(){"use strict";var e=function(){return(e=Object.assign||function(e){for(var t,n=1,a=arguments.length;n",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},i={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var t=e%100;if(t>3&&t<21)return"th";switch(t%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},o=function(e,t){return void 0===t&&(t=2),("000"+e).slice(-1*t)},r=function(e){return!0===e?1:0};function l(e,t){var n;return function(){var a=this;clearTimeout(n),n=setTimeout((function(){return e.apply(a,arguments)}),t)}}var c=function(e){return e instanceof Array?e:[e]};function d(e,t,n){if(!0===n)return e.classList.add(t);e.classList.remove(t)}function s(e,t,n){var a=window.document.createElement(e);return t=t||"",n=n||"",a.className=t,void 0!==n&&(a.textContent=n),a}function u(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function f(e,t){return t(e)?e:e.parentNode?f(e.parentNode,t):void 0}function m(e,t){var n=s("div","numInputWrapper"),a=s("input","numInput "+e),i=s("span","arrowUp"),o=s("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?a.type="number":(a.type="text",a.pattern="\\d*"),void 0!==t)for(var r in t)a.setAttribute(r,t[r]);return n.appendChild(a),n.appendChild(i),n.appendChild(o),n}function g(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(t){return e.target}}var p=function(){},h=function(e,t,n){return n.months[t?"shorthand":"longhand"][e]},v={D:p,F:function(e,t,n){e.setMonth(n.months.longhand.indexOf(t))},G:function(e,t){e.setHours(parseFloat(t))},H:function(e,t){e.setHours(parseFloat(t))},J:function(e,t){e.setDate(parseFloat(t))},K:function(e,t,n){e.setHours(e.getHours()%12+12*r(new RegExp(n.amPM[1],"i").test(t)))},M:function(e,t,n){e.setMonth(n.months.shorthand.indexOf(t))},S:function(e,t){e.setSeconds(parseFloat(t))},U:function(e,t){return new Date(1e3*parseFloat(t))},W:function(e,t,n){var a=parseInt(t),i=new Date(e.getFullYear(),0,2+7*(a-1),0,0,0,0);return i.setDate(i.getDate()-i.getDay()+n.firstDayOfWeek),i},Y:function(e,t){e.setFullYear(parseFloat(t))},Z:function(e,t){return new Date(t)},d:function(e,t){e.setDate(parseFloat(t))},h:function(e,t){e.setHours(parseFloat(t))},i:function(e,t){e.setMinutes(parseFloat(t))},j:function(e,t){e.setDate(parseFloat(t))},l:p,m:function(e,t){e.setMonth(parseFloat(t)-1)},n:function(e,t){e.setMonth(parseFloat(t)-1)},s:function(e,t){e.setSeconds(parseFloat(t))},u:function(e,t){return new Date(parseFloat(t))},w:p,y:function(e,t){e.setFullYear(2e3+parseFloat(t))}},D={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},w={Z:function(e){return e.toISOString()},D:function(e,t,n){return t.weekdays.shorthand[w.w(e,t,n)]},F:function(e,t,n){return h(w.n(e,t,n)-1,!1,t)},G:function(e,t,n){return o(w.h(e,t,n))},H:function(e){return o(e.getHours())},J:function(e,t){return void 0!==t.ordinal?e.getDate()+t.ordinal(e.getDate()):e.getDate()},K:function(e,t){return t.amPM[r(e.getHours()>11)]},M:function(e,t){return h(e.getMonth(),!0,t)},S:function(e){return o(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,t,n){return n.getWeek(e)},Y:function(e){return o(e.getFullYear(),4)},d:function(e){return o(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return o(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,t){return t.weekdays.longhand[e.getDay()]},m:function(e){return o(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var t=e.config,n=void 0===t?a:t,o=e.l10n,r=void 0===o?i:o,l=e.isMobile,c=void 0!==l&&l;return function(e,t,a){var i=a||r;return void 0===n.formatDate||c?t.split("").map((function(t,a,o){return w[t]&&"\\"!==o[a-1]?w[t](e,i,n):"\\"!==t?t:""})).join(""):n.formatDate(e,t,i)}},C=function(e){var t=e.config,n=void 0===t?a:t,o=e.l10n,r=void 0===o?i:o;return function(e,t,i,o){if(0===e||e){var l,c=o||r,d=e;if(e instanceof Date)l=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)l=new Date(e);else if("string"==typeof e){var s=t||(n||a).dateFormat,u=String(e).trim();if("today"===u)l=new Date,i=!0;else if(/Z$/.test(u)||/GMT$/.test(u))l=new Date(e);else if(n&&n.parseDate)l=n.parseDate(e,s);else{l=n&&n.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0);for(var f=void 0,m=[],g=0,p=0,h="";g=0?new Date:new Date(w.config.minDate.getTime()),n=x(w.config);t.setHours(n.hours,n.minutes,n.seconds,t.getMilliseconds()),w.selectedDates=[t],w.latestSelectedDateObj=t}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var t="keydown"===e.type,n=g(e),a=n;void 0!==w.amPM&&n===w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]);var i=parseFloat(a.getAttribute("min")),l=parseFloat(a.getAttribute("max")),c=parseFloat(a.getAttribute("step")),d=parseInt(a.value,10),s=e.delta||(t?38===e.which?1:-1:0),u=d+c*s;if(void 0!==a.value&&2===a.value.length){var f=a===w.hourElement,m=a===w.minuteElement;ul&&(u=a===w.hourElement?u-l-r(!w.amPM):i,m&&j(void 0,1,w.hourElement)),w.amPM&&f&&(1===c?u+d===23:Math.abs(u-d)>c)&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]),a.value=o(u)}}(e);var a=w._input.value;S(),be(),w._input.value!==a&&w._debouncedChange()}function S(){if(void 0!==w.hourElement&&void 0!==w.minuteElement){var e,t,n=(parseInt(w.hourElement.value.slice(-2),10)||0)%24,a=(parseInt(w.minuteElement.value,10)||0)%60,i=void 0!==w.secondElement?(parseInt(w.secondElement.value,10)||0)%60:0;void 0!==w.amPM&&(e=n,t=w.amPM.textContent,n=e%12+12*r(t===w.l10n.amPM[1]));var o=void 0!==w.config.minTime||w.config.minDate&&w.minDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.minDate,!0);if(void 0!==w.config.maxTime||w.config.maxDate&&w.maxDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.maxDate,!0)){var l=void 0!==w.config.maxTime?w.config.maxTime:w.config.maxDate;(n=Math.min(n,l.getHours()))===l.getHours()&&(a=Math.min(a,l.getMinutes())),a===l.getMinutes()&&(i=Math.min(i,l.getSeconds()))}if(o){var c=void 0!==w.config.minTime?w.config.minTime:w.config.minDate;(n=Math.max(n,c.getHours()))===c.getHours()&&a=12)]),void 0!==w.secondElement&&(w.secondElement.value=o(n)))}function F(e){var t=g(e),n=parseInt(t.value)+(e.delta||0);(n/1e3>1||"Enter"===e.key&&!/[^\d]/.test(n.toString()))&&Q(n)}function A(e,t,n,a){return t instanceof Array?t.forEach((function(t){return A(e,t,n,a)})):e instanceof Array?e.forEach((function(e){return A(e,t,n,a)})):(e.addEventListener(t,n,a),void w._handlers.push({remove:function(){return e.removeEventListener(t,n)}}))}function N(){pe("onChange")}function P(e,t){var n=void 0!==e?w.parseDate(e):w.latestSelectedDateObj||(w.config.minDate&&w.config.minDate>w.now?w.config.minDate:w.config.maxDate&&w.config.maxDate=0&&M(e,w.selectedDates[1])<=0)}(t)&&!ve(t)&&o.classList.add("inRange"),w.weekNumbers&&1===w.config.showMonths&&"prevMonthDay"!==e&&n%7==1&&w.weekNumbers.insertAdjacentHTML("beforeend",""+w.config.getWeek(t)+""),pe("onDayCreate",o),o}function L(e){e.focus(),"range"===w.config.mode&&ae(e)}function W(e){for(var t=e>0?0:w.config.showMonths-1,n=e>0?w.config.showMonths:-1,a=t;a!=n;a+=e)for(var i=w.daysContainer.children[a],o=e>0?0:i.children.length-1,r=e>0?i.children.length:-1,l=o;l!=r;l+=e){var c=i.children[l];if(-1===c.className.indexOf("hidden")&&X(c.dateObj))return c}}function R(e,t){var n=ee(document.activeElement||document.body),a=void 0!==e?e:n?document.activeElement:void 0!==w.selectedDateElem&&ee(w.selectedDateElem)?w.selectedDateElem:void 0!==w.todayDateElem&&ee(w.todayDateElem)?w.todayDateElem:W(t>0?1:-1);void 0===a?w._input.focus():n?function(e,t){for(var n=-1===e.className.indexOf("Month")?e.dateObj.getMonth():w.currentMonth,a=t>0?w.config.showMonths:-1,i=t>0?1:-1,o=n-w.currentMonth;o!=a;o+=i)for(var r=w.daysContainer.children[o],l=n-w.currentMonth===o?e.$i+t:t<0?r.children.length-1:0,c=r.children.length,d=l;d>=0&&d0?c:-1);d+=i){var s=r.children[d];if(-1===s.className.indexOf("hidden")&&X(s.dateObj)&&Math.abs(e.$i-d)>=Math.abs(t))return L(s)}w.changeMonth(i),R(W(i),0)}(a,t):L(a)}function B(e,t){for(var n=(new Date(e,t,1).getDay()-w.l10n.firstDayOfWeek+7)%7,a=w.utils.getDaysInMonth((t-1+12)%12,e),i=w.utils.getDaysInMonth(t,e),o=window.document.createDocumentFragment(),r=w.config.showMonths>1,l=r?"prevMonthDay hidden":"prevMonthDay",c=r?"nextMonthDay hidden":"nextMonthDay",d=a+1-n,u=0;d<=a;d++,u++)o.appendChild(H(l,new Date(e,t-1,d),d,u));for(d=1;d<=i;d++,u++)o.appendChild(H("",new Date(e,t,d),d,u));for(var f=i+1;f<=42-n&&(1===w.config.showMonths||u%7!=0);f++,u++)o.appendChild(H(c,new Date(e,t+1,f%i),f,u));var m=s("div","dayContainer");return m.appendChild(o),m}function J(){if(void 0!==w.daysContainer){u(w.daysContainer),w.weekNumbers&&u(w.weekNumbers);for(var e=document.createDocumentFragment(),t=0;t1||"dropdown"!==w.config.monthSelectorType)){var e=function(e){return!(void 0!==w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&ew.config.maxDate.getMonth())};w.monthsDropdownContainer.tabIndex=-1,w.monthsDropdownContainer.innerHTML="";for(var t=0;t<12;t++)if(e(t)){var n=s("option","flatpickr-monthDropdown-month");n.value=new Date(w.currentYear,t).getMonth().toString(),n.textContent=h(t,w.config.shorthandCurrentMonth,w.l10n),n.tabIndex=-1,w.currentMonth===t&&(n.selected=!0),w.monthsDropdownContainer.appendChild(n)}}}function U(){var e,t=s("div","flatpickr-month"),n=window.document.createDocumentFragment();w.config.showMonths>1||"static"===w.config.monthSelectorType?e=s("span","cur-month"):(w.monthsDropdownContainer=s("select","flatpickr-monthDropdown-months"),w.monthsDropdownContainer.setAttribute("aria-label",w.l10n.monthAriaLabel),A(w.monthsDropdownContainer,"change",(function(e){var t=g(e),n=parseInt(t.value,10);w.changeMonth(n-w.currentMonth),pe("onMonthChange")})),K(),e=w.monthsDropdownContainer);var a=m("cur-year",{tabindex:"-1"}),i=a.getElementsByTagName("input")[0];i.setAttribute("aria-label",w.l10n.yearAriaLabel),w.config.minDate&&i.setAttribute("min",w.config.minDate.getFullYear().toString()),w.config.maxDate&&(i.setAttribute("max",w.config.maxDate.getFullYear().toString()),i.disabled=!!w.config.minDate&&w.config.minDate.getFullYear()===w.config.maxDate.getFullYear());var o=s("div","flatpickr-current-month");return o.appendChild(e),o.appendChild(a),n.appendChild(o),t.appendChild(n),{container:t,yearElement:i,monthElement:e}}function q(){u(w.monthNav),w.monthNav.appendChild(w.prevMonthNav),w.config.showMonths&&(w.yearElements=[],w.monthElements=[]);for(var e=w.config.showMonths;e--;){var t=U();w.yearElements.push(t.yearElement),w.monthElements.push(t.monthElement),w.monthNav.appendChild(t.container)}w.monthNav.appendChild(w.nextMonthNav)}function $(){w.weekdayContainer?u(w.weekdayContainer):w.weekdayContainer=s("div","flatpickr-weekdays");for(var e=w.config.showMonths;e--;){var t=s("div","flatpickr-weekdaycontainer");w.weekdayContainer.appendChild(t)}return z(),w.weekdayContainer}function z(){if(w.weekdayContainer){var e=w.l10n.firstDayOfWeek,n=t(w.l10n.weekdays.shorthand);e>0&&e\n "+n.join("")+"\n \n "}}function G(e,t){void 0===t&&(t=!0);var n=t?e:e-w.currentMonth;n<0&&!0===w._hidePrevMonthArrow||n>0&&!0===w._hideNextMonthArrow||(w.currentMonth+=n,(w.currentMonth<0||w.currentMonth>11)&&(w.currentYear+=w.currentMonth>11?1:-1,w.currentMonth=(w.currentMonth+12)%12,pe("onYearChange"),K()),J(),pe("onMonthChange"),De())}function V(e){return!(!w.config.appendTo||!w.config.appendTo.contains(e))||w.calendarContainer.contains(e)}function Z(e){if(w.isOpen&&!w.config.inline){var t=g(e),n=V(t),a=t===w.input||t===w.altInput||w.element.contains(t)||e.path&&e.path.indexOf&&(~e.path.indexOf(w.input)||~e.path.indexOf(w.altInput)),i="blur"===e.type?a&&e.relatedTarget&&!V(e.relatedTarget):!a&&!n&&!V(e.relatedTarget),o=!w.config.ignoredFocusElements.some((function(e){return e.contains(t)}));i&&o&&(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement&&""!==w.input.value&&void 0!==w.input.value&&I(),w.close(),w.config&&"range"===w.config.mode&&1===w.selectedDates.length&&(w.clear(!1),w.redraw()))}}function Q(e){if(!(!e||w.config.minDate&&ew.config.maxDate.getFullYear())){var t=e,n=w.currentYear!==t;w.currentYear=t||w.currentYear,w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth=Math.min(w.config.maxDate.getMonth(),w.currentMonth):w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&(w.currentMonth=Math.max(w.config.minDate.getMonth(),w.currentMonth)),n&&(w.redraw(),pe("onYearChange"),K())}}function X(e,t){var n;void 0===t&&(t=!0);var a=w.parseDate(e,void 0,t);if(w.config.minDate&&a&&M(a,w.config.minDate,void 0!==t?t:!w.minDateHasTime)<0||w.config.maxDate&&a&&M(a,w.config.maxDate,void 0!==t?t:!w.maxDateHasTime)>0)return!1;if(!w.config.enable&&0===w.config.disable.length)return!0;if(void 0===a)return!1;for(var i=!!w.config.enable,o=null!==(n=w.config.enable)&&void 0!==n?n:w.config.disable,r=0,l=void 0;r=l.from.getTime()&&a.getTime()<=l.to.getTime())return i}return!i}function ee(e){return void 0!==w.daysContainer&&(-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&w.daysContainer.contains(e))}function te(e){!(e.target===w._input)||!(w.selectedDates.length>0||w._input.value.length>0)||e.relatedTarget&&V(e.relatedTarget)||w.setDate(w._input.value,!0,e.target===w.altInput?w.config.altFormat:w.config.dateFormat)}function ne(e){var t=g(e),n=w.config.wrap?p.contains(t):t===w._input,a=w.config.allowInput,i=w.isOpen&&(!a||!n),o=w.config.inline&&n&&!a;if(13===e.keyCode&&n){if(a)return w.setDate(w._input.value,!0,t===w.altInput?w.config.altFormat:w.config.dateFormat),t.blur();w.open()}else if(V(t)||i||o){var r=!!w.timeContainer&&w.timeContainer.contains(t);switch(e.keyCode){case 13:r?(e.preventDefault(),I(),se()):ue(e);break;case 27:e.preventDefault(),se();break;case 8:case 46:n&&!w.config.allowInput&&(e.preventDefault(),w.clear());break;case 37:case 39:if(r||n)w.hourElement&&w.hourElement.focus();else if(e.preventDefault(),void 0!==w.daysContainer&&(!1===a||document.activeElement&&ee(document.activeElement))){var l=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),G(l),R(W(1),0)):R(void 0,l)}break;case 38:case 40:e.preventDefault();var c=40===e.keyCode?1:-1;w.daysContainer&&void 0!==t.$i||t===w.input||t===w.altInput?e.ctrlKey?(e.stopPropagation(),Q(w.currentYear-c),R(W(1),0)):r||R(void 0,7*c):t===w.currentYearElement?Q(w.currentYear-c):w.config.enableTime&&(!r&&w.hourElement&&w.hourElement.focus(),I(e),w._debouncedChange());break;case 9:if(r){var d=[w.hourElement,w.minuteElement,w.secondElement,w.amPM].concat(w.pluginElements).filter((function(e){return e})),s=d.indexOf(t);if(-1!==s){var u=d[s+(e.shiftKey?-1:1)];e.preventDefault(),(u||w._input).focus()}}else!w.config.noCalendar&&w.daysContainer&&w.daysContainer.contains(t)&&e.shiftKey&&(e.preventDefault(),w._input.focus())}}if(void 0!==w.amPM&&t===w.amPM)switch(e.key){case w.l10n.amPM[0].charAt(0):case w.l10n.amPM[0].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[0],S(),be();break;case w.l10n.amPM[1].charAt(0):case w.l10n.amPM[1].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[1],S(),be()}(n||V(t))&&pe("onKeyDown",e)}function ae(e){if(1===w.selectedDates.length&&(!e||e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled"))){for(var t=e?e.dateObj.getTime():w.days.firstElementChild.dateObj.getTime(),n=w.parseDate(w.selectedDates[0],void 0,!0).getTime(),a=Math.min(t,w.selectedDates[0].getTime()),i=Math.max(t,w.selectedDates[0].getTime()),o=!1,r=0,l=0,c=a;ca&&cr)?r=c:c>n&&(!l||c0&&m0&&m>l;return g?(f.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach((function(e){f.classList.remove(e)})),"continue"):o&&!g?"continue":(["startRange","inRange","endRange","notAllowed"].forEach((function(e){f.classList.remove(e)})),void(void 0!==e&&(e.classList.add(t<=w.selectedDates[0].getTime()?"startRange":"endRange"),nt&&m===n&&f.classList.add("endRange"),m>=r&&(0===l||m<=l)&&(d=n,u=t,(c=m)>Math.min(d,u)&&c0||n.getMinutes()>0||n.getSeconds()>0),w.selectedDates&&(w.selectedDates=w.selectedDates.filter((function(e){return X(e)})),w.selectedDates.length||"min"!==e||_(n),be()),w.daysContainer&&(de(),void 0!==n?w.currentYearElement[e]=n.getFullYear().toString():w.currentYearElement.removeAttribute(e),w.currentYearElement.disabled=!!a&&void 0!==n&&a.getFullYear()===n.getFullYear())}}function re(){return w.config.wrap?p.querySelector("[data-input]"):p}function le(){"object"!=typeof w.config.locale&&void 0===T.l10ns[w.config.locale]&&w.config.errorHandler(new Error("flatpickr: invalid locale "+w.config.locale)),w.l10n=e(e({},T.l10ns.default),"object"==typeof w.config.locale?w.config.locale:"default"!==w.config.locale?T.l10ns[w.config.locale]:void 0),D.K="("+w.l10n.amPM[0]+"|"+w.l10n.amPM[1]+"|"+w.l10n.amPM[0].toLowerCase()+"|"+w.l10n.amPM[1].toLowerCase()+")",void 0===e(e({},v),JSON.parse(JSON.stringify(p.dataset||{}))).time_24hr&&void 0===T.defaultConfig.time_24hr&&(w.config.time_24hr=w.l10n.time_24hr),w.formatDate=b(w),w.parseDate=C({config:w.config,l10n:w.l10n})}function ce(e){if("function"!=typeof w.config.position){if(void 0!==w.calendarContainer){pe("onPreCalendarPosition");var t=e||w._positionElement,n=Array.prototype.reduce.call(w.calendarContainer.children,(function(e,t){return e+t.offsetHeight}),0),a=w.calendarContainer.offsetWidth,i=w.config.position.split(" "),o=i[0],r=i.length>1?i[1]:null,l=t.getBoundingClientRect(),c=window.innerHeight-l.bottom,s="above"===o||"below"!==o&&cn,u=window.pageYOffset+l.top+(s?-n-2:t.offsetHeight+2);if(d(w.calendarContainer,"arrowTop",!s),d(w.calendarContainer,"arrowBottom",s),!w.config.inline){var f=window.pageXOffset+l.left,m=!1,g=!1;"center"===r?(f-=(a-l.width)/2,m=!0):"right"===r&&(f-=a-l.width,g=!0),d(w.calendarContainer,"arrowLeft",!m&&!g),d(w.calendarContainer,"arrowCenter",m),d(w.calendarContainer,"arrowRight",g);var p=window.document.body.offsetWidth-(window.pageXOffset+l.right),h=f+a>window.document.body.offsetWidth,v=p+a>window.document.body.offsetWidth;if(d(w.calendarContainer,"rightMost",h),!w.config.static)if(w.calendarContainer.style.top=u+"px",h)if(v){var D=function(){for(var e=null,t=0;tw.currentMonth+w.config.showMonths-1)&&"range"!==w.config.mode;if(w.selectedDateElem=n,"single"===w.config.mode)w.selectedDates=[a];else if("multiple"===w.config.mode){var o=ve(a);o?w.selectedDates.splice(parseInt(o),1):w.selectedDates.push(a)}else"range"===w.config.mode&&(2===w.selectedDates.length&&w.clear(!1,!1),w.latestSelectedDateObj=a,w.selectedDates.push(a),0!==M(a,w.selectedDates[0],!0)&&w.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()})));if(S(),i){var r=w.currentYear!==a.getFullYear();w.currentYear=a.getFullYear(),w.currentMonth=a.getMonth(),r&&(pe("onYearChange"),K()),pe("onMonthChange")}if(De(),J(),be(),i||"range"===w.config.mode||1!==w.config.showMonths?void 0!==w.selectedDateElem&&void 0===w.hourElement&&w.selectedDateElem&&w.selectedDateElem.focus():L(n),void 0!==w.hourElement&&void 0!==w.hourElement&&w.hourElement.focus(),w.config.closeOnSelect){var l="single"===w.config.mode&&!w.config.enableTime,c="range"===w.config.mode&&2===w.selectedDates.length&&!w.config.enableTime;(l||c)&&se()}N()}}w.parseDate=C({config:w.config,l10n:w.l10n}),w._handlers=[],w.pluginElements=[],w.loadedPlugins=[],w._bind=A,w._setHoursFromDate=_,w._positionCalendar=ce,w.changeMonth=G,w.changeYear=Q,w.clear=function(e,t){void 0===e&&(e=!0);void 0===t&&(t=!0);w.input.value="",void 0!==w.altInput&&(w.altInput.value="");void 0!==w.mobileInput&&(w.mobileInput.value="");w.selectedDates=[],w.latestSelectedDateObj=void 0,!0===t&&(w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth());if(!0===w.config.enableTime){var n=x(w.config),a=n.hours,i=n.minutes,o=n.seconds;O(a,i,o)}w.redraw(),e&&pe("onChange")},w.close=function(){w.isOpen=!1,w.isMobile||(void 0!==w.calendarContainer&&w.calendarContainer.classList.remove("open"),void 0!==w._input&&w._input.classList.remove("active"));pe("onClose")},w._createElement=s,w.destroy=function(){void 0!==w.config&&pe("onDestroy");for(var e=w._handlers.length;e--;)w._handlers[e].remove();if(w._handlers=[],w.mobileInput)w.mobileInput.parentNode&&w.mobileInput.parentNode.removeChild(w.mobileInput),w.mobileInput=void 0;else if(w.calendarContainer&&w.calendarContainer.parentNode)if(w.config.static&&w.calendarContainer.parentNode){var t=w.calendarContainer.parentNode;if(t.lastChild&&t.removeChild(t.lastChild),t.parentNode){for(;t.firstChild;)t.parentNode.insertBefore(t.firstChild,t);t.parentNode.removeChild(t)}}else w.calendarContainer.parentNode.removeChild(w.calendarContainer);w.altInput&&(w.input.type="text",w.altInput.parentNode&&w.altInput.parentNode.removeChild(w.altInput),delete w.altInput);w.input&&(w.input.type=w.input._type,w.input.classList.remove("flatpickr-input"),w.input.removeAttribute("readonly"));["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete w[e]}catch(e){}}))},w.isEnabled=X,w.jumpToDate=P,w.open=function(e,t){void 0===t&&(t=w._positionElement);if(!0===w.isMobile){if(e){e.preventDefault();var n=g(e);n&&n.blur()}return void 0!==w.mobileInput&&(w.mobileInput.focus(),w.mobileInput.click()),void pe("onOpen")}if(w._input.disabled||w.config.inline)return;var a=w.isOpen;w.isOpen=!0,a||(w.calendarContainer.classList.add("open"),w._input.classList.add("active"),pe("onOpen"),ce(t));!0===w.config.enableTime&&!0===w.config.noCalendar&&(!1!==w.config.allowInput||void 0!==e&&w.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return w.hourElement.select()}),50))},w.redraw=de,w.set=function(e,t){if(null!==e&&"object"==typeof e)for(var a in Object.assign(w.config,e),e)void 0!==fe[a]&&fe[a].forEach((function(e){return e()}));else w.config[e]=t,void 0!==fe[e]?fe[e].forEach((function(e){return e()})):n.indexOf(e)>-1&&(w.config[e]=c(t));w.redraw(),be(!0)},w.setDate=function(e,t,n){void 0===t&&(t=!1);void 0===n&&(n=w.config.dateFormat);if(0!==e&&!e||e instanceof Array&&0===e.length)return w.clear(t);me(e,n),w.latestSelectedDateObj=w.selectedDates[w.selectedDates.length-1],w.redraw(),P(void 0,t),_(),0===w.selectedDates.length&&w.clear(!1);be(t),t&&pe("onChange")},w.toggle=function(e){if(!0===w.isOpen)return w.close();w.open(e)};var fe={locale:[le,z],showMonths:[q,k,$],minDate:[P],maxDate:[P],clickOpens:[function(){!0===w.config.clickOpens?(A(w._input,"focus",w.open),A(w._input,"click",w.open)):(w._input.removeEventListener("focus",w.open),w._input.removeEventListener("click",w.open))}]};function me(e,t){var n=[];if(e instanceof Array)n=e.map((function(e){return w.parseDate(e,t)}));else if(e instanceof Date||"number"==typeof e)n=[w.parseDate(e,t)];else if("string"==typeof e)switch(w.config.mode){case"single":case"time":n=[w.parseDate(e,t)];break;case"multiple":n=e.split(w.config.conjunction).map((function(e){return w.parseDate(e,t)}));break;case"range":n=e.split(w.l10n.rangeSeparator).map((function(e){return w.parseDate(e,t)}))}else w.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));w.selectedDates=w.config.allowInvalidPreload?n:n.filter((function(e){return e instanceof Date&&X(e,!1)})),"range"===w.config.mode&&w.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()}))}function ge(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?w.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:w.parseDate(e.from,void 0),to:w.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function pe(e,t){if(void 0!==w.config){var n=w.config[e];if(void 0!==n&&n.length>0)for(var a=0;n[a]&&a1||"static"===w.config.monthSelectorType?w.monthElements[t].textContent=h(n.getMonth(),w.config.shorthandCurrentMonth,w.l10n)+" ":w.monthsDropdownContainer.value=n.getMonth().toString(),e.value=n.getFullYear().toString()})),w._hidePrevMonthArrow=void 0!==w.config.minDate&&(w.currentYear===w.config.minDate.getFullYear()?w.currentMonth<=w.config.minDate.getMonth():w.currentYearw.config.maxDate.getMonth():w.currentYear>w.config.maxDate.getFullYear()))}function we(e){return w.selectedDates.map((function(t){return w.formatDate(t,e)})).filter((function(e,t,n){return"range"!==w.config.mode||w.config.enableTime||n.indexOf(e)===t})).join("range"!==w.config.mode?w.config.conjunction:w.l10n.rangeSeparator)}function be(e){void 0===e&&(e=!0),void 0!==w.mobileInput&&w.mobileFormatStr&&(w.mobileInput.value=void 0!==w.latestSelectedDateObj?w.formatDate(w.latestSelectedDateObj,w.mobileFormatStr):""),w.input.value=we(w.config.dateFormat),void 0!==w.altInput&&(w.altInput.value=we(w.config.altFormat)),!1!==e&&pe("onValueUpdate")}function Ce(e){var t=g(e),n=w.prevMonthNav.contains(t),a=w.nextMonthNav.contains(t);n||a?G(n?-1:1):w.yearElements.indexOf(t)>=0?t.select():t.classList.contains("arrowUp")?w.changeYear(w.currentYear+1):t.classList.contains("arrowDown")&&w.changeYear(w.currentYear-1)}return function(){w.element=w.input=p,w.isOpen=!1,function(){var t=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],i=e(e({},JSON.parse(JSON.stringify(p.dataset||{}))),v),o={};w.config.parseDate=i.parseDate,w.config.formatDate=i.formatDate,Object.defineProperty(w.config,"enable",{get:function(){return w.config._enable},set:function(e){w.config._enable=ge(e)}}),Object.defineProperty(w.config,"disable",{get:function(){return w.config._disable},set:function(e){w.config._disable=ge(e)}});var r="time"===i.mode;if(!i.dateFormat&&(i.enableTime||r)){var l=T.defaultConfig.dateFormat||a.dateFormat;o.dateFormat=i.noCalendar||r?"H:i"+(i.enableSeconds?":S":""):l+" H:i"+(i.enableSeconds?":S":"")}if(i.altInput&&(i.enableTime||r)&&!i.altFormat){var d=T.defaultConfig.altFormat||a.altFormat;o.altFormat=i.noCalendar||r?"h:i"+(i.enableSeconds?":S K":" K"):d+" h:i"+(i.enableSeconds?":S":"")+" K"}Object.defineProperty(w.config,"minDate",{get:function(){return w.config._minDate},set:oe("min")}),Object.defineProperty(w.config,"maxDate",{get:function(){return w.config._maxDate},set:oe("max")});var s=function(e){return function(t){w.config["min"===e?"_minTime":"_maxTime"]=w.parseDate(t,"H:i:S")}};Object.defineProperty(w.config,"minTime",{get:function(){return w.config._minTime},set:s("min")}),Object.defineProperty(w.config,"maxTime",{get:function(){return w.config._maxTime},set:s("max")}),"time"===i.mode&&(w.config.noCalendar=!0,w.config.enableTime=!0);Object.assign(w.config,o,i);for(var u=0;u-1?w.config[m]=c(f[m]).map(E).concat(w.config[m]):void 0===i[m]&&(w.config[m]=f[m])}i.altInputClass||(w.config.altInputClass=re().className+" "+w.config.altInputClass);pe("onParseConfig")}(),le(),function(){if(w.input=re(),!w.input)return void w.config.errorHandler(new Error("Invalid input element specified"));w.input._type=w.input.type,w.input.type="text",w.input.classList.add("flatpickr-input"),w._input=w.input,w.config.altInput&&(w.altInput=s(w.input.nodeName,w.config.altInputClass),w._input=w.altInput,w.altInput.placeholder=w.input.placeholder,w.altInput.disabled=w.input.disabled,w.altInput.required=w.input.required,w.altInput.tabIndex=w.input.tabIndex,w.altInput.type="text",w.input.setAttribute("type","hidden"),!w.config.static&&w.input.parentNode&&w.input.parentNode.insertBefore(w.altInput,w.input.nextSibling));w.config.allowInput||w._input.setAttribute("readonly","readonly");w._positionElement=w.config.positionElement||w._input}(),function(){w.selectedDates=[],w.now=w.parseDate(w.config.now)||new Date;var e=w.config.defaultDate||("INPUT"!==w.input.nodeName&&"TEXTAREA"!==w.input.nodeName||!w.input.placeholder||w.input.value!==w.input.placeholder?w.input.value:null);e&&me(e,w.config.dateFormat);w._initialDate=w.selectedDates.length>0?w.selectedDates[0]:w.config.minDate&&w.config.minDate.getTime()>w.now.getTime()?w.config.minDate:w.config.maxDate&&w.config.maxDate.getTime()0&&(w.latestSelectedDateObj=w.selectedDates[0]);void 0!==w.config.minTime&&(w.config.minTime=w.parseDate(w.config.minTime,"H:i"));void 0!==w.config.maxTime&&(w.config.maxTime=w.parseDate(w.config.maxTime,"H:i"));w.minDateHasTime=!!w.config.minDate&&(w.config.minDate.getHours()>0||w.config.minDate.getMinutes()>0||w.config.minDate.getSeconds()>0),w.maxDateHasTime=!!w.config.maxDate&&(w.config.maxDate.getHours()>0||w.config.maxDate.getMinutes()>0||w.config.maxDate.getSeconds()>0)}(),w.utils={getDaysInMonth:function(e,t){return void 0===e&&(e=w.currentMonth),void 0===t&&(t=w.currentYear),1===e&&(t%4==0&&t%100!=0||t%400==0)?29:w.l10n.daysInMonth[e]}},w.isMobile||function(){var e=window.document.createDocumentFragment();if(w.calendarContainer=s("div","flatpickr-calendar"),w.calendarContainer.tabIndex=-1,!w.config.noCalendar){if(e.appendChild((w.monthNav=s("div","flatpickr-months"),w.yearElements=[],w.monthElements=[],w.prevMonthNav=s("span","flatpickr-prev-month"),w.prevMonthNav.innerHTML=w.config.prevArrow,w.nextMonthNav=s("span","flatpickr-next-month"),w.nextMonthNav.innerHTML=w.config.nextArrow,q(),Object.defineProperty(w,"_hidePrevMonthArrow",{get:function(){return w.__hidePrevMonthArrow},set:function(e){w.__hidePrevMonthArrow!==e&&(d(w.prevMonthNav,"flatpickr-disabled",e),w.__hidePrevMonthArrow=e)}}),Object.defineProperty(w,"_hideNextMonthArrow",{get:function(){return w.__hideNextMonthArrow},set:function(e){w.__hideNextMonthArrow!==e&&(d(w.nextMonthNav,"flatpickr-disabled",e),w.__hideNextMonthArrow=e)}}),w.currentYearElement=w.yearElements[0],De(),w.monthNav)),w.innerContainer=s("div","flatpickr-innerContainer"),w.config.weekNumbers){var t=function(){w.calendarContainer.classList.add("hasWeeks");var e=s("div","flatpickr-weekwrapper");e.appendChild(s("span","flatpickr-weekday",w.l10n.weekAbbreviation));var t=s("div","flatpickr-weeks");return e.appendChild(t),{weekWrapper:e,weekNumbers:t}}(),n=t.weekWrapper,a=t.weekNumbers;w.innerContainer.appendChild(n),w.weekNumbers=a,w.weekWrapper=n}w.rContainer=s("div","flatpickr-rContainer"),w.rContainer.appendChild($()),w.daysContainer||(w.daysContainer=s("div","flatpickr-days"),w.daysContainer.tabIndex=-1),J(),w.rContainer.appendChild(w.daysContainer),w.innerContainer.appendChild(w.rContainer),e.appendChild(w.innerContainer)}w.config.enableTime&&e.appendChild(function(){w.calendarContainer.classList.add("hasTime"),w.config.noCalendar&&w.calendarContainer.classList.add("noCalendar");var e=x(w.config);w.timeContainer=s("div","flatpickr-time"),w.timeContainer.tabIndex=-1;var t=s("span","flatpickr-time-separator",":"),n=m("flatpickr-hour",{"aria-label":w.l10n.hourAriaLabel});w.hourElement=n.getElementsByTagName("input")[0];var a=m("flatpickr-minute",{"aria-label":w.l10n.minuteAriaLabel});w.minuteElement=a.getElementsByTagName("input")[0],w.hourElement.tabIndex=w.minuteElement.tabIndex=-1,w.hourElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getHours():w.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),w.minuteElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getMinutes():e.minutes),w.hourElement.setAttribute("step",w.config.hourIncrement.toString()),w.minuteElement.setAttribute("step",w.config.minuteIncrement.toString()),w.hourElement.setAttribute("min",w.config.time_24hr?"0":"1"),w.hourElement.setAttribute("max",w.config.time_24hr?"23":"12"),w.hourElement.setAttribute("maxlength","2"),w.minuteElement.setAttribute("min","0"),w.minuteElement.setAttribute("max","59"),w.minuteElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(n),w.timeContainer.appendChild(t),w.timeContainer.appendChild(a),w.config.time_24hr&&w.timeContainer.classList.add("time24hr");if(w.config.enableSeconds){w.timeContainer.classList.add("hasSeconds");var i=m("flatpickr-second");w.secondElement=i.getElementsByTagName("input")[0],w.secondElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getSeconds():e.seconds),w.secondElement.setAttribute("step",w.minuteElement.getAttribute("step")),w.secondElement.setAttribute("min","0"),w.secondElement.setAttribute("max","59"),w.secondElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(s("span","flatpickr-time-separator",":")),w.timeContainer.appendChild(i)}w.config.time_24hr||(w.amPM=s("span","flatpickr-am-pm",w.l10n.amPM[r((w.latestSelectedDateObj?w.hourElement.value:w.config.defaultHour)>11)]),w.amPM.title=w.l10n.toggleTitle,w.amPM.tabIndex=-1,w.timeContainer.appendChild(w.amPM));return w.timeContainer}());d(w.calendarContainer,"rangeMode","range"===w.config.mode),d(w.calendarContainer,"animate",!0===w.config.animate),d(w.calendarContainer,"multiMonth",w.config.showMonths>1),w.calendarContainer.appendChild(e);var i=void 0!==w.config.appendTo&&void 0!==w.config.appendTo.nodeType;if((w.config.inline||w.config.static)&&(w.calendarContainer.classList.add(w.config.inline?"inline":"static"),w.config.inline&&(!i&&w.element.parentNode?w.element.parentNode.insertBefore(w.calendarContainer,w._input.nextSibling):void 0!==w.config.appendTo&&w.config.appendTo.appendChild(w.calendarContainer)),w.config.static)){var l=s("div","flatpickr-wrapper");w.element.parentNode&&w.element.parentNode.insertBefore(l,w.element),l.appendChild(w.element),w.altInput&&l.appendChild(w.altInput),l.appendChild(w.calendarContainer)}w.config.static||w.config.inline||(void 0!==w.config.appendTo?w.config.appendTo:window.document.body).appendChild(w.calendarContainer)}(),function(){w.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(w.element.querySelectorAll("[data-"+e+"]"),(function(t){return A(t,"click",w[e])}))}));if(w.isMobile)return void function(){var e=w.config.enableTime?w.config.noCalendar?"time":"datetime-local":"date";w.mobileInput=s("input",w.input.className+" flatpickr-mobile"),w.mobileInput.tabIndex=1,w.mobileInput.type=e,w.mobileInput.disabled=w.input.disabled,w.mobileInput.required=w.input.required,w.mobileInput.placeholder=w.input.placeholder,w.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",w.selectedDates.length>0&&(w.mobileInput.defaultValue=w.mobileInput.value=w.formatDate(w.selectedDates[0],w.mobileFormatStr));w.config.minDate&&(w.mobileInput.min=w.formatDate(w.config.minDate,"Y-m-d"));w.config.maxDate&&(w.mobileInput.max=w.formatDate(w.config.maxDate,"Y-m-d"));w.input.getAttribute("step")&&(w.mobileInput.step=String(w.input.getAttribute("step")));w.input.type="hidden",void 0!==w.altInput&&(w.altInput.type="hidden");try{w.input.parentNode&&w.input.parentNode.insertBefore(w.mobileInput,w.input.nextSibling)}catch(e){}A(w.mobileInput,"change",(function(e){w.setDate(g(e).value,!1,w.mobileFormatStr),pe("onChange"),pe("onClose")}))}();var e=l(ie,50);w._debouncedChange=l(N,300),w.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&A(w.daysContainer,"mouseover",(function(e){"range"===w.config.mode&&ae(g(e))}));A(window.document.body,"keydown",ne),w.config.inline||w.config.static||A(window,"resize",e);void 0!==window.ontouchstart?A(window.document,"touchstart",Z):A(window.document,"mousedown",Z);A(window.document,"focus",Z,{capture:!0}),!0===w.config.clickOpens&&(A(w._input,"focus",w.open),A(w._input,"click",w.open));void 0!==w.daysContainer&&(A(w.monthNav,"click",Ce),A(w.monthNav,["keyup","increment"],F),A(w.daysContainer,"click",ue));if(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement){var t=function(e){return g(e).select()};A(w.timeContainer,["increment"],I),A(w.timeContainer,"blur",I,{capture:!0}),A(w.timeContainer,"click",Y),A([w.hourElement,w.minuteElement],["focus","click"],t),void 0!==w.secondElement&&A(w.secondElement,"focus",(function(){return w.secondElement&&w.secondElement.select()})),void 0!==w.amPM&&A(w.amPM,"click",(function(e){I(e),N()}))}w.config.allowInput&&A(w._input,"blur",te)}(),(w.selectedDates.length||w.config.noCalendar)&&(w.config.enableTime&&_(w.config.noCalendar?w.latestSelectedDateObj:void 0),be(!1)),k();var t=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!w.isMobile&&t&&ce(),pe("onReady")}(),w}function k(e,t){for(var n=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),a=[],i=0;i').html(that.buttons[key].text).addClass(that.buttons[key].btnClass).prop("disabled",that.buttons[key].isDisabled).css("display",that.buttons[key].isHidden?"none":"").click(function(e){e.preventDefault();var res=that.buttons[key].action.apply(that,[that.buttons[key]]);that.onAction.apply(that,[key,that.buttons[key]]);that._stopCountDown();if(typeof res==="undefined"||res){that.close();}});that.buttons[key].el=button_element;that.buttons[key].setText=function(text){button_element.html(text);};that.buttons[key].addClass=function(className){button_element.addClass(className);};that.buttons[key].removeClass=function(className){button_element.removeClass(className);};that.buttons[key].disable=function(){that.buttons[key].isDisabled=true;button_element.prop("disabled",true);};that.buttons[key].enable=function(){that.buttons[key].isDisabled=false;button_element.prop("disabled",false);};that.buttons[key].show=function(){that.buttons[key].isHidden=false;button_element.css("display","");};that.buttons[key].hide=function(){that.buttons[key].isHidden=true;button_element.css("display","none");};that["$_"+key]=that["$$"+key]=button_element;that.$btnc.append(button_element);});if(total_buttons===0){this.$btnc.hide();}if(this.closeIcon===null&&total_buttons===0){this.closeIcon=true;}if(this.closeIcon){if(this.closeIconClass){var closeHtml='';this.$closeIcon.html(closeHtml);}this.$closeIcon.click(function(e){e.preventDefault();var buttonName=false;var shouldClose=false;var str;if(typeof that.closeIcon==="function"){str=that.closeIcon();}else{str=that.closeIcon;}if(typeof str==="string"&&typeof that.buttons[str]!=="undefined"){buttonName=str;shouldClose=false;}else{if(typeof str==="undefined"||!!(str)===true){shouldClose=true;}else{shouldClose=false;}}if(buttonName){var btnResponse=that.buttons[buttonName].action.apply(that);shouldClose=(typeof btnResponse==="undefined")||!!(btnResponse);}if(shouldClose){that.close();}});this.$closeIcon.show();}else{this.$closeIcon.hide();}},setTitle:function(string,force){force=force||false;if(typeof string!=="undefined"){if(typeof string==="string"){this.title=string;}else{if(typeof string==="function"){if(typeof string.promise==="function"){console.error("Promise was returned from title function, this is not supported.");}var response=string();if(typeof response==="string"){this.title=response;}else{this.title=false;}}else{this.title=false;}}}if(this.isAjaxLoading&&!force){return;}this.$title.html(this.title||"");this.updateTitleContainer();},setIcon:function(iconClass,force){force=force||false;if(typeof iconClass!=="undefined"){if(typeof iconClass==="string"){this.icon=iconClass;}else{if(typeof iconClass==="function"){var response=iconClass();if(typeof response==="string"){this.icon=response;}else{this.icon=false;}}else{this.icon=false;}}}if(this.isAjaxLoading&&!force){return;}this.$icon.html(this.icon?'':"");this.updateTitleContainer();},updateTitleContainer:function(){if(!this.title&&!this.icon){this.$titleContainer.hide();}else{this.$titleContainer.show();}},setContentPrepend:function(content,force){if(!content){return;}this.contentParsed.prepend(content);},setContentAppend:function(content){if(!content){return;}this.contentParsed.append(content);},setContent:function(content,force){force=!!force;var that=this;if(content){this.contentParsed.html("").append(content);}if(this.isAjaxLoading&&!force){return;}this.$content.html("");this.$content.append(this.contentParsed);setTimeout(function(){that.$body.find("input[autofocus]:visible:first").focus();},100);},loadingSpinner:false,showLoading:function(disableButtons){this.loadingSpinner=true;this.$jconfirmBox.addClass("loading");if(disableButtons){this.$btnc.find("button").prop("disabled",true);}},hideLoading:function(enableButtons){this.loadingSpinner=false;this.$jconfirmBox.removeClass("loading");if(enableButtons){this.$btnc.find("button").prop("disabled",false);}},ajaxResponse:false,contentParsed:"",isAjax:false,isAjaxLoading:false,_parseContent:function(){var that=this;var e=" ";if(typeof this.content==="function"){var res=this.content.apply(this);if(typeof res==="string"){this.content=res;}else{if(typeof res==="object"&&typeof res.always==="function"){this.isAjax=true;this.isAjaxLoading=true;res.always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});this.content=e;}else{this.content=e;}}}if(typeof this.content==="string"&&this.content.substr(0,4).toLowerCase()==="url:"){this.isAjax=true;this.isAjaxLoading=true;var u=this.content.substring(4,this.content.length);$.get(u).done(function(html){that.contentParsed.html(html);}).always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});}if(!this.content){this.content=e;}if(!this.isAjax){this.contentParsed.html(this.content);this.setContent();that._contentReady.resolve();}},_stopCountDown:function(){clearInterval(this.autoCloseInterval);if(this.$cd){this.$cd.remove();}},_startCountDown:function(){var that=this;var opt=this.autoClose.split("|");if(opt.length!==2){console.error("Invalid option for autoClose. example 'close|10000'");return false;}var button_key=opt[0];var time=parseInt(opt[1]);if(typeof this.buttons[button_key]==="undefined"){console.error("Invalid button key '"+button_key+"' for autoClose");return false;}var seconds=Math.ceil(time/1000);this.$cd=$(' ('+seconds+")").appendTo(this["$_"+button_key]);this.autoCloseInterval=setInterval(function(){that.$cd.html(" ("+(seconds-=1)+") ");if(seconds<=0){that["$$"+button_key].trigger("click");that._stopCountDown();}},1000);},_getKey:function(key){switch(key){case 192:return"tilde";case 13:return"enter";case 16:return"shift";case 9:return"tab";case 20:return"capslock";case 17:return"ctrl";case 91:return"win";case 18:return"alt";case 27:return"esc";case 32:return"space";}var initial=String.fromCharCode(key);if(/^[A-z0-9]+$/.test(initial)){return initial.toLowerCase();}else{return false;}},reactOnKey:function(e){var that=this;var a=$(".jconfirm");if(a.eq(a.length-1)[0]!==this.$el[0]){return false;}var key=e.which;if(this.$content.find(":input").is(":focus")&&/13|32/.test(key)){return false;}var keyChar=this._getKey(key);if(keyChar==="esc"&&this.escapeKey){if(this.escapeKey===true){this.$scrollPane.trigger("click");}else{if(typeof this.escapeKey==="string"||typeof this.escapeKey==="function"){var buttonKey;if(typeof this.escapeKey==="function"){buttonKey=this.escapeKey();}else{buttonKey=this.escapeKey;}if(buttonKey){if(typeof this.buttons[buttonKey]==="undefined"){console.warn("Invalid escapeKey, no buttons found with key "+buttonKey);}else{this["$_"+buttonKey].trigger("click");}}}}}$.each(this.buttons,function(key,button){if(button.keys.indexOf(keyChar)!==-1){that["$_"+key].trigger("click");}});},setDialogCenter:function(){console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables");},_unwatchContent:function(){clearInterval(this._timer);},close:function(onClosePayload){var that=this;if(typeof this.onClose==="function"){this.onClose(onClosePayload);}this._unwatchContent();$(window).unbind("resize."+this._id);$(window).unbind("keyup."+this._id);$(window).unbind("jcKeyDown."+this._id);if(this.draggable){$(window).unbind("mousemove."+this._id);$(window).unbind("mouseup."+this._id);this.$titleContainer.unbind("mousedown");}that.$el.removeClass(that.loadedClass);$("body").removeClass("jconfirm-no-scroll-"+that._id);that.$jconfirmBoxContainer.removeClass("jconfirm-no-transition");setTimeout(function(){that.$body.addClass(that.closeAnimationParsed);that.$jconfirmBg.addClass("jconfirm-bg-h");var closeTimer=(that.closeAnimation==="none")?1:that.animationSpeed;setTimeout(function(){that.$el.remove();var l=w.jconfirm.instances;var i=w.jconfirm.instances.length-1;for(i;i>=0;i--){if(w.jconfirm.instances[i]._id===that._id){w.jconfirm.instances.splice(i,1);}}if(!w.jconfirm.instances.length){if(that.scrollToPreviousElement&&w.jconfirm.lastFocused&&w.jconfirm.lastFocused.length&&$.contains(document,w.jconfirm.lastFocused[0])){var $lf=w.jconfirm.lastFocused;if(that.scrollToPreviousElementAnimate){var st=$(window).scrollTop();var ot=w.jconfirm.lastFocused.offset().top;var wh=$(window).height();if(!(ot>st&&ot<(st+wh))){var scrollTo=(ot-Math.round((wh/3)));$("html, body").animate({scrollTop:scrollTo},that.animationSpeed,"swing",function(){$lf.focus();});}else{$lf.focus();}}else{$lf.focus();}w.jconfirm.lastFocused=false;}}if(typeof that.onDestroy==="function"){that.onDestroy();}},closeTimer*0.4);},50);return true;},open:function(){if(this.isOpen()){return false;}this._buildHTML();this._bindEvents();this._open();return true;},setStartingPoint:function(){var el=false;if(this.animateFromElement!==true&&this.animateFromElement){el=this.animateFromElement;w.jconfirm.lastClicked=false;}else{if(w.jconfirm.lastClicked&&this.animateFromElement===true){el=w.jconfirm.lastClicked;w.jconfirm.lastClicked=false;}else{return false;}}if(!el){return false;}var offset=el.offset();var iTop=el.outerHeight()/2;var iLeft=el.outerWidth()/2;iTop-=this.$jconfirmBox.outerHeight()/2;iLeft-=this.$jconfirmBox.outerWidth()/2;var sourceTop=offset.top+iTop;sourceTop=sourceTop-this._scrollTop();var sourceLeft=offset.left+iLeft;var wh=$(window).height()/2;var ww=$(window).width()/2;var targetH=wh-this.$jconfirmBox.outerHeight()/2;var targetW=ww-this.$jconfirmBox.outerWidth()/2;sourceTop-=targetH;sourceLeft-=targetW;if(Math.abs(sourceTop)>wh||Math.abs(sourceLeft)>ww){return false;}this.$jconfirmBoxContainer.css("transform","translate("+sourceLeft+"px, "+sourceTop+"px)");},_open:function(){var that=this;if(typeof that.onOpenBefore==="function"){that.onOpenBefore();}this.$body.removeClass(this.animationParsed);this.$jconfirmBg.removeClass("jconfirm-bg-h");this.$body.focus();that.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");setTimeout(function(){that.$body.css(that._getCSS(that.animationSpeed,1));that.$body.css({"transition-property":that.$body.css("transition-property")+", margin"});that.$jconfirmBoxContainer.addClass("jconfirm-no-transition");that._modalReady.resolve();if(typeof that.onOpen==="function"){that.onOpen();}that.$el.addClass(that.loadedClass);},this.animationSpeed);},loadedClass:"jconfirm-open",isClosed:function(){return !this.$el||this.$el.parent().length===0;},isOpen:function(){return !this.isClosed();},toggle:function(){if(!this.isOpen()){this.open();}else{this.close();}}};w.jconfirm.instances=[];w.jconfirm.lastFocused=false;w.jconfirm.pluginDefaults={template:'
    ',title:"Hello",titleClass:"",type:"default",typeAnimated:true,draggable:true,dragWindowGap:15,dragWindowBorder:true,animateFromElement:true,alignMiddle:true,smoothContent:true,content:"Are you sure to continue?",buttons:{},defaultButtons:{ok:{action:function(){}},close:{action:function(){}}},contentLoaded:function(){},icon:"",lazyOpen:false,bgOpacity:null,theme:"light",animation:"scale",closeAnimation:"scale",animationSpeed:400,animationBounce:1,escapeKey:true,rtl:false,container:"body",containerFluid:false,backgroundDismiss:false,backgroundDismissAnimation:"shake",autoClose:false,closeIcon:null,closeIconClass:false,watchInterval:100,columnClass:"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",boxWidth:"50%",scrollToPreviousElement:true,scrollToPreviousElementAnimate:true,useBootstrap:true,offsetTop:40,offsetBottom:40,bootstrapClasses:{container:"container",containerFluid:"container-fluid",row:"row"},onContentReady:function(){},onOpenBefore:function(){},onOpen:function(){},onClose:function(){},onDestroy:function(){},onAction:function(){}};var keyDown=false;$(window).on("keydown",function(e){if(!keyDown){var $target=$(e.target);var pass=false;if($target.closest(".jconfirm-box").length){pass=true;}if(pass){$(window).trigger("jcKeyDown");}keyDown=true;}});$(window).on("keyup",function(){keyDown=false;});w.jconfirm.lastClicked=false;$(document).on("mousedown","button, a, [jc-source]",function(){w.jconfirm.lastClicked=$(this);});})); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.js b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.js new file mode 100755 index 00000000..48925b5f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.js @@ -0,0 +1,388 @@ +/** +* jquery-match-height 0.7.2 by @liabru +* http://brm.io/jquery-match-height/ +* License: MIT +*/ + +;(function(factory) { // eslint-disable-line no-extra-semi + 'use strict'; + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof module !== 'undefined' && module.exports) { + // CommonJS + module.exports = factory(require('jquery')); + } else { + // Global + factory(jQuery); + } +})(function($) { + /* + * internal + */ + + var _previousResizeWidth = -1, + _updateTimeout = -1; + + /* + * _parse + * value parse utility function + */ + + var _parse = function(value) { + // parse value and convert NaN to 0 + return parseFloat(value) || 0; + }; + + /* + * _rows + * utility function returns array of jQuery selections representing each row + * (as displayed after float wrapping applied by browser) + */ + + var _rows = function(elements) { + var tolerance = 1, + $elements = $(elements), + lastTop = null, + rows = []; + + // group elements by their top position + $elements.each(function(){ + var $that = $(this), + top = $that.offset().top - _parse($that.css('margin-top')), + lastRow = rows.length > 0 ? rows[rows.length - 1] : null; + + if (lastRow === null) { + // first item on the row, so just push it + rows.push($that); + } else { + // if the row top is the same, add to the row group + if (Math.floor(Math.abs(lastTop - top)) <= tolerance) { + rows[rows.length - 1] = lastRow.add($that); + } else { + // otherwise start a new row group + rows.push($that); + } + } + + // keep track of the last row top + lastTop = top; + }); + + return rows; + }; + + /* + * _parseOptions + * handle plugin options + */ + + var _parseOptions = function(options) { + var opts = { + byRow: true, + property: 'height', + target: null, + remove: false + }; + + if (typeof options === 'object') { + return $.extend(opts, options); + } + + if (typeof options === 'boolean') { + opts.byRow = options; + } else if (options === 'remove') { + opts.remove = true; + } + + return opts; + }; + + /* + * matchHeight + * plugin definition + */ + + var matchHeight = $.fn.matchHeight = function(options) { + var opts = _parseOptions(options); + + // handle remove + if (opts.remove) { + var that = this; + + // remove fixed height from all selected elements + this.css(opts.property, ''); + + // remove selected elements from all groups + $.each(matchHeight._groups, function(key, group) { + group.elements = group.elements.not(that); + }); + + // TODO: cleanup empty groups + + return this; + } + + if (this.length <= 1 && !opts.target) { + return this; + } + + // keep track of this group so we can re-apply later on load and resize events + matchHeight._groups.push({ + elements: this, + options: opts + }); + + // match each element's height to the tallest element in the selection + matchHeight._apply(this, opts); + + return this; + }; + + /* + * plugin global options + */ + + matchHeight.version = '0.7.2'; + matchHeight._groups = []; + matchHeight._throttle = 80; + matchHeight._maintainScroll = false; + matchHeight._beforeUpdate = null; + matchHeight._afterUpdate = null; + matchHeight._rows = _rows; + matchHeight._parse = _parse; + matchHeight._parseOptions = _parseOptions; + + /* + * matchHeight._apply + * apply matchHeight to given elements + */ + + matchHeight._apply = function(elements, options) { + var opts = _parseOptions(options), + $elements = $(elements), + rows = [$elements]; + + // take note of scroll position + var scrollTop = $(window).scrollTop(), + htmlHeight = $('html').outerHeight(true); + + // get hidden parents + var $hiddenParents = $elements.parents().filter(':hidden'); + + // cache the original inline style + $hiddenParents.each(function() { + var $that = $(this); + $that.data('style-cache', $that.attr('style')); + }); + + // temporarily must force hidden parents visible + $hiddenParents.css('display', 'block'); + + // get rows if using byRow, otherwise assume one row + if (opts.byRow && !opts.target) { + + // must first force an arbitrary equal height so floating elements break evenly + $elements.each(function() { + var $that = $(this), + display = $that.css('display'); + + // temporarily force a usable display value + if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') { + display = 'block'; + } + + // cache the original inline style + $that.data('style-cache', $that.attr('style')); + + $that.css({ + 'display': display, + 'padding-top': '0', + 'padding-bottom': '0', + 'margin-top': '0', + 'margin-bottom': '0', + 'border-top-width': '0', + 'border-bottom-width': '0', + 'height': '100px', + 'overflow': 'hidden' + }); + }); + + // get the array of rows (based on element top position) + rows = _rows($elements); + + // revert original inline styles + $elements.each(function() { + var $that = $(this); + $that.attr('style', $that.data('style-cache') || ''); + }); + } + + $.each(rows, function(key, row) { + var $row = $(row), + targetHeight = 0; + + if (!opts.target) { + // skip apply to rows with only one item + if (opts.byRow && $row.length <= 1) { + $row.css(opts.property, ''); + return; + } + + // iterate the row and find the max height + $row.each(function(){ + var $that = $(this), + style = $that.attr('style'), + display = $that.css('display'); + + // temporarily force a usable display value + if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') { + display = 'block'; + } + + // ensure we get the correct actual height (and not a previously set height value) + var css = { 'display': display }; + css[opts.property] = ''; + $that.css(css); + + // find the max height (including padding, but not margin) + if ($that.outerHeight(false) > targetHeight) { + targetHeight = $that.outerHeight(false); + } + + // revert styles + if (style) { + $that.attr('style', style); + } else { + $that.css('display', ''); + } + }); + } else { + // if target set, use the height of the target element + targetHeight = opts.target.outerHeight(false); + } + + // iterate the row and apply the height to all elements + $row.each(function(){ + var $that = $(this), + verticalPadding = 0; + + // don't apply to a target + if (opts.target && $that.is(opts.target)) { + return; + } + + // handle padding and border correctly (required when not using border-box) + if ($that.css('box-sizing') !== 'border-box') { + verticalPadding += _parse($that.css('border-top-width')) + _parse($that.css('border-bottom-width')); + verticalPadding += _parse($that.css('padding-top')) + _parse($that.css('padding-bottom')); + } + + // set the height (accounting for padding and border) + $that.css(opts.property, (targetHeight - verticalPadding) + 'px'); + }); + }); + + // revert hidden parents + $hiddenParents.each(function() { + var $that = $(this); + $that.attr('style', $that.data('style-cache') || null); + }); + + // restore scroll position if enabled + if (matchHeight._maintainScroll) { + $(window).scrollTop((scrollTop / htmlHeight) * $('html').outerHeight(true)); + } + + return this; + }; + + /* + * matchHeight._applyDataApi + * applies matchHeight to all elements with a data-match-height attribute + */ + + matchHeight._applyDataApi = function() { + var groups = {}; + + // generate groups by their groupId set by elements using data-match-height + $('[data-match-height], [data-mh]').each(function() { + var $this = $(this), + groupId = $this.attr('data-mh') || $this.attr('data-match-height'); + + if (groupId in groups) { + groups[groupId] = groups[groupId].add($this); + } else { + groups[groupId] = $this; + } + }); + + // apply matchHeight to each group + $.each(groups, function() { + this.matchHeight(true); + }); + }; + + /* + * matchHeight._update + * updates matchHeight on all current groups with their correct options + */ + + var _update = function(event) { + if (matchHeight._beforeUpdate) { + matchHeight._beforeUpdate(event, matchHeight._groups); + } + + $.each(matchHeight._groups, function() { + matchHeight._apply(this.elements, this.options); + }); + + if (matchHeight._afterUpdate) { + matchHeight._afterUpdate(event, matchHeight._groups); + } + }; + + matchHeight._update = function(throttle, event) { + // prevent update if fired from a resize event + // where the viewport width hasn't actually changed + // fixes an event looping bug in IE8 + if (event && event.type === 'resize') { + var windowWidth = $(window).width(); + if (windowWidth === _previousResizeWidth) { + return; + } + _previousResizeWidth = windowWidth; + } + + // throttle updates + if (!throttle) { + _update(event); + } else if (_updateTimeout === -1) { + _updateTimeout = setTimeout(function() { + _update(event); + _updateTimeout = -1; + }, matchHeight._throttle); + } + }; + + /* + * bind events + */ + + // apply on DOM ready event + $(matchHeight._applyDataApi); + + // use on or bind where supported + var on = $.fn.on ? 'on' : 'bind'; + + // update heights on load and resize events + $(window)[on]('load', function(event) { + matchHeight._update(false, event); + }); + + // throttled update heights on resize events + $(window)[on]('resize orientationchange', function(event) { + matchHeight._update(true, event); + }); + +}); diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.min.js new file mode 100755 index 00000000..fc942dd4 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/jquery.matchHeight.min.js @@ -0,0 +1 @@ +!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):t(jQuery)}(function(l){function c(t){return parseFloat(t)||0}function h(t){var e=l(t),n=null,a=[];return e.each(function(){var t=l(this),e=t.offset().top-c(t.css("margin-top")),o=0a&&(a=t.outerHeight(!1)),e?t.attr("style",e):t.css("display","")})}o.each(function(){var t=l(this),e=0;i.target&&t.is(i.target)||("border-box"!==t.css("box-sizing")&&(e+=c(t.css("border-top-width"))+c(t.css("border-bottom-width")),e+=c(t.css("padding-top"))+c(t.css("padding-bottom"))),t.css(i.property,a-e+"px"))})}),s.each(function(){var t=l(this);t.attr("style",t.data("style-cache")||null)}),d._maintainScroll&&l(window).scrollTop(a/r*l("html").outerHeight(!0)),this},d._applyDataApi=function(){var o={};l("[data-match-height], [data-mh]").each(function(){var t=l(this),e=t.attr("data-mh")||t.attr("data-match-height");o[e]=e in o?o[e].add(t):t}),l.each(o,function(){this.matchHeight(!0)})};function i(t){d._beforeUpdate&&d._beforeUpdate(t,d._groups),l.each(d._groups,function(){d._apply(this.elements,this.options)}),d._afterUpdate&&d._afterUpdate(t,d._groups)}d._update=function(t,e){if(e&&"resize"===e.type){var o=l(window).width();if(o===n)return;n=o}t?-1===a&&(a=setTimeout(function(){i(e),a=-1},d._throttle)):i(e)},l(d._applyDataApi);var t=l.fn.on?"on":"bind";l(window)[t]("load",function(t){d._update(!1,t)}),l(window)[t]("resize orientationchange",function(t){d._update(!0,t)})}); \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/js/vendor/lity.min.js b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/lity.min.js new file mode 100755 index 00000000..40d0f34a --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/js/vendor/lity.min.js @@ -0,0 +1,5 @@ +/*! Lity - v2.4.1 - 2020-04-26 +* http://sorgalla.com/lity/ +* Copyright (c) 2015-2020 Jan Sorgalla; Licensed MIT */ + +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=b(a,require("jquery")):a.lity=b(a,a.jQuery||a.Zepto)}("undefined"!=typeof window?window:this,function(a,b){"use strict";function c(a){var b=B();return N&&a.length?(a.one(N,b.resolve),setTimeout(b.resolve,500)):b.resolve(),b.promise()}function d(a,c,d){if(1===arguments.length)return b.extend({},a);if("string"==typeof c){if(void 0===d)return void 0===a[c]?null:a[c];a[c]=d}else b.extend(a,c);return this}function e(a){for(var b,c=decodeURI(a.split("#")[0]).split("&"),d={},e=0,f=c.length;e-1?"&":"?")+b.param(c)}function g(a,b){var c=a.indexOf("#");return-1===c?b:(c>0&&(a=a.substr(c)),b+a)}function h(a){return b('').append(a)}function i(a,c){var d=c.opener()&&c.opener().data("lity-desc")||"Image with no description",e=b(''+d+''),f=B(),g=function(){f.reject(h("Failed loading image"))};return e.on("load",function(){if(0===this.naturalWidth)return g();f.resolve(e)}).on("error",g),f.promise()}function j(a,c){var d,e,f;try{d=b(a)}catch(a){return!1}return!!d.length&&(e=b(''),f=d.hasClass("lity-hide"),c.element().one("lity:remove",function(){e.before(d).remove(),f&&!d.closest(".lity-content").length&&d.addClass("lity-hide")}),d.removeClass("lity-hide").after(e))}function k(a){var c=J.exec(a);return!!c&&o(g(a,f("https://www.youtube"+(c[2]||"")+".com/embed/"+c[4],b.extend({autoplay:1},e(c[5]||"")))))}function l(a){var c=K.exec(a);return!!c&&o(g(a,f("https://player.vimeo.com/video/"+c[3],b.extend({autoplay:1},e(c[4]||"")))))}function m(a){var c=M.exec(a);return!!c&&(0!==a.indexOf("http")&&(a="https:"+a),o(g(a,f("https://www.facebook.com/plugins/video.php?href="+a,b.extend({autoplay:1},e(c[4]||""))))))}function n(a){var b=L.exec(a);return!!b&&o(g(a,f("https://www.google."+b[3]+"/maps?"+b[6],{output:b[6].indexOf("layer=c")>0?"svembed":"embed"})))}function o(a){return'
    '; + + $.dialog( { + title: false, + content: video, + closeIcon: true, + boxWidth: '70%', + } ); + } ); + }, + + //--------------------------------------------------------------------// + // Addons List. + //--------------------------------------------------------------------// + + /** + * Element bindings for the Addons List page. + * + * @since 1.3.9 + */ + initAddons() { // eslint-disable-line max-lines-per-function + // Only run on the addons page. + if ( ! $( '#wpforms-admin-addons' ).length ) { + return; + } + + // Addons searching. + const $sectionAll = $( '#wpforms-addons-list-section-all' ); + const $sectionInstalled = $( '#wpforms-addons-list-section-installed' ); + + if ( $sectionAll.length || $sectionInstalled.length ) { + let addonSearchInstalled; + let addonSearchAll; + + if ( $sectionInstalled.length ) { + addonSearchInstalled = new List( + 'wpforms-addons-list-section-installed', + { + valueNames: [ 'addon-link' ], + } + ); + } + + if ( $sectionAll.length ) { + addonSearchAll = new List( + 'wpforms-addons-list-section-all', + { + valueNames: [ 'addon-link' ], + } + ); + } + + $( '#wpforms-addons-search' ).on( + 'keyup search', + function() { + WPFormsAdmin.updateAddonSearchResult( this, addonSearchAll, addonSearchInstalled ); + } + ); + } + + // Toggle an addon state. + $( document ).on( 'change', '.wpforms-addons-list-item .wpforms-toggle-control input', function( event ) { + event.preventDefault(); + + if ( $( this ).hasClass( 'disabled' ) ) { + return false; + } + + WPFormsAdmin.addonToggleNew( $( this ) ); + } ); + + $( document ).on( 'click', '.wpforms-addons-list-item button', function( event ) { + event.preventDefault(); + + if ( $( this ).hasClass( 'disabled' ) ) { + return false; + } + + WPFormsAdmin.addonToggleNew( $( this ) ); + } ); + + $( document ).on( 'click', '#wpforms-admin-addons .addon-item button', function( event ) { + event.preventDefault(); + + if ( $( this ).hasClass( 'disabled' ) ) { + return false; + } + + WPFormsAdmin.addonToggle( $( this ) ); + } ); + }, + + /** + * Handle addons search field operations. + * + * @since 1.7.4 + * + * @param {Object} searchField The search field HTML element. + * @param {Object} addonSearchAll Addons all list (uses List.js). + * @param {Object} addonSearchInstalled Addons installed list (uses List.js). + */ + updateAddonSearchResult( searchField, addonSearchAll, addonSearchInstalled ) { + let searchTerm = $( searchField ).val(); + + /* + * Replace dot and comma with space + * it is a workaround for a bug in the list.js library. + * + * Note: remove when the issue below is fixed: + * @see https://github.com/javve/list.js/issues/699 + */ + searchTerm = searchTerm.replace( /[.,]/g, ' ' ); + + const $noResultsMessage = $( '#wpforms-addons-no-results' ); + const $sectionAll = $( '#wpforms-addons-list-section-all' ); + const $sectionInstalled = $( '#wpforms-addons-list-section-installed' ); + const searchResultsAll = addonSearchAll ? addonSearchAll.search( searchTerm ) : []; + const searchResultsInstalled = addonSearchInstalled ? addonSearchInstalled.search( searchTerm ) : []; + + $noResultsMessage.toggle( searchResultsAll.length === 0 && searchResultsInstalled.length === 0 ); + $sectionAll.toggle( searchResultsAll.length > 0 ); + $sectionInstalled.toggle( searchResultsInstalled.length > 0 ); + }, + + /** + * Change plugin/addon state. + * + * @since 1.6.3 + * + * @param {string} plugin Plugin slug or URL for download. + * @param {string} state State status activate|deactivate|install. + * @param {string} pluginType Plugin type addon or plugin. + * @param {Function} callback Callback for get a result from AJAX. + * @param {Function} errorCallback Callback for get error from AJAX. + */ + setAddonState( plugin, state, pluginType, callback, errorCallback ) { + const actions = { + activate: 'wpforms_activate_addon', + install: 'wpforms_install_addon', + deactivate: 'wpforms_deactivate_addon', + incompatible: 'wpforms_activate_addon', + }; + const action = actions[ state ]; + + if ( ! action ) { + return; + } + + const data = { + action, + nonce: wpforms_admin.nonce, + plugin, + type: pluginType, + }; + + $.post( wpforms_admin.ajax_url, data, function( res ) { + callback( res ); + } ).fail( function( xhr ) { + errorCallback( xhr ); + } ); + }, + + /** + * Toggle addon state. + * + * @since 1.8.6 + * + * @param {Object} $btn Button element. + */ + // eslint-disable-next-line max-lines-per-function + addonToggleNew( $btn ) { + const $footer = $btn.parents( '.wpforms-addons-list-item-footer' ); + const classes = { + active: 'wpforms-addons-list-item-footer-active', + activating: 'wpforms-addons-list-item-footer-activating', + incompatible: 'wpforms-addons-list-item-footer-incompatible', + installed: 'wpforms-addons-list-item-footer-installed', + missing: 'wpforms-addons-list-item-footer-missing', + goToUrl: 'wpforms-addons-list-item-footer-go-to-url', + withError: 'wpforms-addons-list-item-footer-with-error', + }; + + // Open url in new tab. + if ( $footer.hasClass( classes.goToUrl ) ) { + window.open( $btn.attr( 'data-plugin' ), '_blank' ); + return; + } + + $btn.prop( 'disabled', true ); + + let checked = $btn.is( ':checked' ); + let cssClass; + const plugin = $footer.attr( 'data-plugin' ); + const pluginType = $footer.attr( 'data-type' ); + const $addon = $btn.parents( '.wpforms-addons-list-item' ); + const state = WPFormsAdmin.getAddonState( $footer, classes, $btn ); + + /** + * Handle error. + * + * @param {Object} res Response object. + */ + function handleError( res ) { + $footer.addClass( classes.withError ); + + if ( typeof res.data === 'object' ) { + $footer.append( `` ); + } else { + $footer.append( `` ); + } + + if ( state === 'install' ) { + checked = false; + WPFormsAdmin.removeSpinnerFromButton( $btn ); + } else if ( state === 'deactivate' ) { + checked = true; + } else if ( state === 'activate' ) { + checked = false; + } + } + + /** + * Handle success. + * + * @param {Object} res Response object. + */ + function handleSuccess( res ) { + if ( state === 'install' ) { + cssClass = classes.active; + checked = true; + + $footer.attr( 'data-plugin', res.data.basename ); + + if ( ! res.data.is_activated ) { + cssClass = classes.installed; + checked = false; + } + + $btn.hide(); + $btn = $btn.closest( '.wpforms-addons-list-item' ).find( '.wpforms-toggle-control input' ); + } else if ( state === 'activate' ) { + $footer.find( '.wpforms-addons-list-item-footer-settings-link' ).fadeIn( 150 ); + cssClass = classes.active; + checked = true; + } else if ( state === 'deactivate' ) { + $footer.find( '.wpforms-addons-list-item-footer-settings-link' ).fadeOut( 150 ); + cssClass = classes.installed; + checked = false; + } + + $footer.removeClass( classes.active + ' ' + classes.incompatible + ' ' + classes.installed + ' ' + classes.missing ).addClass( cssClass ); + } + + WPFormsAdmin.setAddonState( plugin, state, pluginType, function( res ) { + if ( res.success ) { + handleSuccess( res ); + } else { + handleError( res ); + } + + WPFormsAdmin.updateAddonButtonPropertiesAndUI( $btn, $addon, $footer, classes, checked ); + }, function() { + handleError( { + data: wpforms_admin.server_error, + } ); + + WPFormsAdmin.updateAddonButtonPropertiesAndUI( $btn, $addon, $footer, classes, checked ); + } ); + }, + + /** + * Add spinner to button. + * + * @since 1.8.6 + * + * @param {Object} $button Button element. + */ + addSpinnerToButton( $button ) { + const spinnerBlue = ''; + const originalWidth = $button.width(); + + $button.data( 'original-text', $button.html() ); + $button.width( originalWidth ).html( spinnerBlue ); + }, + + /** + * Remove spinner from button. + * + * @since 1.8.6 + * + * @param {Object} $button Button element. + */ + removeSpinnerFromButton( $button ) { + $button.html( $button.data( 'original-text' ) ); + }, + + /** + * Get addon state. + * + * @since 1.8.6 + * + * @param {Object} $footer Footer element. + * @param {Object} classes Classes object. + * @param {Object} $button Button element. + * + * @return {string} State. + */ + getAddonState( $footer, classes, $button ) { + if ( $footer.hasClass( classes.active ) || $footer.hasClass( classes.incompatible ) ) { + return 'deactivate'; + } + + if ( $footer.hasClass( classes.installed ) ) { + return 'activate'; + } + + if ( $footer.hasClass( classes.missing ) ) { + WPFormsAdmin.addSpinnerToButton( $button ); + return 'install'; + } + + return ''; + }, + + /** + * Update button properties and UI. + * + * @since 1.8.6 + * + * @param {Object} $btn Button element. + * @param {Object} $addon Addon element. + * @param {Object} $footer Footer element. + * @param {Object} classes Classes object. + * @param {boolean} checked Checked state. + */ + updateAddonButtonPropertiesAndUI( $btn, $addon, $footer, classes, checked ) { + $btn.prop( 'checked', checked ); + $btn.prop( 'disabled', false ); + $btn.siblings( '.wpforms-toggle-control-status' ).html( $btn.siblings( '.wpforms-toggle-control-status' ).data( checked ? 'on' : 'off' ) ); + + if ( $addon.find( '.wpforms-addons-list-item-footer-error' ).length > 0 ) { + setTimeout( function() { + $footer.removeClass( classes.withError ); + $addon.find( '.wpforms-addons-list-item-footer-error' ).remove(); + }, 6000 ); + } + }, + + /** + * Scroll to integration. + * + * @since 1.8.6 + */ + scrollToIntegration() { + const currentURL = window.location.href; + // eslint-disable-next-line compat/compat + const urlObject = new URL( currentURL ); + const searchParams = urlObject.searchParams; + const addon = searchParams.get( 'addon' ); + + if ( addon ) { + const $elementToScrollTo = $( '.wpforms-settings-provider[id*="' + addon + '"]' ); + + if ( $elementToScrollTo.length ) { + $( window ).scrollTop( $elementToScrollTo.offset().top ); + searchParams.delete( 'addon' ); + + window.history.pushState( {}, document.title, urlObject.toString() ); + } + } + }, + + /** + * Toggle addon state. + * + * @since 1.3.9 + * + * @param {Object} $btn Button element. + */ + // eslint-disable-next-line max-lines-per-function,complexity + addonToggle( $btn ) { + let state, + cssClass, + stateText, + buttonText, + errorText, + successText; + + if ( $btn.hasClass( 'status-go-to-url' ) ) { + // Open url in new tab. + window.open( $btn.attr( 'data-plugin' ), '_blank' ); + return; + } + + $btn.prop( 'disabled', true ).addClass( 'loading' ); + $btn.html( s.iconSpinner ); + + const pluginType = $btn.attr( 'data-type' ); + + if ( $btn.hasClass( 'status-active' ) ) { + // Deactivate. + state = 'deactivate'; + cssClass = 'status-installed'; + if ( pluginType === 'plugin' ) { + cssClass += ' button button-secondary'; + } + stateText = wpforms_admin.addon_inactive; + buttonText = wpforms_admin.addon_activate; + errorText = wpforms_admin.addon_deactivate; + if ( pluginType === 'addon' ) { + buttonText = s.iconActivate + buttonText; + errorText = s.iconDeactivate + errorText; + } + } else if ( $btn.hasClass( 'status-installed' ) ) { + // Activate. + state = 'activate'; + cssClass = 'status-active'; + if ( pluginType === 'plugin' ) { + cssClass += ' button button-secondary disabled'; + } + stateText = wpforms_admin.addon_active; + buttonText = wpforms_admin.addon_deactivate; + if ( pluginType === 'addon' ) { + buttonText = s.iconDeactivate + buttonText; + errorText = s.iconActivate + wpforms_admin.addon_activate; + } else if ( pluginType === 'plugin' ) { + buttonText = wpforms_admin.addon_activated; + errorText = wpforms_admin.addon_activate; + } + } else if ( $btn.hasClass( 'status-missing' ) ) { + // Install & Activate. + state = 'install'; + cssClass = 'status-active'; + if ( pluginType === 'plugin' ) { + cssClass += ' button disabled'; + } + stateText = wpforms_admin.addon_active; + buttonText = wpforms_admin.addon_activated; + errorText = s.iconInstall; + if ( pluginType === 'addon' ) { + buttonText = s.iconActivate + wpforms_admin.addon_deactivate; + errorText += wpforms_admin.addon_install; + } + } else { + return; + } + + const plugin = $btn.attr( 'data-plugin' ); + + // eslint-disable-next-line complexity + WPFormsAdmin.setAddonState( plugin, state, pluginType, function( res ) { + const $addon = $btn.closest( '.addon-item' ); + + if ( res.success ) { + if ( 'install' === state ) { + $btn.attr( 'data-plugin', res.data.basename ); + successText = res.data.msg; + if ( ! res.data.is_activated ) { + stateText = wpforms_admin.addon_inactive; + buttonText = 'plugin' === pluginType ? wpforms_admin.addon_activate : s.iconActivate + wpforms_admin.addon_activate; + cssClass = 'plugin' === pluginType ? 'status-installed button button-secondary' : 'status-installed'; + } + } else { + successText = res.data; + } + $addon.find( '.actions' ).append( '
    ' + successText + '
    ' ); + $addon.find( 'span.status-label' ) + .removeClass( 'status-active status-installed status-missing' ) + .addClass( cssClass ) + .removeClass( 'button button-primary button-secondary disabled' ) + .text( stateText ); + $btn + .removeClass( 'status-active status-installed status-missing' ) + .removeClass( 'button button-primary button-secondary disabled' ) + .addClass( cssClass ).html( buttonText ); + } else { + if ( 'object' === typeof res.data ) { + if ( pluginType === 'addon' ) { + $addon.find( '.actions' ).append( '

    ' + wpforms_admin.addon_error + '

    ' ); + } else { + $addon.find( '.actions' ).append( '

    ' + wpforms_admin.plugin_error + '

    ' ); + } + } else { + $addon.find( '.actions' ).append( '

    ' + res.data + '

    ' ); + } + if ( 'install' === state && 'plugin' === pluginType ) { + $btn.addClass( 'status-go-to-url' ).removeClass( 'status-missing' ); + } + $btn.html( errorText ); + } + + $btn.prop( 'disabled', false ).removeClass( 'loading' ); + + if ( ! $addon.find( '.actions' ).find( '.msg.error' ).length ) { + setTimeout( function() { + $( '.addon-item .msg' ).remove(); + }, 3000 ); + } + }, + function( error ) { + // eslint-disable-next-line no-console + console.log( error.responseText ); + } ); + }, + + //--------------------------------------------------------------------// + // Settings. + //--------------------------------------------------------------------// + /** + * Element bindings for Settings page. + * + * @since 1.3.9 + */ + initSettings() { // eslint-disable-line max-lines-per-function + // On ready events. + $( document ).on( 'wpformsReady', function() { // eslint-disable-line max-lines-per-function + // Only proceed if we're on the settings page. + if ( ! $( '#wpforms-settings' ).length ) { + return; + } + + // Watch for hashes and scroll to if found. + // Display all addon boxes as the same height. + const integrationFocus = WPFormsAdmin.getQueryString( 'wpforms-integration' ), + jumpTo = WPFormsAdmin.getQueryString( 'jump' ); + + if ( integrationFocus ) { + $( 'body' ).animate( + { scrollTop: $( '#wpforms-integration-' + integrationFocus ).offset().top }, + 1000 + ); + } else if ( jumpTo ) { + $( 'body' ).animate( + { scrollTop: $( '#' + jumpTo ).offset().top }, + 1000 + ); + } + + // Settings conditional logic. + $( '.wpforms-admin-settings-form' ).conditions( [ + + // Misc > Disable User Cookies visibility. + { + conditions: { + element: '#wpforms-setting-gdpr', + type: 'checked', + operator: 'is', + }, + actions: { + if: { + element: '#wpforms-setting-row-gdpr-disable-uuid,#wpforms-setting-row-gdpr-disable-details', + action: 'show', + }, + else : { + element: '#wpforms-setting-row-gdpr-disable-uuid,#wpforms-setting-row-gdpr-disable-details', + action: 'hide', + }, + }, + effect: 'appear', + }, + + // CAPTCHA > Type. + { + conditions: { + element: 'input[name=captcha-provider]:checked', + type: 'value', + operator: '=', + condition: 'hcaptcha', + }, + actions: { + if: [ + { + element: '.wpforms-setting-row', + action: 'show', + }, + { + element: '.wpforms-setting-recaptcha, #wpforms-setting-row-recaptcha-site-key, #wpforms-setting-row-recaptcha-secret-key, #wpforms-setting-row-recaptcha-fail-msg, .wpforms-setting-turnstile, #wpforms-setting-row-turnstile-heading, #wpforms-setting-row-turnstile-site-key, #wpforms-setting-row-turnstile-secret-key, #wpforms-setting-row-turnstile-theme, #wpforms-setting-row-turnstile-fail-msg', + action: 'hide', + }, + ], + }, + effect: 'appear', + }, + { + conditions: { + element: 'input[name=captcha-provider]:checked', + type: 'value', + operator: '=', + condition: 'recaptcha', + }, + actions: { + if: [ + { + element: '.wpforms-setting-row', + action: 'show', + }, + { + element: '#wpforms-setting-row-hcaptcha-heading, #wpforms-setting-row-hcaptcha-site-key, #wpforms-setting-row-hcaptcha-secret-key, #wpforms-setting-row-hcaptcha-fail-msg, #wpforms-setting-row-turnstile-heading, #wpforms-setting-row-turnstile-site-key, #wpforms-setting-row-turnstile-secret-key, #wpforms-setting-row-turnstile-theme, #wpforms-setting-row-turnstile-fail-msg', + action: 'hide', + }, + ], + }, + effect: 'appear', + }, + { + conditions: { + element: 'input[name=captcha-provider]:checked', + type: 'value', + operator: '=', + condition: 'turnstile', + }, + actions: { + if: [ + { + element: '.wpforms-setting-row', + action: 'show', + }, + { + element: '#wpforms-setting-row-hcaptcha-heading, #wpforms-setting-row-hcaptcha-site-key, #wpforms-setting-row-hcaptcha-secret-key, #wpforms-setting-row-hcaptcha-fail-msg, .wpforms-setting-recaptcha, #wpforms-setting-row-recaptcha-site-key, #wpforms-setting-row-recaptcha-secret-key, #wpforms-setting-row-recaptcha-fail-msg', + action: 'hide', + }, + ], + }, + effect: 'appear', + }, + { + conditions: { + element: 'input[name=captcha-provider]:checked', + type: 'value', + operator: '=', + condition: 'none', + }, + actions: { + if: [ + { + element: '.wpforms-setting-row', + action: 'hide', + }, + { + element: '.wpforms-setting-captcha-heading, #wpforms-setting-row-captcha-provider', + action: 'show', + }, + ], + }, + effect: 'appear', + }, + ] ); + } ); + + // Render engine setting. + $( document ).on( 'change', '#wpforms-setting-row-render-engine input', WPFormsAdmin.settingsRenderEngineChange ); + + // Form styles plugin setting. + $( document ).on( 'change', '#wpforms-setting-disable-css', function() { + WPFormsAdmin.settingsFormStylesAlert( $( this ).val() ); + } ); + + // Image upload fields. + $( document ).on( 'click', '.wpforms-setting-row-image button', function( event ) { + event.preventDefault(); + + // If the remove button was clicked, clear the value and remove the image. + if ( $( this ).hasClass( 'wpforms-setting-remove-image' ) ) { + const $wrapper = $( this ).closest( '.wpforms-setting-row-image' ); + $wrapper.find( 'input' ).val( '' ).attr( 'value', '' ).trigger( 'change' ).end().find( 'img' ).remove(); + + return; + } + + WPFormsAdmin.imageUploadModal( $( this ) ); + } ); + + // Verify license key. + $( document ).on( 'click', '#wpforms-setting-license-key-verify', function( event ) { + event.preventDefault(); + + WPFormsAdmin.licenseVerify( $( this ) ); + } ); + + // Show a message for license field. + $( document ).on( 'click', '.wpforms-setting-license-wrapper', function( event ) { + event.preventDefault(); + + const $keyField = $( '#wpforms-setting-license-key' ); + + if ( ! $keyField.length ) { + return; + } + + if ( ! $keyField.prop( 'disabled' ) ) { + return; + } + + WPFormsAdmin.licenseEditMessage(); + } ); + + // Deactivate a license key. + $( document ).on( 'click', '#wpforms-setting-license-key-deactivate', function( event ) { + event.preventDefault(); + + WPFormsAdmin.licenseDeactivate( $( this ) ); + } ); + + // Refresh license key. + $( document ).on( 'click', '#wpforms-setting-license-key-refresh', function( event ) { + event.preventDefault(); + + WPFormsAdmin.licenseRefresh( $( this ) ); + } ); + + /** + * @todo Refactor providers settings tab. Code below is legacy. + */ + + // Integration connect. + $( document ).on( 'click', '.wpforms-settings-provider-connect', function( event ) { + event.preventDefault(); + + const button = $( this ); + + WPFormsAdmin.integrationConnect( button ); + } ); + + // Integration account disconnect. + $( document ).on( 'click', '.wpforms-settings-provider-accounts-list .remove a', function( event ) { + event.preventDefault(); + + WPFormsAdmin.integrationDisconnect( $( this ) ); + } ); + + // Integration individual display toggling. + $( document ).on( 'click', '.wpforms-settings-provider:not(.focus-out) .wpforms-settings-provider-header', function( event ) { + event.preventDefault(); + + const $this = $( this ); + + $this + .parent() + .find( '.wpforms-settings-provider-accounts' ) + .stop( false, true ) + .slideToggle( '', function() { + $this.parent().find( '.wpforms-settings-provider-logo i' ).toggleClass( 'fa-chevron-right fa-chevron-down' ); + } ); + } ); + + // Integration accounts display toggling. + $( document ).on( 'click', '.wpforms-settings-provider-accounts-toggle a', function( event ) { + event.preventDefault(); + + const $connectFields = $( this ).parent().next( '.wpforms-settings-provider-accounts-connect' ); + $connectFields.find( 'input[type=text], input[type=password]' ).val( '' ); + $connectFields.stop().slideToggle(); + } ); + + // CAPTCHA settings page: type toggling. + $( document ).on( 'change', '#wpforms-setting-row-captcha-provider input', function() { + const $preview = $( '#wpforms-setting-row-captcha-preview' ); + + if ( this.value === 'hcaptcha' || this.value === 'turnstile' ) { + $preview.removeClass( 'wpforms-hidden' ); + } else if ( this.value === 'none' ) { + $preview.addClass( 'wpforms-hidden' ); + } else { + $( '#wpforms-setting-row-recaptcha-type input:checked' ).trigger( 'change' ); + } + + if ( $preview.find( '.wpforms-captcha-preview' ).length ) { + $preview.find( '.wpforms-captcha-preview' ).empty(); + $preview.find( '.wpforms-captcha-placeholder' ).removeClass( 'wpforms-hidden' ); + } + } ); + + // CAPTCHA settings page: reCAPTCHA type toggling. + $( document ).on( 'change', '#wpforms-setting-row-recaptcha-type input', function() { + $( '#wpforms-setting-row-captcha-preview' ).toggleClass( 'wpforms-hidden', 'v2' !== this.value ); + $( '#wpforms-setting-row-recaptcha-v3-threshold' ).toggleClass( 'wpforms-hidden', 'v3' !== this.value ); + } ); + + // Toggle control switch description. + $( document ).on( 'change', '.wpforms-toggle-control input', function() { + const $input = $( this ), + checked = $input.is( ':checked' ), + state = checked ? 'on' : 'off', + $field = $input.closest( '.wpforms-setting-field' ), + $control = $input.closest( '.wpforms-toggle-control' ), + $status = $control.find( '.wpforms-toggle-control-status' ), + $descOn = $field.find( '.wpforms-toggle-desc.desc-on' ), + $descOff = $field.find( '.wpforms-toggle-desc.desc-off' ), + isDoubleDesc = $descOn.length > 0 && $descOff.length > 0; + + $descOn.toggleClass( 'wpforms-hidden', ! checked && isDoubleDesc ); + $descOff.toggleClass( 'wpforms-hidden', checked && isDoubleDesc ); + $status.html( $status.data( state ) ); + } ); + }, + + /** + * Render engine setting change event handler. + * + * @since 1.8.1 + */ + settingsRenderEngineChange() { + // noinspection JSUnusedLocalSymbols + const renderEngine = $( this ).val(); // eslint-disable-line + + // TODO: Add corresponding code that need to be executed on change render engine setting. + }, + + /** + * Alert users if they change form styles to something that may give unexpected results. + * + * @since 1.5.0 + * + * @param {string} value Form Styles value. + */ + settingsFormStylesAlert( value ) { + let msg; + + if ( '2' === value ) { + msg = wpforms_admin.settings_form_style_base; + } else if ( '3' === value ) { + msg = wpforms_admin.settings_form_style_none; + } else { + return; + } + + $.alert( { + title: wpforms_admin.heads_up, + content: msg, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Image upload modal window. + * + * @since 1.3.0 + * + * @param {jQuery} $el Image upload button element. + */ + imageUploadModal( $el ) { + // To prevent caching of the media frame object and + // avoid confusion between multiple instances, + // this method no longer relies on the shared s.mediaFrame object. + // Instead, it creates a new mediaFrame object for each instance. + + const $setting = $el.closest( '.wpforms-setting-field' ); + + s.mediaFrame = wpf.initMediaLibrary( { + title: wpforms_admin.upload_image_title, + extensions: wpforms_admin.upload_image_extensions, + extensionsError: wpforms_admin.upload_image_extensions_error, + buttonText: wpforms_admin.upload_image_button, + } ); + + s.mediaFrame.on( 'select', function() { + // Grab our attachment selection and construct a JSON representation of the model. + const mediaAttachment = s.mediaFrame.state().get( 'selection' ).first().toJSON(); + const $input = $setting.find( 'input[type=text]' ); + + // Send the attachment URL to our custom input field via jQuery. + $input.val( mediaAttachment.url ); + $setting.find( 'img' ).remove(); + $setting.prepend( '' ); + $input.trigger( 'change' ); + } ).on( 'close', function() { + s.mediaFrame.off( 'library:selection:add' ); + } ); + + // Now that everything has been set, let's open up the frame. + s.mediaFrame.open(); + }, + + /** + * Verify a license key. + * + * @since 1.3.9 + * + * @param {jQuery} $el Verify button element. + */ + licenseVerify( $el ) { // eslint-disable-line max-lines-per-function + const $row = $el.closest( '.wpforms-setting-row' ), + $keyField = $( '#wpforms-setting-license-key' ), + buttonWidth = $el.outerWidth(), + buttonLabel = $el.text(), + data = { + action: 'wpforms_verify_license', + nonce: wpforms_admin.nonce, + license: $keyField.val(), + }; + + $el.html( s.iconSpinner ).css( 'width', buttonWidth ).prop( 'disabled', true ); + + $.post( wpforms_admin.ajax_url, data, function( res ) { + let icon = 'fa fa-check-circle', + color = 'green', + msg; + + if ( res.success ) { + msg = res.data.msg; + $el.hide(); + $row.find( '#wpforms-setting-license-key-info-message' ).empty().hide(); + $row.find( '.type, .desc, #wpforms-setting-license-key-deactivate' ).show(); + $row.find( '.type strong' ).text( res.data.type ); + $( '.wpforms-license-notice' ).remove(); + $keyField + .prop( 'disabled', true ) + .addClass( 'wpforms-setting-license-is-valid' ) + .attr( 'value', $keyField.val().replace( /./g, '*' ) ); + } else { + icon = 'fa fa-exclamation-circle'; + color = 'orange'; + msg = res.data; + $row.find( '.type, .desc, #wpforms-setting-license-key-deactivate' ).hide(); + $keyField.prop( 'disabled', false ); + } + + $.alert( { + title: msg.header ?? false, + content: msg.msg ?? msg, + icon, + type: color, + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + + $el.html( buttonLabel ).css( 'width', 'auto' ).prop( 'disabled', false ); + } ).fail( function( xhr ) { + $keyField.prop( 'disabled', false ); + + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + }, + + /** + * Show a message that license key editing is disabled. + * + * @since 1.6.5 + */ + licenseEditMessage() { + $.alert( { + title: wpforms_admin.heads_up, + content: wpforms_admin.edit_license, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Deactivate a license key. + * + * @since 1.3.9 + * + * @param {Element} el Button element. + */ + licenseDeactivate( el ) { + const $this = $( el ); + const $row = $this.closest( '.wpforms-setting-row' ); + + const buttonWidth = $this.outerWidth(); + const buttonLabel = $this.text(); + + const data = { + action: 'wpforms_deactivate_license', + nonce: wpforms_admin.nonce, + }; + + $this.html( s.iconSpinner ).css( 'width', buttonWidth ).prop( 'disabled', true ); + + $.post( wpforms_admin.ajax_url, data, function( res ) { + let icon = 'fa fa-info-circle'; + let color = 'blue'; + let title = wpforms_admin.success; + + const resData = res.data; + const msg = ! resData.msg || typeof resData.msg !== 'string' ? wpforms_admin.something_went_wrong : resData.msg; + + if ( res.success ) { + $row.find( '#wpforms-setting-license-key' ) + .val( '' ) + .attr( 'value', '' ) + .prop( { readonly: false, disabled: false } ) + .removeClass(); + $row.find( '.wpforms-license-key-deactivate-remove' ).remove(); + $row.find( '#wpforms-setting-license-key-info-message' ).html( resData.info ).show(); + $row.find( '#wpforms-setting-license-key-verify' ).prop( 'disabled', false ).show(); + $row.find( '.type, .desc, #wpforms-setting-license-key-deactivate' ).hide(); + } else { + icon = 'fa fa-exclamation-circle'; + color = 'orange'; + title = wpforms_admin.oops; + } + + $.alert( { + title, + content: msg, + icon, + type: color, + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + + $this.html( buttonLabel ).css( 'width', 'auto' ).prop( 'disabled', false ); + } ).fail( function( xhr ) { + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + }, + + /** + * Refresh a license key. + * + * @since 1.3.9 + * + * @param {jQuery} el Element. + */ + licenseRefresh( el ) { + const $this = $( el ), + $row = $this.closest( '.wpforms-setting-row' ), + $input = $( '#wpforms-setting-license-key' ), + data = { + action: 'wpforms_refresh_license', + nonce: wpforms_admin.nonce, + }; + + $.post( wpforms_admin.ajax_url, data, function( res ) { + let icon = 'fa fa-check-circle', + color = 'green', + msg; + + if ( res.success ) { + msg = res.data.msg; + $row.find( '.type strong' ).text( res.data.type ); + } else { + icon = 'fa fa-exclamation-circle'; + color = 'orange'; + msg = res.data; + $row.find( '.type, .desc' ).hide(); + $input.removeClass( 'wpforms-setting-license-is-valid' ).addClass( 'wpforms-setting-license-is-invalid' ); + } + + $.alert( { + title: msg.header ?? false, + content: msg.msg ?? msg, + icon, + type: color, + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + } ).fail( function( xhr ) { + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + }, + + /** + * Connect integration provider account. + * + * @since 1.3.9 + * + * @param {jQuery} $btn Button (.wpforms-settings-provider-connect) that was clicked to establish connection. + */ + integrationConnect( $btn ) { + const buttonWidth = $btn.outerWidth(), + buttonLabel = $btn.text(), + $provider = $btn.closest( '.wpforms-settings-provider' ), + data = { + action : 'wpforms_settings_provider_add_' + $btn.data( 'provider' ), + data : $btn.closest( 'form' ).serialize(), + provider: $btn.data( 'provider' ), + nonce : wpforms_admin.nonce, + }; + let errorMessage = wpforms_admin.provider_auth_error; + + $btn.html( wpforms_admin.connecting ).css( 'width', buttonWidth ).prop( 'disabled', true ); + + $.post( wpforms_admin.ajax_url, data, function( response ) { + if ( response.success ) { + $provider.find( '.wpforms-settings-provider-accounts-list ul' ).append( response.data.html ); + $provider.addClass( 'connected' ); + $btn.closest( '.wpforms-settings-provider-accounts-connect' ).stop().slideToggle(); + } else { + if ( + Object.prototype.hasOwnProperty.call( response, 'data' ) && + Object.prototype.hasOwnProperty.call( response.data, 'error_msg' ) + ) { + errorMessage += '
    ' + response.data.error_msg; + } + + WPFormsAdmin.integrationError( errorMessage ); + } + } ).fail( function() { + WPFormsAdmin.integrationError( errorMessage ); + } ).always( function() { + $btn.html( buttonLabel ).css( 'width', 'auto' ).prop( 'disabled', false ); + } ); + }, + + /** + * Remove an integration provider account. + * + * @since 1.3.9 + * + * @param {Object} el Disconnect link that was clicked to establish removing account. + */ + integrationDisconnect( el ) { + const $this = $( el ), + $provider = $this.parents( '.wpforms-settings-provider' ), + data = { + action : 'wpforms_settings_provider_disconnect_' + $this.data( 'provider' ), + provider: $this.data( 'provider' ), + key : $this.data( 'key' ), + nonce : wpforms_admin.nonce, + }; + let errorMessage = wpforms_admin.provider_delete_error; + + $.confirm( { + title: wpforms_admin.heads_up, + content: wpforms_admin.provider_delete_confirm, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + $.post( wpforms_admin.ajax_url, data, function( response ) { + if ( response.success ) { + $this.parent().parent().remove(); + + // Hide the Connected status label if no more integrations are linked. + const numberOfIntegrations = $provider.find( '.wpforms-settings-provider-accounts-list li' ).length; + + if ( typeof numberOfIntegrations === 'undefined' || numberOfIntegrations === 0 ) { + $provider.removeClass( 'connected' ); + } + + /** + * Provider account has been removed. + * + * @since 1.7.7 + */ + $( document ).trigger( 'wpformsProviderRemoved', [ $provider, response ] ); + } else { + if ( + Object.prototype.hasOwnProperty.call( response, 'data' ) && + Object.prototype.hasOwnProperty.call( response.data, 'error_msg' ) + ) { + errorMessage += '
    ' + response.data.error_msg; + } + + WPFormsAdmin.integrationError( errorMessage ); + } + } ).fail( function() { + WPFormsAdmin.integrationError( errorMessage ); + } ); + }, + }, + cancel: { + text: wpforms_admin.cancel, + keys: [ 'esc' ], + }, + }, + } ); + }, + + /** + * Error handling. + * + * @since 1.6.4 + * + * @param {string} error Error message. + */ + integrationError( error ) { + $.alert( { + title: wpforms_admin.something_went_wrong, + content: error, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + //--------------------------------------------------------------------// + // Tools. + //--------------------------------------------------------------------// + + /** + * Element bindings for Tools page. + * + * @since 1.4.2 + */ + initTools() { // eslint-disable-line max-lines-per-function + // Enable import/export buttons when a value is selected. + $( document ).on( 'change', '#wpforms-tools-form-import, #wpforms-tools-form-other-import, #wpforms-tools-form-export, #wpforms-tools-form-template', function() { + const $field = $( this ); + const $button = $field.parents( 'form' ).find( 'button' ); + + $button.attr( 'aria-disabled', $field.val().length === 0 ); + } ); + + // Copy system information to the clipboard. + $( document ).on( 'click', '#wpforms-system-information-copy', function( event ) { + event.preventDefault(); + WPFormsAdmin.copySystemInformation(); + } ); + + // Run SSL test. + $( document ).on( 'click', '#wpforms-ssl-verify', function( event ) { + event.preventDefault(); + WPFormsAdmin.verifySSLConnection(); + } ); + + // Recreate database tables. + $( document ).on( 'click', '#wpforms-recreate-tables', function( event ) { + event.preventDefault(); + WPFormsAdmin.recreateTables(); + } ); + + // Run import for a specific provider. + $( document ).on( 'click', '#wpforms-importer-forms-submit', function( event ) { + event.preventDefault(); + + // Check to confirm the user as selected a form. + const $checked = $( '#wpforms-importer-forms input:checked' ); + + if ( $checked.length ) { + const ids = []; + + $checked.each( function( i ) { + ids[ i ] = $( this ).val(); + } ); + + if ( ! wpforms_admin.isPro ) { + // We need to analyze the forms before starting the actual import. + WPFormsAdmin.analyzeForms( ids ); + } else { + // Begin the import process. + WPFormsAdmin.importForms( ids ); + } + } else { + // User didn't select a form so alert them. + $.alert( { + title: wpforms_admin.heads_up, + content: wpforms_admin.importer_forms_required, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + } + } ); + + // Continue import after analyzing. + $( document ).on( 'click', '#wpforms-importer-continue-submit', function( event ) { + event.preventDefault(); + WPFormsAdmin.importForms( s.formIDs ); + } ); + }, + + /** + * Copy system information to the clipboard. + * + * @since 1.8.4 + */ + copySystemInformation() { + $( '#wpforms-system-information' ).select(); + document.execCommand( 'copy' ); + }, + + /** + * Perform a test connection to verify that the current web host + * can successfully make outbound SSL connections. + * + * @since 1.4.5 + */ + verifySSLConnection() { + const $btn = $( '#wpforms-ssl-verify' ); + const btnLabel = $btn.text(); + const btnWidth = $btn.outerWidth(); + const $settings = $btn.parent(); + + $btn.css( 'width', btnWidth ).prop( 'disabled', true ).text( wpforms_admin.testing ); + + const data = { + action: 'wpforms_verify_ssl', + nonce: wpforms_admin.nonce, + }; + + // Trigger AJAX to test connection + $.post( wpforms_admin.ajax_url, data, function( res ) { + WPFormsAdmin.debug( res ); + + // Remove any previous alerts. + $settings.find( '.wpforms-notice' ).remove(); + + if ( res.success ) { + $btn.before( '
    ' + res.data.msg + '
    ' ); + } + + if ( ! res.success && res.data.msg ) { + $btn.before( '
    ' + res.data.msg + '
    ' ); + } + + if ( ! res.success && res.data.debug ) { + $btn.before( '
    ' + res.data.debug + '
    ' ); + } + + $btn.css( 'width', btnWidth ).prop( 'disabled', false ).text( btnLabel ); + } ); + }, + + /** + * Recreate custom tables. + * + * @since 1.9.0 + */ + recreateTables() { + const $btn = $( '#wpforms-recreate-tables' ); + const btnLabel = $btn.text(); + const btnWidth = $btn.outerWidth(); + const $settings = $btn.parent(); + + $btn.css( 'width', btnWidth ).prop( 'disabled', true ).text( wpforms_admin.recreating ); + + const data = { + action: 'wpforms_recreate_tables', + nonce: wpforms_admin.nonce, + }; + + // Trigger AJAX to recreate tables. + $.post( wpforms_admin.ajax_url, data, function( res ) { + WPFormsAdmin.debug( res ); + + // Remove any previous alerts. + $settings.find( '.wpforms-notice' ).remove(); + + if ( res.success ) { + $btn.before( '
    ' + res.data.msg + '
    ' ); + $btn.hide(); + } + + if ( ! res.success && res.data.msg ) { + $btn.before( '
    ' + res.data.msg + '
    ' ); + } + + if ( ! res.success && res.data.debug ) { + $btn.before( '
    ' + res.data.debug + '
    ' ); + } + } ).always( function() { + $btn.css( 'width', btnWidth ).prop( 'disabled', false ).text( btnLabel ); + } ); + }, + + /** + * Begins the process of analyzing the forms. + * + * This runs for non-Pro installs to check if any of the forms to be imported + * contain fields not currently available. + * + * @since 1.4.2 + * + * @param {Array} forms Forms. + */ + analyzeForms( forms ) { + const $processAnalyze = $( '#wpforms-importer-analyze' ); + + // Display the total number of forms we have to import. + $processAnalyze.find( '.form-total' ).text( forms.length ); + $processAnalyze.find( '.form-current' ).text( '1' ); + + // Hide the form select section. + $( '#wpforms-importer-forms' ).hide(); + + // Show Analyze status. + $processAnalyze.show(); + + // Create global analyze queue. + s.analyzeQueue = forms; + s.analyzed = 0; + s.analyzeUpgrade = []; + s.formIDs = forms; + + // Analyze the first form in the queue. + WPFormsAdmin.analyzeForm(); + }, + + /** + * Analyze a single form from the queue. + * + * @since 1.4.2 + */ + analyzeForm() { + const $analyzeSettings = $( '#wpforms-importer-analyze' ), + formID = _.first( s.analyzeQueue ), + provider = WPFormsAdmin.getQueryString( 'provider' ), + data = { + action: 'wpforms_import_form_' + provider, + analyze: 1, + form_id: formID, + nonce: wpforms_admin.nonce, + }; + + // Trigger AJAX analyze for this form. + $.post( wpforms_admin.ajax_url, data, function( res ) { + if ( res.success ) { + if ( ! _.isEmpty( res.data.upgrade_plain ) || ! _.isEmpty( res.data.upgrade_omit ) ) { + s.analyzeUpgrade.push( { + name: res.data.name, + fields: _.union( res.data.upgrade_omit, res.data.upgrade_plain ), + } ); + } + + // Remove this form ID from the queue. + s.analyzeQueue = _.without( s.analyzeQueue, formID ); + s.analyzed++; + + if ( _.isEmpty( s.analyzeQueue ) ) { + if ( _.isEmpty( s.analyzeUpgrade ) ) { + // Continue to import forms as no Pro fields were found. + WPFormsAdmin.importForms( s.formIDs ); + } else { + // We found Pro fields, so alert the user. + const upgradeDetails = wp.template( 'wpforms-importer-upgrade' ); + $analyzeSettings.find( '.upgrade' ).append( upgradeDetails( s.analyzeUpgrade ) ); + $analyzeSettings.find( '.upgrade' ).show(); + $analyzeSettings.find( '.process-analyze' ).hide(); + } + } else { + // Analyze the next form in the queue. + $analyzeSettings.find( '.form-current' ).text( s.analyzed + 1 ); + WPFormsAdmin.analyzeForm(); + } + } + } ); + }, + + /** + * Begins the process of importing the forms. + * + * @since 1.4.2 + * + * @param {Array} forms Forms. + */ + importForms( forms ) { + const $processSettings = $( '#wpforms-importer-process' ); + + // Display the total number of forms we have to import. + $processSettings.find( '.form-total' ).text( forms.length ); + $processSettings.find( '.form-current' ).text( '1' ); + + // Hide the form select and form analyze sections. + $( '#wpforms-importer-forms, #wpforms-importer-analyze' ).hide(); + + // Show processing status. + $processSettings.show(); + + // Create global import queue. + s.importQueue = forms; + s.imported = 0; + + // Import the first form in the queue. + WPFormsAdmin.importForm(); + }, + + /** + * Imports a single form from the import queue. + * + * @since 1.4.2 + */ + importForm() { + const $processSettings = $( '#wpforms-importer-process' ), + formID = _.first( s.importQueue ), + provider = WPFormsAdmin.getQueryString( 'provider' ), + data = { + action: 'wpforms_import_form_' + provider, + form_id: formID, + nonce: wpforms_admin.nonce, + }; + + // Trigger AJAX import for this form. + $.post( wpforms_admin.ajax_url, data, function( res ) { + if ( res.success ) { + let statusUpdate; + + if ( res.data.error ) { + statusUpdate = wp.template( 'wpforms-importer-status-error' ); + } else { + statusUpdate = wp.template( 'wpforms-importer-status-update' ); + } + + $processSettings.find( '.status' ).prepend( statusUpdate( res.data ) ); + $processSettings.find( '.status' ).show(); + + // Remove this form ID from the queue. + s.importQueue = _.without( s.importQueue, formID ); + s.imported++; + + if ( _.isEmpty( s.importQueue ) ) { + $processSettings.find( '.process-count' ).hide(); + $processSettings.find( '.forms-completed' ).text( s.imported ); + $processSettings.find( '.process-completed' ).show(); + } else { + // Import the next form in the queue. + $processSettings.find( '.form-current' ).text( s.imported + 1 ); + WPFormsAdmin.importForm(); + } + } + } ); + }, + + //--------------------------------------------------------------------// + // Upgrades (Tabs view). + //--------------------------------------------------------------------// + + /** + * Element bindings for Tools page. + * + * @since 1.4.3 + */ + initUpgrades() { + // Prepare to run the v1.4.3 upgrade routine. + $( document ).on( 'click', '#wpforms-upgrade-143 button', function( event ) { + event.preventDefault(); + + const $this = $( this ), + buttonWidth = $this.outerWidth(), + $status = $( '#wpforms-upgrade-143 .status' ), + data = { + action: 'wpforms_upgrade_143', + nonce: wpforms_admin.nonce, + init: true, + incomplete: $this.data( 'incomplete' ), + }; + + // Change the button to indicate we are doing initial processing. + $this.html( s.iconSpinner ).css( 'width', buttonWidth ).prop( 'disabled', true ); + + // Get the total number of entries, then kick off the routine. + $.post( wpforms_admin.ajax_url, data, function( res ) { + if ( res.success ) { + // Set initial values. + s.upgraded = Number( res.data.upgraded ); + s.upgradeTotal = Number( res.data.total ); + const percent = Math.round( ( Number( s.upgraded ) / Number( s.upgradeTotal ) ) * 100 ); + + // Show the status area. + $this.remove(); + $status.find( '.bar' ).css( 'width', percent + '%' ); + $status.show().find( '.total' ).text( s.upgradeTotal ); + $status.find( '.current' ).text( s.upgraded ); + $status.find( '.percent' ).text( percent + '%' ); + + // Begin the actual upgrade routine. + WPFormsAdmin.upgrade143(); + } + } ); + } ); + }, + + /** + * The v1.4.3 entry fields upgrade routine. + * + * @since 1.4.3 + */ + upgrade143() { + const $status = $( '#wpforms-upgrade-143 .status' ), + data = { + action: 'wpforms_upgrade_143', + nonce: wpforms_admin.nonce, + upgraded: s.upgraded, + }; + + // Get the total number of entries, then kick off the routine. + $.post( wpforms_admin.ajax_url, data, function( res ) { + if ( res.success ) { + s.upgraded = Number( s.upgraded ) + Number( res.data.count ); + const percent = Math.round( ( Number( s.upgraded ) / Number( s.upgradeTotal ) ) * 100 ); + + // Update progress bar. + $status.find( '.bar' ).css( 'width', percent + '%' ); + + if ( Number( res.data.count ) < 10 ) { + // This batch completed the upgrade routine. + $status.find( '.progress-bar' ).addClass( 'complete' ); + $status.find( '.msg' ).text( wpforms_admin.upgrade_completed ); + } else { + $status.find( '.current' ).text( s.upgraded ); + $status.find( '.percent' ).text( percent + '%' ); + + // Batch the next round of entries. + WPFormsAdmin.upgrade143(); + } + } + } ); + }, + + /** + * Element bindings for Flyout Menu. + * + * @since 1.5.7 + */ + initFlyoutMenu() { + // Flyout Menu Elements. + const $flyoutMenu = $( '#wpforms-flyout' ); + + if ( $flyoutMenu.length === 0 ) { + return; + } + + const $head = $flyoutMenu.find( '.wpforms-flyout-head' ), + $sullie = $head.find( 'img' ), + menu = { + state: 'inactive', + srcInactive: $sullie.attr( 'src' ), + srcActive: $sullie.data( 'active' ), + }; + + // Click on the menu head icon. + $head.on( 'click', function( e ) { + e.preventDefault(); + + if ( menu.state === 'active' ) { + $flyoutMenu.removeClass( 'opened' ); + $sullie.attr( 'src', menu.srcInactive ); + menu.state = 'inactive'; + } else { + $flyoutMenu.addClass( 'opened' ); + $sullie.attr( 'src', menu.srcActive ); + menu.state = 'active'; + } + } ); + + // Page elements and other values. + const $wpfooter = $( '#wpfooter' ); + + if ( $wpfooter.length === 0 ) { + return; + } + + const $overlap = $( + '#wpforms-overview, ' + + '#wpforms-entries-list, ' + + '#wpforms-tools.wpforms-tools-tab-action-scheduler, ' + + '#wpforms-tools.wpforms-tools-tab-logs' + ); + + // Hide the menu if scrolled down to the bottom of the page. + $( window ).on( 'resize scroll', _.debounce( function() { + const wpfooterTop = $wpfooter.offset().top, + wpfooterBottom = wpfooterTop + $wpfooter.height(), + overlapBottom = $overlap.length > 0 ? $overlap.offset().top + $overlap.height() + 85 : 0, + viewTop = $( window ).scrollTop(), + viewBottom = viewTop + $( window ).height(); + + if ( wpfooterBottom <= viewBottom && wpfooterTop >= viewTop && overlapBottom > viewBottom ) { + $flyoutMenu.addClass( 'out' ); + } else { + $flyoutMenu.removeClass( 'out' ); + } + }, 50 ) ); + + $( window ).trigger( 'scroll' ); + }, + + /** + * Lity improvements. + * + * @since 1.5.8 + */ + initLity() { + // Use `data-lity-srcset` opener's attribute for add srcset to full image in opened lightbox. + $( document ).on( 'lity:ready', function( event, instance ) { + const $el = instance.element(), + $opener = instance.opener(), + srcset = typeof $opener !== 'undefined' ? $opener.data( 'lity-srcset' ) : ''; + + if ( typeof srcset !== 'undefined' && srcset !== '' ) { + $el.find( '.lity-content img' ).attr( 'srcset', srcset ); + } + } ); + }, + + //--------------------------------------------------------------------// + // Helper functions. + //--------------------------------------------------------------------// + + /** + * Return if the target nodeName is a form element. + * + * @since 1.4.0 + * + * @param {string} name Node name. + * @return {boolean} Target node is a form element. + */ + isFormTypeNode( name ) { + name = name || false; + + return 'TEXTAREA' === name || 'INPUT' === name || 'SELECT' === name; + }, + + /** + * Get a query string in a URL. + * + * @since 1.3.9 + * + * @param {string} name Query string to find in a URL. + * @return {string|null} Query string or null. + */ + getQueryString( name ) { + const match = new RegExp( '[?&]' + name + '=([^&]*)' ).exec( window.location.search ); + + return match && decodeURIComponent( match[ 1 ].replace( /\+/g, ' ' ) ); + }, + + /** + * Debug output helper. + * + * @param {string} msg Message. + * + * @since 1.4.4 + */ + debug( msg ) { + if ( WPFormsAdmin.isDebug() ) { + if ( typeof msg === 'object' || msg.constructor === Array ) { + console.log( 'WPForms Debug:' ); // eslint-disable-line no-console + console.log( msg ); // eslint-disable-line no-console + } else { + console.log( 'WPForms Debug: ' + msg ); // eslint-disable-line no-console + } + } + }, + + /** + * Is debug mode. + * + * @since 1.4.4 + * + * @return {boolean} Debug mode. + */ + isDebug() { + return ( window.location.hash && '#wpformsdebug' === window.location.hash ); + }, + + /** + * Get Delete / Trash all notice message. + * + * @since 1.8.5 + * + * @param {string} type Type of screen. + * + * @return {Object} The `Notice Data` object. + */ + getDeleteAllNoticeData: ( type = '' ) => { + // Define delete data for spam or trash. + if ( [ 'spam', 'trash' ].includes( type ) ) { + return { + contentAll : wpforms_admin.entry_delete_all_confirm, + content : wpforms_admin.entry_delete_n_confirm, + action : 'delete', + }; + } + + // Otherwise define trash data. + return { + contentAll : wpforms_admin.entry_trash_all_confirm, + content : wpforms_admin.entry_trash_n_confirm, + action : 'trash', + }; + }, + + /** + * Show/hide the right arrow for the scrollable menu on mobile devices. + * + * @since 1.8.8 + */ + initScrollableMenu() { + $( document ).on( 'wpformsReady', function() { + const $menu = $( '.wpforms-admin-tabs' ); + + if ( ! $menu.length ) { + return; + } + + const $lastMenuItem = $menu.find( 'li:last-child' ); + + // The last item of the menu is not visible - show the right arrow as an indicator of a scrollable menu. + if ( ! wpf.isInViewport( $lastMenuItem ) ) { + $menu.addClass( 'wpforms-admin-tabs--scrollable' ); + } + + // Listen to the ` scroll ` event to hide the right arrow when the last item is visible. + $menu.on( 'scroll', function() { + $menu.toggleClass( 'wpforms-admin-tabs--scrollable', ! wpf.isInViewport( $lastMenuItem ) ); + } ); + } ); + }, + }; + + WPFormsAdmin.init(); + + window.WPFormsAdmin = WPFormsAdmin; +}( jQuery ) ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/admin.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/admin.min.js new file mode 100755 index 00000000..3976e170 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/admin.min.js @@ -0,0 +1 @@ +(l=>{let m;var p={settings:{iconActivate:'',iconDeactivate:'',iconInstall:'',iconSpinner:'',mediaFrame:!1},init(){m=this.settings,l(p.ready),p.initEntriesSingle(),p.initEntriesList(),p.initWelcome(),l(document).on("wpformsReady",p.initAddons),p.initSettings(),p.initTools(),p.initUpgrades(),p.initScrollableMenu()},ready(){l.ajaxSetup({data:{_wp_http_referer:wpf.updateQueryString("_wp_http_referer",null)}}),p.scrollToIntegration(),l(".notice").show(),l("#screen-meta-links, #screen-meta").prependTo("#wpforms-header-temp").show(),p.initChoicesJS(),l(document).on("htmx:afterSwap",p.initChoicesJS),p.initCheckboxMultiselectColumns(),l(".wpforms-color-picker").each(function(){var e=l(this);e.minicolors({defaultValue:e.data("fallback-color")||""})}),l(".wpforms-file-upload").each(function(){let e=l(this).find("input[type=file]"),n=l(this).find("label"),o=n.html();e.on("change",function(e){let t="";this.files&&1'+t+"")):(e.parent().removeClass("checked"),n.find("#"+o).remove())}),l(document).on("click",".checkbox-multiselect-columns .all",function(e){e.preventDefault(),l(this).closest(".checkbox-multiselect-columns").find("input[type=checkbox]").prop("checked",!0).trigger("change"),l(this).remove()})},initFormOverview(){console.warn('WARNING! Function "WPFormsAdmin.initFormOverview()" has been deprecated, please use the new "WPFormsForms.Overview.init()" function instead!'),window.WPFormsForms.Overview.init()},initEntriesList(){l(document).on("click","#wpforms-entries-list .form-selector .toggle",function(e){e.preventDefault(),l(this).toggleClass("active").next(".form-list").toggle()}),l(document).on("click","#wpforms-entries-table #doaction",function(e){let t=l(this),n=t.closest("form"),o=n.find("table"),s=n.find("select[name=action]"),i=o.find("input[name^=entry_id]:checked");var a;"delete"!==s.val()&&"trash"!==s.val()||!i.length||(a="delete"===s.val()?wpforms_admin.entry_delete_n_confirm:wpforms_admin.entry_trash_n_confirm,e.preventDefault(),l.confirm({title:wpforms_admin.heads_up,content:a.replace("{entry_count}",i.length),icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){n.trigger("submit")}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}}))}),l(document).on("click","#wpforms-entries-list .wp-list-table .delete",function(e){e.preventDefault();let t=l(this).attr("href");l.confirm({title:wpforms_admin.heads_up,content:wpforms_admin.entry_delete_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){window.location=t}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})}),l(document).on("click","#wpforms-entries-list .wp-list-table .trash",function(e){e.preventDefault();let t=l(this).attr("href");l.confirm({title:wpforms_admin.heads_up,content:wpforms_admin.entry_trash_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action:()=>{window.location=t}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})}),l(document).on("click","#wpforms-entries-list .wp-list-table .indicator-star",function(e){e.preventDefault();var e=l(this),t=l("#wpforms-entries-list .starred-num"),n=e.parents("table");let o,s=Number(t.text());e.hasClass("star")?(o="star",s++,e.attr("title",wpforms_admin.entry_unstar)):(o="unstar",s--,e.attr("title",wpforms_admin.entry_star)),e.toggleClass("star unstar"),n.hasClass("wpforms-entries-table-spam")||n.hasClass("wpforms-entries-table-trash")||t.text(s);n={task:o,action:"wpforms_entry_list_star",nonce:wpforms_admin.nonce,entryId:e.data("id"),formId:e.data("form-id")};l.post(wpforms_admin.ajax_url,n)}),l(document).on("click","#wpforms-entries-list .wp-list-table .indicator-read",function(e){e.preventDefault();var e=l(this),t=l("#wpforms-entries-list .unread-num"),n=e.parents("table");let o,s=Number(t.text());e.hasClass("read")?(o="read",s--,e.attr("title",wpforms_admin.entry_unread)):(o="unread",s++,e.attr("title",wpforms_admin.entry_read)),e.toggleClass("read unread"),n.hasClass("wpforms-entries-table-spam")||n.hasClass("wpforms-entries-table-trash")||t.text(s);n={task:o,action:"wpforms_entry_list_read",nonce:wpforms_admin.nonce,entryId:e.data("id"),formId:e.data("form-id")};l.post(wpforms_admin.ajax_url,n)}),l(document).on("click","#wpforms-entries-list .form-details-actions-removeall",function(e){e.preventDefault();let t=l(this).data("page"),n=p.getDeleteAllNoticeData(t),o=l(this).attr("href"),s=l("#wpforms-entries-table"),i=s.data("filtered-count-trash")&&"trash"===n.action?parseInt(s.data("filtered-count-trash"),10):0,a={action:"wpforms_entry_list_process_"+n.action+"_all",form_id:s.find('input[name="form_id"]').val(),date:s.find('input[name="date"]').val(),page:t,search:{field:s.find('select[name="search[field]"]').val(),comparison:s.find('select[name="search[comparison]"]').val(),term:s.find('input[name="search[term]"]').val()},nonce:wpforms_admin.nonce,url:o};l.confirm({title:wpforms_admin.heads_up,content:i&&l("#wpforms-reset-filter").length?n.content.replace("{entry_count}",i):n.contentAll,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action:()=>{l.get(wpforms_admin.ajax_url,a).done(function(e){e.success&&(window.location=_.isEmpty(e.data)?o:e.data)})}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})}),l(document).on("heartbeat-send",function(e,t){var n,o=l("#wpforms-entries-list");o.length&&!o.find(".wpforms-dash-widget").length&&void 0!==(n=o.find("#wpforms-entries-table").data("last-entry-id"))&&(t.wpforms_new_entries_entry_id=n,t.wpforms_new_entries_form_id=o.find("input[name=form_id]").val())}),l(document).on("heartbeat-tick",function(e,t){var n=l("#wpforms-entries-list");if(n.length&&t.wpforms_new_entries_notification){var o=n.find(".wp-list-table thead tr").first().children().length;n.find(".new-entries-notification").length||n.find(".wp-list-table thead").append('
    ');let e=n.find(".new-entries-notification a");e.text(t.wpforms_new_entries_notification).slideDown({start(){e.css("display","block")},always(){e.css("display","block")}})}})},initEntriesSingle(){"wpforms-entries"===p.getQueryString("page")&&"details"===p.getQueryString("view")&&p.entryHotkeys(),l(document).on("click","#wpforms-entries-single .wpforms-entry-delete a",function(e){e.preventDefault();let t=l(this).attr("href");l.confirm({title:wpforms_admin.heads_up,content:wpforms_admin.entry_delete_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){window.location=t}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})}),l(document).on("click","#wpforms-entries-single .trash",function(e){e.preventDefault();let t=l(this).attr("href");l.confirm({title:wpforms_admin.heads_up,content:wpforms_admin.entry_trash_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action:()=>{window.location=t}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})}),l(document).on("click","#wpforms-entries-single .wpforms-entry-print a",function(e){e.preventDefault(),window.open(l(this).attr("href"))}),l(document).on("click","#wpforms-entries-single .wpforms-empty-field-toggle",function(e){e.preventDefault(),"true"===wpCookies.get("wpforms_entry_hide_empty")?(wpCookies.remove("wpforms_entry_hide_empty"),l(this).text(wpforms_admin.entry_empty_fields_hide)):(wpCookies.set("wpforms_entry_hide_empty","true",2592e3),l(this).text(wpforms_admin.entry_empty_fields_show)),l(".wpforms-entry-field.empty, .wpforms-edit-entry-field.empty").toggle()}),l(document).on("click","#wpforms-entries-single .wpforms-entry-notes-new .add",function(e){e.preventDefault(),l(this).hide().next("form").stop().slideToggle()}),l(document).on("click","#wpforms-entries-single .wpforms-entry-notes-new .cancel",function(e){e.preventDefault(),l(this).closest("form").stop().slideToggle(),l(".wpforms-entry-notes-new .add").show()}),l(document).on("click","#wpforms-entries-single .wpforms-entry-notes-byline .note-delete",function(e){e.preventDefault();let t=l(this).attr("href");l.confirm({title:wpforms_admin.heads_up,content:wpforms_admin.entry_note_delete_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){window.location=t}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})})},entryHotkeys(){l(document).on("keydown",function(e){74!==e.keyCode||e.metaKey||p.isFormTypeNode(e.target.nodeName)?75!==e.keyCode||e.metaKey||p.isFormTypeNode(e.target.nodeName)||"#"!==(e=l("#wpforms-admin-single-navigation-next-link").attr("href"))&&(window.location.href=e):"#"!==(e=l("#wpforms-admin-single-navigation-prev-link").attr("href"))&&(window.location.href=e)})},initWelcome(){l(document).on("click","#wpforms-welcome .play-video",function(e){e.preventDefault();l.dialog({title:!1,content:'
    ',closeIcon:!0,boxWidth:"70%"})})},initAddons(){if(l("#wpforms-admin-addons").length){var n=l("#wpforms-addons-list-section-all"),o=l("#wpforms-addons-list-section-installed");if(n.length||o.length){let e,t;o.length&&(e=new List("wpforms-addons-list-section-installed",{valueNames:["addon-link"]})),n.length&&(t=new List("wpforms-addons-list-section-all",{valueNames:["addon-link"]})),l("#wpforms-addons-search").on("keyup search",function(){p.updateAddonSearchResult(this,t,e)})}l(document).on("change",".wpforms-addons-list-item .wpforms-toggle-control input",function(e){if(e.preventDefault(),l(this).hasClass("disabled"))return!1;p.addonToggleNew(l(this))}),l(document).on("click",".wpforms-addons-list-item button",function(e){if(e.preventDefault(),l(this).hasClass("disabled"))return!1;p.addonToggleNew(l(this))}),l(document).on("click","#wpforms-admin-addons .addon-item button",function(e){if(e.preventDefault(),l(this).hasClass("disabled"))return!1;p.addonToggle(l(this))})}},updateAddonSearchResult(e,t,n){let o=l(e).val();o=o.replace(/[.,]/g," ");var e=l("#wpforms-addons-no-results"),s=l("#wpforms-addons-list-section-all"),i=l("#wpforms-addons-list-section-installed"),t=t?t.search(o):[],n=n?n.search(o):[];e.toggle(0===t.length&&0===n.length),s.toggle(0

    ${"addon"===t?wpforms_admin.addon_error:wpforms_admin.plugin_error}

    `):r.append(``),"install"===i?(n=!1,p.removeSpinnerFromButton(a)):"deactivate"===i?n=!0:"activate"===i&&(n=!1)}p.setAddonState(e,i,t,function(e){var t;e.success?(t=e,"install"===i?(o=c.active,n=!0,r.attr("data-plugin",t.data.basename),t.data.is_activated||(o=c.installed,n=!1),a.hide(),a=a.closest(".wpforms-addons-list-item").find(".wpforms-toggle-control input")):"activate"===i?(r.find(".wpforms-addons-list-item-footer-settings-link").fadeIn(150),o=c.active,n=!0):"deactivate"===i&&(r.find(".wpforms-addons-list-item-footer-settings-link").fadeOut(150),o=c.installed,n=!1),r.removeClass(c.active+" "+c.incompatible+" "+c.installed+" "+c.missing).addClass(o)):d(e),p.updateAddonButtonPropertiesAndUI(a,s,r,c,n)},function(){d({data:wpforms_admin.server_error}),p.updateAddonButtonPropertiesAndUI(a,s,r,c,n)})}},addSpinnerToButton(e){var t=e.width();e.data("original-text",e.html()),e.width(t).html('')},removeSpinnerFromButton(e){e.html(e.data("original-text"))},getAddonState(e,t,n){return e.hasClass(t.active)||e.hasClass(t.incompatible)?"deactivate":e.hasClass(t.installed)?"activate":e.hasClass(t.missing)?(p.addSpinnerToButton(n),"install"):""},updateAddonButtonPropertiesAndUI(e,t,n,o,s){e.prop("checked",s),e.prop("disabled",!1),e.siblings(".wpforms-toggle-control-status").html(e.siblings(".wpforms-toggle-control-status").data(s?"on":"off")),0'+d+""),t.find("span.status-label").removeClass("status-active status-installed status-missing").addClass(i).removeClass("button button-primary button-secondary disabled").text(a),o.removeClass("status-active status-installed status-missing").removeClass("button button-primary button-secondary disabled").addClass(i).html(r)):("object"==typeof e.data?"addon"===n?t.find(".actions").append('

    '+wpforms_admin.addon_error+"

    "):t.find(".actions").append('

    '+wpforms_admin.plugin_error+"

    "):t.find(".actions").append('

    '+e.data+"

    "),"install"===s&&"plugin"===n&&o.addClass("status-go-to-url").removeClass("status-missing"),o.html(c)),o.prop("disabled",!1).removeClass("loading"),t.find(".actions").find(".msg.error").length||setTimeout(function(){l(".addon-item .msg").remove()},3e3)},function(e){console.log(e.responseText)})}},initSettings(){l(document).on("wpformsReady",function(){var e,t;l("#wpforms-settings").length&&(e=p.getQueryString("wpforms-integration"),t=p.getQueryString("jump"),e?l("body").animate({scrollTop:l("#wpforms-integration-"+e).offset().top},1e3):t&&l("body").animate({scrollTop:l("#"+t).offset().top},1e3),l(".wpforms-admin-settings-form").conditions([{conditions:{element:"#wpforms-setting-gdpr",type:"checked",operator:"is"},actions:{if:{element:"#wpforms-setting-row-gdpr-disable-uuid,#wpforms-setting-row-gdpr-disable-details",action:"show"},else:{element:"#wpforms-setting-row-gdpr-disable-uuid,#wpforms-setting-row-gdpr-disable-details",action:"hide"}},effect:"appear"},{conditions:{element:"input[name=captcha-provider]:checked",type:"value",operator:"=",condition:"hcaptcha"},actions:{if:[{element:".wpforms-setting-row",action:"show"},{element:".wpforms-setting-recaptcha, #wpforms-setting-row-recaptcha-site-key, #wpforms-setting-row-recaptcha-secret-key, #wpforms-setting-row-recaptcha-fail-msg, .wpforms-setting-turnstile, #wpforms-setting-row-turnstile-heading, #wpforms-setting-row-turnstile-site-key, #wpforms-setting-row-turnstile-secret-key, #wpforms-setting-row-turnstile-theme, #wpforms-setting-row-turnstile-fail-msg",action:"hide"}]},effect:"appear"},{conditions:{element:"input[name=captcha-provider]:checked",type:"value",operator:"=",condition:"recaptcha"},actions:{if:[{element:".wpforms-setting-row",action:"show"},{element:"#wpforms-setting-row-hcaptcha-heading, #wpforms-setting-row-hcaptcha-site-key, #wpforms-setting-row-hcaptcha-secret-key, #wpforms-setting-row-hcaptcha-fail-msg, #wpforms-setting-row-turnstile-heading, #wpforms-setting-row-turnstile-site-key, #wpforms-setting-row-turnstile-secret-key, #wpforms-setting-row-turnstile-theme, #wpforms-setting-row-turnstile-fail-msg",action:"hide"}]},effect:"appear"},{conditions:{element:"input[name=captcha-provider]:checked",type:"value",operator:"=",condition:"turnstile"},actions:{if:[{element:".wpforms-setting-row",action:"show"},{element:"#wpforms-setting-row-hcaptcha-heading, #wpforms-setting-row-hcaptcha-site-key, #wpforms-setting-row-hcaptcha-secret-key, #wpforms-setting-row-hcaptcha-fail-msg, .wpforms-setting-recaptcha, #wpforms-setting-row-recaptcha-site-key, #wpforms-setting-row-recaptcha-secret-key, #wpforms-setting-row-recaptcha-fail-msg",action:"hide"}]},effect:"appear"},{conditions:{element:"input[name=captcha-provider]:checked",type:"value",operator:"=",condition:"none"},actions:{if:[{element:".wpforms-setting-row",action:"hide"},{element:".wpforms-setting-captcha-heading, #wpforms-setting-row-captcha-provider",action:"show"}]},effect:"appear"}]))}),l(document).on("change","#wpforms-setting-row-render-engine input",p.settingsRenderEngineChange),l(document).on("change","#wpforms-setting-disable-css",function(){p.settingsFormStylesAlert(l(this).val())}),l(document).on("click",".wpforms-setting-row-image button",function(e){e.preventDefault(),l(this).hasClass("wpforms-setting-remove-image")?l(this).closest(".wpforms-setting-row-image").find("input").val("").attr("value","").trigger("change").end().find("img").remove():p.imageUploadModal(l(this))}),l(document).on("click","#wpforms-setting-license-key-verify",function(e){e.preventDefault(),p.licenseVerify(l(this))}),l(document).on("click",".wpforms-setting-license-wrapper",function(e){e.preventDefault();e=l("#wpforms-setting-license-key");e.length&&e.prop("disabled")&&p.licenseEditMessage()}),l(document).on("click","#wpforms-setting-license-key-deactivate",function(e){e.preventDefault(),p.licenseDeactivate(l(this))}),l(document).on("click","#wpforms-setting-license-key-refresh",function(e){e.preventDefault(),p.licenseRefresh(l(this))}),l(document).on("click",".wpforms-settings-provider-connect",function(e){e.preventDefault();e=l(this);p.integrationConnect(e)}),l(document).on("click",".wpforms-settings-provider-accounts-list .remove a",function(e){e.preventDefault(),p.integrationDisconnect(l(this))}),l(document).on("click",".wpforms-settings-provider:not(.focus-out) .wpforms-settings-provider-header",function(e){e.preventDefault();let t=l(this);t.parent().find(".wpforms-settings-provider-accounts").stop(!1,!0).slideToggle("",function(){t.parent().find(".wpforms-settings-provider-logo i").toggleClass("fa-chevron-right fa-chevron-down")})}),l(document).on("click",".wpforms-settings-provider-accounts-toggle a",function(e){e.preventDefault();e=l(this).parent().next(".wpforms-settings-provider-accounts-connect");e.find("input[type=text], input[type=password]").val(""),e.stop().slideToggle()}),l(document).on("change","#wpforms-setting-row-captcha-provider input",function(){var e=l("#wpforms-setting-row-captcha-preview");"hcaptcha"===this.value||"turnstile"===this.value?e.removeClass("wpforms-hidden"):"none"===this.value?e.addClass("wpforms-hidden"):l("#wpforms-setting-row-recaptcha-type input:checked").trigger("change"),e.find(".wpforms-captcha-preview").length&&(e.find(".wpforms-captcha-preview").empty(),e.find(".wpforms-captcha-placeholder").removeClass("wpforms-hidden"))}),l(document).on("change","#wpforms-setting-row-recaptcha-type input",function(){l("#wpforms-setting-row-captcha-preview").toggleClass("wpforms-hidden","v2"!==this.value),l("#wpforms-setting-row-recaptcha-v3-threshold").toggleClass("wpforms-hidden","v3"!==this.value)}),l(document).on("change",".wpforms-toggle-control input",function(){var e=l(this),t=e.is(":checked"),n=t?"on":"off",o=e.closest(".wpforms-setting-field"),e=e.closest(".wpforms-toggle-control").find(".wpforms-toggle-control-status"),s=o.find(".wpforms-toggle-desc.desc-on"),o=o.find(".wpforms-toggle-desc.desc-off"),i=0'),t.trigger("change")}).on("close",function(){m.mediaFrame.off("library:selection:add")}),m.mediaFrame.open()},licenseVerify(s){let i=s.closest(".wpforms-setting-row"),a=l("#wpforms-setting-license-key"),e=s.outerWidth(),r=s.text(),t={action:"wpforms_verify_license",nonce:wpforms_admin.nonce,license:a.val()};s.html(m.iconSpinner).css("width",e).prop("disabled",!0),l.post(wpforms_admin.ajax_url,t,function(e){let t="fa fa-check-circle",n="green",o;e.success?(o=e.data.msg,s.hide(),i.find("#wpforms-setting-license-key-info-message").empty().hide(),i.find(".type, .desc, #wpforms-setting-license-key-deactivate").show(),i.find(".type strong").text(e.data.type),l(".wpforms-license-notice").remove(),a.prop("disabled",!0).addClass("wpforms-setting-license-is-valid").attr("value",a.val().replace(/./g,"*"))):(t="fa fa-exclamation-circle",n="orange",o=e.data,i.find(".type, .desc, #wpforms-setting-license-key-deactivate").hide(),a.prop("disabled",!1)),l.alert({title:o.header??!1,content:o.msg??o,icon:t,type:n,buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}}),s.html(r).css("width","auto").prop("disabled",!1)}).fail(function(e){a.prop("disabled",!1),console.log(e.responseText)})},licenseEditMessage(){l.alert({title:wpforms_admin.heads_up,content:wpforms_admin.edit_license,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})},licenseDeactivate(e){let a=l(e),r=a.closest(".wpforms-setting-row");e=a.outerWidth();let c=a.text();var t={action:"wpforms_deactivate_license",nonce:wpforms_admin.nonce};a.html(m.iconSpinner).css("width",e).prop("disabled",!0),l.post(wpforms_admin.ajax_url,t,function(e){let t="fa fa-info-circle",n="blue",o=wpforms_admin.success;var s=e.data,i=s.msg&&"string"==typeof s.msg?s.msg:wpforms_admin.something_went_wrong;e.success?(r.find("#wpforms-setting-license-key").val("").attr("value","").prop({readonly:!1,disabled:!1}).removeClass(),r.find(".wpforms-license-key-deactivate-remove").remove(),r.find("#wpforms-setting-license-key-info-message").html(s.info).show(),r.find("#wpforms-setting-license-key-verify").prop("disabled",!1).show(),r.find(".type, .desc, #wpforms-setting-license-key-deactivate").hide()):(t="fa fa-exclamation-circle",n="orange",o=wpforms_admin.oops),l.alert({title:o,content:i,icon:t,type:n,buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}}),a.html(c).css("width","auto").prop("disabled",!1)}).fail(function(e){console.log(e.responseText)})},licenseRefresh(e){let t=l(e),s=t.closest(".wpforms-setting-row"),i=l("#wpforms-setting-license-key"),n={action:"wpforms_refresh_license",nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,n,function(e){let t="fa fa-check-circle",n="green",o;e.success?(o=e.data.msg,s.find(".type strong").text(e.data.type)):(t="fa fa-exclamation-circle",n="orange",o=e.data,s.find(".type, .desc").hide(),i.removeClass("wpforms-setting-license-is-valid").addClass("wpforms-setting-license-is-invalid")),l.alert({title:o.header??!1,content:o.msg??o,icon:t,type:n,buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})}).fail(function(e){console.log(e.responseText)})},integrationConnect(t){let e=t.outerWidth(),n=t.text(),o=t.closest(".wpforms-settings-provider"),s={action:"wpforms_settings_provider_add_"+t.data("provider"),data:t.closest("form").serialize(),provider:t.data("provider"),nonce:wpforms_admin.nonce},i=wpforms_admin.provider_auth_error;t.html(wpforms_admin.connecting).css("width",e).prop("disabled",!0),l.post(wpforms_admin.ajax_url,s,function(e){e.success?(o.find(".wpforms-settings-provider-accounts-list ul").append(e.data.html),o.addClass("connected"),t.closest(".wpforms-settings-provider-accounts-connect").stop().slideToggle()):(Object.prototype.hasOwnProperty.call(e,"data")&&Object.prototype.hasOwnProperty.call(e.data,"error_msg")&&(i+="
    "+e.data.error_msg),p.integrationError(i))}).fail(function(){p.integrationError(i)}).always(function(){t.html(n).css("width","auto").prop("disabled",!1)})},integrationDisconnect(e){let n=l(e),o=n.parents(".wpforms-settings-provider"),t={action:"wpforms_settings_provider_disconnect_"+n.data("provider"),provider:n.data("provider"),key:n.data("key"),nonce:wpforms_admin.nonce},s=wpforms_admin.provider_delete_error;l.confirm({title:wpforms_admin.heads_up,content:wpforms_admin.provider_delete_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){l.post(wpforms_admin.ajax_url,t,function(e){var t;e.success?(n.parent().parent().remove(),void 0!==(t=o.find(".wpforms-settings-provider-accounts-list li").length)&&0!==t||o.removeClass("connected"),l(document).trigger("wpformsProviderRemoved",[o,e])):(Object.prototype.hasOwnProperty.call(e,"data")&&Object.prototype.hasOwnProperty.call(e.data,"error_msg")&&(s+="
    "+e.data.error_msg),p.integrationError(s))}).fail(function(){p.integrationError(s)})}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})},integrationError(e){l.alert({title:wpforms_admin.something_went_wrong,content:e,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})},initTools(){l(document).on("change","#wpforms-tools-form-import, #wpforms-tools-form-other-import, #wpforms-tools-form-export, #wpforms-tools-form-template",function(){var e=l(this);e.parents("form").find("button").attr("aria-disabled",0===e.val().length)}),l(document).on("click","#wpforms-system-information-copy",function(e){e.preventDefault(),p.copySystemInformation()}),l(document).on("click","#wpforms-ssl-verify",function(e){e.preventDefault(),p.verifySSLConnection()}),l(document).on("click","#wpforms-recreate-tables",function(e){e.preventDefault(),p.recreateTables()}),l(document).on("click","#wpforms-importer-forms-submit",function(e){e.preventDefault();e=l("#wpforms-importer-forms input:checked");if(e.length){let t=[];e.each(function(e){t[e]=l(this).val()}),wpforms_admin.isPro?p.importForms(t):p.analyzeForms(t)}else l.alert({title:wpforms_admin.heads_up,content:wpforms_admin.importer_forms_required,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})}),l(document).on("click","#wpforms-importer-continue-submit",function(e){e.preventDefault(),p.importForms(m.formIDs)})},copySystemInformation(){l("#wpforms-system-information").select(),document.execCommand("copy")},verifySSLConnection(){let t=l("#wpforms-ssl-verify"),n=t.text(),o=t.outerWidth(),s=t.parent();t.css("width",o).prop("disabled",!0).text(wpforms_admin.testing);var e={action:"wpforms_verify_ssl",nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,e,function(e){p.debug(e),s.find(".wpforms-notice").remove(),e.success&&t.before('
    '+e.data.msg+"
    "),!e.success&&e.data.msg&&t.before('
    '+e.data.msg+"
    "),!e.success&&e.data.debug&&t.before('
    '+e.data.debug+"
    "),t.css("width",o).prop("disabled",!1).text(n)})},recreateTables(){let t=l("#wpforms-recreate-tables"),e=t.text(),n=t.outerWidth(),o=t.parent();t.css("width",n).prop("disabled",!0).text(wpforms_admin.recreating);var s={action:"wpforms_recreate_tables",nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,s,function(e){p.debug(e),o.find(".wpforms-notice").remove(),e.success&&(t.before('
    '+e.data.msg+"
    "),t.hide()),!e.success&&e.data.msg&&t.before('
    '+e.data.msg+"
    "),!e.success&&e.data.debug&&t.before('
    '+e.data.debug+"
    ")}).always(function(){t.css("width",n).prop("disabled",!1).text(e)})},analyzeForms(e){var t=l("#wpforms-importer-analyze");t.find(".form-total").text(e.length),t.find(".form-current").text("1"),l("#wpforms-importer-forms").hide(),t.show(),m.analyzeQueue=e,m.analyzed=0,m.analyzeUpgrade=[],m.formIDs=e,p.analyzeForm()},analyzeForm(){let t=l("#wpforms-importer-analyze"),n=_.first(m.analyzeQueue),e=p.getQueryString("provider"),o={action:"wpforms_import_form_"+e,analyze:1,form_id:n,nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,o,function(e){e.success&&(_.isEmpty(e.data.upgrade_plain)&&_.isEmpty(e.data.upgrade_omit)||m.analyzeUpgrade.push({name:e.data.name,fields:_.union(e.data.upgrade_omit,e.data.upgrade_plain)}),m.analyzeQueue=_.without(m.analyzeQueue,n),m.analyzed++,_.isEmpty(m.analyzeQueue)?_.isEmpty(m.analyzeUpgrade)?p.importForms(m.formIDs):(e=wp.template("wpforms-importer-upgrade"),t.find(".upgrade").append(e(m.analyzeUpgrade)),t.find(".upgrade").show(),t.find(".process-analyze").hide()):(t.find(".form-current").text(m.analyzed+1),p.analyzeForm()))})},importForms(e){var t=l("#wpforms-importer-process");t.find(".form-total").text(e.length),t.find(".form-current").text("1"),l("#wpforms-importer-forms, #wpforms-importer-analyze").hide(),t.show(),m.importQueue=e,m.imported=0,p.importForm()},importForm(){let n=l("#wpforms-importer-process"),o=_.first(m.importQueue),e=p.getQueryString("provider"),t={action:"wpforms_import_form_"+e,form_id:o,nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,t,function(t){if(t.success){let e;e=t.data.error?wp.template("wpforms-importer-status-error"):wp.template("wpforms-importer-status-update"),n.find(".status").prepend(e(t.data)),n.find(".status").show(),m.importQueue=_.without(m.importQueue,o),m.imported++,_.isEmpty(m.importQueue)?(n.find(".process-count").hide(),n.find(".forms-completed").text(m.imported),n.find(".process-completed").show()):(n.find(".form-current").text(m.imported+1),p.importForm())}})},initUpgrades(){l(document).on("click","#wpforms-upgrade-143 button",function(e){e.preventDefault();let t=l(this),n=t.outerWidth(),o=l("#wpforms-upgrade-143 .status"),s={action:"wpforms_upgrade_143",nonce:wpforms_admin.nonce,init:!0,incomplete:t.data("incomplete")};t.html(m.iconSpinner).css("width",n).prop("disabled",!0),l.post(wpforms_admin.ajax_url,s,function(e){e.success&&(m.upgraded=Number(e.data.upgraded),m.upgradeTotal=Number(e.data.total),e=Math.round(Number(m.upgraded)/Number(m.upgradeTotal)*100),t.remove(),o.find(".bar").css("width",e+"%"),o.show().find(".total").text(m.upgradeTotal),o.find(".current").text(m.upgraded),o.find(".percent").text(e+"%"),p.upgrade143())})})},upgrade143(){let n=l("#wpforms-upgrade-143 .status"),e={action:"wpforms_upgrade_143",nonce:wpforms_admin.nonce,upgraded:m.upgraded};l.post(wpforms_admin.ajax_url,e,function(e){var t;e.success&&(m.upgraded=Number(m.upgraded)+Number(e.data.count),t=Math.round(Number(m.upgraded)/Number(m.upgradeTotal)*100),n.find(".bar").css("width",t+"%"),Number(e.data.count)<10?(n.find(".progress-bar").addClass("complete"),n.find(".msg").text(wpforms_admin.upgrade_completed)):(n.find(".current").text(m.upgraded),n.find(".percent").text(t+"%"),p.upgrade143()))})},initFlyoutMenu(){let r=l("#wpforms-flyout");if(0!==r.length){let e=r.find(".wpforms-flyout-head"),t=e.find("img"),n={state:"inactive",srcInactive:t.attr("src"),srcActive:t.data("active")},a=(e.on("click",function(e){e.preventDefault(),"active"===n.state?(r.removeClass("opened"),t.attr("src",n.srcInactive),n.state="inactive"):(r.addClass("opened"),t.attr("src",n.srcActive),n.state="active")}),l("#wpfooter"));if(0!==a.length){let i=l("#wpforms-overview, #wpforms-entries-list, #wpforms-tools.wpforms-tools-tab-action-scheduler, #wpforms-tools.wpforms-tools-tab-logs");l(window).on("resize scroll",_.debounce(function(){var e=a.offset().top,t=e+a.height(),n=0["spam","trash"].includes(e)?{contentAll:wpforms_admin.entry_delete_all_confirm,content:wpforms_admin.entry_delete_n_confirm,action:"delete"}:{contentAll:wpforms_admin.entry_trash_all_confirm,content:wpforms_admin.entry_trash_n_confirm,action:"trash"},initScrollableMenu(){l(document).on("wpformsReady",function(){let t=l(".wpforms-admin-tabs");if(t.length){let e=t.find("li:last-child");wpf.isInViewport(e)||t.addClass("wpforms-admin-tabs--scrollable"),t.on("scroll",function(){t.toggleClass("wpforms-admin-tabs--scrollable",!wpf.isInViewport(e))})}})}};p.init(),window.WPFormsAdmin=p})(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.js new file mode 100755 index 00000000..19e23d75 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.js @@ -0,0 +1,594 @@ +/* global wpforms_builder_providers, wpforms_builder, wpf, WPForms, WPFormsBuilder */ + +( function( $ ) { + + var s; + + var WPFormsProviders = { + + settings: { + spinner: '', + spinnerWhite: '', + }, + + /** + * Start the engine. + * + * @since 1.0.0 + */ + init: function() { + + s = this.settings; + + // Document ready. + $( WPFormsProviders.ready ); + + WPFormsProviders.bindUIActions(); + }, + + /** + * Document ready. + * + * @since 1.1.1 + */ + ready: function() { + + // Setup/cache some vars not available before. + s.form = $( '#wpforms-builder-form' ); + }, + + /** + * Element bindings. + * + * @since 1.0.0 + */ + bindUIActions: function() { + + // Delete connection. + $( document ).on( 'click', '.wpforms-provider-connection-delete', function( e ) { + WPFormsProviders.connectionDelete( this, e ); + } ); + + // Add new connection. + $( document ).on( 'click', '.wpforms-provider-connections-add', function( e ) { + WPFormsProviders.connectionAdd( this, e ); + } ); + + // Add new provider account. + $( document ).on( 'click', '.wpforms-provider-account-add button', function( e ) { + WPFormsProviders.accountAdd( this, e ); + } ); + + // Select provider account. + $( document ).on( 'change', '.wpforms-provider-accounts select', function( e ) { + WPFormsProviders.accountSelect( this, e ); + } ); + + // Select account list. + $( document ).on( 'change', '.wpforms-provider-lists select', function( e ) { + WPFormsProviders.accountListSelect( this, e ); + } ); + + // BC: Constant Contact v2, Aweber v1 and Campaign Monitor don't have JS logic for updating select fields with form fields options. + // That's why we have to refresh the form every time when change something in fields and visit the Marketing tab. + $( document ).on( 'wpformsPanelSwitch', function( e, targetPanel ) { + const legacyProviders = [ 'aweber', 'campaign-monitor', 'constant-contact' ]; + const hasConfiguredLegacyProvider = legacyProviders.some( ( legacyProvider ) => $( `.wpforms-panel-content-section-${ legacyProvider } .wpforms-provider-connection` ).length > 0 ); + + if ( hasConfiguredLegacyProvider ) { + WPFormsProviders.providerPanelConfirm( targetPanel ); + } + } ); + + // Alert users if they save a form and do not configure required + // fields. + $( document ).on( 'wpformsSaved', function( e, data ) { + var providerAlerts = []; + var $connectionBlocks = $( '#wpforms-panel-providers' ).find( '.wpforms-connection-block' ); + + if ( ! $connectionBlocks.length ) { + return; + } + + $connectionBlocks.each( function() { + var requiredEmpty = false, + providerName; + $( this ).find( 'table span.required' ).each( function() { + var $element = $( this ).parent().parent().find( 'select' ); + if ( $element.val() === '' ) { + requiredEmpty = true; + } + } ); + if ( requiredEmpty ) { + var $titleArea = $( this ).closest( '.wpforms-panel-content-section' ).find( '.wpforms-panel-content-section-title' ).clone(); + $titleArea.find( 'button' ).remove(); + providerName = $titleArea.text().trim(); + var msg = wpforms_builder.provider_required_flds; + + if ( -1 < providerAlerts.indexOf( providerName ) ) { + return; + } + $.alert( { + title: wpforms_builder.heads_up, + content: msg.replace( '{provider}', providerName ), + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + providerAlerts.push( providerName ); + } + } ); + } ); + }, + + /** + * Delete provider connection + * + * @since 1.0.0 + */ + connectionDelete: function( el, e ) { + e.preventDefault(); + + var $this = $( el ); + + $.confirm( { + title: false, + content: wpforms_builder_providers.confirm_connection, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: function() { + + const $section = $this.closest( '.wpforms-panel-content-section' ); + + $this.closest( '.wpforms-provider-connection' ).remove(); + + // Update sidebar icon near the provider. + const provider = $this.closest( '.wpforms-provider-connection' ).data( 'provider' ), + $sidebarItem = $( '.wpforms-panel-sidebar-section-' + provider ); + + $sidebarItem.find( '.fa-check-circle-o' ).toggleClass( 'wpforms-hidden', $( $section ).find( '.wpforms-provider-connection' ).length <= 0 ); + + if ( ! $section.find( '.wpforms-provider-connection' ).length ) { + $section.find( '.wpforms-builder-provider-connections-default' ).removeClass( 'wpforms-hidden' ); + } + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + }, + + /** + * Add new provider connection. + * + * @since 1.0.0 + */ + connectionAdd: function( el, e ) { + e.preventDefault(); + + var $this = $( el ), + $connections = $this.parent().parent(), + $container = $this.parent(), + provider = $this.data( 'provider' ), + defaultValue = WPFormsProviders.getDefaultConnectionName( provider ).trim(), + type = $this.data( 'type' ), + namePrompt = wpforms_builder_providers.prompt_connection, + nameField = '', + nameError = '

    ' + wpforms_builder_providers.error_name + '

    ', + modalContent = namePrompt + nameField + nameError; + + modalContent = modalContent.replace( /%type%/g, type ); + + $.confirm( { + title: false, + content: modalContent, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: function() { + var name = this.$content.find( 'input#provider-connection-name' ).val().trim(); + var error = this.$content.find( '.error' ); + if ( name === '' ) { + error.show(); + return false; + } else { + + // Disable button. + WPFormsProviders.inputToggle( $this, 'disable' ); + + // Fire AJAX. + var data = { + action : 'wpforms_provider_ajax_' + provider, + provider: provider, + task : 'new_connection', + name : name, + id : s.form.data( 'id' ), + nonce : wpforms_builder.nonce, + }; + WPFormsProviders.fireAJAX( $this, data, function( res ) { + if ( res.success ) { + $connections.find( '.wpforms-builder-provider-connections-default' ).addClass( 'wpforms-hidden' ); + $connections.find( '.wpforms-provider-connections' ).prepend( res.data.html ); + + // Process and load the accounts if they exist. + var $connection = $connections.find( '.wpforms-provider-connection' ).first(); + if ( $connection.find( '.wpforms-provider-accounts option:selected' ) ) { + $connection.find( '.wpforms-provider-accounts option' ).first().prop( 'selected', true ); + $connection.find( '.wpforms-provider-accounts select' ).trigger( 'change' ); + } + } else { + WPFormsProviders.errorDisplay( res.data.error, $container ); + } + } ); + } + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + }, + + /** + * Add and authorize provider account. + * + * @since 1.0.0 + */ + accountAdd: function( el, e ) { + e.preventDefault(); + + var $this = $( el ), + provider = $this.data( 'provider' ), + $connection = $this.closest( '.wpforms-provider-connection' ), + $container = $this.parent(), + $fields = $container.find( ':input' ), + errors = WPFormsProviders.requiredCheck( $fields, $container ); + + // Disable button. + WPFormsProviders.inputToggle( $this, 'disable' ); + + // Bail if we have any errors. + if ( errors ) { + $this.prop( 'disabled', false ).find( 'i' ).remove(); + return false; + } + + // Fire AJAX. + var data = { + action : 'wpforms_provider_ajax_' + provider, + provider : provider, + connection_id: $connection.data( 'connection_id' ), + task : 'new_account', + data : WPFormsProviders.fakeSerialize( $fields ), + }; + WPFormsProviders.fireAJAX( $this, data, function( res ) { + if ( res.success ) { + $container.nextAll( '.wpforms-connection-block' ).remove(); + $container.nextAll( '.wpforms-conditional-block' ).remove(); + $container.after( res.data.html ); + $container.slideUp(); + $connection.find( '.wpforms-provider-accounts select' ).trigger( 'change' ); + } else { + WPFormsProviders.errorDisplay( res.data.error, $container ); + } + } ); + }, + + /** + * Selecting a provider account + * + * @since 1.0.0 + */ + accountSelect: function( el, e ) { + e.preventDefault(); + + var $this = $( el ), + $connection = $this.closest( '.wpforms-provider-connection' ), + $container = $this.parent(), + provider = $connection.data( 'provider' ); + + // Disable select, show loading. + WPFormsProviders.inputToggle( $this, 'disable' ); + + // Remove any blocks that might exist as we prep for new account. + $container.nextAll( '.wpforms-connection-block' ).remove(); + $container.nextAll( '.wpforms-conditional-block' ).remove(); + + if ( ! $this.val() ) { + + // User selected to option to add new account. + $connection.find( '.wpforms-provider-account-add input' ).val( '' ); + $connection.find( '.wpforms-provider-account-add' ).slideDown(); + WPFormsProviders.inputToggle( $this, 'enable' ); + + } else { + + $connection.find( '.wpforms-provider-account-add' ).slideUp(); + + // Fire AJAX. + var data = { + action : 'wpforms_provider_ajax_' + provider, + provider : provider, + connection_id: $connection.data( 'connection_id' ), + task : 'select_account', + account_id : $this.find( ':selected' ).val(), + }; + WPFormsProviders.fireAJAX( $this, data, function( res ) { + if ( res.success ) { + $container.after( res.data.html ); + + // Process first list found. + $connection.find( '.wpforms-provider-lists option' ).first().prop( 'selected', true ); + $connection.find( '.wpforms-provider-lists select' ).trigger( 'change' ); + } else { + WPFormsProviders.errorDisplay( res.data.error, $container ); + } + } ); + } + }, + + /** + * Selecting a provider account list. + * + * @since 1.0.0 + */ + accountListSelect: function( el, e ) { + e.preventDefault(); + + var $this = $( el ), + $connection = $this.closest( '.wpforms-provider-connection' ), + $container = $this.parent(), + provider = $connection.data( 'provider' ); + + // Disable select, show loading. + WPFormsProviders.inputToggle( $this, 'disable' ); + + // Remove any blocks that might exist as we prep for new account. + $container.nextAll( '.wpforms-connection-block' ).remove(); + $container.nextAll( '.wpforms-conditional-block' ).remove(); + + var data = { + action : 'wpforms_provider_ajax_' + provider, + provider : provider, + connection_id: $connection.data( 'connection_id' ), + task : 'select_list', + account_id : $connection.find( '.wpforms-provider-accounts option:selected' ).val(), + list_id : $this.find( ':selected' ).val(), + form_id : s.form.data( 'id' ), + }; + + WPFormsProviders.fireAJAX( $this, data, function( res ) { + if ( res.success ) { + $container.after( res.data.html ); + + // Re-init tooltips for new fields. + wpf.initTooltips(); + } else { + WPFormsProviders.errorDisplay( res.data.error, $container ); + } + } ); + }, + + /** + * Confirm form save before loading Provider panel. + * If confirmed, save and reload panel. + * + * @since 1.0.0 + */ + providerPanelConfirm: function( targetPanel ) { + + wpforms_panel_switch = true; + if ( targetPanel === 'providers' && ! s.form.data( 'revision' ) ) { + if ( ! WPFormsBuilder.formIsSaved() ) { + wpforms_panel_switch = false; + $.confirm( { + title: false, + content: wpforms_builder_providers.confirm_save, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: function() { + $( '#wpforms-save' ).trigger( 'click' ); + $( document ).on( 'wpformsSaved', function() { + let wpforms_builder_provider_url = wpforms_builder_providers.url; + const $section = $( `#wpforms-panel-${ targetPanel } .wpforms-panel-sidebar-section.active` ); + const section = $section.length && $section.data( 'section' ) !== 'default' ? $section.data( 'section' ) : null; + + // Adding an active section parameter. + if ( section ) { + wpforms_builder_provider_url += `§ion=${ section }`; + } + + window.location.href = wpforms_builder_provider_url; + } ); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + } + } + }, + + //--------------------------------------------------------------------// + // Helper functions. + //--------------------------------------------------------------------// + + /** + * Fire AJAX call. + * + * @since 1.0.0 + */ + fireAJAX: function( el, d, success ) { + var $this = $( el ); + var data = { + id : $( '#wpforms-builder-form' ).data( 'id' ), + nonce : wpforms_builder.nonce, + }; + + $.extend( data, d ); + $.post( wpforms_builder.ajax_url, data, function( res ) { + success( res ); + WPFormsProviders.inputToggle( $this, 'enable' ); + } ).fail( function( xhr, textStatus, e ) { + console.log( xhr.responseText ); + } ); + }, + + /** + * Toggle input with loading indicator. + * + * @since 1.0.0 + */ + inputToggle: function( el, status ) { + var $this = $( el ); + if ( status === 'enable' ) { + if ( $this.is( 'select' ) ) { + $this.prop( 'disabled', false ).next( 'i' ).remove(); + } else { + $this.prop( 'disabled', false ).find( 'i' ).remove(); + } + } else if ( status === 'disable' ) { + if ( $this.is( 'select' ) ) { + $this.prop( 'disabled', true ).after( s.spinner ); + } else { + $this.prop( 'disabled', true ).prepend( s.spinnerWhite ); + } + } + }, + + /** + * Display error. + * + * @since 1.0.0 + */ + errorDisplay: function( msg, location ) { + location.find( '.wpforms-error-msg' ).remove(); + location.prepend( '

    ' + msg + '

    ' ); + }, + + /** + * Check for required fields. + * + * @since 1.0.0 + */ + requiredCheck: function( fields, location ) { + var error = false; + + // Remove any previous errors. + location.find( '.wpforms-alert-required' ).remove(); + + // Loop through input fields and check for values. + fields.each( function( index, el ) { + if ( $( el ).hasClass( 'wpforms-required' ) && $( el ).val().length === 0 ) { + $( el ).addClass( 'wpforms-error' ); + error = true; + } else { + $( el ).removeClass( 'wpforms-error' ); + } + } ); + if ( error ) { + location.prepend( '

    ' + wpforms_builder_providers.required_field + '

    ' ); + } + return error; + }, + + /** + * Pseudo serializing. Fake it until you make it. + * + * @since 1.0.0 + */ + fakeSerialize: function( els ) { + var fields = els.clone(); + + fields.each( function( index, el ) { + if ( $( el ).data( 'name' ) ) { + $( el ).attr( 'name', $( el ).data( 'name' ) ); + } + } ); + return fields.serialize(); + }, + + /** + * Get the default name for a new connection. + * + * @since 1.9.3 + * + * @param {string} provider Current provider slug. + * + * @return {string} Returns the default name for a new connection. + */ + getDefaultConnectionName( provider ) { + const providerName = $( `#${ provider }-provider` ).data( 'provider-name' ); + const numberOfConnections = WPFormsProviders.getCountConnectionsOf( provider ); + const defaultName = `${ providerName } ${ wpforms_builder.connection_label }`; + + return numberOfConnections < 1 ? defaultName : ''; + }, + + /** + * Get the number of connections for the provider. + * + * @since 1.9.3 + * + * @param {string} provider Current provider slug. + * + * @return {number} Returns the number of connections for the provider. + */ + getCountConnectionsOf( provider ) { + return $( `#${ provider }-provider .wpforms-provider-connection` ).length; + }, + + /** + * Get a provider JS object. + * + * @since 1.9.3 + * @deprecated 1.9.5 Not used anymore. + * + * @param {string} provider Provider name. + * + * @return {Object|null} Return provider object or null. + */ + getProviderClass( provider ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsProviders.getProviderClass()" has been deprecated!' ); + + const upperProviderPart = ( providerPart ) => ( + providerPart.charAt( 0 ).toUpperCase() + providerPart.slice( 1 ) + ); + + const getClassName = provider.split( '-' ).map( upperProviderPart ).join( '' ); + + if ( typeof WPForms?.Admin?.Builder?.Providers?.[ getClassName ] === 'undefined' ) { + return null; + } + return WPForms.Admin.Builder.Providers[ getClassName ]; + }, + }; + + WPFormsProviders.init(); +} )( jQuery ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.min.js new file mode 100755 index 00000000..b3e622e8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder-providers.min.js @@ -0,0 +1 @@ +(c=>{var s,a={settings:{spinner:'',spinnerWhite:''},init:function(){s=this.settings,c(a.ready),a.bindUIActions()},ready:function(){s.form=c("#wpforms-builder-form")},bindUIActions:function(){c(document).on("click",".wpforms-provider-connection-delete",function(e){a.connectionDelete(this,e)}),c(document).on("click",".wpforms-provider-connections-add",function(e){a.connectionAdd(this,e)}),c(document).on("click",".wpforms-provider-account-add button",function(e){a.accountAdd(this,e)}),c(document).on("change",".wpforms-provider-accounts select",function(e){a.accountSelect(this,e)}),c(document).on("change",".wpforms-provider-lists select",function(e){a.accountListSelect(this,e)}),c(document).on("wpformsPanelSwitch",function(e,n){["aweber","campaign-monitor","constant-contact"].some(e=>0')+('

    '+wpforms_builder_providers.error_name+"

    ")).replace(/%type%/g,e);c.confirm({title:!1,content:n,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action:function(){var e=this.$content.find("input#provider-connection-name").val().trim(),n=this.$content.find(".error");if(""===e)return n.show(),!1;a.inputToggle(o,"disable");n={action:"wpforms_provider_ajax_"+t,provider:t,task:"new_connection",name:e,id:s.form.data("id"),nonce:wpforms_builder.nonce};a.fireAJAX(o,n,function(e){var n;e.success?(r.find(".wpforms-builder-provider-connections-default").addClass("wpforms-hidden"),r.find(".wpforms-provider-connections").prepend(e.data.html),(n=r.find(".wpforms-provider-connection").first()).find(".wpforms-provider-accounts option:selected")&&(n.find(".wpforms-provider-accounts option").first().prop("selected",!0),n.find(".wpforms-provider-accounts select").trigger("change"))):a.errorDisplay(e.data.error,i)})}},cancel:{text:wpforms_builder.cancel}}})},accountAdd:function(e,n){n.preventDefault();var n=c(e),e=n.data("provider"),o=n.closest(".wpforms-provider-connection"),r=n.parent(),i=r.find(":input"),t=a.requiredCheck(i,r);if(a.inputToggle(n,"disable"),t)return n.prop("disabled",!1).find("i").remove(),!1;t={action:"wpforms_provider_ajax_"+e,provider:e,connection_id:o.data("connection_id"),task:"new_account",data:a.fakeSerialize(i)};a.fireAJAX(n,t,function(e){e.success?(r.nextAll(".wpforms-connection-block").remove(),r.nextAll(".wpforms-conditional-block").remove(),r.after(e.data.html),r.slideUp(),o.find(".wpforms-provider-accounts select").trigger("change")):a.errorDisplay(e.data.error,r)})},accountSelect:function(e,n){n.preventDefault();var n=c(e),o=n.closest(".wpforms-provider-connection"),r=n.parent(),e=o.data("provider");a.inputToggle(n,"disable"),r.nextAll(".wpforms-connection-block").remove(),r.nextAll(".wpforms-conditional-block").remove(),n.val()?(o.find(".wpforms-provider-account-add").slideUp(),e={action:"wpforms_provider_ajax_"+e,provider:e,connection_id:o.data("connection_id"),task:"select_account",account_id:n.find(":selected").val()},a.fireAJAX(n,e,function(e){e.success?(r.after(e.data.html),o.find(".wpforms-provider-lists option").first().prop("selected",!0),o.find(".wpforms-provider-lists select").trigger("change")):a.errorDisplay(e.data.error,r)})):(o.find(".wpforms-provider-account-add input").val(""),o.find(".wpforms-provider-account-add").slideDown(),a.inputToggle(n,"enable"))},accountListSelect:function(e,n){n.preventDefault();var n=c(e),e=n.closest(".wpforms-provider-connection"),o=n.parent(),r=e.data("provider"),r=(a.inputToggle(n,"disable"),o.nextAll(".wpforms-connection-block").remove(),o.nextAll(".wpforms-conditional-block").remove(),{action:"wpforms_provider_ajax_"+r,provider:r,connection_id:e.data("connection_id"),task:"select_list",account_id:e.find(".wpforms-provider-accounts option:selected").val(),list_id:n.find(":selected").val(),form_id:s.form.data("id")});a.fireAJAX(n,r,function(e){e.success?(o.after(e.data.html),wpf.initTooltips()):a.errorDisplay(e.data.error,o)})},providerPanelConfirm:function(o){wpforms_panel_switch=!0,"providers"!==o||s.form.data("revision")||WPFormsBuilder.formIsSaved()||(wpforms_panel_switch=!1,c.confirm({title:!1,content:wpforms_builder_providers.confirm_save,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action:function(){c("#wpforms-save").trigger("click"),c(document).on("wpformsSaved",function(){let e=wpforms_builder_providers.url;var n=c(`#wpforms-panel-${o} .wpforms-panel-sidebar-section.active`),n=n.length&&"default"!==n.data("section")?n.data("section"):null;n&&(e+="§ion="+n),window.location.href=e})}},cancel:{text:wpforms_builder.cancel}}}))},fireAJAX:function(e,n,o){var r=c(e),e={id:c("#wpforms-builder-form").data("id"),nonce:wpforms_builder.nonce};c.extend(e,n),c.post(wpforms_builder.ajax_url,e,function(e){o(e),a.inputToggle(r,"enable")}).fail(function(e,n,o){console.log(e.responseText)})},inputToggle:function(e,n){e=c(e);"enable"===n?(e.is("select")?e.prop("disabled",!1).next("i"):e.prop("disabled",!1).find("i")).remove():"disable"===n&&(e.is("select")?e.prop("disabled",!0).after(s.spinner):e.prop("disabled",!0).prepend(s.spinnerWhite))},errorDisplay:function(e,n){n.find(".wpforms-error-msg").remove(),n.prepend('

    '+e+"

    ")},requiredCheck:function(e,n){var o=!1;return n.find(".wpforms-alert-required").remove(),e.each(function(e,n){c(n).hasClass("wpforms-required")&&0===c(n).val().length?(c(n).addClass("wpforms-error"),o=!0):c(n).removeClass("wpforms-error")}),o&&n.prepend('

    '+wpforms_builder_providers.required_field+"

    "),o},fakeSerialize:function(e){e=e.clone();return e.each(function(e,n){c(n).data("name")&&c(n).attr("name",c(n).data("name"))}),e.serialize()},getDefaultConnectionName(e){var n=c(`#${e}-provider`).data("provider-name"),e=a.getCountConnectionsOf(e),n=n+" "+wpforms_builder.connection_label;return e<1?n:""},getCountConnectionsOf(e){return c(`#${e}-provider .wpforms-provider-connection`).length},getProviderClass(e){console.warn('WARNING! Function "WPFormsProviders.getProviderClass()" has been deprecated!');e=e.split("-").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("");return void 0===WPForms?.Admin?.Builder?.Providers?.[e]?null:WPForms.Admin.Builder.Providers[e]}};a.init()})(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.js new file mode 100755 index 00000000..cfdccb4f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.js @@ -0,0 +1,9815 @@ +/* global wpforms_builder, wpf, jconfirm, wpforms_panel_switch, Choices, WPForms */ +/* global WPFormsFormEmbedWizard, wpCookies, tinyMCE, WPFormsUtils, List, wpforms_preset_choices */ +// noinspection TypeScriptUMDGlobal + +/** + * @param window.Jconfirm.prototype._updateContentMaxHeight + * @param wpforms_builder.allow_deny_lists_intersect + * @param wpforms_builder.allow_only_email_fields + * @param wpforms_builder.allow_only_one_email + * @param wpforms_builder.are_you_sure_to_close + * @param wpforms_builder.bulk_add_button + * @param wpforms_builder.bulk_add_heading + * @param wpforms_builder.bulk_add_hide + * @param wpforms_builder.bulk_add_placeholder + * @param wpforms_builder.bulk_add_presets_show + * @param wpforms_builder.bulk_add_show + * @param wpforms_builder.choices_icons + * @param wpforms_builder.choices_images + * @param wpforms_builder.date_select_day + * @param wpforms_builder.date_select_month + * @param wpforms_builder.delete_choice_confirm + * @param wpforms_builder.duplicate_confirm + * @param wpforms_builder.duplicate_copy + * @param wpforms_builder.dynamic_choices.empty_message + * @param wpforms_builder.dynamic_choices.limit_message + * @param wpforms_builder.empty_email_address + * @param wpforms_builder.empty_label + * @param wpforms_builder.entry_preview_default_notice + * @param wpforms_builder.entry_preview_require_page_break + * @param wpforms_builder.entry_preview_require_previous_button + * @param wpforms_builder.error_choice + * @param wpforms_builder.error_contact_support + * @param wpforms_builder.error_number_slider_increment + * @param wpforms_builder.error_save_form + * @param wpforms_builder.error_save_form_forbidden + * @param wpforms_builder.exit_confirm + * @param wpforms_builder.field_locked_no_delete_msg + * @param wpforms_builder.field_locked_no_duplicate_msg + * @param wpforms_builder.file_upload.preview_hint + * @param wpforms_builder.file_upload.preview_title_plural + * @param wpforms_builder.file_upload.preview_title_plural_camera + * @param wpforms_builder.file_upload.preview_title_single + * @param wpforms_builder.file_upload.preview_title_single_camera + * @param wpforms_builder.icon_choices.choice_empty_label_tpl + * @param wpforms_builder.icon_choices.default_color + * @param wpforms_builder.icon_choices.default_icon + * @param wpforms_builder.icon_choices.default_icon_style + * @param wpforms_builder.icon_choices.delete_confirm + * @param wpforms_builder.icon_choices.field_locked + * @param wpforms_builder.icon_choices.icons_per_page + * @param wpforms_builder.icon_choices.is_active + * @param wpforms_builder.icon_choices.is_installed + * @param wpforms_builder.icon_choices.strings.icon_picker_description + * @param wpforms_builder.icon_choices.strings.icon_picker_not_found + * @param wpforms_builder.icon_choices.strings.icon_picker_search_placeholder + * @param wpforms_builder.icon_choices.strings.icon_picker_title + * @param wpforms_builder.icon_choices.strings.install_content + * @param wpforms_builder.icon_choices.strings.install_error_content + * @param wpforms_builder.icon_choices.strings.install_prompt_content + * @param wpforms_builder.icon_choices.strings.install_success_content + * @param wpforms_builder.icon_choices.strings.install_title + * @param wpforms_builder.icon_choices.strings.reinstall_prompt_content + * @param wpforms_builder.layout_selector_column + * @param wpforms_builder.layout_selector_hide + * @param wpforms_builder.layout_selector_layout + * @param wpforms_builder.layout_selector_show + * @param wpforms_builder.notification_by_status_enable_alert + * @param wpforms_builder.notification_by_status_switch_alert + * @param wpforms_builder.number_slider_error_valid_default_value + * @param wpforms_builder.payment_choice_empty_label_tpl + * @param wpforms_builder.preview_url + * @param wpforms_builder.pro + * @param wpforms_builder.redirect_url_field_error + * @param wpforms_builder.restricted_default_email + * @param wpforms_builder.restricted_rules + * @param wpforms_builder.revision_update_confirm + * @param wpforms_builder.save_exit + * @param wpforms_builder.scrollbars_css_url + * @param wpforms_builder.select_choice + * @param wpforms_builder.shortcuts_modal_msg + * @param wpforms_builder.shortcuts_modal_title + * @param wpforms_builder.smart_tags_disabled_for_confirmations + * @param wpforms_builder.smart_tags_dropdown_mce_icon + * @param wpforms_builder.smart_tags_hide + * @param wpforms_builder.smart_tags_show + * @param wpforms_builder.something_went_wrong + * @param wpforms_builder.template_modal_msg + * @param wpforms_builder.template_modal_title + * @param wpforms_builder.upload_image_button + * @param wpforms_builder.upload_image_extensions + * @param wpforms_builder.upload_image_extensions_error + * @param wpforms_builder.upload_image_remove + * @param wpforms_builder.upload_image_title + * @param wpforms_builder.wpforms_builder.bulk_add_presets_hide + */ + +/* noinspection JSUnusedLocalSymbols */ +/* eslint-disable no-unused-expressions, no-shadow */ + +// noinspection ES6ConvertVarToLetConst +var WPFormsBuilder = window.WPFormsBuilder || ( function( document, window, $ ) { // eslint-disable-line no-var + let s, + $builder; + const elements = {}, + browser = {}; + + /** + * Whether to show the close confirmation dialog or not. + * + * @since 1.6.0 + * + * @type {boolean} + */ + let closeConfirmation = true; + + /** + * A field is adding. + * + * @since 1.7.1 + * + * @type {boolean} + */ + let adding = false; + + /** + * Preview tab. + * + * @since 1.9.4 + * + * @type {Window|null} + */ + let previewTab = null; + + // noinspection JSUnusedGlobalSymbols + const app = { + /** + * @typedef {Object} JQ + * @property {(selector: string) => JQ} closest Closest function. + * @property {(prop: string) => string} css Css function. + * @property {(prop: string) => string} data Data function. + * @property {() => JQ} fadeIn FadeIn function. + * @property {(selector: string) => JQ} find Find function. + * @property {(text: string) => undefined} insertAtCaret InsertAtCaret function. + * @property {(selector: string) => JQ} next Next function. + * @property {() => JQ} slideDown SlideDown function. + * @property {() => JQ} slideToggle SlideToggle function. + * @property {() => JQ} slideUp SlideUp function. + * @property {() => JQ} stop Stop function. + */ + + /** + * @param {(selector: string) => JQ} $ The jQuery-compatible function. + */ + + /** + * @typedef {Object} jqXHR + * @property {(callback: (data: any, textStatus: string, jqXHR: jqXHR) => void) => jqXHR} done Done function. + */ + + /** + * @typedef {Object} Options + * @property {string|number} position Position. + */ + + /** + * @typedef {Object} Modal + * @property {jQuery} $title Title. + * @property {jQuery} $content Content. + */ + + /* eslint-disable camelcase */ + + settings: { + spinner: '', + spinnerInline: '', + tinymceDefaults: { + tinymce: { toolbar1: 'bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link' }, + quicktags: true, + }, + pagebreakTop: false, + pagebreakBottom: false, + upload_img_modal: false, + choicesLimit: 20, // Choices limit for fields different from Dropdown. + choicesLimitLong: 250, // Choices limit for Dropdown field. + }, + + /** + * Start the engine. + * + * @since 1.0.0 + */ + init() { + const that = this; + + wpforms_panel_switch = true; + s = this.settings; + + // Document ready. + $( app.ready ); + + // Page load. + $( window ).on( 'load', function() { + // In the case of jQuery 3.+, we need to wait for a ready event first. + if ( typeof $.ready.then === 'function' ) { + $.ready.then( app.load ); + } else { + app.load(); + } + } ); + + $( window ).on( 'beforeunload', function() { + if ( ! that.formIsSaved() && closeConfirmation ) { + return wpforms_builder.are_you_sure_to_close; + } + } ); + }, + + /** + * Page load. + * + * @since 1.0.0 + * @since 1.7.9 Added `wpformsBuilderReady` hook. + * + * @return {false|void} False if default event is prevented. + */ + load() { + // Trigger initial save for new forms. + if ( wpf.getQueryString( 'newform' ) ) { + app.formSave( false ); + } + + const panel = $( '#wpforms-panels-toggle .active' ).data( 'panel' ); + + // Render form preview on the Revisions panel if the panel is active. + if ( panel === 'revisions' ) { + app.updateRevisionPreview(); + } + + // Allow callbacks to prevent making Form Builder ready... + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsBuilderReady' ); + + // ...by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return false; + } + + // Hide the loading overlay and make the Form Builder ready to use. + app.hideLoadingOverlay(); + + app.determineActiveSections(); + + // Confirmations' initial setup. + app.confirmationsSetup(); + + WPFormsUtils.triggerEvent( $builder, 'wpformsBuilderConfirmationsReady' ); + + app.loadMsWinCSS(); + + // Maybe display informational modal. + + // noinspection JSUnresolvedReference, EqualityComparisonWithCoercionJS + if ( wpforms_builder.template_modal_display == '1' && 'fields' === wpf.getQueryString( 'view' ) ) { // eslint-disable-line + $.alert( { + title: wpforms_builder.template_modal_title, + content: wpforms_builder.template_modal_msg, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.close, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + } + + wpf._updateFormState(); + }, + + /** + * Init elements cache. + * + * @since 1.9.2 + */ + initElementsCache() { + // Cache builder element. + $builder = $( '#wpforms-builder' ); + + browser.isWindows = /Win/.test( navigator.userAgent ); + browser.isLinux = /Linux/.test( navigator.userAgent ); + browser.isMac = /Mac/.test( navigator.userAgent ); + + // Action buttons. + elements.$helpButton = $( '.js-wpforms-help' ); + elements.$previewButton = $( '#wpforms-preview-btn' ); + elements.$embedButton = $( '#wpforms-embed' ); + elements.$saveButton = $( '#wpforms-save' ); + elements.$exitButton = $( '#wpforms-exit' ); + + // Cache other elements. + elements.$noFieldsOptions = $( '#wpforms-panel-fields .wpforms-no-fields-holder .no-fields' ); + elements.$noFieldsPreview = $( '#wpforms-panel-fields .wpforms-no-fields-holder .no-fields-preview' ); + elements.$formPreview = $( '#wpforms-panel-fields .wpforms-preview-wrap' ); + elements.$revisionPreview = $( '#wpforms-panel-revisions .wpforms-panel-content' ); + elements.defaultEmailSelector = '.wpforms-field-option-email .wpforms-field-option-row-default_value input'; + elements.$defaultEmail = $( elements.defaultEmailSelector ); + elements.$focusOutTarget = null; + + elements.$nextFieldId = $( '#wpforms-field-id' ); + elements.$addFieldsTab = $( '#add-fields a' ); + elements.$fieldOptions = $( '#wpforms-field-options' ); + elements.$fieldsPreviewWrap = $( '#wpforms-panel-fields .wpforms-panel-content-wrap' ); + elements.$sortableFieldsWrap = $( '#wpforms-panel-fields .wpforms-field-wrap' ); + elements.$addFieldsButtons = $( '.wpforms-add-fields-button' ).not( '.not-draggable' ).not( '.warning-modal' ).not( '.education-modal' ); + elements.$fieldsSidebar = $( '#wpforms-panel-fields .wpforms-add-fields' ); + elements.$searchInput = $( '#wpforms-search-fields-input' ); + elements.$sidebarToggle = $( '.wpforms-panels .wpforms-panel-sidebar-content .wpforms-panel-sidebar-toggle' ); + }, + + /** + * Document ready. + * + * @since 1.0.0 + */ + ready() { // eslint-disable-line max-lines-per-function + if ( app.isVisitedViaBackButton() ) { + location.reload(); + + return; + } + + app.initElementsCache(); + + // Add `_wp_http_referer` to the data of every AJAX request. + $.ajaxSetup( { + data: { + // eslint-disable-next-line camelcase + _wp_http_referer: wpf.updateQueryString( '_wp_http_referer', null ), + }, + } ); + + // Remove Embed button if builder opened in the popup. + if ( app.isBuilderInPopup() ) { + elements.$embedButton.remove(); + elements.$previewButton.addClass( 'wpforms-alone' ); + } + + // Bind all actions. + app.bindUIActions(); + + // Setup/cache some vars not available before + s.formID = $( '#wpforms-builder-form' ).data( 'id' ); + s.pagebreakTop = $( '.wpforms-pagebreak-top' ).length; + s.pagebreakBottom = $( '.wpforms-pagebreak-bottom' ).length; + + // Disable implicit submission for every form inside the builder. + // All form values are managed by JS and should not be submitted by pressing Enter. + $builder.on( 'keypress', '#wpforms-builder-form :input:not(textarea)', function( e ) { + if ( e.keyCode === 13 ) { + e.preventDefault(); + } + } ); + + app.loadEntryPreviewFields(); + + // Drag and drop sortable elements. + app.fieldChoiceSortable( 'select' ); + app.fieldChoiceSortable( 'radio' ); + app.fieldChoiceSortable( 'checkbox' ); + app.fieldChoiceSortable( 'payment-multiple' ); + app.fieldChoiceSortable( 'payment-checkbox' ); + app.fieldChoiceSortable( 'payment-select' ); + + // Set field group visibility. + $( '.wpforms-add-fields-group' ).each( function() { + app.fieldGroupToggle( $( this ), 'load' ); + } ); + + app.registerTemplates(); + + // Trim long form titles. + app.trimFormTitle(); + + // Load Tooltips. + wpf.initTooltips(); + + // Load Color Pickers. + app.loadColorPickers(); + + // Hide/Show CAPTCHA in form. + app.captchaToggle(); + + // Notification settings. + app.notificationToggle(); + app.notificationsByStatusAlerts(); + + // Secret builder hotkeys. + app.builderHotkeys(); + + // jquery-confirm defaults. + jconfirm.defaults = { + closeIcon: false, + backgroundDismiss: false, + escapeKey: true, + animationBounce: 1, + useBootstrap: false, + theme: 'modern', + boxWidth: '400px', + animateFromElement: false, + content: wpforms_builder.something_went_wrong, + }; + + app.dropdownField.init(); + + app.iconChoices.init(); + + app.disabledFields.init(); + + app.checkEmptyDynamicChoices(); + + app.initSomeFieldOptions(); + + app.dismissNotice(); + + wpf.initializeChoicesEventHandlers(); + }, + + checkEmptyDynamicChoices() { + const choices = wpf.orders.choices || {}; + + if ( ! Object.keys( choices ).length ) { + return; + } + + wpf.orders.fields.forEach( function( fieldId ) { + const isDynamic = app.dropdownField.helpers.isDynamicChoices( fieldId ); + + if ( ! isDynamic ) { + return; + } + + const $fieldPreview = $( '#wpforms-field-' + fieldId ); + const type = app.dropdownField.helpers.getDynamicChoicesOptionType( fieldId ); + const source = app.dropdownField.helpers.getDynamicChoicesOptionSource( fieldId ); + const isModern = app.dropdownField.helpers.isDynamicChoicesOptionModern( fieldId ); + let isEmpty = isModern + ? $fieldPreview.find( '.has-no-choices' ).length + : $fieldPreview.find( '.primary-input option:not(.placeholder), .primary-input li' ).length === 0; + + if ( isModern && ! isEmpty ) { + const placeholder = $( '#wpforms-field-option-' + fieldId + '-placeholder' ).val(); + const choices = app.dropdownField.helpers.getInitialChoices( fieldId ); + isEmpty = choices.length === 1 && choices[ 0 ].label === placeholder && choices[ 0 ].placeholder === true; + } + + if ( isEmpty ) { + app.emptyChoicesNotice( fieldId, source, type ); + } + } ); + }, + + /** + * Load Microsoft Windows specific stylesheet. + * + * @since 1.6.8 + */ + loadMsWinCSS() { + // Detect OS & browsers. + if ( browser.isMac ) { + return; + } + + // language=HTML + $( '' ) + .appendTo( 'head' ) + .attr( { + type: 'text/css', + rel: 'stylesheet', + href: wpforms_builder.scrollbars_css_url, + } ); + }, + + /** + * Builder was visited via the back button in the browser. + * + * @since 1.6.5 + * + * @return {boolean} True if the builder was visited via back button in browser. + */ + isVisitedViaBackButton() { + if ( ! performance ) { + return false; + } + + let isVisitedViaBackButton = false; + + performance.getEntriesByType( 'navigation' ).forEach( function( nav ) { + if ( nav.type === 'back_forward' ) { + isVisitedViaBackButton = true; + } + } ); + + return isVisitedViaBackButton; + }, + + /** + * Remove loading overlay. + * + * @since 1.6.8 + */ + hideLoadingOverlay() { + const $overlay = $( '#wpforms-builder-overlay' ); + + $overlay.addClass( 'fade-out' ); + + setTimeout( function() { + $overlay.hide(); + }, 250 ); + }, + + /** + * Show loading overlay. + * + * @since 1.6.8 + */ + showLoadingOverlay() { + const $overlay = $( '#wpforms-builder-overlay' ); + + $overlay.removeClass( 'fade-out' ); + $overlay.show(); + }, + + /** + * Initialize some fields options controls. + * + * @since 1.6.3 + */ + initSomeFieldOptions() { + // Show a toggled options group. + app.toggleAllOptionGroups( $builder ); + + // Date/Time field Date type option. + $builder.find( '.wpforms-field-option-row-date .type select' ).trigger( 'change' ); + + // Read-Only + Required field options init. + $builder.find( '.wpforms-field-option-row-read_only input:checked' ).trigger( 'change' ); + }, + + /** + * Dropdown field component. + * + * @since 1.6.1 + */ + dropdownField: { + + /** + * Field configuration. + * + * @since 1.6.1 + */ + config: { + modernClass: 'choicesjs-select', + args: { + searchEnabled: false, + searchChoices: false, + renderChoiceLimit: 1, + shouldSort: false, + callbackOnInit() { + const $element = $( this.containerOuter.element ), + $previewSelect = $element.closest( '.wpforms-field' ).find( 'select' ); + + // Turn off disabled styles. + if ( $element.hasClass( 'is-disabled' ) ) { + $element.removeClass( 'is-disabled' ); + } + + // Disable instances on the preview panel. + if ( $previewSelect.is( '[readonly]' ) ) { + this.disable(); + $previewSelect.prop( 'disabled', false ); + } + + if ( this.passedElement.element.multiple ) { + // Hide a placeholder if the field has selected choices. + if ( this.getValue( true ).length ) { + $( this.input.element ).addClass( 'choices__input--hidden' ); + } + } + + // Decode allowed HTML entities for choices. + $element.find( '.choices__item--selectable' ).each( function() { + const $choice = $( this ); + const text = wpf.decodeAllowedHTMLEntities( $choice.text() ); + + $choice.text( text ); + } ); + }, + }, + }, + + /** + * Initialization for a field component. + * + * @since 1.6.1 + */ + init() { + // Choices.js init. + $builder.find( '.' + app.dropdownField.config.modernClass ).each( function() { + app.dropdownField.events.choicesInit( $( this ) ); + } ); + + // Multiple option. + $builder.on( + 'change', + '.wpforms-field-option-select .wpforms-field-option-row-multiple input', + app.dropdownField.events.multiple + ); + + // Style option. + $builder.on( + 'change', + '.wpforms-field-option-select .wpforms-field-option-row-style select, .wpforms-field-option-payment-select .wpforms-field-option-row-style select', + app.dropdownField.events.applyStyle + ); + + // Add the ability to close the drop-down menu. + $builder.on( 'click', '.choices', function( e ) { + const $choices = $( this ), + choicesObj = $choices.find( 'select' ).data( 'choicesjs' ); + + if ( + choicesObj && + $choices.hasClass( 'is-open' ) && + e.target.classList.contains( 'choices__inner' ) + ) { + choicesObj.hideDropdown(); + } + } ); + }, + + /** + * Field events. + * + * @since 1.6.1 + */ + events: { + + /** + * Load Choices.js library. + * + * @since 1.6.1 + * + * @param {Object} $element jQuery element selector. + */ + choicesInit( $element ) { + const useAjax = $element.data( 'choicesjs-use-ajax' ) === 1; + let instance; + + if ( $element.data( 'choicesjs-callback-fn' ) === 'select_pages' ) { + instance = WPForms.Admin.Builder.WPFormsChoicesJS.setup( + $element[ 0 ], + app.dropdownField.config.args, + { + action: 'wpforms_ajax_search_pages_for_dropdown', + nonce: useAjax ? wpforms_builder.nonce : null, + } + ); + } else { + instance = new Choices( $element[ 0 ], app.dropdownField.config.args ); + } + + app.dropdownField.helpers.setInstance( $element, instance ); + app.dropdownField.helpers.addPlaceholderChoice( $element, instance ); + + $element.closest( '.choices' ).toggleClass( 'wpforms-hidden', ! instance.config.choices.length ); + }, + + /** + * Multiple option callback. + * + * @since 1.6.1 + * + * @param {Object} event Event object. + */ + multiple( event ) { + const fieldId = $( this ).closest( '.wpforms-field-option-row-multiple' ).data().fieldId, + $primary = app.dropdownField.helpers.getPrimarySelector( fieldId ), + $optionChoicesItems = $( `#wpforms-field-option-row-${ fieldId }-choices input.default` ), + $placeholder = $primary.find( '.placeholder' ), + isDynamicChoices = app.dropdownField.helpers.isDynamicChoices( fieldId ), + isMultiple = event.target.checked, + choicesType = isMultiple ? 'checkbox' : 'radio'; + + // Add/remove a `multiple` attribute. + $primary.prop( 'multiple', isMultiple ); + + // Change a `Choices` fields type: + // checkbox - needed for multiple selection + // radio - needed for single selection + $optionChoicesItems.prop( 'type', choicesType ); + + // Dynamic Choices doesn't have default choices (selected options) - make all as unselected. + if ( isDynamicChoices ) { + $primary.find( 'option:selected' ).prop( 'selected', false ); + } + + // Gets default choices. + const selectedChoices = $optionChoicesItems.filter( ':checked' ); + + if ( ! isMultiple && selectedChoices.length ) { + // Uncheck all choices. + $optionChoicesItems.prop( 'checked', false ); + + // For a single selection, we can choose only one. + $( selectedChoices.get( 0 ) ).prop( 'checked', true ); + } + + // Toggle selection for a placeholder option based on a select type. + if ( $placeholder.length ) { + $placeholder.prop( 'selected', ! isMultiple ); + } + + // Update a primary field. + app.dropdownField.helpers.update( fieldId, isDynamicChoices ); + }, + + /** + * Apply a style to . + * + * @since 1.6.1 + * + * @param {string} fieldId Field ID. + */ + convertModernToClassic: ( fieldId ) => { + const $primary = app.dropdownField.helpers.getPrimarySelector( fieldId ), + isDynamicChoices = app.dropdownField.helpers.isDynamicChoices( fieldId ), + instance = app.dropdownField.helpers.getInstance( $primary ), + $sidebarChoices = $( '#wpforms-field-option-row-' + fieldId + '-choices' ), + $sidebarList = $sidebarChoices.find( '.choices-list' ), + elementsCount = $sidebarList.find( 'li' ).length; + + if ( instance && typeof instance.destroy === 'function' ) { + // Destroy the instance of Choices.js. + instance.destroy(); + + // Update a placeholder. + app.dropdownField.helpers.updatePlaceholderChoice( instance, fieldId ); + } + + // Update choices. + if ( ! isDynamicChoices ) { + app.fieldChoiceUpdate( 'select', fieldId, elementsCount ); + } + }, + + /** + * Get initial choices. + * + * @since 1.8.2 + * + * @param {string} fieldId Field ID. + * + * @return {Object} Choices. + */ + getInitialChoices( fieldId ) { + const $primary = app.dropdownField.helpers.getPrimarySelector( fieldId ), + instance = app.dropdownField.helpers.getInstance( $primary ); + + return instance.config.choices; + }, + + /** + * Convert a Classic to Modern style selector. + * + * @since 1.6.1 + * + * @param {string} fieldId Field ID. + */ + convertClassicToModern( fieldId ) { + const $primary = app.dropdownField.helpers.getPrimarySelector( fieldId ), + isDynamicChoices = app.dropdownField.helpers.isDynamicChoices( fieldId ); + + // Update choices. + if ( ! isDynamicChoices ) { + app.fieldChoiceUpdate( 'select', fieldId ); + } + + // Call a Choices.js initialization. + app.dropdownField.events.choicesInit( $primary ); + }, + + /** + * Update a primary field. + * + * @since 1.6.1 + * + * @param {string} fieldId Field ID. + * @param {boolean} isDynamicChoices True if `Dynamic Choices` is turned on. + */ + update( fieldId, isDynamicChoices ) { + const $primary = app.dropdownField.helpers.getPrimarySelector( fieldId ); + + if ( app.dropdownField.helpers.isModernSelect( $primary ) ) { + // If we had a `Modern` `select` before, then we need to make re-init - destroy() + init(). + app.dropdownField.helpers.convertModernToClassic( fieldId ); + + if ( ! isDynamicChoices ) { + app.dropdownField.events.choicesInit( $primary ); + } + } else if ( ! isDynamicChoices ) { + // Update choices. + app.fieldChoiceUpdate( 'select', fieldId ); + } + }, + + /** + * Add a new choice to behave like a placeholder. + * + * @since 1.6.1 + * + * @param {Object} $jquerySelector jQuery primary selector. + * @param {Object} instance The instance of Choices.js. + * + * @return {boolean} False if a fake placeholder wasn't added. + */ + addPlaceholderChoice( $jquerySelector, instance ) { // eslint-disable-line complexity + const wpFormsField = $jquerySelector.closest( '.wpforms-field' ); + if ( wpFormsField.length <= 0 ) { + return false; + } + + const fieldId = wpFormsField.data().fieldId; + let hasDefaults = app.dropdownField.helpers.hasDefaults( fieldId ); + + if ( app.dropdownField.helpers.isDynamicChoices( fieldId ) ) { + hasDefaults = false; + } + + // Already has a placeholder. + if ( false !== app.dropdownField.helpers.searchPlaceholderChoice( instance ) ) { + return false; + } + + // No choices. + if ( ! instance.config.choices.length ) { + return false; + } + + const placeholder = $( '#wpforms-field-option-' + fieldId + '-placeholder' ).val(), + sanitizedPlaceholder = wpf.decodeAllowedHTMLEntities( placeholder ), + isMultiple = $( instance.passedElement.element ).prop( 'multiple' ), + selected = ! ( isMultiple || hasDefaults ); + + // Add a new choice as a placeholder. + instance.setChoices( + [ + { value: '', label: sanitizedPlaceholder, selected, placeholder: true }, + ], + 'value', + 'label', + false + ); + + // Additional case for multiple select. + if ( isMultiple ) { + $( instance.input.element ).prop( 'placeholder', placeholder ); + } + + return true; + }, + + /** + * Search a choice-placeholder item. + * + * @since 1.6.1 + * + * @param {Object} instance The instance of Choices.js. + * + * @return {boolean|object} False if a field doesn't have a choice-placeholder. + * Otherwise - return choice item. + */ + searchPlaceholderChoice( instance ) { + let find = false; + + instance.config.choices.forEach( function( item, i ) { + if ( 'undefined' !== typeof item.placeholder && true === item.placeholder ) { + find = { + key: i, + item, + }; + + return false; + } + } ); + + return find; + }, + + /** + * Add/update a placeholder. + * + * @since 1.6.1 + * + * @param {Object} instance The instance of Choices.js. + * @param {string} fieldId Field ID. + */ + updatePlaceholderChoice( instance, fieldId ) { + const $primary = $( instance.passedElement.element ), + placeholderValue = wpf.sanitizeHTML( $( '#wpforms-field-option-' + fieldId + '-placeholder' ).val() ), + placeholderChoice = app.dropdownField.helpers.searchPlaceholderChoice( instance ); + let $placeholderOption = {}; + + // Get an option with placeholder. + // Note: `.placeholder` class is skipped when calling Choices.js destroy() method. + if ( 'object' === typeof placeholderChoice ) { + $placeholderOption = $( $primary.find( 'option' ).get( placeholderChoice.key ) ); + } + + // We have a placeholder and need to update the UI with it. + if ( '' !== placeholderValue ) { + if ( ! $.isEmptyObject( $placeholderOption ) && $placeholderOption.length ) { + // Update a placeholder option. + $placeholderOption + .addClass( 'placeholder' ) + .text( placeholderValue ); + } else { + // Add a placeholder option. + $primary.prepend( '' ); + } + } else if ( $placeholderOption.length ) { + // Remove the placeholder as it's empty. + $placeholderOption.remove(); + } + }, + + /** + * Is it a `Modern` style dropdown field? + * + * @since 1.6.1 + * + * @param {Object} $jquerySelector jQuery primary selector. + * + * @return {boolean} True if it's a `Modern` style select, false otherwise. + */ + isModernSelect( $jquerySelector ) { + const instance = app.dropdownField.helpers.getInstance( $jquerySelector ); + + if ( 'object' !== typeof instance ) { + return false; + } + + if ( $.isEmptyObject( instance ) ) { + return false; + } + + return instance.initialised; + }, + + /** + * Save an instance of Choices.js. + * + * @since 1.6.1 + * + * @param {Object} $jquerySelector jQuery primary selector. + * @param {Object} instance The instance of Choices.js. + */ + setInstance( $jquerySelector, instance ) { + $jquerySelector.data( 'choicesjs', instance ); + }, + + /** + * Retrieve an instance of Choices.js. + * + * @since 1.6.1 + * + * @param {Object} $jquerySelector jQuery primary selector. + * + * @return {Object} The instance of Choices.js. + */ + getInstance( $jquerySelector ) { + return $jquerySelector.data( 'choicesjs' ); + }, + + /** + * Get the Dynamic Choices option field. + * + * @since 1.8.2 + * + * @param {string|number} fieldId Field ID. + * + * @return {HTMLElement|boolean} False if a field doesn't have a `Dynamic Choices` option. + * Otherwise - return option field. + */ + getDynamicChoicesOption( fieldId ) { + const $fieldOption = $( '#wpforms-field-option-' + fieldId + '-dynamic_choices' ); + + if ( ! $fieldOption.length ) { + return false; + } + + return $fieldOption; + }, + + /** + * Is `Dynamic Choices` used? + * + * @since 1.6.1 + * + * @param {string|number} fieldId Field ID. + * + * @return {boolean} True if a `Dynamic Choices` are active, false otherwise. + */ + isDynamicChoices( fieldId ) { + const $fieldOption = app.dropdownField.helpers.getDynamicChoicesOption( fieldId ); + + if ( ! $fieldOption.length ) { + return false; + } + + return '' !== $fieldOption.val(); + }, + + /** + * Whether the `Dynamic Choices` option type is `Modern`? + * + * @since 1.8.2 + * + * @param {string|number} fieldId Field ID. + * @return {boolean} True if a `Dynamic Choices` option type is `Modern`, false otherwise. + */ + isDynamicChoicesOptionModern( fieldId ) { + const $fieldOption = $( '#wpforms-field-option-' + fieldId + '-style' ); + + if ( ! $fieldOption.length ) { + return false; + } + + return $fieldOption.val() === 'modern'; + }, + + /** + * Get a Dynamic Choices option type. + * + * @since 1.8.2 + * + * @param {string|number} fieldId Field ID. + * + * @return {string|boolean} False if a field doesn't have a `Dynamic Choices` option. + * Otherwise - return an option type. + */ + getDynamicChoicesOptionType( fieldId ) { + const $fieldOption = app.dropdownField.helpers.getDynamicChoicesOption( fieldId ); + + if ( ! $fieldOption.length ) { + return false; + } + + return $fieldOption.val(); + }, + + /** + * Get a Dynamic Choices option source. + * + * @since 1.8.2 + * + * @param {string|number} fieldId Field ID. + * + * @return {string|boolean} False if a field doesn't have a `Dynamic Choices` option. + * Otherwise - return an option source. + */ + getDynamicChoicesOptionSource( fieldId ) { + const type = app.dropdownField.helpers.getDynamicChoicesOptionType( fieldId ); + const $fieldOption = $( '#wpforms-field-option-' + fieldId + '-dynamic_' + type ); + + if ( ! $fieldOption.length ) { + return false; + } + + return $fieldOption.find( 'option:selected' ).text(); + }, + + /** + * Is a field having default choices? + * + * @since 1.6.1 + * + * @param {string} fieldId Field ID. + * + * @return {boolean} True if a field has default choices. + */ + hasDefaults( fieldId ) { + const $choicesList = $( `#wpforms-field-option-row-${ fieldId }-choices .choices-list` ); + + return !! $choicesList.find( 'input.default:checked' ).length; + }, + + /** + * Retrieve a jQuery selector for the Primary field. + * + * @since 1.6.1 + * + * @param {string} fieldId Field ID. + * + * @return {Object} jQuery primary selector. + */ + getPrimarySelector( fieldId ) { + return $( '#wpforms-field-' + fieldId + ' .primary-input' ); + }, + }, + }, + + /** + * Add number slider events listeners. + * + * @since 1.5.7 + * + * @param {Object} $builder JQuery object. + */ + numberSliderEvents( $builder ) { + // Minimum update. + $builder.on( + 'focusout', + '.wpforms-field-option-row-min_max .wpforms-input-row .wpforms-number-slider-min', + app.fieldNumberSliderUpdateMin + ); + + // Maximum update. + $builder.on( + 'focusout', + '.wpforms-field-option-row-min_max .wpforms-input-row .wpforms-number-slider-max', + app.fieldNumberSliderUpdateMax + ); + + // Change default input value. + $builder.on( + 'input', + '.wpforms-number-slider-default-value', + _.debounce( app.changeNumberSliderDefaultValue, 500 ) + ); + + // Change the default input value if it's empty. + $builder.on( + 'focusout', + '.wpforms-number-slider-default-value', + app.changeNumberSliderEmptyDefaultValue + ); + + // Trigger the input event on default value input to check if it's valid. + $builder.find( '.wpforms-number-slider-default-value' ).trigger( 'input' ); + + // Change step value. + $builder.on( + 'input', + '.wpforms-number-slider-step', + _.debounce( app.changeNumberSliderStep, 500 ) + ); + + // Check step value. + $builder.on( + 'focusout', + '.wpforms-number-slider-step', + app.checkNumberSliderStep + ); + + // Change value display. + $builder.on( + 'input', + '.wpforms-number-slider-value-display', + _.debounce( app.changeNumberSliderValueDisplay, 500 ) + ); + + // Change min value. + $builder.on( + 'input', + '.wpforms-number-slider-min', + _.debounce( app.changeNumberSliderMin, 500 ) + ); + + // Change max value. + $builder.on( + 'input', + '.wpforms-number-slider-max', + _.debounce( app.changeNumberSliderMax, 500 ) + ); + }, + + /** + * Change number slider min option. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + changeNumberSliderMin( event ) { + const value = parseFloat( event.target.value ); + + if ( isNaN( value ) ) { + return; + } + + const fieldID = $( event.target ).parents( '.wpforms-field-option-row' ).data( 'fieldId' ); + + app.updateNumberSliderDefaultValueAttr( fieldID, event.target.value, 'min' ); + }, + + /** + * Change number slider max option. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + changeNumberSliderMax( event ) { + const value = parseFloat( event.target.value ); + + if ( isNaN( value ) ) { + return; + } + + const fieldID = $( event.target ).parents( '.wpforms-field-option-row' ).data( 'fieldId' ); + + app.updateNumberSliderDefaultValueAttr( fieldID, event.target.value, 'max' ) + .updateNumberSliderStepValueMaxAttr( fieldID, event.target.value ); + }, + + /** + * Change number slider value display option. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + changeNumberSliderValueDisplay( event ) { + const str = event.target.value; + const fieldID = $( event.target ).parents( '.wpforms-field-option-row' ).data( 'fieldId' ); + const defaultValue = document.getElementById( 'wpforms-field-option-' + fieldID + '-default_value' ); + + if ( defaultValue ) { + app.updateNumberSliderHintStr( fieldID, str ) + .updateNumberSliderHint( fieldID, defaultValue.value ); + } + }, + + /** + * Change the number slider step option. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + changeNumberSliderStep( event ) { + const $el = $( this ); + const value = parseFloat( $el.val() ); + + if ( isNaN( value ) ) { + return; + } + + if ( value <= 0 ) { + return; + } + + const $options = $( $el ).closest( '.wpforms-field-option' ); + const max = parseFloat( $options.find( '.wpforms-number-slider-max' ).val() ); + const min = parseFloat( $options.find( '.wpforms-number-slider-min' ).val() ); + const maxStep = ( max - min ).toFixed( 2 ); + + if ( value > maxStep ) { + event.target.value = maxStep; + $el.trigger( 'input' ); + + return; + } + + const fieldID = $( event.target ).parents( '.wpforms-field-option-row' ).data( 'fieldId' ); + const defaultValue = $( '#wpforms-field-option-' + fieldID + '-default_value' ).val(); + + app.checkMultiplicitySliderDefaultValue( fieldID, defaultValue, value, min, max ) + .updateNumberSliderAttr( fieldID, value, 'step' ) + .updateNumberSliderDefaultValueAttr( fieldID, value, 'step' ); + }, + + /** + * Check multiplicity of a slider default value. + * + * @since 1.8.4 + * + * @param {string} fieldId Field ID. + * @param {number} value Default value. + * @param {number} step Step value. + * @param {number} min Min value. + * @param {number} max Max value. + * + * @return {Object} App instance. + */ + checkMultiplicitySliderDefaultValue( fieldId, value, step, min = 0, max = 0 ) { + const $printSelector = $( `#wpforms-field-option-row-${ fieldId }-default_value` ); + value = parseFloat( value ); + + if ( ( value - min ) % step === 0 ) { + app.removeNotice( $printSelector ); + + return this; + } + + const { + closestSmallerMultiple, + closestLargerMultiple, + } = this.calculateClosestMultiples( value, step, min, max ); + + const formatNumber = ( num ) => ( num % 1 === 0 ? num.toString() : num.toFixed( 2 ) ); + + const normalizedValue = formatNumber( value ); + const normalizedSmaller = formatNumber( closestSmallerMultiple ); + const normalizedLarger = formatNumber( closestLargerMultiple ); + + if ( normalizedSmaller === normalizedLarger || + normalizedSmaller === normalizedValue || + normalizedLarger === normalizedValue + ) { + app.removeNotice( $printSelector ); + return this; + } + + const updatedMessage = wpforms_builder.number_slider_error_valid_default_value + .replace( '{from}', normalizedSmaller ) + .replace( '{to}', normalizedLarger ); + + app.printNotice( updatedMessage, $printSelector ); + + return this; + }, + + /** + * Calculate the closest multiples for a value. + * + * @since 1.9.5 + * + * @param {number} value Default value. + * @param {number} step Step value. + * @param {number} min Min value. + * @param {number} max Max value. + * + * @return {Object} Closest smaller and larger multiples. + */ + // eslint-disable-next-line complexity + calculateClosestMultiples( value, step, min, max ) { + // Calculate the closest smaller value. + let closestSmallerMultiple = min + ( Math.floor( ( value - min ) / step ) * step ); + + // Calculate the closest larger value. + let closestLargerMultiple = min + ( Math.ceil( ( value - min ) / step ) * step ); + + // Handle edge cases where the value is exactly on a step. + if ( value === closestSmallerMultiple && value !== min ) { + closestLargerMultiple = closestSmallerMultiple + step; + } + + if ( value === closestLargerMultiple && value !== max ) { + closestSmallerMultiple = closestLargerMultiple - step; + } + + // Handle edge cases when the value is min or max + if ( value === min ) { + closestLargerMultiple = min + step; + } + if ( value === max ) { + closestSmallerMultiple = max - step; + } + + // Ensure the closest values stay within the min and max bounds. + closestSmallerMultiple = Math.max( closestSmallerMultiple, min ); + closestLargerMultiple = Math.min( closestLargerMultiple, max ); + + return { closestSmallerMultiple, closestLargerMultiple }; + }, + + /** + * Print a notice. + * + * @since 1.8.4 + * + * @param {string} message Message to print. + * @param {Object} $printSelector jQuery element selector. + * @param {boolean} wide Wide notice flag, optional, default is false. + */ + printNotice( message, $printSelector, wide = false ) { + if ( $printSelector.length ) { + this.removeNotice( $printSelector ); + + const wideClass = wide ? 'wpforms-alert-warning-wide' : ''; + + $printSelector.append( `

    ${ message }

    ` ); + } + }, + + /** + * Remove a notice. + * + * @since 1.8.4 + * + * @param {Object} $printSelector jQuery element selector. + */ + removeNotice( $printSelector ) { + if ( $printSelector.length && $printSelector.find( '.wpforms-alert' ).length ) { + $printSelector.find( '.wpforms-alert' ).remove(); + } + }, + + /** + * Check the number slider step option. + * + * @since 1.6.2.3 + * + * @param {Object} event Focusout event object. + */ + checkNumberSliderStep( event ) { + const value = parseFloat( event.target.value ); + + if ( ! isNaN( value ) && value > 0 ) { + return; + } + + const $input = $( this ); + + $.confirm( { + title: wpforms_builder.heads_up, + content: wpforms_builder.error_number_slider_increment, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + $input.val( '' ).trigger( 'focus' ); + }, + }, + }, + } ); + }, + + /** + * Update number slider default value if it's empty. + * + * @since 1.9.3 + * + * @param {Object} event Input event. + */ + changeNumberSliderEmptyDefaultValue( event ) { + const value = parseFloat( event.target.value ); + + if ( isNaN( value ) ) { + const newValue = parseFloat( event.target.min ); + event.target.value = newValue; + + const step = parseFloat( event.target.step ); + const min = parseFloat( event.target.min ); + const max = parseFloat( event.target.max ); + const fieldID = $( event.target ).parents( '.wpforms-field-option-row-default_value' ).data( 'fieldId' ); + + app.checkMultiplicitySliderDefaultValue( fieldID, newValue, step, min, max ) + .updateNumberSlider( fieldID, newValue ) + .updateNumberSliderHint( fieldID, newValue ); + } + }, + + /** + * Change number slider default value option. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + changeNumberSliderDefaultValue( event ) { + const value = parseFloat( event.target.value ); + + if ( ! isNaN( value ) ) { + const max = parseFloat( event.target.max ); + + if ( value > max ) { + event.target.value = max; + + return; + } + + const min = parseFloat( event.target.min ); + + if ( value < min ) { + event.target.value = min; + + return; + } + + const step = parseFloat( event.target.step ); + const fieldID = $( event.target ).parents( '.wpforms-field-option-row-default_value' ).data( 'fieldId' ); + + app.checkMultiplicitySliderDefaultValue( fieldID, value, step, min, max ) + .updateNumberSlider( fieldID, value ) + .updateNumberSliderHint( fieldID, value ); + } + }, + + /** + * Update number slider default value attribute. + * + * @since 1.5.7 + * + * @param {number} fieldID Field ID. + * @param {*} newValue Default value attribute. + * @param {*} attr Attribute name. + * + * @return {Object} App instance. + */ + updateNumberSliderDefaultValueAttr( fieldID, newValue, attr ) { + const input = document.getElementById( 'wpforms-field-option-' + fieldID + '-default_value' ); + + if ( input ) { + const value = parseFloat( input.value ); + + input.setAttribute( attr, newValue ); + newValue = parseFloat( newValue ); + + if ( 'max' === attr && value > newValue ) { + input.value = newValue; + } + + if ( 'min' === attr && value < newValue ) { + input.value = newValue; + } + } + + return this; + }, + + /** + * Update number slider value. + * + * @since 1.5.7 + * + * @param {number} fieldID Field ID. + * @param {string} value Number slider value. + * + * @return {Object} App instance. + */ + updateNumberSlider( fieldID, value ) { + const numberSlider = document.getElementById( 'wpforms-number-slider-' + fieldID ); + + if ( numberSlider ) { + numberSlider.value = value; + } + + return this; + }, + + /** + * Update number slider attribute. + * + * @since 1.5.7 + * + * @param {number} fieldID Field ID. + * @param {any} value Attribute value. + * @param {*} attr Attribute name. + * + * @return {Object} App instance. + */ + updateNumberSliderAttr( fieldID, value, attr ) { + const numberSlider = document.getElementById( 'wpforms-number-slider-' + fieldID ); + + if ( numberSlider ) { + numberSlider.setAttribute( attr, value ); + } + + return this; + }, + + /** + * Update number slider hint string. + * + * @since 1.5.7 + * + * @param {number} fieldID Field ID. + * @param {string} str Hint string. + * + * @return {Object} App instance. + */ + updateNumberSliderHintStr( fieldID, str ) { + const hint = document.getElementById( 'wpforms-number-slider-hint-' + fieldID ); + + if ( hint ) { + hint.dataset.hint = str; + } + + return this; + }, + + /** + * Update number slider Hint value. + * + * @since 1.5.7 + * + * @param {number} fieldID Field ID. + * @param {string} value Hint value. + * + * @return {Object} App instance. + */ + updateNumberSliderHint( fieldID, value ) { + const hint = document.getElementById( 'wpforms-number-slider-hint-' + fieldID ); + + if ( hint ) { + hint.innerHTML = wpf.sanitizeHTML( hint.dataset.hint ).replaceAll( '{value}', '' + value + '' ); + } + + return this; + }, + + /** + * Update min attribute. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + fieldNumberSliderUpdateMin( event ) { + const current = parseFloat( event.target.value ); + + if ( isNaN( current ) ) { + return; + } + + const $options = $( event.target ).parents( '.wpforms-field-option-row-min_max' ); + const max = parseFloat( $options.find( '.wpforms-number-slider-max' ).val() ); + + if ( max <= current ) { + event.preventDefault(); + this.value = max; + + return; + } + + const fieldId = $options.data( 'field-id' ); + const numberSlider = $builder.find( '#wpforms-field-' + fieldId + ' input[type="range"]' ); + + numberSlider.attr( 'min', current ); + }, + + /** + * Update max attribute. + * + * @since 1.5.7 + * + * @param {Object} event Input event. + */ + fieldNumberSliderUpdateMax( event ) { + const current = parseFloat( event.target.value ); + + if ( isNaN( current ) ) { + return; + } + + const $options = $( event.target ).parents( '.wpforms-field-option-row-min_max' ); + const min = parseFloat( $options.find( '.wpforms-number-slider-min' ).val() ); + + if ( min >= current ) { + event.preventDefault(); + this.value = min; + + return; + } + + const fieldId = $options.data( 'field-id' ); + const numberSlider = $builder.find( '#wpforms-field-' + fieldId + ' input[type="range"]' ); + + numberSlider.attr( 'max', current ); + }, + + /** + * Update max attribute for step value. + * + * @since 1.5.7 + * + * @param {number} fieldID Field ID. + * @param {*} newValue Default value attribute. + * + * @return {Object} App instance. + */ + updateNumberSliderStepValueMaxAttr( fieldID, newValue ) { + const input = document.getElementById( 'wpforms-field-option-' + fieldID + '-step' ); + + if ( input ) { + const value = parseFloat( input.value ); + + input.setAttribute( 'max', newValue ); + newValue = parseFloat( newValue ); + + if ( value > newValue ) { + input.value = newValue; + $( input ).trigger( 'input' ); + } + } + + return this; + }, + + /** + * Update upload selector. + * + * @since 1.5.6 + * + * @param {Object} target Changed :input. + */ + fieldFileUploadPreviewUpdate( target ) { + /** + * @type {jQuery} + */ + const $options = $( target ).parents( '.wpforms-field-option-file-upload' ); + const fieldId = $options.data( 'field-id' ); + + const styleOption = $options.find( '#wpforms-field-option-' + fieldId + '-style' ).val(); + const $maxFileNumberRow = $options.find( '#wpforms-field-option-row-' + fieldId + '-max_file_number' ); + const maxFileNumber = parseInt( $maxFileNumberRow.find( 'input' ).val(), 10 ); + const isCameraEnabled = $options.find( '#wpforms-field-option-' + fieldId + '-camera_enabled' ).is( ':checked' ); + + const $preview = $( '#wpforms-field-' + fieldId ); + const classicPreview = '.wpforms-file-upload-builder-classic'; + const modernPreview = '.wpforms-file-upload-builder-modern'; + + if ( styleOption === 'classic' ) { + $( classicPreview, $preview ).removeClass( 'wpforms-hide' ); + $( modernPreview, $preview ).addClass( 'wpforms-hide' ); + $maxFileNumberRow.addClass( 'wpforms-hidden' ); + $( $preview ).find( '.wpforms-file-upload-capture-camera-classic' ).toggleClass( 'wpforms-hidden', ! isCameraEnabled ); + } else { + // Change hint and title. + if ( maxFileNumber > 1 ) { + const titleText = isCameraEnabled + ? wpforms_builder.file_upload.preview_title_plural_camera + : wpforms_builder.file_upload.preview_title_plural; + $preview + .find( '.modern-title' ) + .html( titleText ); + $preview + .find( '.modern-hint' ) + .text( wpforms_builder.file_upload.preview_hint.replace( '{maxFileNumber}', maxFileNumber ) ) + .removeClass( 'wpforms-hide' ); + } else { + const titleText = isCameraEnabled + ? wpforms_builder.file_upload.preview_title_single_camera + : wpforms_builder.file_upload.preview_title_single; + $preview + .find( '.modern-title' ) + .html( titleText ); + $preview + .find( '.modern-hint' ) + .text( wpforms_builder.file_upload.preview_hint.replace( '{maxFileNumber}', 1 ) ) + .addClass( 'wpforms-hide' ); + } + + // Display the preview. + $( classicPreview, $preview ).addClass( 'wpforms-hide' ); + $( modernPreview, $preview ).removeClass( 'wpforms-hide' ); + $maxFileNumberRow.removeClass( 'wpforms-hidden' ); + } + }, + + /** + * Update limit controls by changing the checkbox. + * + * @since 1.5.6 + * + * @param {number} id Field id. + * @param {boolean} checked Whether an option is checked or not. + */ + updateTextFieldsLimitControls( id, checked ) { + if ( ! checked ) { + $( '#wpforms-field-option-row-' + id + '-limit_controls' ).addClass( 'wpforms-hide' ); + } else { + $( '#wpforms-field-option-row-' + id + '-limit_controls' ).removeClass( 'wpforms-hide' ); + } + }, + + /** + * Update disabling today's date controls by changing the checkbox. + * + * @since 1.8.9.4 + * + * @param {number} id Field id. + * @param {boolean} checked Whether an option is checked or not. + */ + updateDisableTodaysDateControls( id, checked ) { + $( `#wpforms-field-option-row-${ id }-date_disable_todays_date` ) + .toggleClass( 'wpforms-hide', ! checked ); + }, + + /** + * Toggles the visibility of the password eye icon. + * + * @since 1.9.8 + */ + togglePasswordEyeIcon() { + const $this = $( this ); + const fieldId = $this.closest( '.wpforms-field-option-row-password-visibility' ).data( 'field-id' ); + const $fieldPreview = $( `#wpforms-field-${ fieldId }` ); + + $fieldPreview.find( '.wpforms-confirm' ).toggleClass( 'wpforms-field-password-visibility-enabled', $this.is( ':checked' ) ); + }, + + /** + * Update Password Strength controls by changing the checkbox. + * + * @since 1.6.7 + * + * @param {number} id Field id. + * @param {boolean} checked Whether an option is checked or not. + */ + updatePasswordStrengthControls( id, checked ) { + const $strengthControls = $( '#wpforms-field-option-row-' + id + '-password-strength-level' ); + + if ( checked ) { + $strengthControls.removeClass( 'wpforms-hidden' ); + } else { + $strengthControls.addClass( 'wpforms-hidden' ); + } + }, + + /** + * Update Rich Text media controls by changing the checkbox. + * + * @since 1.7.0 + */ + updateRichTextMediaFieldsLimitControls() { + const $this = $( this ), + fieldId = $this.closest( '.wpforms-field-option-row-media_enabled' ).data( 'field-id' ), + $mediaControls = $( '#wpforms-field-option-row-' + fieldId + '-media_controls' ), + $toolbar = $( '#wpforms-field-' + fieldId + ' .wpforms-richtext-wrap .mce-toolbar-grp' ); + + if ( ! $this.is( ':checked' ) ) { + $mediaControls.hide(); + $toolbar.removeClass( 'wpforms-field-richtext-media-enabled' ); + } else { + $mediaControls.show(); + $toolbar.addClass( 'wpforms-field-richtext-media-enabled' ); + } + }, + + /** + * Update the Rich Text style preview by changing select. + * + * @since 1.7.0 + */ + updateRichTextStylePreview() { + const $this = $( this ), + fieldId = $this.closest( '.wpforms-field-option-row-style' ).data( 'field-id' ), + $toolbar = $( '#wpforms-field-' + fieldId + ' .wpforms-richtext-wrap .mce-toolbar-grp' ); + + $toolbar.toggleClass( 'wpforms-field-richtext-toolbar-basic', $this.val() !== 'full' ); + }, + + /** + * Element bindings. + * + * @since 1.0.0 + */ + bindUIActions() { + // General Panels. + app.bindUIActionsPanels(); + + // Fields Panel. + app.bindUIActionsFields(); + + // Settings Panel. + app.bindUIActionsSettings(); + + // Revisions Panel. + app.bindUIActionsRevisions(); + + // Save and Exit. + app.bindUIActionsSaveExit(); + + // General/ global. + app.bindUIActionsGeneral(); + + // Preview actions. + app.bindUIActionsPreview(); + }, + + /** + * Bind UI actions for the preview tab. + * + * @since 1.9.4 + */ + bindUIActionsPreview() { + // Open the preview tab or focus on it if it's already opened. + elements.$previewButton.on( 'click', function( e ) { + e.preventDefault(); + + const previewUrl = $( this ).attr( 'href' ); + + // Try to check if the preview tab is still open and from the same origin + let isSameOrigin = false; + if ( previewTab && ! previewTab.closed ) { + try { + // This will throw an error if cross-origin + isSameOrigin = previewTab.location.href.includes( 'wpforms_form_preview' ); + } catch ( error ) { + // Cross-origin access error, we can't access the location + isSameOrigin = false; + } + } + + if ( isSameOrigin ) { + previewTab.focus(); + } else { + previewTab = window.open( previewUrl, '_blank' ); + } + } ); + + // Reload the preview tab after saving the form. + $builder.on( 'wpformsSaved', function() { + if ( previewTab && ! previewTab.closed ) { + try { + // This will throw an error if cross-origin + if ( previewTab.location.href.includes( 'wpforms_form_preview' ) ) { + previewTab.location.reload(); + } + } catch ( error ) { + // Silently handle cross-origin errors + // We can't access or reload cross-origin tabs + } + } + } ); + }, + + //--------------------------------------------------------------------// + // General Panels + //--------------------------------------------------------------------// + + /** + * Element bindings for general panel tasks. + * + * @since 1.0.0 + */ + bindUIActionsPanels() { + // Panel switching. + $builder.on( 'click', '#wpforms-panels-toggle button, .wpforms-panel-switch', function( e ) { + e.preventDefault(); + app.panelSwitch( $( this ).data( 'panel' ) ); + } ); + + // Panel sections switching. + $builder.on( 'click', '.wpforms-panel .wpforms-panel-sidebar-section', function( e ) { + app.panelSectionSwitch( this, e ); + } ); + + // Panel tab switching. + $builder.on( 'click', '.wpforms-panel .wpforms-panel-content .wpforms-panel-content-section-tabs-list-item', function( e ) { + app.panelSectionTabSwitch( this, e ); + } ); + + // Panel sidebar toggle. + $builder.on( 'click', '.wpforms-panels .wpforms-panel-sidebar-content .wpforms-panel-sidebar-toggle', function() { + $( this ).parent().toggleClass( 'wpforms-panel-sidebar-closed' ); + } ); + }, + + /** + * Switch Panels. + * + * @since 1.0.0 + * @since 1.5.9 Added `wpformsPanelSwitched` trigger. + * + * @param {string} panel Panel slug. + * + * @return {void|boolean} Void or false. + */ + panelSwitch( panel ) { + const $panel = $( '#wpforms-panel-' + panel ); + + if ( ! $panel.hasClass( 'active' ) ) { + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsPanelSwitch', [ panel ] ); + + // Allow callbacks on `wpformsPanelSwitch` to cancel panel switching by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() || ! wpforms_panel_switch ) { + return false; + } + + $( '#wpforms-panels-toggle' ).find( 'button' ).removeClass( 'active' ); + $( '.wpforms-panel' ).removeClass( 'active' ); + $( '.wpforms-panel-' + panel + '-button' ).addClass( 'active' ); + $panel.addClass( 'active' ); + + history.replaceState( {}, null, wpf.updateQueryString( 'view', panel ) ); + + // Update the active section parameter in the URL. + let section; + const activeSectionElement = $panel.find( '.active' ); + + if ( activeSectionElement.length && activeSectionElement.data( 'section' ) !== 'default' ) { + section = activeSectionElement.data( 'section' ); + } + + history.replaceState( {}, null, wpf.updateQueryString( 'section', section ) ); + + $builder.trigger( 'wpformsPanelSwitched', [ panel ] ); + } + }, + + /** + * Switch Panel section. + * + * @since 1.0.0 + * + * @param {Element} el Element. + * @param {Event} e Event. + * + * @return {boolean|void} False when not switched. + */ + panelSectionSwitch( el, e ) { // eslint-disable-line complexity + if ( e ) { + e.preventDefault(); + } + + const $this = $( el ); + + if ( $this.hasClass( 'upgrade-modal' ) || $this.hasClass( 'education-modal' ) ) { + return; + } + + const $panel = $this.parent().parent(), + section = $this.data( 'section' ), + $sectionButton = $panel.find( `.wpforms-panel-sidebar-section[data-section="${ section }"]` ); + + if ( ! $sectionButton.hasClass( 'active' ) ) { + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsPanelSectionSwitch', section ); + + // Allow callbacks on `wpformsPanelSectionSwitch` to cancel panel section switching by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() || ! wpforms_panel_switch ) { + return false; + } + + const $sectionButtons = $panel.find( '.wpforms-panel-sidebar-section' ); + + $sectionButtons.removeClass( 'active' ); + $sectionButton.addClass( 'active' ); + $panel.find( '.wpforms-panel-content-section' ).hide().removeClass( 'active' ); + $panel.find( '.wpforms-panel-content-section-' + section ).show().addClass( 'active' ); + + // Update the active section parameter in the URL. + history.replaceState( {}, null, wpf.updateQueryString( 'section', section ) ); + } + }, + + /** + * Switches panel sections. + * + * @since 1.9.8.6 + * + * @param {Element} el Element. + * @param {Event} e Event. + * + * @return {void} + */ + panelSectionTabSwitch( el, e ) { + e.preventDefault(); + + const $tabToggle = $( el ), + disabledClass = 'wpforms-disabled', + activeToggleClass = 'wpforms-panel-content-section-tabs-list-item-active', + activeTab = $tabToggle.data( 'tab' ); + + if ( ! activeTab || $tabToggle.hasClass( disabledClass ) || $tabToggle.hasClass( activeToggleClass ) ) { + return; + } + + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsPanelSectionTabBeforeSwitch', [ activeTab, $tabToggle ] ); + + if ( event.isDefaultPrevented() ) { + return; + } + + const activeContentClass = 'wpforms-panel-content-section-tabs-content-tab-active', + $tabs = $tabToggle.closest( '.wpforms-panel-content-section-tabs-list' ), + $tabContent = $tabs.closest( '.wpforms-panel-content' ).find( '.wpforms-panel-content-section-tabs-content-tab' ); + + $tabs.find( '.wpforms-panel-content-section-tabs-list-item' ).removeClass( activeToggleClass ); + $tabToggle.addClass( activeToggleClass ); + + $tabContent.removeClass( activeContentClass ); + $tabContent.filter( `[data-tab="${ activeTab }"]` ).addClass( activeContentClass ); + + WPFormsUtils.triggerEvent( $builder, 'wpformsPanelSectionTabSwitch', [ activeTab, $tabToggle ] ); + }, + + //--------------------------------------------------------------------// + // Setup Panel + //--------------------------------------------------------------------// + + /** + * Element bindings for a Setup panel. + * + * @since 1.0.0 + * @since 1.6.8 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.Setup.events()` instead. + */ + bindUIActionsSetup() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.bindUIActionsSetup()" has been deprecated, please use the new "WPForms.Admin.Builder.Setup.events()" function instead!' ); + + WPForms.Admin.Builder.Setup.events(); + }, + + /** + * Select template. + * + * @since 1.0.0 + * @since 1.6.8 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.Setup.selectTemplate()` instead. + * + * @param {Object} el DOM element object. + * @param {Object} e Event object. + */ + templateSelect( el, e ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.templateSelect()" has been deprecated, please use the new "WPForms.Admin.Builder.Setup.selectTemplate()" function instead!' ); + + WPForms.Admin.Builder.Setup.selectTemplate( e ); + }, + + //--------------------------------------------------------------------// + // Fields Panel + //--------------------------------------------------------------------// + + /** + * Element bindings for Fields panel. + * + * @since 1.0.0 + */ + bindUIActionsFields() { // eslint-disable-line max-lines-per-function + // Switched to the Fields panel. + $builder.on( 'wpformsPanelSwitched', function( e, panel ) { + if ( panel !== 'fields' ) { + return; + } + + // Detect the case when the field Options tab is active, but there is no active field on the preview panel. + if ( + $( '#field-options a' ).hasClass( 'active' ) && + $( '.wpforms-field-wrap .wpforms-field.active' ).length === 0 + ) { + app.fieldTabToggle( 'field-options' ); + } + } ); + + // Field sidebar tab toggle + $builder.on( 'click', '.wpforms-tab a', function( e ) { + e.preventDefault(); + app.fieldTabToggle( $( this ).parent().attr( 'id' ) ); + } ); + + // Field sidebar group toggle + $builder.on( 'click', '.wpforms-add-fields-heading', function( e ) { + e.preventDefault(); + app.fieldGroupToggle( $( this ), 'click' ); + } ); + + // Form field preview clicking. + $builder.on( 'click', '.wpforms-field', function( event, extraParameters ) { + if ( app.isFieldPreviewActionsDisabled( this ) ) { + return; + } + + // Allow clicking on the "dismiss" button inside the field. + if ( event.target.classList.contains( 'wpforms-dismiss-button' ) ) { + return; + } + + // Dismiss the main context menu when it is open. + if ( WPForms.Admin.Builder.ContextMenu && extraParameters !== 'ignore-contextmenu' ) { + WPForms.Admin.Builder.ContextMenu.hideMainContextMenu( event ); + } + + event.stopPropagation(); + + app.fieldTabToggle( $( this ).data( 'field-id' ) ); + } ); + + // Prevent interactions with inputs on the preview panel. + $builder.on( 'mousedown click', '.wpforms-field input, .wpforms-field select, .wpforms-field textarea', function( e ) { + e.preventDefault(); + this.blur(); + } ); + + // Field delete. + $builder.on( 'click', '.wpforms-field-delete', function( e ) { + e.preventDefault(); + e.stopPropagation(); + + if ( app.isFormPreviewActionsDisabled( this ) ) { + return; + } + + if ( WPForms.Admin.Builder.ContextMenu ) { + WPForms.Admin.Builder.ContextMenu.hideMenu(); + } + + app.fieldDelete( $( this ).parent().data( 'field-id' ) ); + } ); + + // Field duplicate. + $builder.on( 'click', '.wpforms-field-duplicate', function( e ) { + e.preventDefault(); + e.stopPropagation(); + + if ( app.isFormPreviewActionsDisabled( this ) ) { + return; + } + + if ( WPForms.Admin.Builder.ContextMenu ) { + WPForms.Admin.Builder.ContextMenu.hideMenu(); + } + + app.fieldDuplicate( $( this ).parent().data( 'field-id' ) ); + } ); + + // Field add. + $builder.on( 'click', '.wpforms-add-fields-button', function( e ) { + e.preventDefault(); + + const $field = $( this ); + + if ( $field.hasClass( 'ui-draggable-disabled' ) ) { + return; + } + + const type = $field.data( 'field-type' ), + event = WPFormsUtils.triggerEvent( $builder, 'wpformsBeforeFieldAddOnClick', [ type, $field ] ); + + // Allow callbacks on `wpformsBeforeFieldAddOnClick` to cancel adding field + // by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return; + } + + app.fieldAdd( type, { $sortable: 'default' } ); + } ); + + // New field choices should be sortable + $builder.on( 'wpformsFieldAdd', function( event, id, type ) { + const fieldTypes = [ + 'select', + 'radio', + 'checkbox', + 'payment-multiple', + 'payment-checkbox', + 'payment-select', + ]; + + if ( $.inArray( type, fieldTypes ) !== -1 ) { + app.fieldChoiceSortable( type, `#wpforms-field-option-row-${ id }-choices ul` ); + } + } ); + + // Field option tab toggle. + $builder.on( 'wpformsFieldOptionTabToggle', function( e, fieldId ) { + app.fieldLayoutSelectorInit( fieldId ); + } ); + + // Field choice "Add new". + $builder.on( 'click', '.wpforms-field-option-row-choices .add', function( e ) { + app.fieldChoiceAdd( e, $( this ) ); + } ); + + // Field choice "Delete". + $builder.on( 'click', '.wpforms-field-option-row-choices .remove', function( e ) { + app.fieldChoiceDelete( e, $( this ) ); + } ); + + // Field choices' defaults, before change. + $builder.on( 'mousedown', '.wpforms-field-option-row-choices input[type=radio]', function() { + const $this = $( this ); + + if ( $this.is( ':checked' ) ) { + $this.attr( 'data-checked', '1' ); + } else { + $this.attr( 'data-checked', '0' ); + } + } ); + + // Field choices' defaults. + $builder.on( 'click', '.wpforms-field-option-row-choices input[type=radio]', function() { + const $this = $( this ), + list = $this.parent().parent(); + + $this.parent().parent().find( 'input[type=radio]' ).not( this ).prop( 'checked', false ); + + if ( $this.attr( 'data-checked' ) === '1' ) { + $this.prop( 'checked', false ); + $this.attr( 'data-checked', '0' ); + } + + app.fieldChoiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ), list.find( 'li' ).length ); + } ); + + // Field choices update preview area. + $builder.on( 'change', '.wpforms-field-option-row-choices input[type=checkbox]', function() { + const list = $( this ).parent().parent(); + + app.fieldChoiceUpdate( list.data( 'field-type' ), list.data( 'field-id' ), list.find( 'li' ).length ); + } ); + + // Field choices display value toggle. + $builder.on( 'change', '.wpforms-field-option-row-show_values input', function() { // eslint-disable-line max-lines-per-function + const $toggle = $( this ); + const $options = $toggle.closest( '.wpforms-field-option' ); + const $choicesList = $options.find( '.wpforms-field-option-row-choices .choices-list' ); + const fieldId = $choicesList.data( 'field-id' ); + const type = $choicesList.data( 'field-type' ); + const showValuesOn = $toggle.is( ':checked' ); + // Toggle show-values class in the options UI as before. + $choicesList.toggleClass( 'show-values', showValuesOn ); + // Refresh preview. + app.fieldChoiceUpdate( type, fieldId ); + // If Show Values is enabled, sync the Other input value in preview from the Other choice Value field. + WPForms.Admin.Builder.MultipleChoices.updatePreviewState( fieldId ); + } ); + + // Field choices image toggle. + $builder.on( 'change', '.wpforms-field-option-row-choices_images input', function() { + const $this = $( this ), + $optionRow = $this.closest( '.wpforms-field-option-row' ), + fieldID = $optionRow.data( 'field-id' ), + $fieldOptions = $( '#wpforms-field-option-' + fieldID ), + checked = $this.is( ':checked' ), + type = $fieldOptions.find( '.wpforms-field-option-hidden-type' ).val(), + $iconToggle = $optionRow.siblings( '.wpforms-field-option-row-choices_icons' ).find( 'input' ); + + // Toggle icon choices off. + if ( checked && $iconToggle.is( ':checked' ) ) { + $iconToggle.prop( 'checked', false ).trigger( 'change' ); + } + + $optionRow.find( '.wpforms-alert' ).toggleClass( 'wpforms-hidden' ); + $fieldOptions.find( '.wpforms-field-option-row-choices ul' ).toggleClass( 'show-images' ); + $fieldOptions.find( '.wpforms-field-option-row-choices_images_style' ).toggleClass( 'wpforms-hidden' ); + $fieldOptions.find( '.wpforms-field-option-row-dynamic_choices' ).toggleClass( 'wpforms-hidden', checked ); + + if ( checked ) { + $( '#wpforms-field-option-' + fieldID + '-input_columns' ).val( 'inline' ).trigger( 'change' ); + } else { + $( '#wpforms-field-option-' + fieldID + '-input_columns' ).val( '' ).trigger( 'change' ); + } + + $( `#wpforms-field-option-row-${ fieldID }-choices_images_hide` ).toggleClass( 'wpforms-hidden', ! checked ); + + app.fieldChoiceUpdate( type, fieldID ); + } ); + + // Field choices image upload add/remove image. + $builder.on( 'wpformsImageUploadAdd wpformsImageUploadRemove', function( event, $this, $container ) { + const $list = $container.closest( '.choices-list' ), + fieldID = $list.data( 'field-id' ), + type = $list.data( 'field-type' ); + + app.fieldChoiceUpdate( type, fieldID ); + } ); + + // Field choices image style toggle. + $builder.on( 'change', '.wpforms-field-option-row-choices_images_style select', function() { + const fieldID = $( this ).parent().data( 'field-id' ), + type = $( '#wpforms-field-option-' + fieldID ).find( '.wpforms-field-option-hidden-type' ).val(); + + app.fieldChoiceUpdate( type, fieldID ); + } ); + + // Updates field choices text in almost real time. + $builder.on( 'keyup', '.wpforms-field-option-row-choices input.label, .wpforms-field-option-row-choices input.value', function() { + const $list = $( this ).parent().parent(); + + app.fieldChoiceUpdate( $list.data( 'field-type' ), $list.data( 'field-id' ) ); + } ); + + // Sanitize field choices text on focus out. + $builder.on( 'focusout', '.wpforms-field-option-row-choices input.label, .wpforms-field-option-row-choices input.value', function() { + const input = $( this ); + + input.val( wpf.sanitizeHTML( input.val(), wpforms_builder.allowed_label_html_tags ) ); + } ); + + // Field Choices Bulk Add + $builder.on( 'click', '.toggle-bulk-add-display', function( e ) { + e.preventDefault(); + app.fieldChoiceBulkAddToggle( this ); + } ); + + $builder.on( 'click', '.toggle-bulk-add-presets', function( e ) { + e.preventDefault(); + + /** + * @type {JQ|jQuery} + */ + const $presetList = $( this ).closest( '.bulk-add-display' ).find( 'ul' ); + + if ( $presetList.css( 'display' ) === 'block' ) { + $( this ).text( wpforms_builder.bulk_add_presets_show ); + } else { + $( this ).text( wpforms_builder.bulk_add_presets_hide ); + } + + $presetList.stop().slideToggle(); + } ); + + $builder.on( 'click', '.bulk-add-preset-insert', function( e ) { + e.preventDefault(); + + /** @type {JQ|jQuery} */ + const $this = $( this ); + const preset = $this.data( 'preset' ), + $container = $this.closest( '.bulk-add-display' ), + $presetList = $container.find( 'ul' ), + $presetToggle = $container.find( '.toggle-bulk-add-presets' ), + $textarea = $container.find( 'textarea' ); + + $textarea.val( '' ); + $textarea.insertAtCaret( wpforms_preset_choices[ preset ].choices.join( '\n' ) ); + $presetToggle.text( wpforms_builder.bulk_add_presets_show ); + $presetList.slideUp(); + } ); + + $builder.on( 'click', '.bulk-add-insert', function( e ) { + e.preventDefault(); + app.fieldChoiceBulkAddInsert( this ); + } ); + + // Field Options group tabs. + $builder.on( 'click', '.wpforms-field-option-group-toggle:not(.education-modal)', function( e ) { + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsFieldOptionGroupToggle' ); + + // Allow callbacks on `wpformsFieldOptionGroupToggle` to cancel the tab toggle by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return false; + } + + e.preventDefault(); + + const $group = $( this ).closest( '.wpforms-field-option-group' ); + + $group.siblings( '.wpforms-field-option-group' ).removeClass( 'active' ); + $group.addClass( 'active' ); + + $builder.trigger( 'wpformsFieldOptionGroupToggled', [ $group ] ); + } ); + + // Display toggle for an Address field hide address line 2 option. + $builder.on( 'change', '.wpforms-field-option-address input.wpforms-subfield-hide', function() { + const $optionRow = $( this ).closest( '.wpforms-field-option-row' ), + id = $optionRow.data( 'field-id' ), + subfield = $optionRow.data( 'subfield' ); + + $( '#wpforms-field-' + id ).find( '.wpforms-' + subfield ).toggleClass( 'wpforms-hide' ); + } ); + + // Real-time updates for the "Label" field option. + $builder.on( 'input', '.wpforms-field-option-row-label input, .wpforms-field-option-row-name input', function() { + const $this = $( this ), + id = $this.parent().data( 'field-id' ), + $preview = $( '#wpforms-field-' + id ), + type = $preview.data( 'field-type' ); + + let value = $this.val(), + showEmptyLabel = value.length === 0; + + // Do not modify the label of the HTML field. + if ( type === 'html' ) { + showEmptyLabel = false; + } + + if ( showEmptyLabel ) { + value = wpforms_builder.empty_label; + } + + $preview.toggleClass( 'label_empty', showEmptyLabel ).find( '> .label-title .text' ).text( value ); + } ); + + // Real-time updates for the "Description" field option + $builder.on( 'input', '.wpforms-field-option-row-description textarea', function() { + // noinspection CssUnusedSymbol + const $this = $( this ), + value = wpf.sanitizeHTML( $this.val() ), + id = $this.parent().data( 'field-id' ), + // IIF description is not following other fields structure and needs to be selected separately. + $desc = $( + `#wpforms-field-${ id } > .description, + #wpforms-field-${ id } .format-selected-single > .description, + #wpforms-field-${ id } .wpforms-field-internal-information-row-description` + ); + + app.updateDescription( $desc, value ); + + $this.trigger( 'wpformsDescriptionFieldUpdated', { id, descField: $desc, value } ); + } ); + + // Real-time updates the for "Required" field option + $builder.on( 'change', '.wpforms-field-option-row-required input', function() { + const id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ), + $preview = $( '#wpforms-field-' + id ); + + $preview.toggleClass( 'required' ); + + app.onUpdateSelectPlaceholder( id, $preview ); + } ); + + // Real-time updates for a selected default choice option. + $builder.on( 'click', '.choices-list input.default', function() { + const $this = $( this ), + fieldId = $this.closest( '.choices-list' ).data( 'field-id' ), + checked = $this.is( ':checked' ); + + if ( ! checked ) { + app.maybeUpdateRequiredPlaceholder( fieldId ); + } + + /** + * Default choice option changing state event. + * + * @since 1.9.8.3 + * + * @type {Object} The selected default choice option. + */ + $builder.trigger( 'wpformsChoicesSetDefault', [ this ] ); + } ); + + // Real-time updates for the "Summary" field option + $builder.on( 'change', '.wpforms-field-option-row-summary input', function() { + const $this = $( this ), + id = $this.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + + $( `#wpforms-field-${ id }` ).toggleClass( 'wpforms-summary-enabled' ); + $this.closest( '.wpforms-field-option-group-inner' ).find( '.wpforms-total-summary-alert' ).toggleClass( 'wpforms-hidden' ); + } ); + + // Real-time updates for the "Confirmation" field option + $builder.on( 'change', '.wpforms-field-option-row-confirmation input', function() { + const id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ); + + $( '#wpforms-field-' + id ).find( '.wpforms-confirm' ).toggleClass( 'wpforms-confirm-enabled wpforms-confirm-disabled' ); + $( '#wpforms-field-option-' + id ).toggleClass( 'wpforms-confirm-enabled wpforms-confirm-disabled' ); + } ); + + // Real-time updates for "Filter" field option + $builder.on( 'change', '.wpforms-field-option-row-filter_type select', function() { + const id = $( this ).parent().data( 'field-id' ), + $toggledField = $( '#wpforms-field-option-' + id ); + + if ( $( this ).val() ) { + $toggledField.removeClass( 'wpforms-filter-allowlist' ); + $toggledField.removeClass( 'wpforms-filter-denylist' ); + $toggledField.addClass( 'wpforms-filter-' + $( this ).val() ); + } else { + $toggledField.removeClass( 'wpforms-filter-allowlist' ); + $toggledField.removeClass( 'wpforms-filter-denylist' ); + } + } ); + + $builder.on( 'focusout', '.wpforms-field-option-row-allowlist textarea,.wpforms-field-option-row-denylist textarea', function() { // eslint-disable-line max-lines-per-function + const $currentField = $( this ); + + let $current = 'allow'; + + $currentField.next( '.wpforms-alert' ).remove(); + + if ( $currentField.val() === '' ) { + return; + } + + const $allowField = $( '.wpforms-field-option-row-allowlist textarea' ), + $denyField = $( '.wpforms-field-option-row-denylist textarea' ); + + if ( $currentField.is( $denyField ) ) { + $current = 'deny'; + } + + $.get( + wpforms_builder.ajax_url, + { + nonce: wpforms_builder.nonce, + content: JSON.stringify( + { + allow: $allowField.val(), + deny: $denyField.val(), + current: $current, + } + ), + action: 'wpforms_sanitize_restricted_rules', + }, + function( res ) { + if ( res.success ) { + $currentField.val( res.data.currentField ); + const intersect = res.data.intersect; + if ( intersect.length !== 0 ) { + const content = '

    ' + wpforms_builder.allow_deny_lists_intersect + '

    ' + + '

    ' + intersect + '

    '; + $.alert( { + title: wpforms_builder.heads_up, + content, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + } + + const restricted = res.data.restricted || 0; + if ( restricted ) { + $currentField.after( '

    ' + wpforms_builder.restricted_rules + '

    ' ); + } + } + } + ); + } ); + + // Save focusout target. + $builder.on( 'focusout', elements.defaultEmailSelector, function() { + elements.$focusOutTarget = $( this ); + app.focusOutEvent(); + } ); + + // Real-time updates for the "Size" field option + $builder.on( 'change', '.wpforms-field-option-row-size select', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ); + + $( '#wpforms-field-' + id ).removeClass( 'size-small size-medium size-large' ).addClass( 'size-' + value ); + } ); + + // Real-time updates for the "Placeholder" field option. + $builder.on( 'input', '.wpforms-field-option-row-placeholder input', function() { // eslint-disable-line complexity + const $this = $( this ), + id = $this.parent().data( 'field-id' ), + $preview = $( '#wpforms-field-' + id ), + $primary = $preview.find( '.primary-input' ); + + let value = wpf.sanitizeHTML( $this.val() ); + + // Single Item Field - if a placeholder is cleared, set it to "price" placeholder. + if ( $preview.data( 'field-type' ) === 'payment-single' && value === '' ) { + value = $( '#wpforms-field-option-' + id + '-price' ).prop( 'placeholder' ); + } + + // Set the placeholder value for `input` fields. + if ( ! $primary.is( 'select' ) ) { + $primary.prop( 'placeholder', value ); + return; + } + + // Modern select style. + if ( app.dropdownField.helpers.isModernSelect( $primary ) ) { + const choiceInstance = app.dropdownField.helpers.getInstance( $primary ); + + // Additional case for multiple select. + if ( $primary.prop( 'multiple' ) ) { + $( choiceInstance.input.element ).prop( 'placeholder', value ); + } else { + choiceInstance.setChoiceByValue( '' ); + $primary.closest( '.choices' ).find( '.choices__inner .choices__placeholder' ).text( value ); + + const isDynamicChoices = $( '#wpforms-field-option-' + id + '-dynamic_choices' ).val(); + + // We need to re-initialize the modern dropdown to properly determine and update placeholder. + app.dropdownField.helpers.update( id, isDynamicChoices ); + } + + return; + } + + const $placeholder = $primary.find( '.placeholder' ); + + // Classic select style. + if ( ! value.length && $placeholder.length ) { + $placeholder.remove(); + } else { + if ( $placeholder.length ) { + $placeholder.text( value ); + } else { + $primary.prepend( '' ); + } + + $primary.find( '.placeholder' ).prop( 'selected', ! $primary.prop( 'multiple' ) ); + } + } ); + + // Real-time updates for the "Confirmation Placeholder" field option + $builder.on( 'input', '.wpforms-field-option-row-confirmation_placeholder input', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ); + + $( '#wpforms-field-' + id ).find( '.secondary-input' ).attr( 'placeholder', value ); + } ); + + // Real-time updates for Date/Time, and Name "Placeholder" field options + $builder.on( 'input', '.wpforms-field-option .format-selected input.placeholder', function() { + const $this = $( this ); + const value = $this.val(); + const $fieldOptionRow = $this.closest( '.wpforms-field-option-row' ); + const id = $fieldOptionRow.data( 'field-id' ); + const subfield = $fieldOptionRow.data( 'subfield' ); + + $( '#wpforms-field-' + id ).find( '.wpforms-' + subfield + ' input' ).attr( 'placeholder', value ); + } ); + + // Real-time updates for Address field "Placeholder" field options. + $builder.on( 'input', '.wpforms-field-option-address input.placeholder', function() { + const $this = $( this ); + const $fieldOptionRow = $this.closest( '.wpforms-field-option-row' ); + const id = $fieldOptionRow.data( 'field-id' ); + const subfield = $fieldOptionRow.data( 'subfield' ); + const $fieldPreviews = $( '#wpforms-field-' + id + ' .wpforms-' + subfield ).find( 'input, select' ); + const $default = $fieldOptionRow.find( '#wpforms-field-option-' + id + '-' + subfield + '_default' ); + const defaultValue = $default.val(); + const defaultText = $default.find( 'option:selected' ).text(); + + const placeholderValue = $this.val(); + + $fieldPreviews.each( function() { + const $fieldPreview = $( this ); + + if ( $fieldPreview.is( 'select' ) ) { + const $option = $fieldPreview.find( '.placeholder' ); + const value = defaultValue === '' && placeholderValue !== '' ? placeholderValue : defaultText; + + $option.text( value ); + + return; + } + + $fieldPreview.attr( 'placeholder', placeholderValue ); + } ); + } ); + + // Real-time updates for the "Default" field option. + $builder.on( 'input', '.wpforms-field-option-row-default_value input:not([type="search"])', function() { + const $this = $( this ); + const value = wpf.sanitizeHTML( $this.val() ); + const id = $this.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + const $preview = $( '#wpforms-field-' + id + ' .primary-input' ); + + $preview.val( value ); + } ); + + // Real-time updates for "Default" field option of the Name and Address fields. + $builder.on( 'input', '.wpforms-field-options-column input.default', function() { + const $this = $( this ); + const value = wpf.sanitizeHTML( $this.val() ); + const $fieldOptionRow = $this.closest( '.wpforms-field-option-row' ); + const id = $fieldOptionRow.data( 'field-id' ); + const subfield = $fieldOptionRow.data( 'subfield' ); + const $fieldPreview = $( '#wpforms-field-' + id + ' .wpforms-' + subfield + ' input' ); + + $fieldPreview.val( value ); + } ); + + // Real-time updates for "Default" select field option of the Address field. + $builder.on( 'change', '.wpforms-field-option-address select.default', function() { + const $this = $( this ); + const value = $this.val(); + const textValue = $this.find( 'option:selected' ).text(); + const $fieldOptionRow = $this.closest( '.wpforms-field-option-row' ); + const id = $fieldOptionRow.data( 'field-id' ); + const subfield = $fieldOptionRow.data( 'subfield' ); + const scheme = $( '#wpforms-field-option-' + id + '-scheme' ).val(); + const $placeholder = $fieldOptionRow.find( '#wpforms-field-option-' + id + '-' + subfield + '_placeholder' ); + const placeholderValue = $placeholder.val(); + const $fieldPreview = $( '#wpforms-field-' + id + ' .wpforms-address-scheme-' + scheme + ' .wpforms-' + subfield + ' .placeholder' ); + + value === '' && placeholderValue.trim().length > 0 + ? $fieldPreview.text( placeholderValue ) + : $fieldPreview.text( textValue ); + } ); + + // Real-time updates for the "Confirmation Placeholder" field option + $builder.on( 'input', '.wpforms-field-option-row-confirmation_placeholder input', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ); + + $( '#wpforms-field-' + id ).find( '.secondary-input' ).attr( 'placeholder', value ); + } ); + + // Real-time updates for the "Hide Label" field option. + $builder.on( 'change', '.wpforms-field-option-row-label_hide input', function() { + const id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ); + + $( '#wpforms-field-' + id ).toggleClass( 'label_hide' ); + } ); + + // Real-time updates for a Sub Label visibility field option. + $builder.on( 'change', '.wpforms-field-option-row-sublabel_hide input', function() { + const id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ); + + $( '#wpforms-field-' + id ).toggleClass( 'sublabel_hide' ); + } ); + + // Real-time updates for the "Read-Only" field option. + $builder.on( 'change', '.wpforms-field-option-row-read_only input', app.fieldReadOnlyToggleChange ); + + // Real-time updates for a Quantity visibility field option. + $builder.on( 'change', '.wpforms-field-option-row-enable_quantity input', function() { + const id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ), + $preview = $( `#wpforms-field-${ id }` ); + + $( `#wpforms-field-option-row-${ id }-quantity` ).toggleClass( 'wpforms-hidden' ); + $preview.find( '.quantity-input' ).toggleClass( 'wpforms-hidden' ); + $preview.toggleClass( 'payment-quantity-enabled' ); + } ); + + // Real-time updates for Quantity preview minimum value. + $builder.on( 'input', '.wpforms-field-option-row-quantity input', function() { + const $this = $( this ); + + // Allow only a positive integer value less than 9999. + $this.val( Math.min( Math.abs( Math.round( $this.val() ) ), 9999 ) ); + + const $optionRow = $this.closest( '.wpforms-field-option-row' ), + id = $optionRow.data( 'field-id' ), + isMinInput = $this.hasClass( 'min-quantity-input' ), + $minInput = $optionRow.find( '.min-quantity-input' ), + $maxInput = $optionRow.find( '.max-quantity-input' ); + + if ( isMinInput ) { + $( '#wpforms-field-' + id ).find( '.quantity-input option' ).text( $this.val() ); + } + + $minInput.toggleClass( 'wpforms-error', parseInt( $minInput.val(), 10 ) > parseInt( $maxInput.val(), 10 ) ); + } ); + + // Real-time updates for Date/Time, Name and Single Item "Format" option. + $builder.on( 'change', '.wpforms-field-option-row-format select', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ), + $sublabelToggle = $( '#wpforms-field-option-row-' + id + '-sublabel_hide' ), + $preview = $( '#wpforms-field-' + id ); + + $preview.find( '.format-selected' ).removeClass().addClass( 'format-selected format-selected-' + value ); + $( '#wpforms-field-option-' + id ).find( '.format-selected' ).removeClass().addClass( 'format-selected format-selected-' + value ); + + // Show toggle for "Hide Sub labels" only when the field consists of more than one subfield. + if ( [ 'date-time', 'first-last', 'first-middle-last' ].includes( value ) ) { + $sublabelToggle.removeClass( 'wpforms-hidden' ); + } else { + $sublabelToggle.addClass( 'wpforms-hidden' ); + } + + // Hide the label field if it's not a single item. + $( `#wpforms-field-option-row-${ id }-price_label` ).toggleClass( 'wpforms-hidden', value !== 'single' ); + + // Toggle options based on Single Item "Format". + if ( [ 'single', 'user', 'hidden' ].includes( value ) ) { + const isUserDefined = value === 'user', + isSingle = value === 'single', + isHidden = value === 'hidden', + isQuantityEnabled = $( '#wpforms-field-option-' + id + '-enable_quantity' ).is( ':checked' ), + $minPriceOption = $( '#wpforms-field-option-' + id + '-min_price' ), + minPrice = wpf.amountSanitize( $minPriceOption.val() ), + isValidMinPrice = minPrice >= $minPriceOption.data( 'minimum-price' ), + $minPriceOptionRow = $( '#wpforms-field-option-row-' + id + '-min_price' ); + + // Toggle Placeholder option. + $( '#wpforms-field-option-row-' + id + '-placeholder' ).toggleClass( 'wpforms-hidden', ! isUserDefined ); + + // Toggle Quantity options. + $( '#wpforms-field-option-row-' + id + '-enable_quantity' ).toggleClass( 'wpforms-hidden', ! isSingle ); + $( '#wpforms-field-option-row-' + id + '-quantities_alert' ).toggleClass( 'wpforms-hidden', ! isSingle ); + $( '#wpforms-field-option-row-' + id + '-quantity' ).toggleClass( 'wpforms-hidden', ! isSingle || ! isQuantityEnabled ); + $preview.find( '.quantity-input' ).toggleClass( 'wpforms-hidden', ! isSingle || ! isQuantityEnabled ); + + // Toggle Minimum Price options. + $minPriceOptionRow.toggleClass( 'wpforms-hidden', ! isUserDefined ); + $minPriceOptionRow.find( '.wpforms-item-minimum-price-alert' ).toggleClass( 'wpforms-hidden', isValidMinPrice ); + $preview.find( '.item-min-price' ).toggleClass( 'wpforms-hidden', isUserDefined && minPrice <= 0 ); + $preview.toggleClass( 'min-price-warning', ! isValidMinPrice ); + $preview.find( '.fa-exclamation-triangle' ).toggleClass( 'wpforms-hidden', isValidMinPrice ); + + // Toggle the label + $( `#wpforms-field-${ id } .item-price-single` ).toggleClass( 'wpforms-hidden', ! isSingle ); + $( `#wpforms-field-${ id } .item-price-hidden` ).toggleClass( 'wpforms-hidden', ! isHidden ); + } + } ); + + // Real-time updates specific for Address "Scheme" option + $builder.on( 'change', '.wpforms-field-option-row-scheme select', function() { + const $this = $( this ); + const value = $this.val(); + const fieldId = $this.parent().data( 'field-id' ); + + const $fieldPreview = $( `#wpforms-field-${ fieldId }` ); + const $stateOption = $( `#wpforms-field-option-row-${ fieldId }-state` ); + const $countryOption = $( `#wpforms-field-option-row-${ fieldId }-country` ); + + // Switch the scheme in a Preview panel. + $fieldPreview.find( '.wpforms-address-scheme' ).addClass( 'wpforms-hide' ); + $fieldPreview.find( `.wpforms-address-scheme-${ value }` ).removeClass( 'wpforms-hide' ); + + // Show an or hide country option depending on the scheme. + const $countryPreviewField = $fieldPreview.find( `.wpforms-address-scheme-${ value } .wpforms-country select, .wpforms-address-scheme-${ value } .wpforms-country input` ); + + $countryPreviewField.length === 0 + ? $countryOption.addClass( 'wpforms-hidden' ) + : $countryOption.removeClass( 'wpforms-hidden' ); + + // Inputs/selects for a currently selected scheme and the one that we're changing to. + const $currentState = $stateOption.find( '.default .default' ).not( '.wpforms-hidden-strict' ); + const $newState = $stateOption.find( `.default [data-scheme="${ value }"]` ); + const $currentCountry = $countryOption.find( '.default .default' ).not( '.wpforms-hidden-strict' ); + const $newCountry = $countryOption.find( `.default [data-scheme="${ value }"]` ); + + // Switch the state field type in options to match the scheme. + $newState.attr( { + id: $currentState.attr( 'id' ), + name: $currentState.attr( 'name' ), + } ).removeClass( 'wpforms-hidden-strict' ); + $currentState.attr( { id: '', name: '' } ).addClass( 'wpforms-hidden-strict' ); + $newCountry.attr( { + id: $currentCountry.attr( 'id' ), + name: $currentCountry.attr( 'name' ), + } ).removeClass( 'wpforms-hidden-strict' ); + $currentCountry.attr( { id: '', name: '' } ).addClass( 'wpforms-hidden-strict' ); + } ); + + // Real-time updates for a Date/Time date type + $builder.on( 'change', '.wpforms-field-option-row-date .type select', function() { + const $this = $( this ), + value = $this.val(), + id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ), + addClass = value === 'datepicker' ? 'wpforms-date-type-datepicker' : 'wpforms-date-type-dropdown', + removeClass = value === 'datepicker' ? 'wpforms-date-type-dropdown' : 'wpforms-date-type-datepicker'; + + $( '#wpforms-field-' + id ).find( '.wpforms-date' ).addClass( addClass ).removeClass( removeClass ); + $( '#wpforms-field-option-' + id ).addClass( addClass ).removeClass( removeClass ); + + const $limitDays = $this.closest( '.wpforms-field-option-group-advanced' ) + .find( '.wpforms-field-option-row-date_limit_days, .wpforms-field-option-row-date_limit_days_options, .wpforms-field-option-row-date_disable_past_dates' ), + $limitDaysOptions = $( '#wpforms-field-option-row-' + id + '-date_limit_days_options' ); + + if ( value === 'dropdown' ) { + const $dateSelect = $( '#wpforms-field-option-' + id + '-date_format' ); + + if ( $dateSelect.find( 'option:selected' ).hasClass( 'datepicker-only' ) ) { + $dateSelect.prop( 'selectedIndex', 0 ).trigger( 'change' ); + } + + $limitDays.hide(); + } else { + $limitDays.show(); + $( '#wpforms-field-option-' + id + '-date_limit_days' ).is( ':checked' ) + ? $limitDaysOptions.show() + : $limitDaysOptions.hide(); + } + } ); + + // Real-time updates for Date/Time date select format + $builder.on( 'change', '.wpforms-field-option-row-date .format select', function() { + const $this = $( this ), + value = $this.val(), + id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ), + $field = $( '#wpforms-field-' + id ); + + if ( value === 'm/d/Y' || value === 'm.d.Y' ) { + $field.find( '.wpforms-date-dropdown .first option' ).text( wpforms_builder.date_select_month ); + $field.find( '.wpforms-date-dropdown .second option' ).text( wpforms_builder.date_select_day ); + $field.find( '.wpforms-date-dropdown .third option' ).text( wpforms_builder.date_select_year ); + } else if ( value === 'd/m/Y' || value === 'd.m.Y' ) { + $field.find( '.wpforms-date-dropdown .first option' ).text( wpforms_builder.date_select_day ); + $field.find( '.wpforms-date-dropdown .second option' ).text( wpforms_builder.date_select_month ); + $field.find( '.wpforms-date-dropdown .third option' ).text( wpforms_builder.date_select_year ); + } else if ( value === 'Y/m/d' || value === 'Y.m.d' ) { + $field.find( '.wpforms-date-dropdown .first option' ).text( wpforms_builder.date_select_year ); + $field.find( '.wpforms-date-dropdown .second option' ).text( wpforms_builder.date_select_month ); + $field.find( '.wpforms-date-dropdown .third option' ).text( wpforms_builder.date_select_day ); + } + } ); + + // Real-time updates for Date/Time select format + $builder.on( 'change', '.wpforms-field-option-row-time .format select', function() { + const $this = $( this ), + id = $this.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + + let options = '', + hh; + + // Determine a time format type. + // If the format contains `g` or `h`, then this is a 12-hour format, otherwise 24 hours. + const format = $this.val().match( /[gh]/ ) ? 12 : 24, + minHour = format === 12 ? 1 : 0, + maxHour = format === 12 ? 13 : 24; + + // Generate a new set of hour options. + for ( let i = minHour; i < maxHour; i++ ) { + hh = i < 10 ? '0' + i : i; + options += ''.replace( /{hh}/g, hh ); + } + + _.forEach( [ 'start', 'end' ], function( field ) { + const $hour = $builder.find( '#wpforms-field-option-' + id + '-time_limit_hours_' + field + '_hour' ), + $ampm = $builder.find( '#wpforms-field-option-' + id + '-time_limit_hours_' + field + '_ampm' ); + + let hourValue = parseInt( $hour.val(), 10 ), + ampmValue = $ampm.val(); + + if ( format === 24 ) { + hourValue = ampmValue === 'pm' ? hourValue + 12 : hourValue; + } else { + ampmValue = hourValue > 12 ? 'pm' : 'am'; + hourValue = hourValue > 12 ? hourValue - 12 : hourValue; + } + + hourValue = hourValue < 10 ? '0' + hourValue : hourValue; + $hour.html( options ).val( hourValue ); + $ampm.toggleClass( 'wpforms-hidden-strict', format === 24 ).val( ampmValue ); + $ampm.nextAll( 'div' ).toggleClass( 'wpforms-hidden-strict', format === 12 ); + } ); + } ); + + // Real-time updates for the "Hide Divider Line" field option. + $builder.on( 'change', '.wpforms-field-option-row-hide_divider_line input', function() { + const id = $( this ).closest( '.wpforms-field-option-row' ).data( 'field-id' ); + + $( `#wpforms-field-${ id }` ).toggleClass( 'hide_line' ); + } ); + + // Consider the field active when a disabled nav button is clicked + $builder.on( 'click', '.wpforms-pagebreak-button', function( e ) { + e.preventDefault(); + $( this ).closest( '.wpforms-field' ).trigger( 'click' ); + } ); + + /* + * Pagebreak field. + */ + app.fieldPageBreakInitDisplayPrevious( $builder.find( '.wpforms-field-pagebreak.wpforms-pagebreak-normal' ).first() ); + + $builder + .on( 'input', '.wpforms-field-option-row-next input', function() { + // Real-time updates for the "Next" pagebreak field option. + const $this = $( this ), + value = $this.val(), + $next = $( '#wpforms-field-' + $this.parent().data( 'field-id' ) ).find( '.wpforms-pagebreak-next' ); + + if ( value ) { + $next.css( 'display', 'inline-block' ).text( value ); + } else { + $next.css( 'display', 'none' ).empty(); + } + } ) + .on( 'input', '.wpforms-field-option-row-prev input', function() { + // Real-time updates for the "Prev" pagebreak field option. + const $this = $( this ), + value = $this.val().trim(), + $field = $( '#wpforms-field-' + $this.parent().data( 'field-id' ) ), + $prevBtn = $field.find( '.wpforms-pagebreak-prev' ); + + if ( value && $field.prevAll( '.wpforms-field-pagebreak.wpforms-pagebreak-normal' ).length > 0 ) { + $prevBtn.removeClass( 'wpforms-hidden' ).text( value ); + } else { + $prevBtn.addClass( 'wpforms-hidden' ).empty(); + } + } ) + .on( 'change', '.wpforms-field-option-row-prev_toggle input', function() { // eslint-disable-line complexity + // Real-time updates for "Display Previous" pagebreak field option. + const $input = $( this ), + $wrapper = $input.closest( '.wpforms-field-option-row-prev_toggle' ); + + if ( $wrapper.hasClass( 'wpforms-entry-preview-block' ) ) { + return; + } + + const $prev = $input.closest( '.wpforms-field-option-group-inner' ).find( '.wpforms-field-option-row-prev' ); + + const $prevLabel = $prev.find( 'input' ), + $prevBtn = $( '#wpforms-field-' + $input.closest( '.wpforms-field-option' ).data( 'field-id' ) ).find( '.wpforms-pagebreak-prev' ); + + $prev.toggleClass( 'wpforms-hidden', ! $input.prop( 'checked' ) ); + $prevBtn.toggleClass( 'wpforms-hidden', ! $input.prop( 'checked' ) ); + + if ( $input.prop( 'checked' ) && ! $prevLabel.val() ) { + let message = $prevLabel.data( 'last-value' ); + message = message && message.trim() ? message.trim() : wpforms_builder.previous; + + $prevLabel.val( message ); + } + + // Backward compatibility for forms that were created before the toggle was added. + if ( ! $input.prop( 'checked' ) ) { + $prevLabel.data( 'last-value', $prevLabel.val() ); + $prevLabel.val( '' ); + } + + $prevLabel.trigger( 'input' ); + } ) + .on( 'wpformsFieldAdd', app.fieldPagebreakAdd ) + .on( 'wpformsFieldDelete', app.fieldPagebreakDelete ) + .on( 'wpformsFieldAdd', app.toggleOrderSummaryConfirmation ) + .on( 'wpformsFieldDelete', app.toggleOrderSummaryConfirmation ) + .on( 'wpformsBeforeFieldDelete', app.fieldEntryPreviewDelete ); + + // Update Display Previous option visibility for all Pagebreak fields. + $builder.on( 'wpformsFieldMove wpformsFieldAdd wpformsFieldDelete', function() { + $builder.find( '.wpforms-field-pagebreak.wpforms-pagebreak-normal' ).each( function() { + app.fieldPageBreakInitDisplayPrevious( $( this ) ); + } ); + } ); + + // Real-time updates for "Page Title" pagebreak field option + $builder.on( 'input', '.wpforms-field-option-row-title input', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ); + + if ( value ) { + $( '#wpforms-field-' + id ).find( '.wpforms-pagebreak-title' ).text( value ); + } else { + $( '#wpforms-field-' + id ).find( '.wpforms-pagebreak-title' ).empty(); + } + } ); + + // Real-time updates for "Page Navigation Alignment" pagebreak field option + $builder.on( 'change', '.wpforms-field-option-row-nav_align select', function() { + const $this = $( this ); + let value = $this.val(); + + if ( ! value ) { + value = 'center'; + } + + $( '.wpforms-pagebreak-buttons' ) + .removeClass( 'wpforms-pagebreak-buttons-center wpforms-pagebreak-buttons-left wpforms-pagebreak-buttons-right wpforms-pagebreak-buttons-split' ) + .addClass( 'wpforms-pagebreak-buttons-' + value ); + } ); + + // Real-time updates for Single Item field "Item Price" option. + $builder.on( 'input', '.wpforms-field-option-row-price input', function() { + const $this = $( this ), + value = $this.val(), + formatted = wpf.amountFormat( wpf.amountSanitize( value ) ), + id = $this.parent().data( 'field-id' ), + placeholder = $( '#wpforms-field-option-' + id + '-placeholder' ).val().trim(), + $preview = $( '#wpforms-field-' + id ), + newValue = value === '' && placeholder !== '' ? '' : formatted; + + $preview.find( '.primary-input' ).val( newValue ); + $preview.find( '.price' ).text( wpf.amountFormatCurrency( value ) ); + } ); + + // Real-time updates for Single Item field "Minimum Price" option. + $builder.on( 'input', '.wpforms-field-option-row-min_price input', function() { + const $this = $( this ), + amount = $this.val(), + sanitized = wpf.amountSanitize( amount ), + isEmpty = sanitized <= 0, + isValid = sanitized >= $this.data( 'minimum-price' ), + $fieldOptionRow = $this.parent(), + $preview = $( '#wpforms-field-' + $fieldOptionRow.data( 'field-id' ) ); + + $fieldOptionRow.find( '.wpforms-item-minimum-price-alert' ).toggleClass( 'wpforms-hidden', isValid ); + $preview.find( '.item-min-price' ).toggleClass( 'wpforms-hidden', isEmpty ); + $preview.toggleClass( 'min-price-warning', ! isValid ); + $preview.find( '.fa-exclamation-triangle' ).toggleClass( 'wpforms-hidden', isValid ); + + if ( isEmpty ) { + return; + } + + $preview.find( '.min-price' ).text( wpf.amountFormatCurrency( amount ) ); + } ); + + // Real-time updates for price label for single item field. + $builder.on( 'input', '.wpforms-single-item-price-label-display', function() { + const $this = $( this ), + value = wpf.sanitizeHTML( $this.val(), '<>' ), + id = $this.parent().data( 'field-id' ), + $preview = $( `#wpforms-field-${ id }` ), + $price = wpf.amountFormatCurrency( $( `#wpforms-field-option-${ id }-price` ).val() ); + + if ( ! value ) { + $this.val( '{price}' ); + $preview.find( '.price-label' ).html( ` ${ $price } ` ); + return; + } + + $preview.find( '.price-label' ).html( value.replaceAll( '{price}', ` ${ $price } ` ) ); + } ); + + // Real-time updates for payment CC icons + $builder.on( 'change', '.wpforms-field-option-credit-card .payment-icons input', function() { + const $this = $( this ), + card = $this.data( 'card' ), + id = $this.parent().data( 'field-id' ); + + $( '#wpforms-field-' + id ).find( 'img.icon-' + card ).toggleClass( 'card_hide' ); + } ); + + // Generic updates for various additional placeholder fields (at least Stripe's "Name on Card"). + $builder.on( 'input', '.wpforms-field-option input.placeholder-update', function() { + const $this = $( this ), + value = $this.val(), + id = $this.data( 'field-id' ), + subfield = $this.data( 'subfield' ); + + $( '#wpforms-field-' + id ).find( '.wpforms-' + subfield + ' input' ).attr( 'placeholder', value ); + } ); + + // Toggle Choice Layout advanced field option. + $builder.on( 'change', '.wpforms-field-option-row-input_columns select', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ); + + let cls = ''; + + if ( value === '2' ) { + cls = 'wpforms-list-2-columns'; + } else if ( value === '3' ) { + cls = 'wpforms-list-3-columns'; + } else if ( value === 'inline' ) { + cls = 'wpforms-list-inline'; + } + + $( '#wpforms-field-' + id ).removeClass( 'wpforms-list-2-columns wpforms-list-3-columns wpforms-list-inline' ).addClass( cls ); + } ); + + // Toggle the toggle field. + $builder.on( 'change', '.wpforms-field-option-row .wpforms-toggle-control input', function() { + const $check = $( this ), + $control = $check.closest( '.wpforms-toggle-control' ), + $status = $control.find( '.wpforms-toggle-control-status' ), + state = $check.is( ':checked' ) ? 'on' : 'off'; + + $status.html( $status.data( state ) ); + } ); + + // Real-time updates for "Dynamic Choices" field option, for Dropdown, + // Checkboxes, and Multiple choice fields + $builder.on( 'change', '.wpforms-field-option-row-dynamic_choices select', function() { + app.fieldDynamicChoiceToggle( $( this ) ); + } ); + + // Real-time updates for the "Dynamic [type] Source" field option, for Dropdown, + // Checkboxes, and Multiple choice fields + $builder.on( 'change', '.wpforms-field-option-row-dynamic_taxonomy select, .wpforms-field-option-row-dynamic_post_type select', function() { + app.fieldDynamicChoiceSource( $( this ) ); + } ); + + // Toggle Layout selector + $builder.on( 'click', '.toggle-layout-selector-display', function( e ) { + e.preventDefault(); + app.fieldLayoutSelectorToggle( this ); + } ); + $builder.on( 'click', '.layout-selector-display-layout', function( e ) { + e.preventDefault(); + app.fieldLayoutSelectorLayout( this ); + } ); + $builder.on( 'click', '.layout-selector-display-columns span', function( e ) { + e.preventDefault(); + app.fieldLayoutSelectorInsert( this ); + } ); + + // Real-time updates for a Rating field scale option. + $( document ).on( 'change', '.wpforms-field-option-row-scale select', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ), + $icons = $( '#wpforms-field-' + id + ' .rating-icon' ); + + let x = 1; + + $icons.each( function() { + if ( x <= value ) { + $( this ).show(); + } else { + $( this ).hide(); + } + x++; + } ); + } ); + + // Real-time updates for a Rating field icon option. + $( document ).on( 'change', '.wpforms-field-option-row-icon select', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ), + $icons = $( '#wpforms-field-' + id + ' .rating-icon' ); + + let iconClass = 'fa-star'; + + if ( 'heart' === value ) { + iconClass = 'fa-heart'; + } else if ( 'thumb' === value ) { + iconClass = 'fa-thumbs-up'; + } else if ( 'smiley' === value ) { + iconClass = 'fa-smile-o'; + } + + $icons.removeClass( 'fa-star fa-heart fa-thumbs-up fa-smile-o' ).addClass( iconClass ); + } ); + + // Real-time updates for a Rating field icon size option. + $( document ).on( 'change', '.wpforms-field-option-row-icon_size select', function() { + const $this = $( this ), + value = $this.val(), + id = $this.parent().data( 'field-id' ), + $icons = $( '#wpforms-field-' + id + ' .rating-icon' ); + + let fontSize = '28'; + + if ( 'small' === value ) { + fontSize = '18'; + } else if ( 'large' === value ) { + fontSize = '38'; + } + + $icons.css( 'font-size', fontSize + 'px' ); + } ); + + // Real-time updates for a Rating field icon color option. + $( document ).on( 'input', '.wpforms-field-option-row-icon_color input.wpforms-color-picker', function() { + const $this = $( this ), + id = $this.closest( '.wpforms-field-option-row' ).data( 'field-id' ), + $icons = $( `#wpforms-field-${ id } .wpforms-rating-field-icons i.fa` ); + + $icons.css( 'color', app.getValidColorPickerValue( $this ) ); + } ); + + // Real-time updates for a Checkbox field Disclaimer option. + $( document ).on( 'change', '.wpforms-field-option-row-disclaimer_format input', function() { + const $this = $( this ), + id = $this.closest( '.wpforms-field-option-row' ).data( 'field-id' ), + $desc = $( '#wpforms-field-' + id + ' .description' ); + + $desc.toggleClass( 'disclaimer' ); + } ); + + $builder.on( + 'change', + '.wpforms-field-option-row-limit_enabled input', + function( event ) { + app.updateTextFieldsLimitControls( $( event.target ).closest( '.wpforms-field-option-row-limit_enabled' ).data().fieldId, event.target.checked ); + } + ); + + $builder.on( + 'change', + '.wpforms-field-option-row-date_disable_past_dates input', + function( event ) { + app.updateDisableTodaysDateControls( $( event.target ).closest( '.wpforms-field-option-row-date_disable_past_dates' ).data().fieldId, event.target?.checked ); + } + ); + + $builder.on( 'change', '.wpforms-field-option-row-password-visibility input', app.togglePasswordEyeIcon ); + + $builder.on( + 'change', + '.wpforms-field-option-row-password-strength input', + function( event ) { + app.updatePasswordStrengthControls( $( event.target ).parents( '.wpforms-field-option-row-password-strength' ).data().fieldId, event.target.checked ); + } + ); + + $builder.on( + 'change', + '.wpforms-field-option-richtext .wpforms-field-option-row-media_enabled input', + app.updateRichTextMediaFieldsLimitControls + ); + + $builder.on( + 'change', + '.wpforms-field-option-richtext .wpforms-field-option-row-style select', + app.updateRichTextStylePreview + ); + + // File uploader - change style. + $builder + .on( + 'change', + '.wpforms-field-option-file-upload .wpforms-field-option-row-style select, .wpforms-field-option-file-upload .wpforms-field-option-row-max_file_number input, .wpforms-field-option-file-upload .wpforms-field-option-row-camera input', + function( event ) { + app.fieldFileUploadPreviewUpdate( event.target ); + } + ); + + // Real-time updates for the Number Slider field. + app.numberSliderEvents( $builder ); + + // Hide image and icon choices if dynamic choices are not off. + app.fieldDynamicChoiceToggleImageChoices(); + app.fieldDynamicChoiceToggleIconChoices(); + + // Real-time updates for Payment field's 'Show price after item label' option. + $builder.on( 'change', '.wpforms-field-option-row-show_price_after_labels input', function() { + const $input = $( this ), + $list = $input.closest( '.wpforms-field-option-group-basic' ).find( '.wpforms-field-option-row-choices .choices-list' ); + + app.fieldChoiceUpdate( $list.data( 'field-type' ), $list.data( 'field-id' ) ); + } ); + + $builder + .on( 'input', '.wpforms-field-option-row-preview-notice textarea', app.updatePreviewNotice ) + .on( 'change', '.wpforms-field-option-row-preview-notice-enable input', app.toggleEntryPreviewNotice ) + .on( 'wpformsFieldAdd', app.maybeLockEntryPreviewGroupOnAdd ) + .on( 'wpformsFieldMove', app.maybeLockEntryPreviewGroupOnMove ) + .on( 'click', '.wpforms-entry-preview-block', app.entryPreviewBlockField ); + + app.defaultStateEntryPreviewNotice(); + }, + + /** + * Event handler for the Read-Only toggle. + * + * @since 1.9.8 + */ + fieldReadOnlyToggleChange() { + const $input = $( this ); + const fieldId = Number( $input.closest( '.wpforms-field-option-row' ).data( 'field-id' ) ); + const isChecked = $input.is( ':checked' ); + const $dependentToggles = $( `#wpforms-field-option-row-${ fieldId }-required, #wpforms-field-option-row-${ fieldId }-unique_answer` ); + const $requiredInput = $dependentToggles.filter( '.wpforms-field-option-row-required' ).find( 'input' ); + + // Disable/Enable the dependent toggles. + app.fieldReadOnlyToggleDependentToggles( $dependentToggles, isChecked ); + + // Toggle CSS classes in the field preview container. + $( `#wpforms-field-${ fieldId }` ) + .toggleClass( 'readonly', isChecked ) + .toggleClass( 'required', $requiredInput.is( ':checked' ) ); + }, + + /** + * Disable/Enable the dependent toggles. + * + * @since 1.9.8 + * + * @param {Object} $toggles jQuery object with toggles to operate. + * @param {boolean} disable True to disable, false to enable. + */ + fieldReadOnlyToggleDependentToggles( $toggles, disable = true ) { + $toggles.each( function() { + const $optionRow = $( this ); + const $optionInput = $optionRow.find( ':input' ); + const setDataChecked = disable ? $optionInput.is( ':checked' ) : null; + const setChecked = disable ? false : $optionInput.data( 'enabled-state-checked' ); + const setTitle = disable ? wp.i18n.__( 'Disabled because this field is set to Read-Only in the Advanced tab.', 'wpforms' ) : ''; + + $optionRow + .toggleClass( 'wpforms-disabled', disable ) + .find( '.wpforms-toggle-control' ) + .attr( 'title', setTitle ); + $optionInput + .data( 'enabled-state-checked', setDataChecked ) + .prop( 'checked', setChecked ) + .prop( 'disabled', disable ); + } ); + }, + + /** + * Check if we had focusout event from certain fields. + * + * @since 1.7.5 + */ + focusOutEvent() { + if ( elements.$focusOutTarget === null ) { + return; + } + + if ( elements.$defaultEmail.is( elements.$focusOutTarget ) ) { + const $field = elements.$focusOutTarget; + + $field.next( '.wpforms-alert' ).remove(); + + if ( $field.val() === '' ) { + return; + } + + $.get( + wpforms_builder.ajax_url, + { + nonce: wpforms_builder.nonce, + content: $field.val(), + action: 'wpforms_sanitize_default_email', + }, + function( res ) { + if ( res.success ) { + $field.val( res.data ); + $field.trigger( 'input' ); + + if ( ! res.data ) { + $field.after( '

    ' + wpforms_builder.restricted_default_email + '

    ' ); + } + } + } + ); + } + + elements.$focusOutTarget = null; + }, + + /** + * Determine if the field is disabled for selection/duplication/deletion. + * + * @since 1.7.1 + * + * @param {any} el DOM element or jQuery object of some container on the field preview. + * + * @return {boolean} True if actions are disabled. + */ + isFieldPreviewActionsDisabled( el ) { + return app.isFormPreviewActionsDisabled( el ) || + $( el ).closest( '.wpforms-field' ).hasClass( 'ui-sortable-disabled' ); + }, + + /** + * Determine if form wrapper has sorting locked. + * + * @since 1.7.6 + * + * @param {any} el DOM element or jQuery object of some container on the field preview. + * + * @return {boolean} True when form preview wrapper sorting is disabled. + */ + isFormPreviewActionsDisabled( el ) { + return $( el ).closest( '.wpforms-field-wrap' ).hasClass( 'ui-sortable-disabled' ); + }, + + /** + * Toggle field group visibility in the field sidebar. + * + * @since 1.0.0 + * + * @param {any} el DOM element or jQuery object. + * @param {string} action Action. + */ + fieldGroupToggle( el, action ) { + /** @type {JQ|jQuery} */ + const $this = $( el ); + let $buttons = $this.next( '.wpforms-add-fields-buttons' ); + const $group = $buttons.parent(); + let $icon = $this.find( 'i' ), + groupName = $this.data( 'group' ), + cookieName = 'wpforms_field_group_' + groupName; + + if ( action === 'click' ) { + if ( $group.hasClass( 'wpforms-closed' ) ) { + wpCookies.remove( cookieName ); + } else { + wpCookies.set( cookieName, 'true', 2592000 ); // 1 month + } + $icon.toggleClass( 'wpforms-angle-right' ); + $buttons.stop().slideToggle( '', function() { + $group.toggleClass( 'wpforms-closed' ); + } ); + + return; + } + + if ( action === 'load' ) { + $buttons = $this.find( '.wpforms-add-fields-buttons' ); + $icon = $this.find( '.wpforms-add-fields-heading i' ); + groupName = $this.find( '.wpforms-add-fields-heading' ).data( 'group' ); + cookieName = 'wpforms_field_group_' + groupName; + + if ( wpCookies.get( cookieName ) === 'true' ) { + $icon.toggleClass( 'wpforms-angle-right' ); + $buttons.hide(); + $this.toggleClass( 'wpforms-closed' ); + } + } + }, + + /** + * Update description. + * + * @since 1.6.9 + * + * @param {jQuery} $el Element. + * @param {string} value Value. + */ + updateDescription( $el, value ) { + if ( $el.hasClass( 'nl2br' ) ) { + value = value.replace( /\n/g, '
    ' ); + } + + $el.html( value ); + }, + + /** + * Set the default state for the entry preview notice field. + * + * @since 1.6.9 + */ + defaultStateEntryPreviewNotice() { + $( '.wpforms-field-option-row-preview-notice-enable input' ).each( function() { + $( this ).trigger( 'change' ); + } ); + }, + + /** + * Update a preview notice for the field preview. + * + * @since 1.6.9 + */ + updatePreviewNotice() { + const $this = $( this ); + let value = wpf.sanitizeHTML( $this.val() ).trim(); + const id = $this.parent().data( 'field-id' ), + $field = $( '#wpforms-field-' + id ).find( '.wpforms-entry-preview-notice' ); + + value = value ? value : wpforms_builder.entry_preview_default_notice; + + app.updateDescription( $field, value ); + }, + + /** + * Show/hide entry preview notice for the field preview. + * + * @since 1.6.9 + */ + toggleEntryPreviewNotice() { + const $this = $( this ), + id = $this.closest( '.wpforms-field-option' ).data( 'field-id' ), + $field = $( '#wpforms-field-' + id ), + $noticeField = $( '#wpforms-field-option-' + id + ' .wpforms-field-option-row-preview-notice' ), + $notice = $field.find( '.wpforms-entry-preview-notice' ), + $defaultNotice = $field.find( '.wpforms-alert-info' ); + + if ( $this.is( ':checked' ) ) { + $defaultNotice.hide(); + $notice.show(); + $noticeField.show(); + + return; + } + + $noticeField.hide(); + $notice.hide(); + $defaultNotice.show(); + }, + + /** + * Delete a field. + * + * @param {number} id Field ID. + * + * @since 1.0.0 + * @since 1.6.9 Add the entry preview logic. + */ + fieldDelete( id ) { + const $field = $( '#wpforms-field-' + id ), + type = $field.data( 'field-type' ); + + if ( type === 'pagebreak' && $field.hasClass( 'wpforms-field-entry-preview-not-deleted' ) ) { + app.youCantRemovePageBreakFieldPopup(); + + return; + } + + if ( $field.hasClass( 'no-delete' ) ) { + app.youCantRemoveFieldPopup(); + + return; + } + + app.confirmFieldDeletion( id, type ); + }, + + /** + * Show the error message in the popup that you cannot remove the page break field. + * + * @since 1.6.9 + */ + youCantRemovePageBreakFieldPopup() { + $.alert( { + title: wpforms_builder.heads_up, + content: wpforms_builder.entry_preview_require_page_break, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Show the error message in the popup that you cannot reorder the field. + * + * @since 1.7.1 + * @since 1.7.7 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.DragFields.youCantReorderFieldPopup()` instead. + */ + youCantReorderFieldPopup() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.youCantReorderFieldPopup()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.youCantReorderFieldPopup()" function instead!' ); + + WPForms.Admin.Builder.DragFields.youCantReorderFieldPopup(); + }, + + /** + * Show the error message in the popup that you cannot remove the field. + * + * @since 1.6.9 + */ + youCantRemoveFieldPopup() { + $.alert( { + title: wpforms_builder.field_locked, + content: wpforms_builder.field_locked_no_delete_msg, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.close, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Error alert displayed for invalid From Email Notification field. + * + * @since 1.8.1 + * @deprecated 1.9.5 + * + * @param {string} msg Message. + */ + validationErrorNotificationPopup( msg ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.validationErrorNotificationPopup()" has been deprecated.' ); + + $.alert( { + title: wpforms_builder.heads_up, + content: msg, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.close, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Show the confirmation popup before the field deletion. + * + * @param {number} id Field ID. + * @param {string} type Field type. + * + * @since 1.6.9 + */ + confirmFieldDeletion( id, type ) { + const fieldData = { + id, + message: wpforms_builder.delete_confirm, + }; + + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsBeforeFieldDeleteAlert', [ fieldData, type ] ); + + // Allow callbacks on `wpformsBeforeFieldDeleteAlert` to prevent field deletion by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return; + } + + $.confirm( { + title: false, + content: fieldData.message, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + app.fieldDeleteById( id ); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + }, + + /** + * Remove the field by ID. + * + * @since 1.6.9 + * + * @param {number} id Field ID. + * @param {string} type Field type (deprecated) + * @param {number} duration Duration of animation. + */ + fieldDeleteById( id, type = '', duration = 400 ) { + $( `#wpforms-field-${ id }` ).fadeOut( duration, function() { + const $field = $( this ); + const $layoutParents = $field.parents( '.wpforms-field-layout-columns' ); + + type = $field.data( 'field-type' ); + + $builder.trigger( 'wpformsBeforeFieldDelete', [ id, type ] ); + + $field.remove(); + $( '#wpforms-field-option-' + id ).remove(); + $( '.wpforms-field, .wpforms-title-desc' ).removeClass( 'active' ); + app.fieldTabToggle( 'add-fields' ); + + const $fieldsOptions = $( '.wpforms-field-option' ), + $submitButton = $builder.find( '.wpforms-field-submit' ); + + // No fields remains. + if ( $fieldsOptions.length < 1 ) { + elements.$sortableFieldsWrap.append( elements.$noFieldsPreview.clone() ); + elements.$fieldOptions.append( elements.$noFieldsOptions.clone() ); + $submitButton.hide(); + } + + // Only Layout fields remains. + if ( ! $fieldsOptions.filter( ':not(.wpforms-field-option-layout)' ).length ) { + $submitButton.hide(); + } + + $builder.trigger( 'wpformsFieldDelete', [ id, type, $layoutParents ] ); + } ); + }, + + /** + * Determine which sections to activate for each panel. + * + * @since 1.9.3 + */ + determineActiveSections() { + const sectionFromUrl = wpf.getQueryString( 'section' ); + + // Gets the section to activate based on the URL. + const getSectionFromUrl = ( $panel, sectionFromUrl ) => { + if ( ! sectionFromUrl || ! $panel.hasClass( 'active' ) ) { + return null; + } + + const $sectionElement = $panel.find( `.wpforms-panel-sidebar-section[data-section="${ sectionFromUrl }"]` ); + + // Skip non-existing or non-accessible section. + if ( $sectionElement.length === 0 || $sectionElement.hasClass( 'wpforms-panel-sidebar-section-no-access' ) ) { + return null; + } + + return $sectionElement; + }; + + // Gets the configured section within a panel to activate, if available. + const getConfiguredSection = ( $panel ) => { + const $configuredSection = $panel.find( '.wpforms-panel-sidebar-section.configured' ).first(); + + return $configuredSection.length ? $configuredSection : null; + }; + + // Gets the first available section in the sidebar to activate. + const getFirstAvailableSection = ( $panel ) => { + return $panel.find( '.wpforms-panel-sidebar-section:first-of-type' ); + }; + + // Activates the specified section within a panel and its corresponding content section. + const activateSection = ( $panel, $sectionToActivate ) => { + if ( ! $sectionToActivate ) { + return; + } + + const sectionNameToActivate = $sectionToActivate.data( 'section' ); + $sectionToActivate.addClass( 'active' ); + const $contentSection = $panel.find( `.wpforms-panel-content-section-${ sectionNameToActivate }` ); + + if ( $contentSection.length ) { + $contentSection.show().addClass( 'active' ); + $panel.find( '.wpforms-panel-content-section-default' ).toggle( sectionNameToActivate === 'default' ); + } else { + $panel.find( '.wpforms-panel-content-section-default' ).show().addClass( 'active' ); + } + + WPFormsUtils.triggerEvent( $builder, 'wpformsPanelSectionSwitch', sectionNameToActivate ); + }; + + // Iterate through each panel and determine which section to activate. + $( '.wpforms-panel' ).each( function() { + const $panel = $( this ); + const $sectionToActivate = getSectionFromUrl( $panel, sectionFromUrl ) || + getConfiguredSection( $panel ) || + getFirstAvailableSection( $panel ); + + activateSection( $panel, $sectionToActivate ); + } ); + }, + + /** + * Load entry preview fields. + * + * @since 1.6.9 + */ + loadEntryPreviewFields() { + const $fields = $( '#wpforms-panel-fields .wpforms-field-wrap .wpforms-field-entry-preview' ); + + if ( ! $fields.length ) { + return; + } + + $fields.each( function() { + app.lockEntryPreviewFieldsPosition( $( this ).data( 'field-id' ) ); + } ); + }, + + /** + * Delete the entry preview field from the form preview. + * + * @since 1.6.9 + * + * @param {Event} event Event. + * @param {number} id Field ID. + * @param {string} type Field type. + */ + fieldEntryPreviewDelete( event, id, type ) { + if ( 'entry-preview' !== type ) { + return; + } + + const $field = $( '#wpforms-field-' + id ), + $previousPageBreakField = $field.prevAll( '.wpforms-field-pagebreak' ).first(), + $nextPageBreakField = $field.nextAll( '.wpforms-field-pagebreak' ).first(), + nextPageBreakId = $nextPageBreakField.data( 'field-id' ), + $nextPageBreakOptions = $( '#wpforms-field-option-' + nextPageBreakId ); + + $previousPageBreakField.removeClass( 'wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted' ); + $nextPageBreakOptions.find( '.wpforms-entry-preview-block' ).removeClass( 'wpforms-entry-preview-block' ); + + $builder.trigger( 'wpformsFieldDragToggle', [ $previousPageBreakField.data( 'field-id' ), $previousPageBreakField.data( 'field-type' ) ] ); + }, + + /** + * Maybe lock the entry preview and fields nearby after the move event. + * + * @since 1.6.9 + * + * @param {Event} e Event. + * @param {Object} ui UI sortable object. + */ + maybeLockEntryPreviewGroupOnMove( e, ui ) { + if ( ! ui.item.hasClass( 'wpforms-field-pagebreak' ) ) { + return; + } + + app.maybeLockEntryPreviewGroupOnAdd( e, ui.item.data( 'field-id' ), 'pagebreak' ); + }, + + /** + * Maybe lock the entry preview and fields nearby after adding the event. + * + * @since 1.6.9 + * + * @param {Event} e Event. + * @param {number} fieldId Field id. + * @param {string} type Field type. + */ + maybeLockEntryPreviewGroupOnAdd( e, fieldId, type ) { + if ( type !== 'pagebreak' ) { + return; + } + + const $currentField = $( '#wpforms-field-' + fieldId ), + $prevField = $currentField.prevAll( '.wpforms-field-entry-preview,.wpforms-field-pagebreak' ).first(), + $nextField = $currentField.nextAll( '.wpforms-field-entry-preview,.wpforms-field-pagebreak' ).first(); + + if ( ! $prevField.hasClass( 'wpforms-field-entry-preview' ) && ! $nextField.hasClass( 'wpforms-field-entry-preview' ) ) { + return; + } + + const $currentFieldPrevToggle = $( '#wpforms-field-option-' + fieldId + ' .wpforms-field-option-row-prev_toggle' ), + $currentFieldPrevToggleField = $currentFieldPrevToggle.find( 'input' ), + $nextFieldPrevToggle = $( '#wpforms-field-option-' + $nextField.data( 'field-id' ) + ' .wpforms-field-option-row-prev_toggle' ); + + if ( $prevField.hasClass( 'wpforms-field-entry-preview' ) ) { + $currentFieldPrevToggleField.attr( 'checked', 'checked' ).trigger( 'change' ); + $currentFieldPrevToggle.addClass( 'wpforms-entry-preview-block' ); + $nextFieldPrevToggle.removeClass( 'wpforms-entry-preview-block' ); + + return; + } + + const prevFieldId = $prevField.data( 'field-id' ), + $prevFieldPrevToggle = $( '#wpforms-field-option-' + prevFieldId + ' .wpforms-field-option-row-prev_toggle' ), + $prevFieldPrevToggleField = $prevFieldPrevToggle.find( 'input' ); + + $currentField.addClass( 'wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted' ); + $builder.trigger( 'wpformsFieldDragToggle', [ fieldId, type ] ); + $prevField.removeClass( 'wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted' ); + $builder.trigger( 'wpformsFieldDragToggle', [ prevFieldId, $prevField.data( 'field-type' ) ] ); + + if ( $prevField.prevAll( '.wpforms-field-entry-preview,.wpforms-field-pagebreak' ).first().hasClass( 'wpforms-field-entry-preview' ) ) { + $prevFieldPrevToggleField.attr( 'checked', 'checked' ).trigger( 'change' ); + $prevFieldPrevToggle.addClass( 'wpforms-entry-preview-block' ); + } + }, + + /** + * Show the error popup that the entry preview field blocks the field. + * + * @since 1.6.9 + * + * @param {Event} e Event. + */ + entryPreviewBlockField( e ) { + e.preventDefault(); + + $.alert( { + title: wpforms_builder.heads_up, + content: wpforms_builder.entry_preview_require_previous_button, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Is it an entry preview field that should be checked before adding? + * + * @since 1.6.9 + * + * @param {string} type Field type. + * @param {Object} options Field options. + * + * @return {boolean} True when we should check it. + */ + isUncheckedEntryPreviewField( type, options ) { + // eslint-disable-next-line no-mixed-operators + return type === 'entry-preview' && ( ! options || options && ! options.passed ); + }, + + /** + * Add an entry preview field to the form preview. + * + * @since 1.6.9 + * + * @param {string} type Field type. + * @param {Object} options Field options. + */ + addEntryPreviewField( type, options ) { // eslint-disable-line complexity + const addButton = $( '#wpforms-add-fields-entry-preview' ); + + if ( addButton.hasClass( 'wpforms-entry-preview-adding' ) ) { + return; + } + + const $fields = $( '#wpforms-panel-fields .wpforms-field-wrap > .wpforms-field' ), + position = options?.position ? options.position : $fields.length, + needPageBreakBefore = app.isEntryPreviewFieldRequiresPageBreakBefore( $fields, position ), + needPageBreakAfter = app.isEntryPreviewFieldRequiresPageBreakAfter( $fields, position ); + + addButton.addClass( 'wpforms-entry-preview-adding' ); + + if ( ! options ) { + options = {}; + } + + options.passed = true; + + if ( ! needPageBreakBefore && ! needPageBreakAfter ) { + app.fieldAdd( 'entry-preview', options ).done( function( res ) { + app.lockEntryPreviewFieldsPosition( res.data.field.id ); + } ); + + return; + } + + if ( needPageBreakBefore ) { + app.addPageBreakAndEntryPreviewFields( options, position ); + + return; + } + + app.addEntryPreviewAndPageBreakFields( options, position ); + }, + + /** + * Add the entry preview field after the page break field. + * We should wait for the page break adding to avoid id duplication. + * + * @since 1.6.9 + * + * @param {Object} options Field options. + */ + addEntryPreviewFieldAfterPageBreak( options ) { + const checkExist = setInterval( function() { + if ( $( '#wpforms-panel-fields .wpforms-field-wrap' ).find( '.wpforms-pagebreak-bottom, .wpforms-pagebreak-top' ).length === 2 ) { + app.fieldAdd( 'entry-preview', options ).done( function( res ) { + app.lockEntryPreviewFieldsPosition( res.data.field.id ); + } ); + clearInterval( checkExist ); + } + }, 100 ); + }, + + /** + * Add the entry preview field after the page break field. + * + * @since 1.6.9 + * + * @param {Object} options Field options. + * @param {number} position The field position. + */ + addPageBreakAndEntryPreviewFields( options, position ) { + const hasPageBreak = $( '#wpforms-panel-fields .wpforms-field-wrap > .wpforms-field-pagebreak' ).length >= 3; + + app.fieldAdd( 'pagebreak', { position } ).done( function( res ) { + options.position = hasPageBreak ? position + 1 : position + 2; + app.addEntryPreviewFieldAfterPageBreak( options ); + + const $pageBreakOptions = $( '#wpforms-field-option-' + res.data.field.id ), + $pageBreakPrevToggle = $pageBreakOptions.find( '.wpforms-field-option-row-prev_toggle' ), + $pageBreakPrevToggleField = $pageBreakPrevToggle.find( 'input' ); + + $pageBreakPrevToggleField.attr( 'checked', 'checked' ).trigger( 'change' ); + $pageBreakPrevToggle.addClass( 'wpforms-entry-preview-block' ); + } ); + }, + + /** + * Duplicate field. + * + * @since 1.2.9 + * + * @param {string} id Field id. + */ + fieldDuplicate( id ) { + const $field = $( `#wpforms-field-${ id }` ); + + if ( $field.hasClass( 'no-duplicate' ) ) { + $.alert( { + title: wpforms_builder.field_locked, + content: wpforms_builder.field_locked_no_duplicate_msg, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.close, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + + return; + } + + $.confirm( { + title: false, + content: wpforms_builder.duplicate_confirm, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + // Disable the current button to avoid firing multiple click events. + // By default, "jconfirm" tends to destroy any modal DOM element upon button click. + this.$$confirm.prop( 'disabled', true ); + + const beforeEvent = WPFormsUtils.triggerEvent( $builder, 'wpformsBeforeFieldDuplicate', [ id, $field ] ); + + // Allow callbacks on `wpformsFieldBeforeDuplicate` to cancel field duplication. + if ( beforeEvent.isDefaultPrevented() ) { + return; + } + + const newFieldId = app.fieldDuplicateRoutine( id, true ), + $newField = $( `#wpforms-field-${ newFieldId }` ); + + // Lastly, update the next ID stored in the database. + app.increaseNextFieldIdAjaxRequest(); + + WPFormsUtils.triggerEvent( $builder, 'wpformsFieldDuplicated', [ id, $field, newFieldId, $newField ] ); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + }, + + /** + * Update the next ID stored in the database. + * + * @since 1.7.7 + */ + increaseNextFieldIdAjaxRequest() { + /* eslint-disable camelcase */ + $.post( + wpforms_builder.ajax_url, + { + form_id: s.formID, + field_id: elements.$nextFieldId.val(), + nonce: wpforms_builder.nonce, + action: 'wpforms_builder_increase_next_field_id', + } + ); + }, + + /** + * Duplicate field routine. + * + * @since 1.7.7 + * + * @param {number|string} id Field ID. + * @param {boolean} changeLabel Is it necessary to change the label and add a copy suffix. + * + * @return {number} New field ID. + */ + fieldDuplicateRoutine( id, changeLabel = true ) { // eslint-disable-line max-lines-per-function, complexity + const $field = $( `#wpforms-field-${ id }` ), + $fieldOptions = $( `#wpforms-field-option-${ id }` ), + $fieldActive = elements.$sortableFieldsWrap.find( '>.active' ), + $visibleOptions = elements.$fieldOptions.find( '>:visible' ), + $visibleTab = $visibleOptions.find( '>.active' ), + type = $field.data( 'field-type' ), + fieldOptionsClass = $fieldOptions.attr( 'class' ), + isModernDropdown = app.dropdownField.helpers.isModernSelect( $field.find( '> .choices .primary-input' ) ); + + // Restore tooltips before cloning. + wpf.restoreTooltips( $fieldOptions ); + + // Force Modern Dropdown conversion to classic before cloning. + if ( isModernDropdown ) { + app.dropdownField.helpers.convertModernToClassic( id ); + } + + let newFieldOptions = $fieldOptions.html(); + + const $newField = $field.clone(), + newFieldID = parseInt( elements.$nextFieldId.val(), 10 ), + $fieldLabel = $( `#wpforms-field-option-${ id }-label` ), + fieldLabelVal = $fieldLabel.length ? $fieldLabel.val() : $( `#wpforms-field-option-${ id }-name` ).val(), + nextID = newFieldID + 1, + regex = {}; + + const newFieldLabel = fieldLabelVal !== '' + ? `${ fieldLabelVal } ${ wpforms_builder.duplicate_copy }` + : `${ wpforms_builder.field } #${ id } ${ wpforms_builder.duplicate_copy }`; + + regex.fieldOptionsID = new RegExp( 'ID #' + id, 'g' ); + regex.fieldID = new RegExp( 'fields\\[' + id + '\\]', 'g' ); + regex.dataFieldID = new RegExp( 'data-field-id="' + id + '"', 'g' ); + regex.referenceID = new RegExp( 'data-reference="' + id + '"', 'g' ); + regex.elementID = new RegExp( '\\b(id|for)="wpforms-(.*?)' + id + '(.*?)"', 'ig' ); + + // Toggle visibility states. + $field.after( $newField ); + $fieldActive.removeClass( 'active' ); + $newField.addClass( 'active' ).attr( { + id: `wpforms-field-${ newFieldID }`, + 'data-field-id': newFieldID, + } ); + + // Various regexes to adjust the field options to work with the new field ID. + regex.elementIdReplace = function( match, p1, p2, p3 ) { + return `${ p1 }="wpforms-${ p2 }${ newFieldID }${ p3 }"`; + }; + + newFieldOptions = newFieldOptions.replace( regex.fieldOptionsID, `ID #${ newFieldID }` ); + newFieldOptions = newFieldOptions.replace( regex.fieldID, `fields[${ newFieldID }]` ); + newFieldOptions = newFieldOptions.replace( regex.dataFieldID, `data-field-id="${ newFieldID }"` ); + newFieldOptions = newFieldOptions.replace( regex.referenceID, `data-reference="${ newFieldID }"` ); + newFieldOptions = newFieldOptions.replace( regex.elementID, regex.elementIdReplace ); + + // Hide all field options panels. + $visibleOptions.hide(); + + // Add a new field options panel. + $fieldOptions.after( `
    ${ newFieldOptions }
    ` ); + + // Get a new field options panel. + const $newFieldOptions = $( `#wpforms-field-option-${ newFieldID }` ); + + // If the user duplicates an active field. + if ( $fieldActive.data( 'field-id' ) === id && $visibleTab.length ) { + // The following will help identify which tab from the sidebar panel settings is currently being viewed, + // i.e., "General," "Advanced," "Smart Logic," etc. + const visibleTabClassName = $visibleTab.attr( 'class' ).match( /wpforms-field-option-group-\S*/i )[ 0 ]; + const $newFieldOptionsTab = $newFieldOptions.find( `>.${ visibleTabClassName }` ); + + // Remove any left-over state from previously duplicated options. + $newFieldOptions.find( '>' ).removeClass( 'active' ); + + // Set the active tab to the same tab that was active before the duplication. + $newFieldOptionsTab.addClass( 'active' ); + } + + // If the user duplicates an inactive field. + if ( $fieldActive.data( 'field-id' ) !== id && $visibleTab.length ) { + // Remove the active class from the current active tab. + $newFieldOptions.find( '>' ).removeClass( 'active' ); + + // Set the active tab to "General". + $newFieldOptions.find( '>.wpforms-field-option-group-basic' ).addClass( 'active' ); + } + + // Copy over values. + $fieldOptions.find( ':input' ).each( function() { // eslint-disable-line complexity + const $this = $( this ), + name = $this.attr( 'name' ); + + if ( ! name ) { + return 'continue'; + } + + const newName = name.replace( regex.fieldID, `fields[${ newFieldID }]` ), + type = $this.attr( 'type' ); + + if ( type === 'checkbox' || type === 'radio' ) { + if ( $this.is( ':checked' ) ) { + $newFieldOptions.find( `[name="${ newName }"]` ) + .prop( 'checked', true ) + .attr( 'checked', 'checked' ); + } else { + $newFieldOptions.find( `[name="${ newName }"]` ) + .prop( 'checked', false ) + .attr( 'checked', false ); + } + + return; + } + + if ( $this.is( 'select' ) ) { + if ( $this.find( 'option:selected' ).length ) { + const optionVal = $this.find( 'option:selected' ).val(); + + $newFieldOptions.find( `[name="${ newName }"]` ) + .find( `[value="${ optionVal }"]` ) + .prop( 'selected', true ); + } + + return; + } + + const value = $this.val(); + + if ( value === '' && $this.hasClass( 'wpforms-money-input' ) ) { + $newFieldOptions.find( `[name="${ newName }"]` ).val( + wpf.numberFormat( '0', wpforms_builder.currency_decimals, wpforms_builder.currency_decimal, wpforms_builder.currency_thousands ) + ); + } else { + // We've removed the empty value check here. + // If we are duplicating a field with no value, we should respect that. + $newFieldOptions.find( `[name="${ newName }"]` ).val( value ); + } + } ); + + // ID adjustments. + $newFieldOptions.find( '.wpforms-field-option-hidden-id' ).val( newFieldID ); + elements.$nextFieldId.val( nextID ); + + const $newFieldLabel = type === 'html' ? $( `#wpforms-field-option-${ newFieldID }-name` ) : $( `#wpforms-field-option-${ newFieldID }-label` ); + + // Adjust the label to indicate this is a copy. + if ( changeLabel ) { + $newFieldLabel.val( newFieldLabel ).trigger( 'input' ); + } + + // Fire field adds custom event. + $builder.trigger( 'wpformsFieldAdd', [ newFieldID, type ] ); + + // Re-init tooltips for a new field options panel. + wpf.initTooltips(); + + // Re-init Modern Dropdown. + if ( isModernDropdown ) { + app.dropdownField.helpers.convertClassicToModern( id ); + app.dropdownField.helpers.convertClassicToModern( newFieldID ); + } + + // Re-init instance in choices related fields. + app.fieldChoiceUpdate( $newField.data( 'field-type' ), newFieldID ); + + // Re-init color pickers. + app.loadColorPickers(); + + return newFieldID; + }, + + /** + * Add the entry preview field before the page break field. + * + * @since 1.6.9 + * + * @param {Object} options Field options. + * @param {number} position The field position. + */ + addEntryPreviewAndPageBreakFields( options, position ) { + app.fieldAdd( 'entry-preview', options ).done( function( res ) { + const entryPreviewId = res.data.field.id; + + app.fieldAdd( 'pagebreak', { position: position + 1 } ).done( function( res ) { + app.lockEntryPreviewFieldsPosition( entryPreviewId ); + + const $pageBreakField = $( '#wpforms-field-' + res.data.field.id ), + $nextField = $pageBreakField.nextAll( '.wpforms-field-pagebreak, .wpforms-field-entry-preview' ).first(); + + if ( $nextField.hasClass( 'wpforms-field-entry-preview' ) ) { + app.lockEntryPreviewFieldsPosition( $nextField.data( 'field-id' ) ); + } + } ); + } ); + }, + + /** + * Stick an entry preview field after adding. + * + * @since 1.6.9 + * + * @param {number} id ID. + */ + lockEntryPreviewFieldsPosition( id ) { + const $entryPreviewField = $( '#wpforms-field-' + id ), + $pageBreakField = $entryPreviewField.prevAll( '.wpforms-field-pagebreak:not(.wpforms-pagebreak-bottom)' ).first(), + $nextPageBreakField = $entryPreviewField.nextAll( '.wpforms-field-pagebreak' ).first(), + nextPageBreakFieldId = $nextPageBreakField.data( 'field-id' ), + $pageBreakOptions = $( '#wpforms-field-option-' + nextPageBreakFieldId ), + $pageBreakPrevToggle = $pageBreakOptions.find( '.wpforms-field-option-row-prev_toggle' ), + $pageBreakPrevToggleField = $pageBreakPrevToggle.find( 'input' ); + + $entryPreviewField.addClass( 'wpforms-field-not-draggable' ); + $pageBreakField.addClass( 'wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted' ); + $pageBreakPrevToggleField.prop( 'checked', 'checked' ).trigger( 'change' ); + $pageBreakPrevToggle.addClass( 'wpforms-entry-preview-block' ); + $( '#wpforms-add-fields-entry-preview' ).removeClass( 'wpforms-entry-preview-adding' ); + + $builder.trigger( 'wpformsFieldDragToggle', [ id, $entryPreviewField.data( 'field-type' ) ] ); + $builder.trigger( 'wpformsFieldDragToggle', [ $pageBreakField.data( 'field-id' ), $pageBreakField.data( 'field-type' ) ] ); + }, + + /** + * An entry preview field requires a page break that locates before. + * + * @since 1.6.9 + * + * @param {jQuery} $fields List of fields in the form preview. + * @param {number} position The field position. + * + * @return {boolean} True if we need to add a page break field before. + */ + isEntryPreviewFieldRequiresPageBreakBefore( $fields, position ) { + const $beforeFields = $fields.slice( 0, position ).filter( '.wpforms-field-pagebreak,.wpforms-field-entry-preview' ); + let needPageBreakBefore = true; + + if ( ! $beforeFields.length ) { + return needPageBreakBefore; + } + + $( $beforeFields.get().reverse() ).each( function() { + const $this = $( this ); + + if ( $this.hasClass( 'wpforms-field-entry-preview' ) ) { + return false; + } + + if ( $this.hasClass( 'wpforms-field-pagebreak' ) && ! $this.hasClass( 'wpforms-field-stick' ) ) { + needPageBreakBefore = false; + + return false; + } + } ); + + return needPageBreakBefore; + }, + + /** + * An entry preview field requires a page break that locates after. + * + * @since 1.6.9 + * + * @param {jQuery} $fields List of fields in the form preview. + * @param {number} position The field position. + * + * @return {boolean} True if we need to add a page break field after. + */ + isEntryPreviewFieldRequiresPageBreakAfter( $fields, position ) { + const $afterFields = $fields.slice( position ).filter( '.wpforms-field-pagebreak,.wpforms-field-entry-preview' ); + let needPageBreakAfter = Boolean( $afterFields.length ); + + if ( ! $afterFields.length ) { + return needPageBreakAfter; + } + + $afterFields.each( function() { + const $this = $( this ); + + if ( $this.hasClass( 'wpforms-field-entry-preview' ) ) { + return false; + } + + if ( $this.hasClass( 'wpforms-field-pagebreak' ) ) { + needPageBreakAfter = false; + + return false; + } + } ); + + return needPageBreakAfter; + }, + + /** + * Add a new field. + * + * @since 1.0.0 + * @since 1.6.4 Added hCaptcha support. + * + * @param {string} type Field type. + * @param {Object} options Additional options. + * + * @return {Promise|void|jqXHR} jQuery.post() promise interface. + */ + fieldAdd( type, options ) { // eslint-disable-line max-lines-per-function + const $btn = $( `#wpforms-add-fields-${ type }` ); + + if ( $btn.hasClass( 'upgrade-modal' ) || $btn.hasClass( 'education-modal' ) || $btn.hasClass( 'warning-modal' ) ) { + return; + } + + if ( [ 'captcha_turnstile', 'captcha_hcaptcha', 'captcha_recaptcha', 'captcha_none' ].includes( type ) ) { + app.captchaUpdate(); + + return; + } + + adding = true; + + WPForms.Admin.Builder.DragFields.disableDragAndDrop(); + app.disableFormActions(); + + if ( app.isUncheckedEntryPreviewField( type, options ) ) { + app.addEntryPreviewField( type, options ); + + return; + } + + const defaults = { + position: 'bottom', + $sortable: 'base', + placeholder: false, + scroll: true, + defaults: false, + }; + + options = $.extend( {}, defaults, options ); + + const data = { + action: 'wpforms_new_field_' + type, + id: s.formID, + type, + defaults: options.defaults, + nonce: wpforms_builder.nonce, + }; + + return $.post( wpforms_builder.ajax_url, data, function( res ) { // eslint-disable-line complexity + if ( ! res.success ) { + wpf.debug( 'Add field AJAX call is unsuccessful:', res ); + + return; + } + + const $baseFieldsContainer = elements.$sortableFieldsWrap, + /** @type {JQ|jQuery} */ $newField = $( res.data.preview ), + /** @type {JQ|jQuery} */ $newOptions = $( res.data.options ); + + let $fieldContainer = options.$sortable; + + adding = false; + + $newField.css( 'display', 'none' ); + + if ( options.placeholder ) { + options.placeholder.remove(); + } + + if ( options.$sortable === 'default' || ! options.$sortable.length ) { + $fieldContainer = $baseFieldsContainer.find( '.wpforms-fields-sortable-default' ); + } + + if ( options.$sortable === 'base' || ! $fieldContainer.length ) { + $fieldContainer = $baseFieldsContainer; + } + + const event = WPFormsUtils.triggerEvent( + $builder, + 'wpformsBeforeFieldAddToDOM', + [ options, $newField, $newOptions, $fieldContainer ] + ); + + // Allow callbacks on `wpformsBeforeFieldAddToDOM` to cancel adding field + // by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return; + } + + // Add a field to the base level of fields. + // Allow callbacks on `wpformsBeforeFieldAddToDOM` to skip adding field to the base level + // by setting `event.skipAddFieldToBaseLevel = true`. + if ( ! event.skipAddFieldToBaseLevel ) { + app.fieldAddToBaseLevel( options, $newField, $newOptions ); + } + + $newField.fadeIn(); + + $builder.find( '.no-fields, .no-fields-preview' ).remove(); + + if ( $( '.wpforms-field-option:not(.wpforms-field-option-layout)' ).length ) { + $builder.find( '.wpforms-field-submit' ).show(); + } + + // Scroll to the added field. + if ( options.scroll && options.position.length ) { + app.scrollPreviewToField( res.data.field.id ); + } + + // Update next field id hidden input value. + elements.$nextFieldId.val( res.data.field.id + 1 ); + + wpf.initTooltips(); + app.loadColorPickers(); + app.toggleAllOptionGroups(); + + $builder.trigger( 'wpformsFieldAdd', [ res.data.field.id, type ] ); + } ).fail( function( xhr ) { + adding = false; + + wpf.debug( 'Add field AJAX call failed:', xhr.responseText ); + } ).always( function() { + if ( ! adding ) { + WPForms.Admin.Builder.DragFields.enableDragAndDrop(); + app.enableFormActions(); + } + } ); + }, + + /** + * Add a new field to the base level of fields. + * + * @since 1.7.7 + * + * @param {Options} options Field add additional options. + * @param {jQuery} $newField New field preview object. + * @param {jQuery} $newOptions New field options object. + */ + fieldAddToBaseLevel( options, $newField, $newOptions ) { // eslint-disable-line complexity + const $baseFieldsContainer = elements.$sortableFieldsWrap, + $baseFields = $baseFieldsContainer.children( ':not(.wpforms-field-drag-pending, .no-fields-preview)' ), + totalBaseFields = $baseFields.length; + + const $fieldOptions = elements.$fieldOptions; + + if ( options.position === 'top' ) { + // Add a field to the top of base level fields. + $baseFieldsContainer.prepend( $newField ); + $fieldOptions.prepend( $newOptions ); + + return; + } + + const $lastBaseField = $baseFields.last(); + + if ( + options.position === 'bottom' && ( + ! $lastBaseField.length || + ! $lastBaseField.hasClass( 'wpforms-field-stick' ) + ) + ) { + // Add a field to the bottom of base level fields. + $baseFieldsContainer.append( $newField ); + $fieldOptions.append( $newOptions ); + + return; + } + + if ( options.position === 'bottom' ) { + options.position = totalBaseFields; + } + + if ( + options.position === totalBaseFields && + $lastBaseField.length && $lastBaseField.hasClass( 'wpforms-field-stick' ) + ) { + const lastBaseFieldId = $lastBaseField.data( 'field-id' ); + + // Check to see if the last field we have is configured to + // be stuck to the bottom, if so, add the field above it. + $lastBaseField.before( $newField ); + $fieldOptions.find( `#wpforms-field-option-${ lastBaseFieldId }` ).before( $newOptions ); + + return; + } + + const $fieldInPosition = $baseFields.eq( options.position ); + + if ( $fieldInPosition.length ) { + const fieldInPositionId = $fieldInPosition.data( 'field-id' ); + + // Add a field to a specific location. + $fieldInPosition.before( $newField ); + $fieldOptions.find( `#wpforms-field-option-${ fieldInPositionId }` ).before( $newOptions ); + + return; + } + + // Something is wrong. Add the field. This should never occur. + $baseFieldsContainer.append( $newField ); + $fieldOptions.append( $newOptions ); + }, + + /** + * Scroll the preview panel to the desired field. + * + * @since 1.7.7 + * + * @param {number} fieldId Field ID. + */ + scrollPreviewToField( fieldId ) { + const $field = $( `#wpforms-field-${ fieldId }` ), + scrollTop = elements.$fieldsPreviewWrap.scrollTop(), + $layoutField = $field.closest( '.wpforms-field-layout' ); + + let fieldPosition = $field.position().top; + + if ( $layoutField.length ) { + fieldPosition = $layoutField.position().top + fieldPosition + 20; + } + + const scrollAmount = fieldPosition > scrollTop ? fieldPosition - scrollTop : fieldPosition + scrollTop; + + elements.$fieldsPreviewWrap.scrollTop( scrollAmount ); + }, + + /** + * Update CAPTCHA form setting. + * + * @since 1.6.4 + * + * @return {Object} jqXHR. + */ + captchaUpdate() { + const data = { + action: 'wpforms_update_field_captcha', + id: s.formID, + nonce: wpforms_builder.nonce, + }; + + return $.post( wpforms_builder.ajax_url, data, function( res ) { + if ( res.success ) { + const args = { + title: false, + content: false, + icon: 'fa fa-exclamation-circle', + type: 'orange', + boxWidth: '450px', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + }, + $enableCheckbox = $( '#wpforms-panel-field-settings-recaptcha' ); + let caseName = res.data.current; + + $enableCheckbox.data( 'provider', res.data.provider ); + + // Possible cases: + // + // not_configured - IF CAPTCHA is not configured in the WPForms plugin settings + // configured_not_enabled - IF CAPTCHA is configured in WPForms plugin settings, but wasn't set in form settings + // configured_enabled - IF CAPTCHA is configured in WPForms plugin and form settings + if ( 'configured_not_enabled' === caseName || 'configured_enabled' === caseName ) { + // Get a correct case name. + caseName = $enableCheckbox.prop( 'checked' ) ? 'configured_enabled' : 'configured_not_enabled'; + + // Check/uncheck a `CAPTCHA` checkbox in form setting. + args.buttons.confirm.action = function() { + $enableCheckbox.prop( 'checked', ( 'configured_not_enabled' === caseName ) ).trigger( 'change' ); + }; + } + + args.title = res.data.cases[ caseName ].title; + args.content = res.data.cases[ caseName ].content; + + // Do you need a Cancel button? + if ( res.data.cases[ caseName ].cancel ) { + args.buttons.cancel = { + text: wpforms_builder.cancel, + keys: [ 'esc' ], + }; + } + + // Call a Confirm modal. + $.confirm( args ); + } else { + // eslint-disable-next-line no-console + console.log( res ); + } + } ).fail( function( xhr ) { + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + }, + + /** + * Disable drag & drop. + * + * @since 1.7.1 + * @since 1.7.7 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.DragFields.disableDragAndDrop()` instead. + */ + disableDragAndDrop() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.disableDragAndDrop()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.disableDragAndDrop()" function instead!' ); + + WPForms.Admin.Builder.DragFields.disableDragAndDrop(); + }, + + /** + * Enable drag & drop. + * + * @since 1.7.1 + * @since 1.7.7 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.DragFields.enableDragAndDrop()` instead. + */ + enableDragAndDrop() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.enableDragAndDrop()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.enableDragAndDrop()" function instead!' ); + + WPForms.Admin.Builder.DragFields.enableDragAndDrop(); + }, + + /** + * Disable Preview, Embed, Save form actions, and Form Builder exit button. + * + * @since 1.7.4 + */ + disableFormActions() { + $.each( + [ + elements.$previewButton, + elements.$embedButton, + elements.$saveButton, + elements.$exitButton, + ], + function( _index, button ) { + button.prop( 'disabled', true ).addClass( 'wpforms-disabled' ); + } + ); + }, + + /** + * Enable Preview, Embed, Save form actions, and Form Builder exit button. + * + * @since 1.7.4 + */ + enableFormActions() { + $.each( + [ + elements.$previewButton, + elements.$embedButton, + elements.$saveButton, + elements.$exitButton, + ], + function( _index, button ) { + button.prop( 'disabled', false ).removeClass( 'wpforms-disabled' ); + } + ); + }, + + /** + * Sortable fields in the builder form the preview area. + * + * @since 1.0.0 + * @since 1.7.7 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.DragFields.initSortableFields()` instead. + */ + fieldSortable() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.fieldSortable()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.initSortableFields()" function instead!' ); + + WPForms.Admin.Builder.DragFields.initSortableFields(); + }, + + /** + * Show a popup in case if the field is not draggable and cancel moving. + * + * @since 1.7.5 + * @since 1.7.6 The showPopUp parameter added. + * @since 1.7.7 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.DragFields.fieldDragDisable()` instead. + * + * @param {jQuery} $field A field or list of fields. + * @param {boolean} showPopUp Whether the pop-up should be displayed on a dragging attempt. + */ + fieldDragDisable( $field, showPopUp = true ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.fieldDragDisable()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.fieldDragDisable()" function instead!' ); + + WPForms.Admin.Builder.DragFields.fieldDragDisable( $field, showPopUp ); + }, + + /** + * Allow field dragging. + * + * @since 1.7.5 + * @since 1.7.7 Deprecated. + * + * @deprecated Use `WPForms.Admin.Builder.DragFields.fieldDragEnable()` instead. + * + * @param {jQuery} $field A field or list of fields. + */ + fieldDragEnable( $field ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.fieldDragEnable()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.fieldDragEnable()" function instead!' ); + + WPForms.Admin.Builder.DragFields.fieldDragEnable( $field ); + }, + + /** + * Add a new field choice. + * + * @since 1.0.0 + * + * @param {Event} event Event. + * @param {Element} el Element. + */ + fieldChoiceAdd( event, el ) { + event.preventDefault(); + + const $this = $( el ), + $parent = $this.parent(), + checked = $parent.find( 'input.default' ).is( ':checked' ), + fieldID = $this.closest( '.wpforms-field-option-row-choices' ).data( 'field-id' ); + let id = $parent.parent().attr( 'data-next-id' ); + const type = $parent.parent().data( 'field-type' ), + $choice = $parent.clone().insertAfter( $parent ); + + $choice.attr( 'data-key', id ); + $choice.find( '.wpforms-icon-select .ic-fa-preview' ).removeClass().addClass( 'ic-fa-preview ic-fa-' + wpforms_builder.icon_choices.default_icon_style + ' ic-fa-' + wpforms_builder.icon_choices.default_icon ); + $choice.find( '.wpforms-icon-select .ic-fa-preview + span' ).text( wpforms_builder.icon_choices.default_icon ); + $choice.find( '.preview' ).empty(); + $choice.find( '.wpforms-image-upload-add' ).show(); + $choice.find( '.wpforms-money-input' ).trigger( 'focusout' ); + + $choice.find( 'input, select' ).each( function() { + const $field = $( this ), + type = $field.attr( 'type' ); + + $field.attr( 'name', $( this ).attr( 'name' ).replace( /\[choices]\[(\d+)]/g, `[choices][${ id }]` ) ); + + if ( type === 'radio' || type === 'checkbox' ) { + $field.prop( 'checked', false ); + } else { + $field.val( '' ); + } + } ); + + $choice.find( '.wpforms-icon-select input.source-icon' ).val( wpforms_builder.icon_choices.default_icon ); + $choice.find( '.wpforms-icon-select input.source-icon-style' ).val( wpforms_builder.icon_choices.default_icon_style ); + + if ( checked === true ) { + $parent.find( 'input.default' ).prop( 'checked', true ); + } + + id++; + + $parent.parent().attr( 'data-next-id', id ); + $builder.trigger( 'wpformsFieldChoiceAdd', [ fieldID ] ); + app.fieldChoiceUpdate( type, fieldID ); + }, + + /** + * Delete field choice. + * + * @since 1.0.0 + * + * @param {Event} e Event. + * @param {Element} el Element. + */ + fieldChoiceDelete( e, el ) { + e.preventDefault(); + + const $this = $( el ), + $list = $this.parent().parent(), + total = $list.find( 'li' ).not( '.wpforms-choice-other-option' ).length, + fieldData = { + id: $list.data( 'field-id' ), + choiceId: $this.closest( 'li' ).data( 'key' ), + message: '' + wpforms_builder.delete_choice_confirm + '', + trigger: false, + }; + + $builder.trigger( 'wpformsBeforeFieldDeleteAlert', [ fieldData ] ); + + if ( total === 1 ) { + app.fieldChoiceDeleteAlert(); + } else { + const deleteChoice = function() { + $this.parent().remove(); + app.fieldChoiceUpdate( $list.data( 'field-type' ), $list.data( 'field-id' ) ); + $builder.trigger( 'wpformsFieldChoiceDelete', [ $list.data( 'field-id' ) ] ); + }; + + if ( ! fieldData.trigger ) { + deleteChoice(); + + return; + } + + $.confirm( { + title: false, + content: fieldData.message, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + deleteChoice(); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + } + }, + + /** + * Field choice delete error alert. + * + * @since 1.6.7 + */ + fieldChoiceDeleteAlert() { + $.alert( { + title: false, + content: wpforms_builder.error_choice, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Make field choices sortable. + * Currently used for select, radio, and checkboxes field types. + * + * @since 1.0.0 + * + * @param {string} type Type. + * @param {string|undefined} selector Selector. + */ + fieldChoiceSortable( type, selector = undefined ) { + selector = typeof selector !== 'undefined' ? selector : '.wpforms-field-option-' + type + ' .wpforms-field-option-row-choices ul'; + + $( selector ).one( 'mouseenter', function() { // eslint-disable-line max-lines-per-function + $( this ).sortable( { + items: 'li:not(.not-draggable)', + axis: 'y', + delay: 100, + opacity: 0.6, + handle: '.move', + stop( e, ui ) { + const id = ui.item.parent().data( 'field-id' ); + app.fieldChoiceUpdate( type, id ); + $builder.trigger( 'wpformsFieldChoiceMove', ui ); + }, + update() { + }, + } ); + } ); + }, + + /** + * Generate Choice label. + * Used in a field preview template. + * + * @since 1.6.2 + * + * @param {Object} data Template data. + * @param {number} choiceID Choice ID. + * + * @return {string} Label. + */ + fieldChoiceLabel( data, choiceID ) { // eslint-disable-line complexity + const isPaymentChoice = [ 'payment-multiple', 'payment-checkbox' ].includes( data.settings.type ), + isIconImageChoice = data.settings.choices_icons || data.settings.choices_images, + isEmptyLabel = typeof data.settings.choices[ choiceID ].label === 'undefined' || data.settings.choices[ choiceID ].label.length === 0; + + // Do not set a placeholder for an empty label in Icon and Image choices except for payment fields. + if ( isEmptyLabel && ! isPaymentChoice && isIconImageChoice ) { + return ''; + } + + const placeholder = isPaymentChoice ? wpforms_builder.payment_choice_empty_label_tpl : wpforms_builder.choice_empty_label_tpl; + let label = ! isEmptyLabel + ? wpf.sanitizeHTML( data.settings.choices[ choiceID ].label, wpforms_builder.allowed_label_html_tags ) + : placeholder.replace( '{number}', choiceID ); + + if ( data.settings.show_price_after_labels ) { + label += ' - ' + wpf.amountFormatCurrency( data.settings.choices[ choiceID ].value ); + } + + return label; + }, + + /** + * Update field choices in the preview area for the Fields panel. + * + * Currently used for select, radio, and checkboxes field types. + * + * @param {string} type Field type. + * @param {string|number} id Field ID. + * @param {number} count Number of choices to show, -1 if not set. + * + * @since 1.0.0 + */ + fieldChoiceUpdate: ( type, id, count = -1 ) => { // eslint-disable-line complexity, max-lines-per-function + const isDynamicChoices = app.dropdownField.helpers.isDynamicChoices( id ); + + if ( app.replaceChoicesWithTemplate( type, id, isDynamicChoices ) ) { + return; + } + + if ( count === -1 ) { + count = app.settings.choicesLimitLong; + } + + // Dropdown payment choices are of a select type. + if ( 'payment-select' === type ) { + type = 'select'; + } + + const $primary = $( '#wpforms-field-' + id + ' .primary-input' ); + + let newChoice = ''; + + if ( 'select' === type ) { + if ( ! isDynamicChoices ) { + newChoice = ''; + $primary.find( 'option' ).not( '.placeholder' ).remove(); + } + } else if ( 'radio' === type || 'checkbox' === type || 'gdpr-checkbox' === type ) { + type = 'gdpr-checkbox' === type ? 'checkbox' : type; + $primary.find( 'li' ).remove(); + newChoice = '
  1. {label}
  2. '; + } + + // Building an inner content for the Primary field. + const $choicesList = $( `#wpforms-field-option-row-${ id }-choices .choices-list` ), + $choicesToRender = $choicesList.find( 'li' ).slice( 0, count ), + hasDefaults = !! $choicesList.find( 'input.default:checked' ).length, + modernSelectChoices = [], + showPriceAfterLabels = $( '#wpforms-field-option-' + id + '-show_price_after_labels' ).prop( 'checked' ), + isModernSelect = app.dropdownField.helpers.isModernSelect( $primary ); + + $choicesToRender.get().forEach( function( item ) {// eslint-disable-line complexity + const $this = $( item ), + value = $this.find( 'input.value' ).val(), + choiceID = $this.data( 'key' ); + + let label = wpf.sanitizeHTML( $this.find( 'input.label' ).val().trim(), wpforms_builder.allowed_label_html_tags ), + $choice; + + label = label !== '' ? label : wpforms_builder.choice_empty_label_tpl.replace( '{number}', choiceID ); + label += ( showPriceAfterLabels && value ) ? ' - ' + wpf.amountFormatCurrency( value ) : ''; + + // Append a new choice. + if ( ! isModernSelect ) { + if ( ! isDynamicChoices ) { + $choice = $( newChoice.replace( /{label}/g, label ) ); + $primary.append( $choice ); + } + } else { + modernSelectChoices.push( + { + value: label, + label, + } + ); + } + + const selected = $this.find( 'input.default' ).is( ':checked' ); + + if ( true === selected ) { + switch ( type ) { + case 'select': + + if ( ! isModernSelect ) { + app.setClassicSelectedChoice( $choice ); + } else { + modernSelectChoices[ modernSelectChoices.length - 1 ].selected = true; + } + break; + case 'radio': + case 'checkbox': + $choice.find( 'input' ).prop( 'checked', 'true' ); + break; + } + } + } ); + + if ( isModernSelect ) { + const placeholderClass = $primary.prop( 'multiple' ) ? 'input.choices__input' : '.choices__inner .choices__placeholder', + choicesjsInstance = app.dropdownField.helpers.getInstance( $primary ); + + if ( ! isDynamicChoices ) { + choicesjsInstance.removeActiveItems(); + } + + choicesjsInstance.setChoices( modernSelectChoices, 'value', 'label', true ); + + // Re-initialize the modern dropdown to properly determine and update the placeholder. + app.dropdownField.helpers.update( id, isDynamicChoices ); + + // Hide/show a placeholder for Modern select if it has or not default choices. + $primary + .closest( '.choices' ) + .find( placeholderClass ) + .toggleClass( 'wpforms-hidden', hasDefaults ); + } + }, + + /** + * Generate Choice label. + * Used in a field preview template. + * + * @since 1.8.6 + * + * @param {string} type Field type. + * @param {number} id Field ID. + * @param {boolean} isDynamicChoices Whether the field has dynamic choices. + * + * @return {boolean} True if the template was used. + */ + replaceChoicesWithTemplate: ( type, id, isDynamicChoices ) => { // eslint-disable-line complexity + // Radio, Checkbox, and Payment Multiple/Checkbox use _ template. + if ( 'radio' !== type && 'checkbox' !== type && 'payment-multiple' !== type && 'payment-checkbox' !== type ) { + return false; + } + + const order = wpf.getChoicesOrder( id ), + tmpl = wp.template( 'wpforms-field-preview-checkbox-radio-payment-multiple' ); + + const fieldSettings = wpf.getField( id ), + slicedChoices = {}, + slicedOrder = order.slice( 0, app.settings.choicesLimit ), + data = { + settings: fieldSettings, + order: slicedOrder, + type: 'radio', + }; + + // If Icon Choices is on, get the valid color. + if ( fieldSettings.choices_icons ) { + // eslint-disable-next-line camelcase + data.settings.choices_icons_color = app.getValidColorPickerValue( $( '#wpforms-field-option-' + id + '-choices_icons_color' ) ); + } + + // Slice choices for preview. + slicedOrder.forEach( function( entry ) { + slicedChoices[ entry ] = fieldSettings.choices[ entry ]; + } ); + + fieldSettings.choices = slicedChoices; + + if ( 'checkbox' === type || 'payment-checkbox' === type ) { + data.type = 'checkbox'; + } + + if ( ! isDynamicChoices ) { + $( '#wpforms-field-' + id ).find( 'ul.primary-input' ).replaceWith( tmpl( data ) ); + } + + // Toggle limit choices alert message. + app.firstNChoicesAlert( id, order.length ); + + return true; + }, + + /** + * Set the classic selected choice. + * + * @since 1.8.2.3 + * + * @param {jQuery|undefined} $choice Choice option. + */ + setClassicSelectedChoice( $choice ) { + if ( $choice === undefined ) { + return; + } + + $choice.prop( 'selected', 'true' ); + }, + + /** + * Field choice bulk add toggling. + * + * @since 1.3.7 + * + * @param {Object} el jQuery object. + */ + fieldChoiceBulkAddToggle( el ) { + const /** @type {JQ|jQuery} */ $this = $( el ), + /** @type {JQ|jQuery} */ $label = $this.closest( 'label' ); + + if ( $this.hasClass( 'bulk-add-showing' ) ) { + // "Import details" is showing, so hide/remove it. + const $selector = $label.next( '.bulk-add-display' ); + + $selector.slideUp( 400, function() { + $selector.remove(); + } ); + + $this.find( 'span' ).text( wpforms_builder.bulk_add_show ); + } else { + let importOptions = '
    '; + + importOptions += '

    ' + wpforms_builder.bulk_add_heading + ' ' + wpforms_builder.bulk_add_presets_show + '

    '; + importOptions += ''; + importOptions += ''; + importOptions += ''; + importOptions += '
    '; + + $label.after( importOptions ); + $label.next( '.bulk-add-display' ).slideDown( 400, function() { + $( this ).find( 'textarea' ).trigger( 'focus' ); + } ); + $this.find( 'span' ).text( wpforms_builder.bulk_add_hide ); + } + + $this.toggleClass( 'bulk-add-showing' ); + }, + + /** + * Field choice bulk insert the new choices. + * + * @since 1.3.7 + * + * @param {Object} el DOM element. + */ + fieldChoiceBulkAddInsert( el ) { + const $this = $( el ), + $container = $this.closest( '.wpforms-field-option-row' ), + $textarea = $container.find( 'textarea' ), + $list = $container.find( '.choices-list' ), + $choice = $list.find( 'li:first-of-type' ).clone().wrap( '
    ' ).parent(); + let choice = ''; + const fieldID = $container.data( 'field-id' ), + type = $list.data( 'field-type' ); + let nextID = Number( $list.attr( 'data-next-id' ) ); + const newValues = $textarea.val().split( '\n' ); + let newChoices = ''; + + $this.prop( 'disabled', true ).html( $this.html() + ' ' + s.spinner ); + $choice.find( 'input.value,input.label' ).attr( 'value', '' ); + $choice.find( 'input.default' ).attr( 'checked', false ); + $choice.find( 'input.source-icon' ).attr( 'value', wpforms_builder.icon_choices.default_icon ); + $choice.find( 'input.source-icon-style' ).attr( 'value', wpforms_builder.icon_choices.default_icon_style ); + $choice.find( '.ic-fa-preview' ).removeClass().addClass( `ic-fa-preview ic-fa-${ wpforms_builder.icon_choices.default_icon_style } ic-fa-${ wpforms_builder.icon_choices.default_icon }` ); + $choice.find( '.ic-fa-preview + span' ).text( wpforms_builder.icon_choices.default_icon ); + choice = $choice.html(); + + for ( const key in newValues ) { + if ( ! newValues.hasOwnProperty( key ) ) { + continue; + } + + const value = wpf.sanitizeHTML( newValues[ key ] ).trim().replace( /"/g, '"' ); + let newChoice = choice; + + newChoice = newChoice.replace( /\[choices]\[(\d+)]/g, '[choices][' + nextID + ']' ); + newChoice = newChoice.replace( /data-key="(\d+)"/g, 'data-key="' + nextID + '"' ); + newChoice = newChoice.replace( /value="" class="label"/g, 'value="' + value + '" class="label"' ); + + // For some reason, IE has its own attribute order. + newChoice = newChoice.replace( /class="label" type="text" value=""/g, 'class="label" type="text" value="' + value + '"' ); + newChoices += newChoice; + nextID++; + } + + $list.attr( 'data-next-id', nextID ); + + // Ensure the "Other" choice remains the last item in the list. + const $other = $list.find( 'li.wpforms-choice-other-option' ).first(); + if ( $other.length ) { + $other.before( newChoices ); + } else { + $list.append( newChoices ); + } + + app.fieldChoiceUpdate( type, fieldID, nextID ); + $builder.trigger( 'wpformsFieldChoiceAdd' ); + app.fieldChoiceBulkAddToggle( $container.find( '.toggle-bulk-add-display' ) ); + }, + + /** + * Trigger $builder event. + * + * @since 1.9.1 + * + * @param {string} event Event name. + */ + triggerBuilderEvent( event ) { + $builder.trigger( event ); + }, + + /** + * Toggle fields tabs (Add Fields, Field Options). + * + * @since 1.0.0 + * + * @param {number|string} id Field ID or `add-fields` or `field-options`. + * + * @return {false|void} False if event is prevented. + */ + fieldTabToggle( id ) { + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsFieldTabToggle', [ id ] ); + + // Allow callbacks on `wpformsFieldTabToggle` to cancel tab toggle by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return false; + } + + $( '.wpforms-tab a' ).removeClass( 'active' ); + $( '.wpforms-field, .wpforms-title-desc' ).removeClass( 'active' ); + + if ( id === 'add-fields' ) { + elements.$addFieldsTab.addClass( 'active' ); + $( '.wpforms-field-options' ).hide(); + $( '.wpforms-add-fields' ).show(); + } else { + $( '#field-options a' ).addClass( 'active' ); + + if ( id === 'field-options' ) { + const $field = $( '.wpforms-field' ).first(); + + $field.addClass( 'active' ); + id = $field.data( 'field-id' ); + } else { + $( '#wpforms-field-' + id ).addClass( 'active' ); + } + + $( '.wpforms-field-option' ).hide(); + $( '#wpforms-field-option-' + id ).show(); + $( '.wpforms-add-fields' ).hide(); + $( '.wpforms-field-options' ).show(); + + $builder.trigger( 'wpformsFieldOptionTabToggle', [ id ] ); + } + }, + + /** + * Watches fields being added and listens for a pagebreak field. + * + * If a pagebreak field is added, and it's the first one, then we + * automatically add the top and bottom pagebreak elements to the + * builder. + * + * @param {Object} event Current DOM event. + * @param {number} id Field ID. + * @param {string} type Field type. + * + * @since 1.2.1 + */ + fieldPagebreakAdd( event, id, type ) { + /* eslint-disable camelcase */ + + if ( 'pagebreak' !== type ) { + return; + } + + let options; + + if ( ! s.pagebreakTop ) { + s.pagebreakTop = true; + options = { + position: 'top', + scroll: false, + defaults: { + position: 'top', + nav_align: 'left', + }, + }; + + app.fieldAdd( 'pagebreak', options ).done( function( res ) { + s.pagebreakTop = res.data.field.id; + + const $preview = $( '#wpforms-field-' + res.data.field.id ), + $options = $( '#wpforms-field-option-' + res.data.field.id ); + + $options.find( '.wpforms-field-option-group' ).addClass( 'wpforms-pagebreak-top' ); + $preview.addClass( 'wpforms-field-stick wpforms-pagebreak-top' ); + } ); + } else if ( ! s.pagebreakBottom ) { + s.pagebreakBottom = true; + options = { + position: 'bottom', + scroll: false, + defaults: { + position: 'bottom', + }, + }; + app.fieldAdd( 'pagebreak', options ).done( function( res ) { + s.pagebreakBottom = res.data.field.id; + + const $preview = $( '#wpforms-field-' + res.data.field.id ), + $options = $( '#wpforms-field-option-' + res.data.field.id ); + + $options.find( '.wpforms-field-option-group' ).addClass( 'wpforms-pagebreak-bottom' ); + $preview.addClass( 'wpforms-field-stick wpforms-pagebreak-bottom' ); + } ); + } + }, + + /** + * Watches fields being deleted and listens for a pagebreak field. + * + * If a pagebreak field is added, and it's the first one, then we + * automatically add the top and bottom pagebreak elements to the + * builder. + * + * @param {Object} event Current DOM event. + * @param {number} id Field ID. + * @param {string} type Field type. + * + * @since 1.2.1 + */ + fieldPagebreakDelete( event, id, type ) { + if ( 'pagebreak' !== type ) { + return; + } + + const pagebreaksRemaining = $( '#wpforms-panel-fields .wpforms-field-pagebreak' ).not( '.wpforms-pagebreak-top, .wpforms-pagebreak-bottom' ).length; + + if ( pagebreaksRemaining ) { + return; + } + + // All pagebreaks, excluding top/bottom, are gone. + // So we need to remove the top and bottom pagebreak. + const $preview = $( '#wpforms-panel-fields .wpforms-preview-wrap' ), + $top = $preview.find( '.wpforms-pagebreak-top' ), + topID = $top.data( 'field-id' ), + $bottom = $preview.find( '.wpforms-pagebreak-bottom' ), + bottomID = $bottom.data( 'field-id' ); + + $top.remove(); + $( '#wpforms-field-option-' + topID ).remove(); + s.pagebreakTop = false; + $bottom.remove(); + $( '#wpforms-field-option-' + bottomID ).remove(); + s.pagebreakBottom = false; + }, + + /** + * Init Display Previous option for Pagebreak field. + * + * @since 1.5.8 + * + * @param {jQuery} $field Page Break field jQuery object. + */ + fieldPageBreakInitDisplayPrevious( $field ) { + const id = $field.data( 'field-id' ), + $prevToggle = $( '#wpforms-field-option-row-' + id + '-prev_toggle' ), + $prev = $( '#wpforms-field-option-row-' + id + '-prev' ), + $prevBtn = $field.find( '.wpforms-pagebreak-prev' ); + + if ( $field.prevAll( '.wpforms-field-pagebreak.wpforms-pagebreak-normal' ).length > 0 ) { + $prevToggle.removeClass( 'hidden' ); + $prev.removeClass( 'hidden' ); + if ( $prevToggle.find( 'input' ).is( ':checked' ) ) { + $prevBtn.removeClass( 'wpforms-hidden' ).text( $prev.find( 'input' ).val() ); + } + } else { + $prevToggle.addClass( 'hidden' ); + $prev.addClass( 'hidden' ); + $prevBtn.addClass( 'wpforms-hidden' ); + } + }, + + /** + * Field Dynamic Choice toggle. + * + * @since 1.2.8 + * + * @param {Element} el Element. + */ + fieldDynamicChoiceToggle( el ) { // eslint-disable-line complexity, max-lines-per-function + let optionHTML; + const $this = $( el ), + $thisOption = $this.parent(), + value = $this.val(), + id = $thisOption.data( 'field-id' ); + const $choices = $( '#wpforms-field-option-row-' + id + '-choices' ), + $images = $( '#wpforms-field-option-' + id + '-choices_images' ), + $icons = $( '#wpforms-field-option-' + id + '-choices_icons' ), + $otherOption = $( '#wpforms-field-option-' + id + '-choices_other' ), + $basicOptions = $( `#wpforms-field-option-basic-${ id }` ); + + // Hide image and icon choices if "dynamic choices" is not off. + app.fieldDynamicChoiceToggleImageChoices(); + app.fieldDynamicChoiceToggleIconChoices(); + app.fieldDynamicChoiceToggleOtherOption(); + + // Fire an event when a field's dynamic choices option was changed. + $builder.trigger( 'wpformsFieldDynamicChoiceToggle', [ id ] ); + + // Loading + wpf.fieldOptionLoading( $thisOption ); + + // Remove previous dynamic post-type or taxonomy source options. + $( '#wpforms-field-option-row-' + id + '-dynamic_post_type' ).remove(); + $( '#wpforms-field-option-row-' + id + '-dynamic_taxonomy' ).remove(); + + /* + * Post type- or Taxonomy-based dynamic populating. + */ + if ( '' !== value ) { + // Hide choice images and icons options, not applicable. + $images.addClass( 'wpforms-hidden' ); + $icons.addClass( 'wpforms-hidden' ); + $otherOption.addClass( 'wpforms-hidden' ); + + // Hide `Bulk Add` toggle. + $choices.find( '.toggle-bulk-add-display' ).addClass( 'wpforms-hidden' ); + + // Hide the AI Choices button. + $basicOptions.find( '.wpforms-ai-choices-button' ).addClass( 'wpforms-hidden' ); + + // Hide tooltip. + $choices.find( '.wpforms-help-tooltip' ).addClass( 'wpforms-hidden' ); + + const data = { + type: value, + field_id: id, // eslint-disable-line camelcase + action: 'wpforms_builder_dynamic_choices', + nonce: wpforms_builder.nonce, + }; + + $.post( wpforms_builder.ajax_url, data, function( res ) { + if ( res.success ) { + // New option markup. + $thisOption.after( res.data.markup ); + } else { + // eslint-disable-next-line no-console + console.log( res ); + } + + // Hide the loading indicator. + wpf.fieldOptionLoading( $thisOption, true ); + + // Re-init tooltips for a new field. + wpf.initTooltips(); + + // Trigger Dynamic source updates. + const $dynamicValue = $( '#wpforms-field-option-' + id + '-dynamic_' + value ); + + $dynamicValue.find( 'option' ).first().prop( 'selected', true ); + $dynamicValue.trigger( 'change' ); + } ).fail( function( xhr ) { + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + + return; // Nothing more for dynamic populating. + } + + /* + * "Off" - no dynamic populating. + */ + + let type = $( '#wpforms-field-option-' + id ).find( '.wpforms-field-option-hidden-type' ).val(); + + // Show choice images and icon options. + $images.removeClass( 'wpforms-hidden' ); + $icons.removeClass( 'wpforms-hidden' ); + $otherOption.removeClass( 'wpforms-hidden' ); + + // Show `Bulk Add` toggle. + $choices.find( '.toggle-bulk-add-display' ).removeClass( 'wpforms-hidden' ); + + // Show the AI Choices button. + $basicOptions.find( '.wpforms-ai-choices-button' ).removeClass( 'wpforms-hidden' ); + + // Show tooltip. + $choices.find( '.wpforms-help-tooltip' ).removeClass( 'wpforms-hidden' ); + + const $wpformsField = $( '#wpforms-field-' + id ); + + $wpformsField.find( '.wpforms-alert' ).remove(); + + if ( [ 'checkbox', 'radio', 'payment-multiple', 'payment-checkbox' ].indexOf( type ) > -1 ) { + app.fieldChoiceUpdate( type, id ); + + // Toggle elements and hide the loading indicator. + $choices.find( 'ul' ).removeClass( 'wpforms-hidden' ); + $choices.find( '.wpforms-alert' ).addClass( 'wpforms-hidden' ); + + wpf.fieldOptionLoading( $thisOption, true ); + + return; // Nothing more for those types. + } + + // Get original field choices. + const $field = $wpformsField; + + const choices = [], + $primary = $field.find( '.primary-input' ); + let key; + + $( `#wpforms-field-option-row-${ id }-choices li` ).each( function() { + const $this = $( this ); + + choices.push( { + label: wpf.sanitizeHTML( $this.find( '.label' ).val() ), + selected: $this.find( '.default' ).is( ':checked' ), + } ); + } ); + + // Restore field to display original field choices. + if ( $field.hasClass( 'wpforms-field-select' ) ) { + const isModernSelect = app.dropdownField.helpers.isModernSelect( $primary ); + + let selected = false; + + // Remove previous items. + $primary.find( 'option' ).not( '.placeholder' ).remove(); + + // Update Modern Dropdown. + if ( isModernSelect && choices.length ) { + app.dropdownField.helpers.update( id, false ); + } else { + // Update Classic select field. + for ( key in choices ) { + selected = choices[ key ].selected; + + optionHTML = '' : '>'; + optionHTML += choices[ key ].label + ''; + + $primary.append( optionHTML ); + } + } + } else { + type = 'radio'; + + if ( $field.hasClass( 'wpforms-field-checkbox' ) ) { + type = 'checkbox'; + } + + // Remove previous items. + $primary.empty(); + + // Add new items to the radio or checkbox field. + for ( key in choices ) { + optionHTML = '
  3. ' : '>'; + optionHTML += choices[ key ].label + '
  4. '; + + $primary.append( optionHTML ); + } + } + + // Toggle elements and hide the loading indicator. + $choices.find( 'ul' ).removeClass( 'wpforms-hidden' ); + $choices.find( '.wpforms-alert' ).addClass( 'wpforms-hidden' ); + $primary.removeClass( 'wpforms-hidden' ); + + wpf.fieldOptionLoading( $thisOption, true ); + }, + + /** + * Field Dynamic Choice Source toggle. + * + * @since 1.2.8 + * + * @param {Element} el Element. + */ + fieldDynamicChoiceSource( el ) { // eslint-disable-line max-lines-per-function + /* eslint-disable camelcase */ + const $this = $( el ), + $thisOption = $this.parent(), + value = $this.val(), + id = $thisOption.data( 'field-id' ), + form_id = $( '#wpforms-builder-form' ).data( 'id' ), + $choices = $( '#wpforms-field-option-row-' + id + '-choices' ), + $field = $( '#wpforms-field-' + id ), + type = $( `#wpforms-field-option-${ id }-dynamic_choices option:selected` ).val(); + let limit = 20; + + // Loading. + wpf.fieldOptionLoading( $thisOption ); + + const data = { + type, + source: value, + field_id: id, + form_id, + action: 'wpforms_builder_dynamic_source', + nonce: wpforms_builder.nonce, + }; + + /** + * @typedef {Object} DynamicSourceResponse + * @property {boolean} success Success flag. + * @property {{ source_name: string, type_name: string }} data Response data. + */ + + /** + * @param {DynamicSourceResponse} res + */ + $.post( wpforms_builder.ajax_url, data, function( res ) { + if ( ! res.success ) { + // eslint-disable-next-line no-console + console.log( res ); + + // Toggle elements and hide the loading indicator. + wpf.fieldOptionLoading( $thisOption, true ); + return; + } + + // Update the info box and remove old choices. + $choices.find( '.dynamic-name' ).text( res.data.source_name ); + $choices.find( '.dynamic-type' ).text( res.data.type_name ); + $choices.find( 'ul' ).addClass( 'wpforms-hidden' ); + $choices.find( '.wpforms-alert' ).removeClass( 'wpforms-hidden' ); + + // Update items. + app.fieldDynamicChoiceSourceItems( $field, res.data.items ); + + if ( $field.hasClass( 'wpforms-field-select' ) ) { + limit = 200; + } + + // Remove any previous empty message. + $field.find( '.wpforms-notice-dynamic-empty' ).remove(); + + // If the source has more items than the field type can + // ideally handle alert the user. + if ( Number( res.data.total ) > limit ) { + let msg = wpforms_builder.dynamic_choices.limit_message; + + msg = msg.replace( '{source}', res.data.source_name ); + msg = msg.replace( '{type}', res.data.type_name ); + msg = msg.replace( '{limit}', limit ); + msg = msg.replace( '{total}', res.data.total ); + + $.alert( { + title: wpforms_builder.heads_up, + content: msg, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + } + + // Toggle limit choices alert message. + app.firstNChoicesAlert( id, res.data.total ); + + // Toggle empty choices to notice a message. + if ( Number( res.data.total ) === 0 ) { + app.emptyChoicesNotice( id, res.data.source_name, res.data.type ); + } + + // Toggle elements and hide the loading indicator. + wpf.fieldOptionLoading( $thisOption, true ); + } ).fail( function( xhr ) { + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + }, + + /** + * Update a Field Items when `Dynamic Choice` Source is toggled. + * + * @since 1.6.1 + * + * @param {Object} $field jQuery selector for current field. + * @param {Object} items Items collection. + */ + fieldDynamicChoiceSourceItems( $field, items ) { + const $primary = $field.find( '.primary-input' ); + let key = 0; + + if ( $field.hasClass( 'wpforms-field-select' ) ) { + const isModernSelect = app.dropdownField.helpers.isModernSelect( $primary ); + + if ( isModernSelect ) { + app.fieldDynamicChoiceSourceForModernSelect( $primary, items ); + } else { + app.fieldDynamicChoiceSourceForClassicSelect( $primary, items ); + } + } else { + let type = 'radio'; + + if ( $field.hasClass( 'wpforms-field-checkbox' ) ) { + type = 'checkbox'; + } + + // Remove previous items. + $primary.empty(); + + // Add new items to the radio or checkbox field. + for ( key in items ) { + $primary.append( '
  5. ' + wpf.sanitizeHTML( items[ key ] ) + '
  6. ' ); + } + } + }, + + /** + * Update options for Modern style select when `Dynamic Choice` Source is toggled. + * + * @since 1.6.1 + * + * @param {Object} $jquerySelector jQuery selector for primary input. + * @param {Object} items Items collection. + */ + fieldDynamicChoiceSourceForModernSelect( $jquerySelector, items ) { + const instance = app.dropdownField.helpers.getInstance( $jquerySelector ), + fieldId = $jquerySelector.closest( '.wpforms-field' ).data().fieldId; + + // Destroy the instance of Choices.js. + instance.destroy(); + + // Update a placeholder. + app.dropdownField.helpers.updatePlaceholderChoice( instance, fieldId ); + + // Update options. + app.fieldDynamicChoiceSourceForClassicSelect( $jquerySelector, items ); + + // Choices.js init. + app.dropdownField.events.choicesInit( $jquerySelector ); + }, + + /** + * Update options for Classic style select when `Dynamic Choice` Source is toggled. + * + * @since 1.6.1 + * + * @param {Object} $jquerySelector jQuery selector for primary input. + * @param {Object} items Items collection. + */ + fieldDynamicChoiceSourceForClassicSelect( $jquerySelector, items ) { + let index = 0; + const itemsSize = items.length; + + // Clear. + $jquerySelector.find( 'option' ).not( '.placeholder' ).remove(); + + // Add options (items) to a single `, + nameError = '

    ' + wpforms_builder[ blockType + '_error' ] + '

    ', + modalContent = namePrompt + nameField + nameError; + + const modal = $.confirm( { + container: $builder, + title: false, + content: modalContent, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { // eslint-disable-line complexity, max-lines-per-function + const settingsBlockName = this.$content.find( 'input#settings-block-name' ).val().toString().trim(), + error = this.$content.find( '.error' ); + + if ( settingsBlockName === '' ) { + error.show(); + return false; + } + + const $firstSettingsBlock = $el.closest( '.wpforms-panel-content-section' ).find( '.wpforms-builder-settings-block' ).first(); + + // Restore tooltips before cloning. + wpf.restoreTooltips( $firstSettingsBlock ); + + // Check if we have a template for this block type. + const templateSelector = '#wpforms-' + blockType + '-template-block'; + const $template = $( templateSelector ); + + let $newSettingsBlock; + let blockID; + + // If we have a template and no existing blocks to clone from. + if ( $template.length ) { + // Get the template HTML + let templateHTML = $template.text(); + + // Replace variables in the template. + templateHTML = templateHTML + .replace( /{CLONE}/g, nextID ) + .replace( /CLONE/g, nextID ); + + // Create a new jQuery object from the template. + $newSettingsBlock = $( templateHTML ); + blockID = nextID; + } else { + // Use the regular clone approach when no template exists. + $newSettingsBlock = $firstSettingsBlock.clone(); + blockID = $firstSettingsBlock.data( 'block-id' ); + } + + let newSettingsBlock; + + $newSettingsBlock.attr( 'data-block-id', nextID ); + $newSettingsBlock.find( '.wpforms-builder-settings-block-name-holder span' ).text( settingsBlockName ); + + /** + * Fires to reset settings block elements on adding a new settings block. + * + * @param {jQuery} $element jQuery object of an element. + */ + const resetFormElement = function( $element ) { + if ( $element.attr( 'name' ) ) { + $element.val( '' ).attr( 'name', $element.attr( 'name' ).replace( /\[(\d+)]/, '[' + nextID + ']' ) ); + if ( $element.is( 'select' ) ) { + $element.find( 'option' ).prop( 'selected', false ).attr( 'selected', false ); + $element.find( 'option' ).first().prop( 'selected', true ).attr( 'selected', 'selected' ); + } else if ( $element.attr( 'type' ) === 'checkbox' ) { + const isChecked = $element.closest( '.wpforms-panel-field' ).hasClass( 'js-wpforms-enabled-notification' ); + + $element.prop( 'checked', isChecked ).attr( 'checked', isChecked ).val( '1' ); + } else { + $element.val( '' ).attr( 'value', '' ); + } + } + }; + + $newSettingsBlock.find( 'input, textarea, select' ).each( function() { + const $this = $( this ); + const $parent = $this.parent(); + + if ( $this.hasClass( 'wpforms-disabled' ) && ( $parent.hasClass( 'from-name' ) || $parent.hasClass( 'from-email' ) ) ) { + return; + } + + if ( $parent.hasClass( 'wpforms-pdf-file-name' ) ) { + return; + } + + resetFormElement( $this ); + } ); + + // Update elements IDs. + const idPrefixPanel = 'wpforms-panel-field-' + panelID + '-', + idPrefixBlock = idPrefixPanel + blockID; + $newSettingsBlock.find( '[id^="' + idPrefixBlock + '"], [for^="' + idPrefixBlock + '"]' ).each( function() { + const $el = $( this ), + attr = $el.prop( 'tagName' ) === 'LABEL' ? 'for' : 'id', + elID = $el.attr( attr ).replace( new RegExp( idPrefixBlock, 'g' ), idPrefixPanel + nextID ); + + $el.attr( attr, elID ); + } ); + + // Update `notification by status` checkboxes. + const radioGroup = blockID + '-notification-by-status'; + $newSettingsBlock.find( '[data-radio-group="' + radioGroup + '"]' ).each( function() { + $( this ) + .removeClass( 'wpforms-radio-group-' + radioGroup ) + .addClass( 'wpforms-radio-group-' + nextID + '-notification-by-status' ) + .attr( 'data-radio-group', nextID + '-notification-by-status' ); + } ); + + $newSettingsBlock.find( '.wpforms-builder-settings-block-name-holder input' ).val( settingsBlockName ).attr( 'value', settingsBlockName ); + + if ( blockType === 'notification' ) { + $newSettingsBlock.find( '.email-msg textarea' ).val( '{all_fields}' ).text( '{all_fields}' ).attr( 'value', '{all_fields}' ); + $newSettingsBlock.find( '.email-recipient input' ).val( '{admin_email}' ).attr( 'value', '{admin_email}' ); + } + + $newSettingsBlock.removeClass( 'wpforms-builder-settings-block-default' ); + + if ( blockType === 'confirmation' ) { + $newSettingsBlock.find( '.wpforms-panel-field-tinymce' ).remove(); + if ( typeof WPForms !== 'undefined' ) { + $newSettingsBlock.find( '.wpforms-panel-field-confirmations-type-wrap' ) + .after( WPForms.Admin.Builder.Templates + .get( 'wpforms-builder-confirmations-message-field' )( { + id: nextID, + } ) + ); + } + } + + // Conditional logic, if present + const $conditionalLogic = $newSettingsBlock.find( '.wpforms-conditional-block' ); + if ( $conditionalLogic.length && typeof WPForms !== 'undefined' ) { + $conditionalLogic + .html( WPForms.Admin.Builder.Templates + .get( 'wpforms-builder-conditional-logic-toggle-field' )( { + id: nextID, + type: blockType, + actions: JSON.stringify( $newSettingsBlock.find( '.wpforms-panel-field-conditional_logic-checkbox' ).data( 'actions' ) ), + actionDesc: $newSettingsBlock.find( '.wpforms-panel-field-conditional_logic-checkbox' ).data( 'action-desc' ), + reference: $newSettingsBlock.find( '.wpforms-panel-field-conditional_logic-checkbox' ).data( 'reference' ), + } ) + ); + } + + // Fields Map Table, if present. + const $fieldsMapTable = $newSettingsBlock.find( '.wpforms-field-map-table' ); + if ( $fieldsMapTable.length ) { + $fieldsMapTable.each( function( index, el ) { + const $table = $( el ); + + // Clean table fields. + $table.find( 'tr:not(:first-child)' ).remove(); + + const $input = $table.find( '.key input' ), + $select = $table.find( '.field select' ), + name = $select.data( 'name' ); + + $input.attr( 'value', '' ); + $select + .attr( 'name', '' ) + .attr( 'data-name', name.replace( /\[(\d+)]/, '[' + nextID + ']' ) ); + } ); + } + + newSettingsBlock = $newSettingsBlock.wrap( '
    ' ).parent().html(); + newSettingsBlock = newSettingsBlock.replace( /\[conditionals]\[(\d+)]\[(\d+)]/g, '[conditionals][0][0]' ); + + // If there are no existing blocks, we need to add the new block to the section + if ( $firstSettingsBlock.length === 0 ) { + const $section = $el.closest( '.wpforms-panel-content-section' ); + $section.append( newSettingsBlock ); + } else { + // Otherwise, add it before the first block + $firstSettingsBlock.before( newSettingsBlock ); + } + + // Get the newly added block - it's either the first or the last block in the section. + const $addedSettingBlock = $firstSettingsBlock.length === 0 ? $el.closest( '.wpforms-panel-content-section' ).find( '.wpforms-builder-settings-block' ).first() : $firstSettingsBlock.prev(); + + // Reset the confirmation type to the 1st one. + if ( blockType === 'confirmation' ) { + app.prepareChoicesJSField( $addedSettingBlock, nextID ); + app.confirmationFieldsToggle( $( '.wpforms-panel-field-confirmations-type' ).first() ); + } + + // Init the WP Editor. + if ( typeof tinymce !== 'undefined' && typeof wp.editor !== 'undefined' && blockType === 'confirmation' ) { + wp.editor.initialize( 'wpforms-panel-field-confirmations-message-' + nextID, s.tinymceDefaults ); + } + + // Init tooltips for a new section. + wpf.initTooltips(); + + $builder.trigger( 'wpformsSettingsBlockAdded', [ $addedSettingBlock ] ); + + $el.attr( 'data-next-id', nextID + 1 ); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + + // We need to process this event here because we need a confirmation modal object defined, + // so we can intrude into it. + // Pressing Enter will click the Ok button. + $builder.on( 'keypress', '#settings-block-name', function( e ) { + if ( e.keyCode === 13 ) { + $( modal.buttons.confirm.el ).trigger( 'click' ); + } + } ); + }, + + /** + * Reset the 'Select Page' field to it's initial state then + * re-initialize ChoicesJS on it. + * + * @since 1.7.9 + * + * @param {jQuery} $addedSettingBlock Newly added Settings Block jQuery object. + * @param {number} addedSettingBlockID Number ID used when `$addedSettingBlock` was created. + */ + prepareChoicesJSField( $addedSettingBlock, addedSettingBlockID ) { + const $addedConfirmationWrap = $addedSettingBlock.find( `#wpforms-panel-field-confirmations-${ addedSettingBlockID }-page-wrap` ); + if ( $addedConfirmationWrap.length <= 0 ) { + return; + } + + const $confirmationSelectPageField = $addedConfirmationWrap.find( `#wpforms-panel-field-confirmations-${ addedSettingBlockID }-page` ); + if ( $confirmationSelectPageField.length <= 0 && ! $confirmationSelectPageField.hasClass( 'choicesjs-select' ) ) { + return; + } + + const $choicesWrapper = $addedConfirmationWrap.find( '.choices' ); + if ( $choicesWrapper.length <= 0 ) { + return; + } + + // Remove ChoicesJS-related attr. + const $selectPageField = $confirmationSelectPageField.first(); + $selectPageField.removeAttr( 'data-choice' ); + $selectPageField.removeAttr( 'hidden' ); + $selectPageField.removeClass( 'choices__input' ); + + // Move the select page field to it's initial location in the DOM. + $( $selectPageField ).appendTo( $addedConfirmationWrap.first() ); + + // Remove the `.choices` wrapper. + $choicesWrapper.first().remove(); + + // Re-init ChoicesJS. + app.dropdownField.events.choicesInit( $selectPageField ); + }, + + /** + * Show settings block editing interface. + * + * @since 1.4.8 + * + * @param {jQuery} $el Element. + */ + settingsBlockNameEditingShow( $el ) { + const headerHolder = $el.parents( '.wpforms-builder-settings-block-name-holder' ), + nameHolder = headerHolder.find( '.wpforms-builder-settings-block-name' ); + + nameHolder + .addClass( 'editing' ) + .hide(); + + // Make the editing interface active and in focus + headerHolder.find( '.wpforms-builder-settings-block-name-edit' ).addClass( 'active' ); + wpf.focusCaretToEnd( headerHolder.find( 'input' ) ); + }, + + /** + * Update settings block name and hide editing interface. + * + * @since 1.4.8 + * + * @param {jQuery} $el Element. + */ + settingsBlockNameEditingHide( $el ) { + const headerHolder = $el.parents( '.wpforms-builder-settings-block-header' ), + nameHolder = headerHolder.find( '.wpforms-builder-settings-block-name' ), + editHolder = headerHolder.find( '.wpforms-builder-settings-block-name-edit' ); + let currentName = editHolder.find( 'input' ).val().trim(); + const blockType = $el.data( 'block-type' ) || $el.closest( '.wpforms-builder-settings-block' ).data( 'block-type' ); + + // Provide a default value for the empty settings block name. + if ( ! currentName.length ) { + currentName = wpforms_builder[ blockType + '_def_name' ]; + } + + // This is done for sanitizing. + editHolder.find( 'input' ).val( currentName ); + nameHolder.text( currentName ); + + // Editing should be hidden, displaying - active. + nameHolder + .removeClass( 'editing' ) + .show(); + editHolder.removeClass( 'active' ); + }, + + /** + * Clone the Notification block with all of its content and events. + * Put the newly created clone above the target. + * + * @since 1.6.5 + * @since 1.7.7 Registered `wpformsSettingsBlockCloned` trigger. + * + * @param {Object} $el Clone icon DOM element. + */ + settingsBlockPanelClone( $el ) { // eslint-disable-line max-lines-per-function + const $panel = $el.closest( '.wpforms-panel-content-section' ), + $addNewSettingButton = $panel.find( '.wpforms-builder-settings-block-add' ), + $settingsBlock = $el.closest( '.wpforms-builder-settings-block' ), + $settingBlockContent = $settingsBlock.find( '.wpforms-builder-settings-block-content' ), + settingsBlockId = parseInt( $addNewSettingButton.attr( 'data-next-id' ), 10 ), + settingsBlockType = $settingsBlock.data( 'block-type' ), + settingsBlockName = $settingsBlock.find( '.wpforms-builder-settings-block-name' ).text().trim() + wpforms_builder[ settingsBlockType + '_clone' ], + isVisibleContent = $settingBlockContent.is( ':hidden' ); + + // Restore tooltips before cloning. + wpf.restoreTooltips( $settingsBlock ); + + const $clone = $settingsBlock.clone( false, true ); + + // Save the open / close state while cloning. + app.settingsBlockUpdateState( isVisibleContent, settingsBlockId, settingsBlockType ); + + // Change the cloned setting block ID and name. + $clone.data( 'block-id', settingsBlockId ).attr( 'data-block-id', settingsBlockId ); + $clone.find( '.wpforms-builder-settings-block-name-holder span' ).text( settingsBlockName ); + $clone.find( '.wpforms-builder-settings-block-name-holder input' ).val( settingsBlockName ); + $clone.removeClass( 'wpforms-builder-settings-block-default' ); + + // Change the Next Settings block ID for the "Add new" button. + $addNewSettingButton.attr( 'data-next-id', settingsBlockId + 1 ); + + // Change the name attribute. + $clone.find( 'input, textarea, select' ).each( function() { + const $this = $( this ); + + if ( $this.attr( 'name' ) ) { + $this.attr( 'name', $this.attr( 'name' ).replace( /\[(\d+)]/, '[' + settingsBlockId + ']' ) ); + } + if ( $this.data( 'name' ) ) { + $this.data( 'name', $this.data( 'name' ).replace( /\[(\d+)]/, '[' + settingsBlockId + ']' ) ); + } + if ( $this.attr( 'class' ) ) { + $this.attr( 'class', $this.attr( 'class' ).replace( /-(\d+)/, '-' + settingsBlockId ) ); + } + if ( $this.attr( 'data-radio-group' ) ) { + $this.attr( 'data-radio-group', $this.attr( 'data-radio-group' ).replace( /(\d+)-/, settingsBlockId + '-' ) ); + } + } ); + + // Change IDs/data-attributes in DOM elements. + $clone.find( '*' ).each( function() { + const $this = $( this ); + + if ( $this.attr( 'id' ) ) { + $this.attr( 'id', $this.attr( 'id' ).replace( /-(\d+)/, '-' + settingsBlockId ) ); + } + if ( $this.attr( 'for' ) ) { + $this.attr( 'for', $this.attr( 'for' ).replace( /-(\d+)-/, '-' + settingsBlockId + '-' ) ); + } + if ( $this.data( 'input-name' ) ) { + $this.data( 'input-name', $this.data( 'input-name' ).replace( /\[(\d+)]/, '[' + settingsBlockId + ']' ) ); + } + } ); + + // Transfer selected values to copy elements since jQuery doesn't clone the current selected state. + $settingsBlock.find( 'select' ).each( function() { + const baseSelectName = $( this ).attr( 'name' ), + clonedSelectName = $( this ).attr( 'name' ).replace( /\[(\d+)]/, '[' + settingsBlockId + ']' ); + + $clone.find( 'select[name="' + clonedSelectName + '"]' ).val( $( this ).attr( 'name', baseSelectName ).val() ); + } ); + + // Insert before the target settings block. + $clone + .css( 'display', 'none' ) + .insertBefore( $settingsBlock ) + .show( 'fast', function() { + // Init tooltips for a new section. + wpf.initTooltips(); + } ); + + $builder.trigger( 'wpformsSettingsBlockCloned', [ $clone, $settingsBlock.data( 'block-id' ) ] ); + }, + + /** + * Show or hide settings block panel content. + * + * @since 1.4.8 + * @since 1.9.6.1 Added `isShow` parameter. + * + * @param {Object} $el Toggle an icon DOM element. + * @param {boolean|null} isShow Force showing or hiding. If null - toggle (default), if true - show, if false - hide. + */ + settingsBlockPanelToggle( $el, isShow = null ) { + const $settingsBlock = $el.closest( '.wpforms-builder-settings-block' ), + settingsBlockId = $settingsBlock.data( 'block-id' ), + settingsBlockType = $settingsBlock.data( 'block-type' ), + $content = $settingsBlock.find( '.wpforms-builder-settings-block-content' ), + isVisible = $content.is( ':visible' ), + slideSettings = { + duration: 400, + start() { + // Send it early to save fast. + // It's an animation start, so we should save the state for the animation end (reversed). + app.settingsBlockUpdateState( isVisible, settingsBlockId, settingsBlockType ); + }, + always() { + if ( $content.is( ':visible' ) ) { + $el.html( '' ); + } else { + $el.html( '' ); + } + }, + }; + + $content.stop(); + + // Determine the action based on the force parameter. + if ( isShow === true ) { + $content.slideDown( slideSettings ); + + return; + } else if ( isShow === false ) { + $content.slideUp( slideSettings ); + + return; + } + + $content.slideToggle( slideSettings ); + }, + + /** + * Delete settings block. + * + * @since 1.4.8 + * @since 1.6.1.2 Registered `wpformsSettingsBlockDeleted` trigger. + * + * @param {jQuery} $el Delete button element. + */ + settingsBlockDelete( $el ) { + const $contentSection = $el.closest( '.wpforms-panel-content-section' ); + + // Skip if only one block persist. + // This condition should not be executed in normal circumstances. + if ( $contentSection.find( '.wpforms-builder-settings-block' ).length < 2 && $el.parents( '.wpforms-builder-settings-block' ).data( 'block-type' ) !== 'pdf' ) { + return; + } + + const $currentBlock = $el.closest( '.wpforms-builder-settings-block' ), + blockType = $currentBlock.data( 'block-type' ); + + $.confirm( { + title: false, + content: wpforms_builder[ blockType + '_delete' ], + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + const settingsBlockId = $currentBlock.data( 'block-id' ), + settingsBlockType = $currentBlock.data( 'block-type' ); + + /* eslint-disable camelcase */ + $.post( wpforms_builder.ajax_url, { + action: 'wpforms_builder_settings_block_state_remove', + nonce: wpforms_builder.nonce, + block_id: settingsBlockId, + block_type: settingsBlockType, + form_id: s.formID, + } ); + /* eslint-enable */ + + $currentBlock.remove(); + + $builder.trigger( 'wpformsSettingsBlockDeleted', [ blockType, settingsBlockId ] ); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + }, + + /** + * Change the open / close state for setting block. + * + * @since 1.6.5 + * + * @param {boolean} isVisible State status. + * @param {number} settingsBlockId Block ID. + * @param {string} settingsBlockType Block type. + */ + settingsBlockUpdateState( isVisible, settingsBlockId, settingsBlockType ) { + /* eslint-disable camelcase */ + $.post( wpforms_builder.ajax_url, { + action: 'wpforms_builder_settings_block_state_save', + state: isVisible ? 'closed' : 'opened', + form_id: s.formID, + block_id: settingsBlockId, + block_type: settingsBlockType, + nonce: wpforms_builder.nonce, + } ); + }, + + /** + * Change visibility for notification elements, e.g., + * the Enable This Notification toggle and notification status. + * The elements are invisible when the form has only one notification, + * and customers can turn off all notifications instead. + * + * @since 1.9.2 + * @deprecated 1.9.5 Always visible. + */ + notificationsUpdateElementsVisibility() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.notificationsUpdateElementsVisibility()" has been deprecated.' ); + }, + + /** + * Update the notification status to display if the notification is active or inactive. + * + * @since 1.9.2 + * + * @since 1.9.2 + * + * @param {jQuery} $notification Notification element. + */ + notificationUpdateStatus( $notification ) { + const notificationId = $notification.data( 'block-id' ), + $notificationEnable = $( `#wpforms-panel-field-notifications-${ notificationId }-enable` ); + + const $status = $notification.find( '.wpforms-builder-settings-block-status' ); + + app.changeStatusButton( $status, $notificationEnable.val() !== '0' ); + + if ( ! $notificationEnable.val() ) { + $notificationEnable.val( '1' ); + } + }, + + /** + * Change the status of a notification. + * + * @since 1.9.5 + * + * @param {jQuery} $statusButton The status button element. + */ + notificationChangeStatus( $statusButton ) { + const $notification = $statusButton.closest( '.wpforms-notification' ), + notificationId = $notification.data( 'block-id' ), + $notificationEnable = $( `#wpforms-panel-field-notifications-${ notificationId }-enable` ), + isActive = $statusButton.data( 'active' ); + + app.changeStatusButton( $statusButton, ! isActive ); + + $notificationEnable.val( ! isActive ? '1' : '0' ); + }, + + /** + * Handles the toggle functionality of the status button, updating its state + * and reflecting the change in a corresponding hidden input field. + * + * @since 1.9.6.1 + * + * @param {jQuery} $statusButton The jQuery object for the status button being toggled. + */ + handleStatusButton( $statusButton ) { + const connectionId = $statusButton.data( 'connection-id' ), + isActive = $statusButton.data( 'active' ); + + app.changeStatusButton( $statusButton, ! isActive ); + + $( `#wpforms-connection-status-${ connectionId }` ).val( ! isActive ? '1' : '0' ); + }, + + /** + * Change the status of a button. + * + * @since 1.9.5 + * + * @param {jQuery} $button The button element. + * @param {boolean} isActive Whether the button is active. + */ + changeStatusButton( $button, isActive ) { + $button.removeClass( 'wpforms-badge-green wpforms-badge-silver' ); + + const $icon = $button.find( '.fa' ), + $label = $button.find( '.wpforms-status-label' ); + + $icon.removeClass( 'fa-check fa-times' ); + + if ( isActive ) { + $button.addClass( 'wpforms-badge-green' ); + $icon.addClass( 'fa-check' ); + $label.text( wpforms_builder.active ); + $button.attr( 'title', wpforms_builder.deactivate ); + } else { + $button.addClass( 'wpforms-badge-silver' ); + $icon.addClass( 'fa-times' ); + $label.text( wpforms_builder.inactive ); + $button.attr( 'title', wpforms_builder.activate ); + } + + $button.data( 'active', isActive ); + }, + + //--------------------------------------------------------------------// + // Revisions Panel + //--------------------------------------------------------------------// + + /** + * Element bindings for Revisions panel. + * + * @since 1.7.3 + */ + bindUIActionsRevisions() { + // Update a revisions panel when it becomes active. + $builder.on( 'wpformsPanelSwitched', function( event, panel ) { + if ( panel !== 'revisions' ) { + return; + } + + app.updateRevisionsList(); + app.updateRevisionPreview(); + } ); + + // Update the revision list when the form was saved with a revisions panel being active. + $builder.on( 'wpformsSaved', function() { + if ( wpf.getQueryString( 'view' ) !== 'revisions' ) { + return; + } + + app.updateRevisionsList(); + } ); + + // Switch to the Revisions panel when the link is clicked. + $builder.on( 'click', '.wpforms-panel-content-revisions-link', function( e ) { + e.preventDefault(); + app.panelSwitch( 'revisions' ); + } ); + }, + + /** + * Fetch and update a list of form revisions. + * + * @since 1.7.3 + */ + updateRevisionsList() { + const $revisionsButtonBadge = $( '.wpforms-panel-revisions-button .badge-exclamation' ); + + // Revisions' badge exists, send a request and remove the badge on successful response. + if ( $revisionsButtonBadge.length ) { + $.post( wpforms_builder.ajax_url, { + action: 'wpforms_mark_panel_viewed', + form_id: s.formID, // eslint-disable-line camelcase + nonce: wpforms_builder.nonce, + } ) + .done( function( response ) { + // eslint-disable-next-line no-unused-expressions + response.success ? $revisionsButtonBadge.remove() : wpf.debug( response ); + } ) + .fail( function( xhr, textStatus ) { + wpf.debug( xhr.responseText || textStatus || '' ); + } ); + } + + // Revisions are disabled, no need to fetch a list of revisions. + if ( ! $builder.hasClass( 'wpforms-revisions-enabled' ) ) { + return; + } + + const $revisionsList = $( '#wpforms-panel-revisions .wpforms-revisions-content' ); + + // Dim the list, send a request and replace the list on successful response. + $revisionsList.fadeTo( 250, 0.25, function() { + $.post( wpforms_builder.ajax_url, { + action: 'wpforms_get_form_revisions', + form_id: s.formID, // eslint-disable-line camelcase + revision_id: wpf.getQueryString( 'revision_id' ), // eslint-disable-line camelcase + nonce: wpforms_builder.nonce, + } ) + .done( function( response ) { + // eslint-disable-next-line no-unused-expressions + response.success ? $revisionsList.replaceWith( response.data.html ) : wpf.debug( response ); + } ) + .fail( function( xhr, textStatus ) { + wpf.debug( xhr.responseText || textStatus || '' ); + + // Undim the list to reset the UI. + $revisionsList.fadeTo( 250, 1 ); + } ); + } ); + }, + + /** + * Clone form preview from Fields panel. + * + * @since 1.7.3 + */ + updateRevisionPreview() { + // Clone preview DOM from a Fields panel. + const $preview = elements.$formPreview.clone(); + + // Clean up the cloned preview, remove unnecessary elements, set states, etc. + $preview + .find( '.wpforms-field-duplicate, .wpforms-field-delete, .wpforms-field-helper, .wpforms-debug' ) + .remove() + .end(); + $preview + .find( '.wpforms-field-wrap' ) + .removeClass( 'ui-sortable' ) + .addClass( 'ui-sortable-disabled' ); + $preview + .find( '.wpforms-field' ) + .removeClass( 'ui-sortable-handle ui-draggable ui-draggable-handle active' ) + .removeAttr( 'id data-field-id data-field-type' ) + .removeData(); + $preview + .find( '.wpforms-field-submit-button' ) + .prop( 'disabled', true ); + + // Put the cleaned-up clone into a Preview panel. + if ( elements.$revisionPreview.hasClass( 'has-preview' ) ) { + elements + .$revisionPreview + .find( '.wpforms-preview-wrap' ) + .replaceWith( $preview ); + } else { + elements + .$revisionPreview + .append( $preview ) + .addClass( 'has-preview' ); + } + }, + + /** + * Inform the user about making this version the default if the revision is currently loaded, and it was modified. + * + * @since 1.7.3 + */ + confirmSaveRevision() { + $.confirm( { + title: wpforms_builder.heads_up, + content: wpforms_builder.revision_update_confirm, + icon: 'fa fa-exclamation-circle', + type: 'orange', + closeIcon: false, + buttons: { + + confirm: { + text: wpforms_builder.save, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + // Put the Form Builder into "saving state". + $builder.addClass( 'wpforms-revision-is-saving' ); + + // Save the revision as the current version and reload the Form Builder. + WPFormsBuilder.formSave( false ).done( app.revisionSavedReload ); + }, + }, + + cancel: { + text: wpforms_builder.cancel, + action() { + WPFormsBuilder.setCloseConfirmation( true ); + }, + }, + }, + } ); + }, + + /** + * When a modified revision was saved as a current version, reload the Form Builder with the current tab active. + * + * @since 1.7.3 + */ + revisionSavedReload() { + wpf.updateQueryString( 'view', wpf.getQueryString( 'view' ) ); + wpf.removeQueryParam( 'revision_id' ); + + window.location.reload(); + }, + + //--------------------------------------------------------------------// + // Save and Exit + //--------------------------------------------------------------------// + + /** + * Element bindings for Embed and Save/Exit items. + * + * @since 1.0.0 + * @since 1.5.8 Added trigger on `wpformsSaved` event to remove a `newform` URL-parameter. + */ + bindUIActionsSaveExit() { + // Embed form. + $builder.on( 'click', '#wpforms-embed', function( e ) { + e.preventDefault(); + + if ( $( this ).hasClass( 'wpforms-disabled' ) || $( this ).hasClass( 'wpforms-btn-light-grey-disabled' ) ) { + return; + } + + WPFormsFormEmbedWizard.openPopup(); + } ); + + // Save form. + $builder.on( 'click', '#wpforms-save', function( e ) { + e.preventDefault(); + app.formSave( false ); + } ); + + // Exit builder. + $builder.on( 'click', '#wpforms-exit', function( e ) { + e.preventDefault(); + app.formExit(); + } ); + + // After form save. + $builder.on( 'wpformsSaved', function() { + /** + * Remove the `newform` parameter if it's in URL, otherwise we can get a "race condition". + * E.g., form settings will be updated before some provider connection is loaded. + */ + wpf.removeQueryParam( 'newform' ); + } ); + }, + + // eslint-disable-next-line jsdoc/require-returns + /** + * Save form. + * + * @since 1.0.0 + * @since 1.7.5 Added `wpformsBeforeSave` trigger. + * + * @param {boolean} redirect Whether to redirect after save. + */ + formSave( redirect ) { // eslint-disable-line max-lines-per-function + // Saving a revision directly is not allowed. We need to notify the user that it will overwrite the current version. + if ( $builder.hasClass( 'wpforms-is-revision' ) && ! $builder.hasClass( 'wpforms-revision-is-saving' ) ) { + app.confirmSaveRevision(); + + return; + } + + if ( typeof tinyMCE !== 'undefined' ) { + tinyMCE.triggerSave(); + } + + const event = WPFormsUtils.triggerEvent( $builder, 'wpformsBeforeSave' ); + + // Allow callbacks on `wpformsBeforeSave` to cancel form submission by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return; + } + + const $saveBtn = elements.$saveButton, + $icon = $saveBtn.find( 'i.fa-check' ), + $spinner = $saveBtn.find( 'i.wpforms-loading-spinner' ), + $label = $saveBtn.find( 'span' ), + text = $label.text(); + + $label.text( wpforms_builder.saving ); + $saveBtn.prop( 'disabled', true ); + $icon.addClass( 'wpforms-hidden' ); + $spinner.removeClass( 'wpforms-hidden' ); + + const data = { + action: 'wpforms_save_form', + data: JSON.stringify( app.serializeAllData( $( '#wpforms-builder-form' ) ) ), + id: s.formID, + nonce: wpforms_builder.nonce, + }; + + const onSaveFormFail = function( xhr ) { + wpf.debug( xhr ); + let errorMessage = ''; + + if ( xhr.status === 403 ) { + errorMessage = wpforms_builder.error_save_form_forbidden; + } + + app.formSaveError( errorMessage ); + }; + + return $.post( wpforms_builder.ajax_url, data, function( response ) { + if ( response.success ) { + wpf.initialSave = false; + + // We need to save the form next tick to ensure that JS fields are already initialized. + setTimeout( () => { + wpf._updateFormState(); + + $builder.trigger( 'wpformsSaved', response.data ); + + if ( redirect !== true ) { + return; + } + + if ( app.isBuilderInPopup() ) { + app.builderInPopupClose( 'saved' ); + return; + } + + window.location.href = wpforms_builder.exit_url; + }, 0 ); + } else { + wpf.debug( response ); + app.formSaveError( response.data ); + } + } ).fail( onSaveFormFail ).always( function() { + $label.text( text ); + $saveBtn.prop( 'disabled', false ); + $spinner.addClass( 'wpforms-hidden' ); + $icon.removeClass( 'wpforms-hidden' ); + } ); + }, + + /** + * Serialize all form data including checkboxes that are not checked. + * + * @since 1.9.0 + * + * @param {Object} $form Form jQuery object. + * + * @return {Array} Form data. + */ + serializeAllData( $form ) { + const formData = $form.serializeArray(); + + $form.find( '.wpforms-field-option-layout .wpforms-field-option-row-label_hide input[type=checkbox]' ).each( function() { + const $checkbox = $( this ); + const name = $checkbox.attr( 'name' ); + const value = $checkbox.is( ':checked' ) ? '1' : ''; + + if ( ! value ) { + formData.push( { name, value } ); + } + } ); + + return formData; + }, + + /** + * Form save error. + * + * @since 1.6.3 + * + * @param {string} error Error message. + */ + formSaveError( error = '' ) { + // Default error message. + if ( wpf.empty( error ) ) { + error = wpforms_builder.error_save_form; + } + + // Display error in a modal window. + $.confirm( { + title: wpforms_builder.heads_up, + content: '

    ' + error + '

    ' + wpforms_builder.error_contact_support + '

    ', + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + }, + + /** + * Exit form builder. + * + * @since 1.0.0 + */ + formExit() { + if ( app.isBuilderInPopup() && app.formIsSaved() ) { + app.builderInPopupClose( 'saved' ); + return; + } + + if ( app.formIsSaved() ) { + window.location.href = wpforms_builder.exit_url; + } else { + $.confirm( { + title: false, + content: wpforms_builder.exit_confirm, + icon: 'fa fa-exclamation-circle', + type: 'orange', + closeIcon: true, + buttons: { + confirm: { + text: wpforms_builder.save_exit, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + app.formSave( true ); + }, + }, + cancel: { + text: wpforms_builder.exit, + action() { + closeConfirmation = false; + + if ( app.isBuilderInPopup() ) { + app.builderInPopupClose( 'canceled' ); + return; + } + + window.location.href = wpforms_builder.exit_url; + }, + }, + }, + } ); + } + }, + + /** + * Close confirmation setter. + * + * @since 1.6.2 + * + * @param {boolean} confirm Close confirmation flag value. + */ + setCloseConfirmation( confirm ) { + closeConfirmation = !! confirm; + }, + + /** + * Check the current form state. + * + * @since 1.0.0 + * + * @return {boolean} True if the form is saved. + */ + formIsSaved() { // eslint-disable-line complexity + if ( typeof wpf.savedFormState !== 'object' || Object.keys( wpf.savedFormState ).length === 0 ) { + return false; + } + + const isDebugEnabled = wpf.isDebug(); + const differences = {}; + const currentState = wpf._getCurrentFormState(); + + // Compare current state with saved state + for ( const key in currentState ) { + if ( currentState[ key ] !== wpf.savedFormState[ key ] ) { + if ( ! isDebugEnabled ) { + return false; + } + + differences[ key ] = { + old: wpf.savedFormState[ key ], + new: currentState[ key ], + }; + } + } + + // Check for deleted fields + for ( const key in wpf.savedFormState ) { + if ( ! ( key in currentState ) ) { + if ( ! isDebugEnabled ) { + return false; + } + + differences[ key ] = { + old: wpf.savedFormState[ key ], + new: undefined, + }; + } + } + + if ( ! Object.keys( differences ).length ) { + return true; + } + + wpf.debug( 'Form state differences:', differences ); + + return false; + }, + + /** + * Check if the builder opened in the popup (iframe). + * + * @since 1.6.2 + * + * @return {boolean} True if builder opened in the popup. + */ + isBuilderInPopup() { + return window.self !== window.parent && window.self.frameElement.id === 'wpforms-builder-iframe'; + }, + + /** + * Close popup with the form builder. + * + * @since 1.6.2 + * + * @param {string} action Performed action: saved or canceled. + */ + builderInPopupClose( action ) { + const $popup = window.parent.jQuery( '.wpforms-builder-popup' ); + const $title = $( '.wpforms-center-form-name' ).text(); + + $popup.find( '#wpforms-builder-iframe' ).attr( 'src', 'about:blank' ); + $popup.fadeOut(); + + $popup.trigger( 'wpformsBuilderInPopupClose', [ action, s.formID, $title ] ); + }, + + //--------------------------------------------------------------------// + // General / global + //--------------------------------------------------------------------// + + /** + * Element bindings for general and global items. + * + * @since 1.2.0 + */ + bindUIActionsGeneral() { // eslint-disable-line max-lines-per-function + // Toggle Smart Tags + $builder.on( 'click', '.toggle-smart-tag-display', app.smartTagToggle ); + + $builder.on( 'click', '.smart-tags-list-display a', app.smartTagInsert ); + + // Toggle unfoldable group of fields + $builder.on( 'click', '.wpforms-panel-fields-group.unfoldable .wpforms-panel-fields-group-title', app.toggleUnfoldableGroup ); + + // Hide the field preview helper box. + $builder.on( 'click', '.wpforms-field-helper-hide ', app.hideFieldHelper ); + + // Restrict user money input fields + $builder.on( 'input', '.wpforms-money-input', function() { + const $this = $( this ), + amount = $this.val(), + start = $this[ 0 ].selectionStart, + end = $this[ 0 ].selectionEnd; + + $this.val( amount.replace( /[^0-9.,]/g, '' ) ); + $this[ 0 ].setSelectionRange( start, end ); + } ); + + // Format user money input fields + $builder.on( 'focusout', '.wpforms-money-input', function() { + const $this = $( this ), + amount = $this.val(); + + if ( ! amount ) { + return amount; + } + + const sanitized = wpf.amountSanitize( amount ), + formatted = wpf.amountFormat( sanitized ); + + $this.val( formatted ); + } ); + + // Show/hide a group of options. + $builder.on( 'change', '.wpforms-panel-field-toggle', function() { + const $input = $( this ); + + if ( $input.prop( 'disabled' ) ) { + return; + } + + $input.prop( 'disabled', true ); + app.toggleOptionsGroup( $input ); + } ); + + // Upload or add an image. + $builder.on( 'click', '.wpforms-image-upload-add', function( event ) { + event.preventDefault(); + + const $this = $( this ); + const $container = $this.parent(); + + const mediaFrame = wpf.initMediaLibrary( { + title: wpforms_builder.upload_image_title, + extensions: wpforms_builder.upload_image_extensions, + extensionsError: wpforms_builder.upload_image_extensions_error, + buttonText: wpforms_builder.upload_image_button, + } ); + + mediaFrame.on( 'select', function() { + const mediaAttachment = mediaFrame.state().get( 'selection' ).first().toJSON(); + const $preview = $container.find( '.preview' ); + + $container.find( '.source' ).val( mediaAttachment.url ); + $preview.empty(); + $preview.prepend( '' ); + + if ( $this.data( 'after-upload' ) === 'hide' ) { + $this.hide(); + } + + $builder.trigger( 'wpformsImageUploadAdd', [ $this, $container ] ); + } ).on( 'close', function() { + mediaFrame.off( 'library:selection:add' ); + } ); + + // Now that everything has been set, let's open up the frame. + mediaFrame.open(); + } ); + + // Remove and uploaded image. + $builder.on( 'click', '.wpforms-image-upload-remove', function( event ) { + event.preventDefault(); + + const $container = $( this ).parent().parent(); + + $container.find( '.preview' ).empty(); + $container.find( '.wpforms-image-upload-add' ).show(); + $container.find( '.source' ).val( '' ); + + $builder.trigger( 'wpformsImageUploadRemove', [ $( this ), $container ] ); + } ); + + // Validate email smart tags in Notifications fields. + $builder.on( 'blur', '.wpforms-notification .wpforms-panel-field-text input:not([type="search"])', function() { + app.validateEmailSmartTags( $( this ) ); + } ); + $builder.on( 'blur', '.wpforms-notification .wpforms-panel-field-textarea textarea', function() { + app.validateEmailSmartTags( $( this ) ); + } ); + + // Validate From Email in Notification settings. + $builder.on( 'focusout', '.wpforms-notification .wpforms-panel-field.js-wpforms-from-email-validation input:not([type="search"])', app.validateFromEmail ); + $builder.on( 'wpformsPanelSectionSwitch', app.notificationsPanelSectionSwitch ); + + // Mobile notice primary button / close icon click. + $builder.on( 'click', '#wpforms-builder-mobile-notice .wpforms-fullscreen-notice-button-primary, #wpforms-builder-mobile-notice .close', function() { + window.location.href = wpforms_builder.exit_url; + } ); + + // Mobile notice secondary button click. + $builder.on( 'click', '#wpforms-builder-mobile-notice .wpforms-fullscreen-notice-button-secondary', function() { + window.location.href = wpf.updateQueryString( 'force_desktop_view', 1, window.location.href ); + } ); + + // License Alert close button click. + $( '#wpforms-builder-license-alert .close' ).on( 'click', function() { + window.location.href = wpforms_builder.exit_url; + } ); + + // License Alert dismiss button click. + $( '#wpforms-builder-license-alert .dismiss' ).on( 'click', function( event ) { + event.preventDefault(); + $( '#wpforms-builder-license-alert' ).remove(); + wpCookies.set( 'wpforms-builder-license-alert', 'true', 3600 ); + } ); + + // Don't allow the Akismet setting to be enabled if the Akismet plugin isn't available. + $builder.on( 'change', '#wpforms-panel-field-settings-akismet.wpforms-akismet-disabled', function() { + const $this = $( this ), + akismetStatus = $this.data( 'akismet-status' ); + + if ( $this.prop( 'checked' ) ) { + $.alert( { + title: wpforms_builder.heads_up, + content: wpforms_builder[ akismetStatus ], + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + onClose() { + $this.prop( 'checked', false ); + }, + } ); + } + } ); + + // Re-init the Show More button for multiselect instances when it's visible. + $builder.on( 'wpformsPanelSectionSwitch wpformsPanelSwitched', function() { + wpf.reInitShowMoreChoices( $( '#wpforms-panel-providers, #wpforms-panel-settings' ) ); + } ); + }, + + /** + * Notification section switch event handler. + * + * @since 1.8.2.3 + * + * @param {Object} e Event object. + * @param {string} panel Panel name. + */ + notificationsPanelSectionSwitch( e, panel ) { + if ( panel !== 'notifications' ) { + return; + } + + $( '.wpforms-notification .wpforms-panel-field.js-wpforms-from-email-validation input' ).trigger( 'focusout' ); + }, + + /** + * Check if one of the payment addons payments enabled. + * + * @since 1.7.5 + * + * @return {boolean} True if one of the payment addons payment enabled. + */ + isPaymentsEnabled() { + let paymentEnabled = false; + + $( app.getPaymentsTogglesSelector() ).each( function() { + if ( $( this ).prop( 'checked' ) ) { + paymentEnabled = true; + + return false; + } + } ); + + return paymentEnabled; + }, + + /** + * Get Payments toggles selector. + * + * @since 1.7.5 + * + * @return {string} List of selectors. + */ + getPaymentsTogglesSelector() { + return `.wpforms-panel-content-section-payment-toggle-one-time input, + .wpforms-panel-content-section-payment-toggle-recurring input, + #wpforms-panel-field-stripe-enable, + #wpforms-panel-field-paypal_standard-enable, + #wpforms-panel-field-authorize_net-enable, + #wpforms-panel-field-square-enable`; + }, + + /** + * Toggle an options group. + * + * @since 1.6.3 + * + * @param {Object} $input Toggled field. + */ + toggleOptionsGroup( $input ) { + const name = $input.attr( 'name' ); + let value = ''; + const $body = $( '.wpforms-panel-field-toggle-body[data-toggle="' + name + '"]' ), + enableInput = function() { + $input.prop( 'disabled', false ); + }; + + app.toggleProviderActiveIcon( $input ); + + if ( $body.length === 0 ) { + enableInput(); + + return; + } + + const type = $input.attr( 'type' ); + + if ( 'checkbox' === type || 'radio' === type ) { + value = $input.prop( 'checked' ) ? $input.val() : '0'; + } else { + value = $input.val(); + } + + $body.each( function() { + /** @type {JQ|jQuery} */ + const $this = $( this ); + + // eslint-disable-next-line no-unused-expressions + $this.attr( 'data-toggle-value' ).toString() === value.toString() + ? $this.slideDown( 150, enableInput ) + : $this.slideUp( 150, enableInput ); + } ); + }, + + /** + * Toggle Provider Active icon. + * + * @since 1.9.3 + * + * @param {Object} $input Toggled field. + */ + toggleProviderActiveIcon( $input ) { + const provider = $input.closest( '.wpforms-panel-content-section' ).data( 'provider' ); + + const wrappers = [ + 'wpforms-panel-field-' + provider + '-enable-wrap', + 'wpforms-panel-field-' + provider + '-enable_one_time-wrap', + 'wpforms-panel-field-' + provider + '-enable_recurring-wrap', + ]; + + if ( ! provider || ! wrappers.includes( $input.attr( 'id' ) ) ) { + return; + } + + let isActive = false; + + wrappers.forEach( ( wrapper ) => { + const $wrapper = $( '#' + wrapper ); + + if ( $wrapper.length && $wrapper.find( 'input' ).is( ':checked' ) ) { + isActive = true; + } + } ); + + const $sidebar = $( `.wpforms-panel-sidebar-section[data-section=${ provider }]` ), + $check_icon = $sidebar.find( '.fa-check-circle-o' ); + + $check_icon.toggleClass( 'wpforms-hidden', ! isActive ); + }, + + /** + * Toggle all option groups. + * + * @since 1.6.3 + * + * @param {jQuery} $context Context container jQuery object. + */ + toggleAllOptionGroups( $context ) { + $context = $context || $builder || $( '#wpforms-builder' ) || $( 'body' ); + + if ( ! $context ) { + return; + } + + // Show a toggled body. + $context.find( '.wpforms-panel-field-toggle' ).each( function() { + const $input = $( this ); + + $input.prop( 'disabled', true ); + app.toggleOptionsGroup( $input ); + } ); + }, + + /** + * Toggle unfoldable group of fields. + * + * @since 1.6.8 + * + * @param {Object} e Event object. + */ + toggleUnfoldableGroup( e ) { + e.preventDefault(); + + const /** @type {JQ|jQuery} */ $title = $( e.target ), + $group = $title.closest( '.wpforms-panel-fields-group' ), + $inner = $group.find( '.wpforms-panel-fields-group-inner' ), + cookieName = 'wpforms_fields_group_' + $group.data( 'group' ); + + if ( $group.hasClass( 'opened' ) ) { + wpCookies.remove( cookieName ); + $inner.stop().slideUp( 150, function() { + $group.removeClass( 'opened' ); + } ); + } else { + wpCookies.set( cookieName, 'true', 2592000 ); // 1 month. + $group.addClass( 'opened' ); + $inner.stop().slideDown( 150 ); + } + }, + + /** + * Hide the field preview helper box. + * + * @since 1.7.1 + * + * @param {Object} e Event object. + */ + hideFieldHelper( e ) { + e.preventDefault(); + e.stopPropagation(); + + const $helpers = $( '.wpforms-field-helper' ), + cookieName = 'wpforms_field_helper_hide'; + + wpCookies.set( cookieName, 'true', 30 * 24 * 60 * 60 ); // 1 month. + $helpers.hide(); + }, + + /** + * Smart Tag toggling. + * + * @since 1.0.1 + * @since 1.6.9 Simplify method. + * @since 1.9.5 Deprecated. + * + * @param {Event} e Event. + */ + smartTagToggle( e ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.smartTagToggle()" has been deprecated.' ); + + e.preventDefault(); + + // Prevent ajax to validate the default email queued on focusout event. + elements.$focusOutTarget = null; + + const $this = $( this ), + $wrapper = $this.closest( '.wpforms-panel-field,.wpforms-field-option-row' ); + + if ( $wrapper.hasClass( 'smart-tags-toggling' ) ) { + return; + } + + $wrapper.addClass( 'smart-tags-toggling' ); + + if ( $this.hasClass( 'smart-tag-showing' ) ) { + app.removeSmartTagsList( $this ); + + return; + } + + app.insertSmartTagsList( $this ); + }, + + /** + * Remove a Smart Tag list. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {JQ|jQuery} $el Toggle element. + */ + removeSmartTagsList( $el ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.removeSmartTagsList()" has been deprecated.' ); + + const $wrapper = $el.closest( '.wpforms-panel-field,.wpforms-field-option-row' ), + $list = $wrapper.find( '.smart-tags-list-display' ); + + $el.find( 'span' ).text( wpforms_builder.smart_tags_show ); + + $list.slideUp( '', function() { + $list.remove(); + $el.removeClass( 'smart-tag-showing' ); + $wrapper.removeClass( 'smart-tags-toggling' ); + } ); + }, + + /** + * Insert Smart Tag list. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {JQ|jQuery} $el Toggle element. + */ + insertSmartTagsList( $el ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.insertSmartTagsList()" has been deprecated.' ); + + const $wrapper = $el.closest( '.wpforms-panel-field,.wpforms-field-option-row' ); + let $label = $el.closest( 'label' ), + insideLabel = true; + + if ( ! $label.length ) { + $label = $wrapper.find( 'label' ); + insideLabel = false; + } + + const smartTagList = app.getSmartTagsList( $el, $label.attr( 'for' ).indexOf( 'wpforms-field-option-' ) !== -1 ); + + // eslint-disable-next-line no-unused-expressions + insideLabel + ? $label.after( smartTagList ) + : $el.after( smartTagList ); + + $el.find( 'span' ).text( wpforms_builder.smart_tags_hide ); + + $wrapper.find( '.smart-tags-list-display' ).slideDown( '', function() { + $el.addClass( 'smart-tag-showing' ); + $wrapper.removeClass( 'smart-tags-toggling' ); + } ); + }, + + /** + * Get Smart Tag list markup. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {jQuery} $el Toggle element. + * @param {boolean} isFieldOption Is a field option. + * + * @return {string} Smart Tags list markup. + */ + getSmartTagsList( $el, isFieldOption ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.getSmartTagsList()" has been deprecated.' ); + + let smartTagList; + + smartTagList = '
      '; + smartTagList += app.getSmartTagsListFieldsElements( $el ); + smartTagList += app.getSmartTagsListOtherElements( $el, isFieldOption ); + smartTagList += '
    '; + + return smartTagList; + }, + + /** + * Get Smart Tag fields elements markup. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {jQuery} $el Toggle element. + * + * @return {string} Smart Tags list elements markup. + */ + getSmartTagsListFieldsElements( $el ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.getSmartTagsListFieldsElements()" has been deprecated.' ); + + const type = $el.data( 'type' ); + + if ( ! [ 'fields', 'all' ].includes( type ) ) { + return ''; + } + + const fields = app.getSmartTagsFields( $el ); + + if ( ! fields ) { + return '
  7. ' + wpforms_builder.fields_unavailable + '
  8. '; + } + + let smartTagListElements = ''; + + smartTagListElements += '
  9. ' + wpforms_builder.fields_available + '
  10. '; + + for ( const fieldKey in fields ) { + smartTagListElements += app.getSmartTagsListFieldsElement( fields[ fieldKey ] ); + } + + return smartTagListElements; + }, + + /** + * Get fields that possible to create smart tag. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {jQuery} $el Toggle element. + * + * @return {Array} Fields for smart tags. + */ + getSmartTagsFields( $el ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.getSmartTagsFields()" has been deprecated.' ); + + const allowed = $el.data( 'fields' ); + const isAllowedRepeater = $el.data( 'allow-repeated-fields' ); + const allowedFields = allowed ? allowed.split( ',' ) : undefined; + + return wpf.getFields( allowedFields, true, isAllowedRepeater ); + }, + + /** + * Get field markup for the Smart Tags list. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {Object} field A field. + * + * @return {string} Smart Tags field markup. + */ + getSmartTagsListFieldsElement( field ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.getSmartTagsListFieldsElement()" has been deprecated.' ); + + const label = field.label + ? wpf.encodeHTMLEntities( wpf.sanitizeHTML( field.label ) ) + : wpforms_builder.field + ' #' + field.id; + + let html = `
  11. ${ label }
  12. `; + + const additionalTags = field.additional || []; + + // Add additional tags for `name`, `date/time` and `address` fields. + if ( additionalTags.length > 1 ) { + additionalTags.forEach( ( additionalTag ) => { + // Capitalize the first letter and add space before numbers. + const additionalTagLabel = additionalTag.charAt( 0 ).toUpperCase() + additionalTag.slice( 1 ).replace( /(\D)(\d)/g, '$1 $2' ); + html += `
  13. ${ label } – ${ additionalTagLabel }
  14. `; + } ); + } + + return html; + }, + + /** + * Get Smart Tag other elements' markup. + * + * @since 1.6.9 + * @since 1.9.5 Deprecated. + * + * @param {jQuery} $el Toggle element. + * @param {boolean} isFieldOption Is a field option. + * + * @return {string} Smart Tags list element markup. + */ + getSmartTagsListOtherElements( $el, isFieldOption ) {// eslint-disable-line complexity + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.getSmartTagsListOtherElements()" has been deprecated.' ); + + const type = $el.data( 'type' ); + let smartTagListElements; + + if ( type !== 'other' && type !== 'all' ) { + return ''; + } + + smartTagListElements = '
  15. ' + wpforms_builder.other + '
  16. '; + + for ( const smartTagKey in wpforms_builder.smart_tags ) { + if ( + ( isFieldOption && wpforms_builder.smart_tags_disabled_for_fields.includes( smartTagKey ) ) || + ( + $el.data( 'location' ) === 'confirmations' && + wpforms_builder.smart_tags_disabled_for_confirmations.includes( smartTagKey ) + ) + ) { + continue; + } + + smartTagListElements += '
  17. ' + wpforms_builder.smart_tags[ smartTagKey ] + '
  18. '; + } + + return smartTagListElements; + }, + + /** + * Smart Tag insert. + * + * @since 1.0.1 + * @since 1.6.9 TinyMCE compatibility. + * @since 1.9.5 Deprecated. + * + * @param {Event} e Event. + */ + smartTagInsert( e ) { // eslint-disable-line complexity + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.smartTagInsert()" has been deprecated.' ); + + e.preventDefault(); + + const /** @type {JQ|jQuery} */ $this = $( this ), + $list = $this.closest( '.smart-tags-list-display' ), + $wrapper = $list.closest( '.wpforms-panel-field,.wpforms-field-option-row' ), + $toggle = $wrapper.find( '.toggle-smart-tag-display' ), + $input = $wrapper.find( 'input[type=text], textarea' ), + meta = $this.data( 'meta' ), + additional = $this.data( 'additional' ) ? '|' + $this.data( 'additional' ) : '', + type = $this.data( 'type' ); + let smartTag = type === 'field' ? '{field_id="' + meta + additional + '"}' : '{' + meta + '}', + editor; + + if ( typeof tinyMCE !== 'undefined' ) { + editor = tinyMCE.get( $input.prop( 'id' ) ); + + if ( editor && ! editor.hasFocus() ) { + editor.focus( true ); + } + } + + if ( editor && ! editor.isHidden() ) { + editor.insertContent( smartTag ); + } else { + smartTag = ' ' + smartTag + ' '; + + $input.insertAtCaret( smartTag ); + + // Remove redundant spaces after wrapping smartTag into spaces. + $input.val( $input.val().trim().replace( ' ', ' ' ) ); + $input.trigger( 'focus' ).trigger( 'input' ); + } + + // Remove the list, all done! + $list.slideUp( '', function() { + $list.remove(); + } ); + + $toggle.find( 'span' ).text( wpforms_builder.smart_tags_show ); + $wrapper.find( '.toggle-smart-tag-display' ).removeClass( 'smart-tag-showing' ); + }, + + /** + * Validate email smart tags in Notifications fields. + * + * @since 1.4.9 + * @since 1.9.5 Deprecated. + * + * @param {Object} $el Input field to check the value for. + */ + validateEmailSmartTags( $el ) { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.validateEmailSmartTags()" has been deprecated.' ); + + let val = $el.val(); + + if ( ! val ) { + return; + } + + // Turns '{email@domain.com}' into 'email@domain.com'. + // Email RegEx inspired by http://emailregex.com + val = val.replace( /{(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))}/g, function( x ) { + return x.slice( 1, -1 ); + } ); + + $el.val( val ); + }, + + /** + * Validate the Email field smart tag `{field_id="N"}` and return the error. + * + * @since 1.9.5 + * + * @param {string} value Input field value. + * + * @return {string|null} Error message or null in case the regexp pattern doesn't match. + */ + getEmailFieldSmartTagError( value ) { + // Detects `{field_id="N"}` smart tags. + const fieldSmartTagRegex = /\{field_id="(\d+)"}/g; + + if ( ! fieldSmartTagRegex.test( value ) ) { + return null; + } + + // Reset regex lastIndex to ensure we start from the beginning. + fieldSmartTagRegex.lastIndex = 0; + + // Extract the field ID from the smart tag. + const match = fieldSmartTagRegex.exec( value ); + const fieldId = match ? match[ 1 ] : null; + const fieldSettings = wpf.getField( fieldId ); + + if ( fieldSettings && fieldSettings.type === 'email' ) { + return ''; + } + + return wpforms_builder.allow_only_email_fields; + }, + + /** + * Validate From Email in the Notification block. + * + * @since 1.8.1 + */ + validateFromEmail() { + // Detect repeated execution. + if ( wpf.isRepeatedCall( 'validateFromEmail' ) ) { + return; + } + + const $field = $( this ); + const value = $field.val(); + + if ( $field.data( 'value' ) === value ) { + return; + } + + $field.data( 'value', value ); + + const $fieldWrapper = $field.parent(); + const warningClass = 'wpforms-panel-field-warning'; + const blockedSymbolsRegex = /[\s,;]/g; + + if ( blockedSymbolsRegex.test( value.trim() ) ) { + $fieldWrapper.addClass( warningClass ); + app.printNotice( wpforms_builder.allow_only_one_email, $fieldWrapper ); + + return; + } + + if ( ! app.shouldCallAjaxValidation( value, $fieldWrapper, warningClass ) ) { + return; + } + + app.ajaxValidation( value, $fieldWrapper, warningClass ); + }, + + /** + * Whether we should call Ajax validation. + * + * @since 1.9.5 + * + * @param {*} value Field value. + * @param {jQuery} $fieldWrapper Field wrapper. + * @param {string} warningClass Warning class. + * + * @return {boolean} True if Ajax validation should be performed, otherwise false. + */ + shouldCallAjaxValidation( value, $fieldWrapper, warningClass ) { + let error = ''; + let callAjaxValidation = true; + + // If the field is empty. + error = value === '' ? wpforms_builder.empty_email_address : ''; + + // If the field is not empty, check for the `{field_id}` smart tag. + if ( error === '' ) { + error = app.getEmailFieldSmartTagError( value ); + callAjaxValidation = error === null; + } + + // If there is an error, we don't need to make an AJAX request. + if ( error ) { + $fieldWrapper.addClass( warningClass ); + app.printNotice( error, $fieldWrapper, value === '' ); + + return false; + } + + if ( ! callAjaxValidation ) { + $fieldWrapper.removeClass( warningClass ); + app.removeNotice( $fieldWrapper ); + + return false; + } + + return true; + }, + + /** + * Whether we should call Ajax validation. + * + * @since 1.9.5 + * + * @param {*} value Field value. + * @param {jQuery} $fieldWrapper Field wrapper. + * @param {string} warningClass Warning class. + */ + ajaxValidation( value, $fieldWrapper, warningClass ) { + const data = { + form_id: s.formID, // eslint-disable-line camelcase + email: value, + nonce: wpforms_builder.nonce, + action: 'wpforms_builder_notification_from_email_validate', + }; + + // noinspection JSUnusedLocalSymbols + $.post( + wpforms_builder.ajax_url, data, function( res ) { + app.removeNotice( $fieldWrapper ); + + if ( res.success ) { + $fieldWrapper.removeClass( warningClass ); + + return; + } + + $fieldWrapper.addClass( warningClass ); + $fieldWrapper.append( res.data ); + } + ).fail( function( xhr ) { + // eslint-disable-next-line no-console + console.log( xhr.responseText ); + } ); + }, + + /** + * Disabled fields. + * Addon fields in Lite initialization. + * + * @since 1.9.4 + */ + disabledFields: { + init() { + app.disabledFields.initCouponsChoicesJS(); + app.disabledFields.initFileUploadChoicesJS(); + }, + + /** + * Initialize Choices.js for the Coupon field. + * + * @since 1.9.4 + */ + initCouponsChoicesJS() { + if ( typeof window.Choices !== 'function' || WPForms.Admin.Builder.Coupons ) { + return; + } + + $( '.wpforms-field-option-row-allowed_coupons select:not(.choices__input)' ).each( function() { + const $select = $( this ); + const choicesInstance = new Choices( + $select.get( 0 ), + { + shouldSort: false, + removeItemButton: true, + renderChoicesLimit: 5, + callbackOnInit() { + wpf.showMoreButtonForChoices( this.containerOuter.element ); + }, + } ); + + // Save the Choices.js instance for future access. + $select.data( 'choicesjs', choicesInstance ); + } ); + }, + + /** + * Initialize Choices.js for the File Upload field. + * + * @since 1.9.4 + */ + initFileUploadChoicesJS() { + if ( typeof window.Choices !== 'function' || WPForms.Admin.Builder.FieldFileUpload ) { + return; + } + + const $selects = $( '.wpforms-file-upload-user-roles-select, .wpforms-file-upload-user-names-select' ); + + $selects.each( function() { + new Choices( $( this )[ 0 ], { removeItemButton: true } ); + } ); + }, + }, + + //--------------------------------------------------------------------// + // Icon Choices + //--------------------------------------------------------------------// + + /** + * Icon Choices component. + * + * @since 1.7.9 + */ + iconChoices: { + + /** + * Runtime component cache. + * + * Field "toggle": "Use Icon Choices" toggle that initiated the installation. + * Field "previousModal": Last open modal that may need to be closed. + * + * @since 1.7.9 + */ + cache: {}, + + /** + * Component configuration settings. + * + * @since 1.7.9 + */ + config: { + colorPropertyName: '--wpforms-icon-choices-color', + }, + + /** + * Initialize the component. + * + * @since 1.7.9 + */ + init() { + // Extend jquery-confirm plugin with max-height support for the content area. + app.iconChoices.extendJqueryConfirm(); + + $builder.on( 'wpformsBuilderReady', function( event ) { + // If there are Icon Choices fields but the library is not installed - force install prompt. + if ( wpforms_builder.icon_choices.is_active && ! wpforms_builder.icon_choices.is_installed ) { + app.iconChoices.openInstallPromptModal( true ); + + // Prevent the Form Builder from getting ready (hold the loading state). + event.preventDefault(); + } + } ); + + // Toggle Icon Choices on or off. + $builder.on( 'change', '.wpforms-field-option-row-choices_icons input', app.iconChoices.toggleIconChoices ); + + // Change accent color. + $builder.on( 'change', '.wpforms-field-option-row-choices_icons_color .wpforms-color-picker', app.iconChoices.changeIconsColor ); + + // Update field preview when option value is changed (style, size). + $builder.on( 'change', '.wpforms-field-option-row-choices_icons_style select, .wpforms-field-option-row-choices_icons_size select', function() { + const fieldID = $( this ).parent().data( 'field-id' ), + fieldType = $( '#wpforms-field-option-' + fieldID ).find( '.wpforms-field-option-hidden-type' ).val(); + + app.fieldChoiceUpdate( fieldType, fieldID ); + } ); + + // Open Icon Picker modal. + $builder.on( 'click', '.wpforms-field-option-row-choices .choices-list .wpforms-icon-select', app.iconChoices.openIconPickerModal ); + }, + + /** + * Turn the feature on or off. + * + * @since 1.7.9 + */ + toggleIconChoices() { // eslint-disable-line complexity + const $this = $( this ), + checked = $this.is( ':checked' ); + + // Check if a required icon library is installed. + if ( checked && ! wpforms_builder.icon_choices.is_installed ) { + app.iconChoices.cache.toggle = $this; + app.iconChoices.openInstallPromptModal(); + + return; + } + + const fieldID = $this.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + const $fieldOptions = $( `#wpforms-field-option-${ fieldID }` ), + $imageChoices = $fieldOptions.find( `#wpforms-field-option-${ fieldID }-choices_images` ), + $choicesList = $fieldOptions.find( `#wpforms-field-option-row-${ fieldID }-choices ul` ); + + // Turn Image Choice off. + if ( checked && $imageChoices.is( ':checked' ) ) { + $imageChoices.prop( 'checked', false ).trigger( 'change' ); + } + + // Toggle Advanced > Dynamic Choices on or off. + $fieldOptions.find( `#wpforms-field-option-row-${ fieldID }-dynamic_choices` ).toggleClass( 'wpforms-hidden', checked ); + + // Toggle subfields. + $fieldOptions.find( `#wpforms-field-option-row-${ fieldID }-choices_icons_color` ).toggleClass( 'wpforms-hidden' ); + $fieldOptions.find( `#wpforms-field-option-row-${ fieldID }-choices_icons_size` ).toggleClass( 'wpforms-hidden' ); + $fieldOptions.find( `#wpforms-field-option-row-${ fieldID }-choices_icons_style` ).toggleClass( 'wpforms-hidden' ); + + const $colorOption = $fieldOptions.find( `#wpforms-field-option-${ fieldID }-choices_icons_color` ), + colorValue = _.isEmpty( $colorOption.val() ) ? wpforms_builder.icon_choices.default_color : $colorOption.val(); + + // Set accent color for all choices. + $choicesList.prop( 'style', `${ app.iconChoices.config.colorPropertyName }: ${ colorValue };` ); + + // Toggle icon selectors with previews for all choices. + $choicesList.toggleClass( 'show-icons', checked ); + + // Set the layout to inline on activation, revert to one column on deactivation. + $fieldOptions.find( `#wpforms-field-option-${ fieldID }-input_columns` ).val( checked ? 'inline' : '' ).trigger( 'change' ); + + $( `#wpforms-field-option-row-${ fieldID }-choices_icons_hide` ).toggleClass( 'wpforms-hidden', ! checked ); + + // Finally, update the preview. + app.fieldChoiceUpdate( $fieldOptions.find( '.wpforms-field-option-hidden-type' ).val(), fieldID ); + }, + + /** + * Change accent color and update previews. + * + * @since 1.7.9 + */ + changeIconsColor() { + const $this = $( this ), + fieldID = $this.parents( '.wpforms-field-option-row' ).data( 'field-id' ), + $field = $( '#wpforms-field-option-' + fieldID ), + type = $field.find( '.wpforms-field-option-hidden-type' ).val(), + $choicesList = $field.find( '.wpforms-field-option-row-choices .choices-list' ), + colorValue = app.getValidColorPickerValue( $this ); + + // Update icons color in options panel. + $choicesList.prop( 'style', `${ app.iconChoices.config.colorPropertyName }: ${ colorValue };` ); + + // Update preview. + app.fieldChoiceUpdate( type, fieldID ); + }, + + /** + * Open a modal prompting to install the icon library for Icon Choices. + * + * @since 1.7.9 + * + * @param {boolean} force Whether it's a normal installation procedure or forced if the library is necessary but is missing. + */ + openInstallPromptModal( force = false ) { + const content = force + ? wpforms_builder.icon_choices.strings.reinstall_prompt_content + : wpforms_builder.icon_choices.strings.install_prompt_content; + + const modal = $.confirm( { + title: wpforms_builder.heads_up, + content, + icon: 'fa fa-info-circle', + type: 'orange', + buttons: { + continue: { + text: wpforms_builder.continue, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + this.setIcon( 'fa fa-cloud-download' ); + this.setTitle( wpforms_builder.icon_choices.strings.install_title ); + this.setContent( wpforms_builder.icon_choices.strings.install_content ); + + $.each( this.buttons, function( _index, button ) { + button.hide(); + } ); + + app.iconChoices.installIconLibrary(); + + // Do not close the modal. + return false; + }, + }, + }, + onOpen() { + // Turn the toggle off during normal installation. + if ( ! force && app.iconChoices.cache.toggle ) { + app.iconChoices.cache.toggle.prop( 'checked', false ); + } + + app.iconChoices.cache.previousModal = this; + }, + } ); + + // Add a Cancel button for normal installation routine only. + if ( ! force ) { + modal.buttons.cancel = { + text: wpforms_builder.cancel, + keys: [ 'esc' ], + action() { + app.iconChoices.cache.toggle.prop( 'checked', false ); + }, + }; + } + }, + + /** + * Silently download and install the icon library on the server. + * + * @since 1.7.9 + */ + installIconLibrary() { + const data = { + // eslint-disable-next-line camelcase + _wp_http_referer: wpf.updateQueryString( '_wp_http_referer', null ), + nonce: wpforms_builder.nonce, + action: 'wpforms_icon_choices_install', + }; + + $.ajaxSetup( { + type: 'POST', + timeout: 120000, // 2 minutes. + } ); + + $.post( wpforms_builder.ajax_url, data, function( response ) { + // eslint-disable-next-line no-unused-expressions + response.success + ? app.iconChoices.openInstallSuccessModal() + : app.iconChoices.openInstallErrorModal( response ); + } ).fail( function( jqXHR ) { + app.iconChoices.openInstallErrorModal( jqXHR ); + } ); + }, + + /** + * Open a modal on icon library installation success. + * + * @since 1.7.9 + */ + openInstallSuccessModal() { + $.confirm( { + title: wpforms_builder.done, + content: wpforms_builder.icon_choices.strings.install_success_content, + icon: 'fa fa-check-circle', + type: 'green', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + if ( app.iconChoices.cache.toggle ) { + app.iconChoices.cache.toggle.prop( 'checked', true ); + + const fieldId = app.iconChoices.cache.toggle.parents( '.wpforms-field-option-row' ).data( 'field-id' ); + const $imageChoices = $builder.find( `#wpforms-field-option-${ fieldId }-choices_images` ); + + // Turn Image Choice off, if needed, without triggering change event. + if ( $imageChoices.is( ':checked' ) ) { + $imageChoices.prop( 'checked', false ); + } + } + + wpforms_builder.exit_url = window.location.href; + + app.formSave( true ); + }, + }, + }, + onOpen() { + if ( app.iconChoices.cache.toggle ) { + const fieldId = app.iconChoices.cache.toggle.parents( '.wpforms-field-option-row-choices_icons' ).data( 'field-id' ); + + $builder.find( `#wpforms-field-option-${ fieldId }-input_columns` ).val( 'inline' ); + } + + app.iconChoices.cache.previousModal.close(); + }, + } ); + }, + + /** + * Open a modal on icon library installation failure. + * + * @since 1.7.9 + * + * @param {Object} errorData Unsuccessful ajax JSON response or jqXHR object. + */ + openInstallErrorModal( errorData ) { + $.confirm( { + title: wpforms_builder.uh_oh, + content: wpforms_builder.icon_choices.strings.install_error_content, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + if ( app.iconChoices.cache.toggle ) { + app.iconChoices.cache.toggle.prop( 'checked', false ); + } else { + app.formSaveError(); + } + }, + }, + }, + onOpen() { + wpf.debug( errorData ); + app.iconChoices.cache.previousModal.close(); + }, + onDestroy() { + // Clean up the cache, we're done. + delete app.iconChoices.cache.previousModal; + delete app.iconChoices.cache.toggle; + }, + } ); + }, + + /** + * Extend jquery-confirm plugin with support of max-height for the content area. + * + * @since 1.7.9 + */ + extendJqueryConfirm() { + // Extend a method of global instance. + // noinspection JSUnusedGlobalSymbols + window.Jconfirm.prototype._updateContentMaxHeight = function() { + // noinspection JSUnresolvedReference + const height = + $( window ).height() - + ( this.$jconfirmBox.outerHeight() - this.$contentPane.outerHeight() ) - + ( this.offsetTop + this.offsetBottom ); + + // Custom property, if set via jquery-confirm options. + // noinspection JSUnresolvedReference + const maxHeight = this.contentMaxHeight || height; + + // noinspection JSUnresolvedReference + this.$contentPane.css( { + 'max-height': Math.min( maxHeight, height ) + 'px', + } ); + }; + }, + + /** + * Open Icon Picker modal. + * + * @since 1.7.9 + */ + openIconPickerModal() { + const $this = $( this ); + + const data = { + fieldId: $this.parents( '.wpforms-field-option-row' ).data( 'field-id' ), + choiceId: $this.parent().data( 'key' ), + selectedIcon: $this.find( '.source-icon' ).val(), + selectedIconStyle: $this.find( '.source-icon-style' ).val(), + }; + + const title = ` + ${ wpforms_builder.icon_choices.strings.icon_picker_title } + ${ wpforms_builder.icon_choices.strings.icon_picker_description } + + `; + + const content = ` +
    +
      +
        +

        +

        `; + + $.confirm( { + title, + titleClass: 'wpforms-icon-picker-title', + content, + icon: false, + closeIcon: true, + type: 'orange', + backgroundDismiss: true, + boxWidth: 800, + contentMaxHeight: 368, // Custom property, see app.iconChoices.extendJqueryConfirm(). + smoothContent: false, + buttons: false, + onOpenBefore() { + // Add custom classes to target various elements. + this.$body.addClass( 'wpforms-icon-picker-jconfirm-box' ); + this.$contentPane.addClass( 'wpforms-icon-picker-jconfirm-content-pane' ); + }, + onContentReady() { + /** @type {Modal} */ + const modal = this; + + // Initialize the list of icons with List.js and display the 1st page. + app.iconChoices.initIconsList( data ); + + // Focus the search input. + modal.$title.find( '.search' ).focus(); + + // Listen for clicks on icons to select them. + modal.$content.find( '.wpforms-icon-picker-icons' ).on( 'click', 'li', function() { + app.iconChoices.selectIcon( modal, $( this ) ); + } ); + }, + } ); + }, + + /** + * Initialize List.js in the Icon Selector modal on demand and cache it. + * + * @since 1.7.9 + * + * @param {Object} data Source option data - field and choice IDs, selected icon name and style. + */ + initIconsList( data ) { + const options = { + valueNames: [ 'name' ], + listClass: 'wpforms-icon-picker-icons', + page: wpforms_builder.icon_choices.icons_per_page, + pagination: { + paginationClass: 'wpforms-icon-picker-pagination', + }, + item( values ) { + const maybeSelectedClass = ( values.icon === data.selectedIcon && values.style === data.selectedIconStyle ) ? 'class="selected"' : ''; + + return ` +
      • + + ${ values.icon } +
      • `; + }, + indexAsync: true, + }; + + // Initialize List.js instance. + const iconsList = new List( 'wpforms-icon-picker-icons', options, wpforms_builder.icon_choices.icons ); + + // Initialize infinite scroll pagination on the list instance. + app.iconChoices.infiniteScrollPagination( iconsList ); + + // Bind search to custom input. + $( '#wpforms-icon-picker-search' ).on( 'keyup', function() { + // Custom partial match search. + iconsList.search( $( this ).val(), [ 'name' ], function( searchString ) { + for ( let index = 0, length = iconsList.items.length; index < length; index++ ) { + iconsList.items[ index ].found = ( new RegExp( searchString ) ).test( iconsList.items[ index ].values().icon ); + } + } ); + } ); + + // Show a "nothing found" message if the search returned no results. + iconsList.on( 'searchComplete', function() { + const $element = $( '.wpforms-icon-picker-not-found' ); + + $element.html( $element.data( 'message' ).replace( '{keyword}', $( '#wpforms-icon-picker-search' ).val() ) ); + $element.toggleClass( 'wpforms-hidden', ! _.isEmpty( iconsList.matchingItems ) ); + } ); + }, + + /** + * Handle infinite scroll on the list of icons. + * + * @since 1.7.9 + * + * @param {Object} list List.js instance. + */ + infiniteScrollPagination( list ) { + let page = 1; + + const options = { + root: document.querySelector( '.wpforms-icon-picker-jconfirm-content-pane' ), + rootMargin: '600px', // 5 rows of icons. Formula: 20 + ( (96 + 20) * rows ). + }; + + const observer = new IntersectionObserver( function( entries ) { + if ( ! entries[ 0 ].isIntersecting ) { + return; + } + + page++; + list.show( 0, page * wpforms_builder.icon_choices.icons_per_page ); + }, options ); + + observer.observe( document.querySelector( '.wpforms-icon-picker-pagination' ) ); + }, + + /** + * When an icon is selected, update the choice and the field preview. + * + * @since 1.7.9 + * + * @param {Object} modal Current jQuery Confirm modal instance. + * @param {jQuery} $this The list item (icon) that was clicked. + */ + selectIcon( modal, $this ) { + const fieldId = $this.parent().data( 'field-id' ); + const choiceId = $this.parent().data( 'choice-id' ); + const icon = $this.data( 'icon' ); + const iconStyle = $this.data( 'icon-style' ); + const $choice = $( `#wpforms-field-option-row-${ fieldId }-choices ul li[data-key=${ choiceId }]` ); + const fieldType = $( `#wpforms-field-option-row-${ fieldId }-choices ul` ).data( 'field-type' ); + + $this.addClass( 'selected' ); + $this.siblings( '.selected' ).removeClass( 'selected' ); + + $choice.find( '.wpforms-icon-select span' ).text( icon ); + $choice.find( '.wpforms-icon-select .ic-fa-preview' ).removeClass().addClass( `ic-fa-preview ic-fa-${ iconStyle } ic-fa-${ icon }` ); + $choice.find( '.wpforms-icon-select .source-icon' ).val( icon ); + $choice.find( '.wpforms-icon-select .source-icon-style' ).val( iconStyle ); + + app.fieldChoiceUpdate( fieldType, fieldId ); + + modal.close(); + }, + }, + + //--------------------------------------------------------------------// + // Alerts (notices). + //--------------------------------------------------------------------// + + /** + * Click on the Dismiss notice button. + * + * @since 1.6.7 + */ + dismissNotice() { + $builder.on( 'click', '.wpforms-alert-field-not-available .wpforms-dismiss-button', function( e ) { + e.preventDefault(); + + const $button = $( this ), + $alert = $button.closest( '.wpforms-alert' ), + fieldId = $button.data( 'field-id' ); + + $alert.addClass( 'out' ); + setTimeout( function() { + $alert.remove(); + }, 250 ); + + if ( fieldId ) { + $( '#wpforms-field-option-' + fieldId ).remove(); + } + } ); + }, + + //--------------------------------------------------------------------// + // Other functions. + //--------------------------------------------------------------------// + + /** + * Trim long form titles. + * + * @since 1.0.0 + */ + trimFormTitle() { + const $title = $( '.wpforms-center-form-name' ); + + if ( $title.text().length > 38 ) { + const shortTitle = $title.text().trim().substring( 0, 38 ).split( ' ' ).slice( 0, -1 ).join( ' ' ) + '...'; + + $title.text( shortTitle ); + } + }, + + /** + * Load or refresh the color picker. + * + * @since 1.2.1 + * @since 1.7.9 Added default value support. + * @since 1.9.7 Added `$context` and `options` parameters. + * + * @param {jQuery|null} $context Container to search for color picker elements. + * @param {Object|null} options Color picker options. + */ + loadColorPickers( $context = null, options = null ) { + $context = $context || $builder; + options = options || {}; + + $context.find( '.wpforms-color-picker' ).each( function() { + const $input = $( this ); + const $minicolors = $input.closest( '.minicolors' ); + + // Skip the focused (active) color picker. + if ( $minicolors.hasClass( 'minicolors-focus' ) && options.skipFocused ) { + return; + } + + // If it appears to be already initialized, reset. This is necessary when duplicating fields with color pickers. + if ( $input.hasClass( 'minicolors-input' ) ) { + $input.minicolors( 'destroy' ); + } + + const pickerOptions = { + defaultValue: $input.data( 'fallback-color' ) || '', + ...options, + }; + + $input.minicolors( pickerOptions ); + } ); + }, + + /** + * Get a valid color value from the color picker or a default one. + * + * @since 1.7.9 + * + * @param {Object} $colorPicker Current field. + * + * @return {string} Always valid color value. + */ + getValidColorPickerValue( $colorPicker ) { + const color = $colorPicker.minicolors( 'value' ); + + // jQuery MiniColors returns a "black" RGB object if the color value is invalid. + const isInvalid = _.isEqual( $colorPicker.minicolors( 'rgbObject' ), { r: 0, g: 0, b: 0 } ); + const isBlack = _.includes( [ '#000', '#000000' ], color ); + + // If default value isn't provided via the data attribute, use black. + const defaultValue = $colorPicker.data( 'fallback-color' ) || '#000000'; + + return isInvalid && ! isBlack ? defaultValue : color; + }, + + /** + * Hotkeys: + * Ctrl+H - Help. + * Ctrl+P - Preview. + * Ctrl+B - Embed. + * Ctrl+E - Entries. + * Ctrl+S - Save. + * Ctrl+Q - Exit. + * Ctrl+/ - Keyboard Shortcuts modal. + * Ctrl+F - Focus search fields input. + * Ctrl+T - Toggle sidebar (Alt+S on Windows and Linux). + * + * @since 1.2.4 + */ + builderHotkeys() { + $( document ).on( 'keydown', function( e ) { // eslint-disable-line complexity + // Toggle sidebar on Alt+S (on Windows and Linux). + if ( ( browser.isLinux || browser.isWindows ) && e.altKey && e.keyCode === 83 ) { + $( elements.$sidebarToggle, $builder ).trigger( 'click' ); + + return; + } + + if ( ! e.ctrlKey ) { + return; + } + + switch ( e.keyCode ) { + case 72: // Open the Help screen on Ctrl+H. + $( elements.$helpButton, $builder ).trigger( 'click' ); + break; + + case 80: // Open the Form Preview tab on Ctrl+P. + window.open( wpforms_builder.preview_url ); + break; + + case 66: // Trigger the Embed modal on Ctrl+B. + $( elements.$embedButton, $builder ).trigger( 'click' ); + break; + + case 69: // Open the Entries tab on Ctrl+E. + window.open( wpforms_builder.entries_url ); + break; + + case 83: // Trigger the Builder save on Ctrl+S. + $( elements.$saveButton, $builder ).trigger( 'click' ); + break; + + case 81: // Trigger the Exit on Ctrl+Q. + $( elements.$exitButton, $builder ).trigger( 'click' ); + break; + + case 191: // Keyboard shortcuts modal on Ctrl+/. + app.openKeyboardShortcutsModal(); + break; + + case 84: // Toggle sidebar on Ctrl+T. + $( elements.$sidebarToggle, $builder ).trigger( 'click' ); + break; + + case 70: // Focus search fields input on Ctrl+F. + elements.$addFieldsTab.trigger( 'click' ); + elements.$fieldsSidebar.scrollTop( 0 ); + elements.$searchInput.focus(); + break; + + default: + return; + } + + return false; + } ); + }, + + /** + * Open Keyboard Shortcuts modal. + * + * @since 1.6.9 + */ + openKeyboardShortcutsModal() { + // Close the already opened instance. + if ( $( '.wpforms-builder-keyboard-shortcuts' ).length ) { + jconfirm.instances[ jconfirm.instances.length - 1 ].close(); + + return; + } + + $.alert( { + title: wpforms_builder.shortcuts_modal_title, + content: wpforms_builder.shortcuts_modal_msg + wp.template( 'wpforms-builder-keyboard-shortcuts' )(), + icon: 'fa fa-keyboard-o', + type: 'blue', + boxWidth: '550px', + smoothContent: false, + buttons: { + confirm: { + text: wpforms_builder.close, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + onOpenBefore() { + this.$body.addClass( 'wpforms-builder-keyboard-shortcuts' ); + // Dynamically change the shortcut key documentation on Windows/Linux. + if ( browser.isLinux || browser.isWindows ) { + this.$body.find( '.shortcut-key.shortcut-key-ctrl-t' ).html( 'alts' ); + } + }, + } ); + }, + + /** + * Register JS templates for various elements. + * + * @since 1.4.8 + */ + registerTemplates() { + if ( typeof WPForms === 'undefined' ) { + return; + } + + WPForms.Admin.Builder.Templates.add( [ + 'wpforms-builder-confirmations-message-field', + 'wpforms-builder-conditional-logic-toggle-field', + ] ); + }, + + /** + * Exit builder. + * + * @since 1.5.7 + * @since 1.7.8 Deprecated. + */ + exitBack() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsBuilder.exitBack()" has been deprecated.' ); + }, + + /** + * Update select field placeholder. + * + * Updates the select field placeholder to be "--- Select Choice". + * First checks if the field has required to be toggled on and if this is not a multiple selection field. + * Does not update the placeholder if it is already set. + * + * @since 1.9.6 + * + * @param {number} id Field id. + * @param {jQuery} $preview Field preview. + */ + onUpdateSelectPlaceholder( id, $preview ) { // eslint-disable-line complexity + if ( + ! [ 'select', 'payment-select' ].includes( $preview.data( 'field-type' ) ) || + ! $preview.hasClass( 'required' ) || + $( `#wpforms-field-option-${ id }-multiple` ).prop( 'checked' ) + ) { + return; + } + + // Check if this field has a preselected default value. + if ( app.dropdownField.helpers.hasDefaults( id ) ) { + return; + } + + app.updateSelectPlaceholder( id ); + }, + + /** + * Update the selected placeholder if it does not have value already. + * + * @since 1.9.6 + * + * @param {number} fieldId Field id. + */ + updateSelectPlaceholder( fieldId ) { + const $placeholder = $( `#wpforms-field-option-${ fieldId }-placeholder` ); + + if ( ! $placeholder.val() ) { + $placeholder.val( wpforms_builder.select_choice ).trigger( 'input' ); + } + }, + + /** + * Acts when user deselects default choice on dropdown. + * + * @since 1.9.6 + * + * @param {number} fieldId Field id. + */ + maybeUpdateRequiredPlaceholder( fieldId ) { + const isRequired = $( `#wpforms-field-option-${ fieldId }-required` ).is( ':checked' ); + + if ( ! isRequired ) { + return; + } + + app.updateSelectPlaceholder( fieldId ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +WPFormsBuilder.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.min.js new file mode 100755 index 00000000..c4ba9519 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/admin-builder.min.js @@ -0,0 +1,25 @@ +var WPFormsBuilder=window.WPFormsBuilder||((r,a,v)=>{let m,y,C={},i={},o=!0,n=!1,t=null,k={settings:{spinner:'',spinnerInline:'',tinymceDefaults:{tinymce:{toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link"},quicktags:!0},pagebreakTop:!1,pagebreakBottom:!1,upload_img_modal:!1,choicesLimit:20,choicesLimitLong:250},init(){let e=this;wpforms_panel_switch=!0,m=this.settings,v(k.ready),v(a).on("load",function(){"function"==typeof v.ready.then?v.ready.then(k.load):k.load()}),v(a).on("beforeunload",function(){if(!e.formIsSaved()&&o)return wpforms_builder.are_you_sure_to_close})},load(){if(wpf.getQueryString("newform")&&k.formSave(!1),"revisions"===v("#wpforms-panels-toggle .active").data("panel")&&k.updateRevisionPreview(),WPFormsUtils.triggerEvent(y,"wpformsBuilderReady").isDefaultPrevented())return!1;k.hideLoadingOverlay(),k.determineActiveSections(),k.confirmationsSetup(),WPFormsUtils.triggerEvent(y,"wpformsBuilderConfirmationsReady"),k.loadMsWinCSS(),"1"==wpforms_builder.template_modal_display&&"fields"===wpf.getQueryString("view")&&v.alert({title:wpforms_builder.template_modal_title,content:wpforms_builder.template_modal_msg,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.close,btnClass:"btn-confirm",keys:["enter"]}}}),wpf._updateFormState()},initElementsCache(){y=v("#wpforms-builder"),i.isWindows=/Win/.test(navigator.userAgent),i.isLinux=/Linux/.test(navigator.userAgent),i.isMac=/Mac/.test(navigator.userAgent),C.$helpButton=v(".js-wpforms-help"),C.$previewButton=v("#wpforms-preview-btn"),C.$embedButton=v("#wpforms-embed"),C.$saveButton=v("#wpforms-save"),C.$exitButton=v("#wpforms-exit"),C.$noFieldsOptions=v("#wpforms-panel-fields .wpforms-no-fields-holder .no-fields"),C.$noFieldsPreview=v("#wpforms-panel-fields .wpforms-no-fields-holder .no-fields-preview"),C.$formPreview=v("#wpforms-panel-fields .wpforms-preview-wrap"),C.$revisionPreview=v("#wpforms-panel-revisions .wpforms-panel-content"),C.defaultEmailSelector=".wpforms-field-option-email .wpforms-field-option-row-default_value input",C.$defaultEmail=v(C.defaultEmailSelector),C.$focusOutTarget=null,C.$nextFieldId=v("#wpforms-field-id"),C.$addFieldsTab=v("#add-fields a"),C.$fieldOptions=v("#wpforms-field-options"),C.$fieldsPreviewWrap=v("#wpforms-panel-fields .wpforms-panel-content-wrap"),C.$sortableFieldsWrap=v("#wpforms-panel-fields .wpforms-field-wrap"),C.$addFieldsButtons=v(".wpforms-add-fields-button").not(".not-draggable").not(".warning-modal").not(".education-modal"),C.$fieldsSidebar=v("#wpforms-panel-fields .wpforms-add-fields"),C.$searchInput=v("#wpforms-search-fields-input"),C.$sidebarToggle=v(".wpforms-panels .wpforms-panel-sidebar-content .wpforms-panel-sidebar-toggle")},ready(){k.isVisitedViaBackButton()?location.reload():(k.initElementsCache(),v.ajaxSetup({data:{_wp_http_referer:wpf.updateQueryString("_wp_http_referer",null)}}),k.isBuilderInPopup()&&(C.$embedButton.remove(),C.$previewButton.addClass("wpforms-alone")),k.bindUIActions(),m.formID=v("#wpforms-builder-form").data("id"),m.pagebreakTop=v(".wpforms-pagebreak-top").length,m.pagebreakBottom=v(".wpforms-pagebreak-bottom").length,y.on("keypress","#wpforms-builder-form :input:not(textarea)",function(e){13===e.keyCode&&e.preventDefault()}),k.loadEntryPreviewFields(),k.fieldChoiceSortable("select"),k.fieldChoiceSortable("radio"),k.fieldChoiceSortable("checkbox"),k.fieldChoiceSortable("payment-multiple"),k.fieldChoiceSortable("payment-checkbox"),k.fieldChoiceSortable("payment-select"),v(".wpforms-add-fields-group").each(function(){k.fieldGroupToggle(v(this),"load")}),k.registerTemplates(),k.trimFormTitle(),wpf.initTooltips(),k.loadColorPickers(),k.captchaToggle(),k.notificationToggle(),k.notificationsByStatusAlerts(),k.builderHotkeys(),jconfirm.defaults={closeIcon:!1,backgroundDismiss:!1,escapeKey:!0,animationBounce:1,useBootstrap:!1,theme:"modern",boxWidth:"400px",animateFromElement:!1,content:wpforms_builder.something_went_wrong},k.dropdownField.init(),k.iconChoices.init(),k.disabledFields.init(),k.checkEmptyDynamicChoices(),k.initSomeFieldOptions(),k.dismissNotice(),wpf.initializeChoicesEventHandlers())},checkEmptyDynamicChoices(){var e=wpf.orders.choices||{};Object.keys(e).length&&wpf.orders.fields.forEach(function(i){if(k.dropdownField.helpers.isDynamicChoices(i)){var o=v("#wpforms-field-"+i),t=k.dropdownField.helpers.getDynamicChoicesOptionType(i),r=k.dropdownField.helpers.getDynamicChoicesOptionSource(i),s=k.dropdownField.helpers.isDynamicChoicesOptionModern(i);let e=s?o.find(".has-no-choices").length:0===o.find(".primary-input option:not(.placeholder), .primary-input li").length;s&&!e&&(o=v("#wpforms-field-option-"+i+"-placeholder").val(),s=k.dropdownField.helpers.getInitialChoices(i),e=1===s.length&&s[0].label===o&&!0===s[0].placeholder),e&&k.emptyChoicesNotice(i,r,t)}})},loadMsWinCSS(){i.isMac||v("").appendTo("head").attr({type:"text/css",rel:"stylesheet",href:wpforms_builder.scrollbars_css_url})},isVisitedViaBackButton(){if(!performance)return!1;let i=!1;return performance.getEntriesByType("navigation").forEach(function(e){"back_forward"===e.type&&(i=!0)}),i},hideLoadingOverlay(){let e=v("#wpforms-builder-overlay");e.addClass("fade-out"),setTimeout(function(){e.hide()},250)},showLoadingOverlay(){var e=v("#wpforms-builder-overlay");e.removeClass("fade-out"),e.show()},initSomeFieldOptions(){k.toggleAllOptionGroups(y),y.find(".wpforms-field-option-row-date .type select").trigger("change"),y.find(".wpforms-field-option-row-read_only input:checked").trigger("change")},dropdownField:{config:{modernClass:"choicesjs-select",args:{searchEnabled:!1,searchChoices:!1,renderChoiceLimit:1,shouldSort:!1,callbackOnInit(){var e=v(this.containerOuter.element),i=e.closest(".wpforms-field").find("select");e.hasClass("is-disabled")&&e.removeClass("is-disabled"),i.is("[readonly]")&&(this.disable(),i.prop("disabled",!1)),this.passedElement.element.multiple&&this.getValue(!0).length&&v(this.input.element).addClass("choices__input--hidden"),e.find(".choices__item--selectable").each(function(){var e=v(this),i=wpf.decodeAllowedHTMLEntities(e.text());e.text(i)})}}},init(){y.find("."+k.dropdownField.config.modernClass).each(function(){k.dropdownField.events.choicesInit(v(this))}),y.on("change",".wpforms-field-option-select .wpforms-field-option-row-multiple input",k.dropdownField.events.multiple),y.on("change",".wpforms-field-option-select .wpforms-field-option-row-style select, .wpforms-field-option-payment-select .wpforms-field-option-row-style select",k.dropdownField.events.applyStyle),y.on("click",".choices",function(e){var i=v(this),o=i.find("select").data("choicesjs");o&&i.hasClass("is-open")&&e.target.classList.contains("choices__inner")&&o.hideDropdown()})},events:{choicesInit(e){var i=1===e.data("choicesjs-use-ajax");let o;o="select_pages"===e.data("choicesjs-callback-fn")?WPForms.Admin.Builder.WPFormsChoicesJS.setup(e[0],k.dropdownField.config.args,{action:"wpforms_ajax_search_pages_for_dropdown",nonce:i?wpforms_builder.nonce:null}):new Choices(e[0],k.dropdownField.config.args),k.dropdownField.helpers.setInstance(e,o),k.dropdownField.helpers.addPlaceholderChoice(e,o),e.closest(".choices").toggleClass("wpforms-hidden",!o.config.choices.length)},multiple(e){var i=v(this).closest(".wpforms-field-option-row-multiple").data().fieldId,o=k.dropdownField.helpers.getPrimarySelector(i),t=v(`#wpforms-field-option-row-${i}-choices input.default`),r=o.find(".placeholder"),s=k.dropdownField.helpers.isDynamicChoices(i),e=e.target.checked,l=e?"checkbox":"radio",l=(o.prop("multiple",e),t.prop("type",l),s&&o.find("option:selected").prop("selected",!1),t.filter(":checked"));!e&&l.length&&(t.prop("checked",!1),v(l.get(0)).prop("checked",!0)),r.length&&r.prop("selected",!e),k.dropdownField.helpers.update(i,s)},applyStyle(){var e=v(this),i=e.closest(".wpforms-field-option-row-style").data().fieldId;"modern"===e.val()?k.dropdownField.helpers.convertClassicToModern(i):k.dropdownField.helpers.convertModernToClassic(i)}},helpers:{convertModernToClassic:e=>{var i=k.dropdownField.helpers.getPrimarySelector(e),o=k.dropdownField.helpers.isDynamicChoices(e),i=k.dropdownField.helpers.getInstance(i),t=v("#wpforms-field-option-row-"+e+"-choices").find(".choices-list").find("li").length;i&&"function"==typeof i.destroy&&(i.destroy(),k.dropdownField.helpers.updatePlaceholderChoice(i,e)),o||k.fieldChoiceUpdate("select",e,t)},getInitialChoices(e){e=k.dropdownField.helpers.getPrimarySelector(e);return k.dropdownField.helpers.getInstance(e).config.choices},convertClassicToModern(e){var i=k.dropdownField.helpers.getPrimarySelector(e);k.dropdownField.helpers.isDynamicChoices(e)||k.fieldChoiceUpdate("select",e),k.dropdownField.events.choicesInit(i)},update(e,i){var o=k.dropdownField.helpers.getPrimarySelector(e);k.dropdownField.helpers.isModernSelect(o)?(k.dropdownField.helpers.convertModernToClassic(e),i||k.dropdownField.events.choicesInit(o)):i||k.fieldChoiceUpdate("select",e)},addPlaceholderChoice(e,i){e=e.closest(".wpforms-field");if(e.length<=0)return!1;var o,t,r,e=e.data().fieldId;let s=k.dropdownField.helpers.hasDefaults(e);return k.dropdownField.helpers.isDynamicChoices(e)&&(s=!1),!1===k.dropdownField.helpers.searchPlaceholderChoice(i)&&!!i.config.choices.length&&(e=v("#wpforms-field-option-"+e+"-placeholder").val(),o=wpf.decodeAllowedHTMLEntities(e),r=!((t=v(i.passedElement.element).prop("multiple"))||s),i.setChoices([{value:"",label:o,selected:r,placeholder:!0}],"value","label",!1),t&&v(i.input.element).prop("placeholder",e),!0)},searchPlaceholderChoice(e){let o=!1;return e.config.choices.forEach(function(e,i){if(void 0!==e.placeholder&&!0===e.placeholder)return!(o={key:i,item:e})}),o},updatePlaceholderChoice(e,i){var o=v(e.passedElement.element),i=wpf.sanitizeHTML(v("#wpforms-field-option-"+i+"-placeholder").val()),e=k.dropdownField.helpers.searchPlaceholderChoice(e);let t={};"object"==typeof e&&(t=v(o.find("option").get(e.key))),""!==i?!v.isEmptyObject(t)&&t.length?t.addClass("placeholder").text(i):o.prepend('"):t.length&&t.remove()},isModernSelect(e){e=k.dropdownField.helpers.getInstance(e);return"object"==typeof e&&!v.isEmptyObject(e)&&e.initialised},setInstance(e,i){e.data("choicesjs",i)},getInstance(e){return e.data("choicesjs")},getDynamicChoicesOption(e){e=v("#wpforms-field-option-"+e+"-dynamic_choices");return!!e.length&&e},isDynamicChoices(e){e=k.dropdownField.helpers.getDynamicChoicesOption(e);return!!e.length&&""!==e.val()},isDynamicChoicesOptionModern(e){e=v("#wpforms-field-option-"+e+"-style");return!!e.length&&"modern"===e.val()},getDynamicChoicesOptionType(e){e=k.dropdownField.helpers.getDynamicChoicesOption(e);return!!e.length&&e.val()},getDynamicChoicesOptionSource(e){var i=k.dropdownField.helpers.getDynamicChoicesOptionType(e),e=v("#wpforms-field-option-"+e+"-dynamic_"+i);return!!e.length&&e.find("option:selected").text()},hasDefaults(e){return!!v(`#wpforms-field-option-row-${e}-choices .choices-list`).find("input.default:checked").length},getPrimarySelector(e){return v("#wpforms-field-"+e+" .primary-input")}}},numberSliderEvents(e){e.on("focusout",".wpforms-field-option-row-min_max .wpforms-input-row .wpforms-number-slider-min",k.fieldNumberSliderUpdateMin),e.on("focusout",".wpforms-field-option-row-min_max .wpforms-input-row .wpforms-number-slider-max",k.fieldNumberSliderUpdateMax),e.on("input",".wpforms-number-slider-default-value",_.debounce(k.changeNumberSliderDefaultValue,500)),e.on("focusout",".wpforms-number-slider-default-value",k.changeNumberSliderEmptyDefaultValue),e.find(".wpforms-number-slider-default-value").trigger("input"),e.on("input",".wpforms-number-slider-step",_.debounce(k.changeNumberSliderStep,500)),e.on("focusout",".wpforms-number-slider-step",k.checkNumberSliderStep),e.on("input",".wpforms-number-slider-value-display",_.debounce(k.changeNumberSliderValueDisplay,500)),e.on("input",".wpforms-number-slider-min",_.debounce(k.changeNumberSliderMin,500)),e.on("input",".wpforms-number-slider-max",_.debounce(k.changeNumberSliderMax,500))},changeNumberSliderMin(e){var i=parseFloat(e.target.value);isNaN(i)||(i=v(e.target).parents(".wpforms-field-option-row").data("fieldId"),k.updateNumberSliderDefaultValueAttr(i,e.target.value,"min"))},changeNumberSliderMax(e){var i=parseFloat(e.target.value);isNaN(i)||(i=v(e.target).parents(".wpforms-field-option-row").data("fieldId"),k.updateNumberSliderDefaultValueAttr(i,e.target.value,"max").updateNumberSliderStepValueMaxAttr(i,e.target.value))},changeNumberSliderValueDisplay(e){var i=e.target.value,e=v(e.target).parents(".wpforms-field-option-row").data("fieldId"),o=r.getElementById("wpforms-field-option-"+e+"-default_value");o&&k.updateNumberSliderHintStr(e,i).updateNumberSliderHint(e,o.value)},changeNumberSliderStep(e){var i,o,t,r=v(this),s=parseFloat(r.val());isNaN(s)||s<=0||(o=v(r).closest(".wpforms-field-option"),(t=((i=parseFloat(o.find(".wpforms-number-slider-max").val()))-(o=parseFloat(o.find(".wpforms-number-slider-min").val()))).toFixed(2))e%1==0?e.toString():e.toFixed(2))(i),(o=r(o))===(r=r(t))||o===i||r===i?k.removeNotice(e):(t=wpforms_builder.number_slider_error_valid_default_value.replace("{from}",o).replace("{to}",r),k.printNotice(t,e))),this},calculateClosestMultiples(e,i,o,t){let r=o+Math.floor((e-o)/i)*i,s=o+Math.ceil((e-o)/i)*i;return e===(s=e===r&&e!==o?r+i:s)&&e!==t&&(r=s-i),e===o&&(s=o+i),e===t&&(r=t-i),r=Math.max(r,o),s=Math.min(s,t),{closestSmallerMultiple:r,closestLargerMultiple:s}},printNotice(e,i,o=!1){i.length&&(this.removeNotice(i),i.append(`

        ${e}

        `))},removeNotice(e){e.length&&e.find(".wpforms-alert").length&&e.find(".wpforms-alert").remove()},checkNumberSliderStep(e){e=parseFloat(e.target.value);if(isNaN(e)||!(0"+i+"
        ")),this},fieldNumberSliderUpdateMin(e){var i,o,t=parseFloat(e.target.value);isNaN(t)||(i=v(e.target).parents(".wpforms-field-option-row-min_max"),(o=parseFloat(i.find(".wpforms-number-slider-max").val()))<=t?(e.preventDefault(),this.value=o):(e=i.data("field-id"),y.find("#wpforms-field-"+e+' input[type="range"]').attr("min",t)))},fieldNumberSliderUpdateMax(e){var i,o,t=parseFloat(e.target.value);isNaN(t)||(i=v(e.target).parents(".wpforms-field-option-row-min_max"),t<=(o=parseFloat(i.find(".wpforms-number-slider-min").val()))?(e.preventDefault(),this.value=o):(e=i.data("field-id"),y.find("#wpforms-field-"+e+' input[type="range"]').attr("max",t)))},updateNumberSliderStepValueMaxAttr(e,i){var o,e=r.getElementById("wpforms-field-option-"+e+"-step");return e&&(o=parseFloat(e.value),e.setAttribute("max",i),(i=parseFloat(i)) .label-title .text").text(t)}),y.on("input",".wpforms-field-option-row-description textarea",function(){var e=v(this),i=wpf.sanitizeHTML(e.val()),o=e.parent().data("field-id"),t=v(`#wpforms-field-${o} > .description, + #wpforms-field-${o} .format-selected-single > .description, + #wpforms-field-${o} .wpforms-field-internal-information-row-description`);k.updateDescription(t,i),e.trigger("wpformsDescriptionFieldUpdated",{id:o,descField:t,value:i})}),y.on("change",".wpforms-field-option-row-required input",function(){var e=v(this).closest(".wpforms-field-option-row").data("field-id"),i=v("#wpforms-field-"+e);i.toggleClass("required"),k.onUpdateSelectPlaceholder(e,i)}),y.on("click",".choices-list input.default",function(){var e=v(this),i=e.closest(".choices-list").data("field-id");e.is(":checked")||k.maybeUpdateRequiredPlaceholder(i),y.trigger("wpformsChoicesSetDefault",[this])}),y.on("change",".wpforms-field-option-row-summary input",function(){var e=v(this),i=e.closest(".wpforms-field-option-row").data("field-id");v("#wpforms-field-"+i).toggleClass("wpforms-summary-enabled"),e.closest(".wpforms-field-option-group-inner").find(".wpforms-total-summary-alert").toggleClass("wpforms-hidden")}),y.on("change",".wpforms-field-option-row-confirmation input",function(){var e=v(this).closest(".wpforms-field-option-row").data("field-id");v("#wpforms-field-"+e).find(".wpforms-confirm").toggleClass("wpforms-confirm-enabled wpforms-confirm-disabled"),v("#wpforms-field-option-"+e).toggleClass("wpforms-confirm-enabled wpforms-confirm-disabled")}),y.on("change",".wpforms-field-option-row-filter_type select",function(){var e=v(this).parent().data("field-id"),e=v("#wpforms-field-option-"+e);v(this).val()?(e.removeClass("wpforms-filter-allowlist"),e.removeClass("wpforms-filter-denylist"),e.addClass("wpforms-filter-"+v(this).val())):(e.removeClass("wpforms-filter-allowlist"),e.removeClass("wpforms-filter-denylist"))}),y.on("focusout",".wpforms-field-option-row-allowlist textarea,.wpforms-field-option-row-denylist textarea",function(){let o=v(this),e="allow";var i,t;o.next(".wpforms-alert").remove(),""!==o.val()&&(i=v(".wpforms-field-option-row-allowlist textarea"),t=v(".wpforms-field-option-row-denylist textarea"),o.is(t)&&(e="deny"),v.get(wpforms_builder.ajax_url,{nonce:wpforms_builder.nonce,content:JSON.stringify({allow:i.val(),deny:t.val(),current:e}),action:"wpforms_sanitize_restricted_rules"},function(e){var i;e.success&&(o.val(e.data.currentField),0!==(i=e.data.intersect).length&&(i="

        "+wpforms_builder.allow_deny_lists_intersect+'

        '+i+"

        ",v.alert({title:wpforms_builder.heads_up,content:i,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})),e.data.restricted||0)&&o.after('

        '+wpforms_builder.restricted_rules+"

        ")}))}),y.on("focusout",C.defaultEmailSelector,function(){C.$focusOutTarget=v(this),k.focusOutEvent()}),y.on("change",".wpforms-field-option-row-size select",function(){var e=v(this),i=e.val(),e=e.parent().data("field-id");v("#wpforms-field-"+e).removeClass("size-small size-medium size-large").addClass("size-"+i)}),y.on("input",".wpforms-field-option-row-placeholder input",function(){var e=v(this),i=e.parent().data("field-id"),o=v("#wpforms-field-"+i),t=o.find(".primary-input");let r=wpf.sanitizeHTML(e.val());"payment-single"===o.data("field-type")&&""===r&&(r=v("#wpforms-field-option-"+i+"-price").prop("placeholder")),t.is("select")?k.dropdownField.helpers.isModernSelect(t)?(e=k.dropdownField.helpers.getInstance(t),t.prop("multiple")?v(e.input.element).prop("placeholder",r):(e.setChoiceByValue(""),t.closest(".choices").find(".choices__inner .choices__placeholder").text(r),o=v("#wpforms-field-option-"+i+"-dynamic_choices").val(),k.dropdownField.helpers.update(i,o))):(e=t.find(".placeholder"),!r.length&&e.length?e.remove():(e.length?e.text(r):t.prepend('"),t.find(".placeholder").prop("selected",!t.prop("multiple")))):t.prop("placeholder",r)}),y.on("input",".wpforms-field-option-row-confirmation_placeholder input",function(){var e=v(this),i=e.val(),e=e.parent().data("field-id");v("#wpforms-field-"+e).find(".secondary-input").attr("placeholder",i)}),y.on("input",".wpforms-field-option .format-selected input.placeholder",function(){var e=v(this),i=e.val(),e=e.closest(".wpforms-field-option-row"),o=e.data("field-id"),e=e.data("subfield");v("#wpforms-field-"+o).find(".wpforms-"+e+" input").attr("placeholder",i)}),y.on("input",".wpforms-field-option-address input.placeholder",function(){var e=v(this),i=e.closest(".wpforms-field-option-row"),o=i.data("field-id"),t=i.data("subfield"),r=v("#wpforms-field-"+o+" .wpforms-"+t).find("input, select"),i=i.find("#wpforms-field-option-"+o+"-"+t+"_default");let s=i.val(),l=i.find("option:selected").text(),a=e.val();r.each(function(){var e,i,o=v(this);o.is("select")?(e=o.find(".placeholder"),i=""===s&&""!==a?a:l,e.text(i)):o.attr("placeholder",a)})}),y.on("input",'.wpforms-field-option-row-default_value input:not([type="search"])',function(){var e=v(this),i=wpf.sanitizeHTML(e.val()),e=e.closest(".wpforms-field-option-row").data("field-id");v("#wpforms-field-"+e+" .primary-input").val(i)}),y.on("input",".wpforms-field-options-column input.default",function(){var e=v(this),i=wpf.sanitizeHTML(e.val()),e=e.closest(".wpforms-field-option-row"),o=e.data("field-id"),e=e.data("subfield");v("#wpforms-field-"+o+" .wpforms-"+e+" input").val(i)}),y.on("change",".wpforms-field-option-address select.default",function(){var e=v(this),i=e.val(),o=e.find("option:selected").text(),e=e.closest(".wpforms-field-option-row"),t=e.data("field-id"),r=e.data("subfield"),s=v("#wpforms-field-option-"+t+"-scheme").val(),e=e.find("#wpforms-field-option-"+t+"-"+r+"_placeholder").val(),t=v("#wpforms-field-"+t+" .wpforms-address-scheme-"+s+" .wpforms-"+r+" .placeholder");""===i&&0parseInt(i.val(),10))}),y.on("change",".wpforms-field-option-row-format select",function(){var e,i,o,t,r,s=v(this),l=s.val(),s=s.parent().data("field-id"),a=v("#wpforms-field-option-row-"+s+"-sublabel_hide"),n=v("#wpforms-field-"+s);n.find(".format-selected").removeClass().addClass("format-selected format-selected-"+l),v("#wpforms-field-option-"+s).find(".format-selected").removeClass().addClass("format-selected format-selected-"+l),["date-time","first-last","first-middle-last"].includes(l)?a.removeClass("wpforms-hidden"):a.addClass("wpforms-hidden"),v(`#wpforms-field-option-row-${s}-price_label`).toggleClass("wpforms-hidden","single"!==l),["single","user","hidden"].includes(l)&&(a="user"===l,e="single"===l,l="hidden"===l,i=v("#wpforms-field-option-"+s+"-enable_quantity").is(":checked"),t=v("#wpforms-field-option-"+s+"-min_price"),t=(o=wpf.amountSanitize(t.val()))>=t.data("minimum-price"),r=v("#wpforms-field-option-row-"+s+"-min_price"),v("#wpforms-field-option-row-"+s+"-placeholder").toggleClass("wpforms-hidden",!a),v("#wpforms-field-option-row-"+s+"-enable_quantity").toggleClass("wpforms-hidden",!e),v("#wpforms-field-option-row-"+s+"-quantities_alert").toggleClass("wpforms-hidden",!e),v("#wpforms-field-option-row-"+s+"-quantity").toggleClass("wpforms-hidden",!e||!i),n.find(".quantity-input").toggleClass("wpforms-hidden",!e||!i),r.toggleClass("wpforms-hidden",!a),r.find(".wpforms-item-minimum-price-alert").toggleClass("wpforms-hidden",t),n.find(".item-min-price").toggleClass("wpforms-hidden",a&&o<=0),n.toggleClass("min-price-warning",!t),n.find(".fa-exclamation-triangle").toggleClass("wpforms-hidden",t),v(`#wpforms-field-${s} .item-price-single`).toggleClass("wpforms-hidden",!e),v(`#wpforms-field-${s} .item-price-hidden`).toggleClass("wpforms-hidden",!l))}),y.on("change",".wpforms-field-option-row-scheme select",function(){var e=v(this),i=e.val(),e=e.parent().data("field-id"),o=v("#wpforms-field-"+e),t=v(`#wpforms-field-option-row-${e}-state`),e=v(`#wpforms-field-option-row-${e}-country`),o=(o.find(".wpforms-address-scheme").addClass("wpforms-hide"),o.find(".wpforms-address-scheme-"+i).removeClass("wpforms-hide"),o.find(`.wpforms-address-scheme-${i} .wpforms-country select, .wpforms-address-scheme-${i} .wpforms-country input`)),o=(0===o.length?e.addClass("wpforms-hidden"):e.removeClass("wpforms-hidden"),t.find(".default .default").not(".wpforms-hidden-strict")),t=t.find(`.default [data-scheme="${i}"]`),r=e.find(".default .default").not(".wpforms-hidden-strict"),e=e.find(`.default [data-scheme="${i}"]`);t.attr({id:o.attr("id"),name:o.attr("name")}).removeClass("wpforms-hidden-strict"),o.attr({id:"",name:""}).addClass("wpforms-hidden-strict"),e.attr({id:r.attr("id"),name:r.attr("name")}).removeClass("wpforms-hidden-strict"),r.attr({id:"",name:""}).addClass("wpforms-hidden-strict")}),y.on("change",".wpforms-field-option-row-date .type select",function(){var e=v(this),i=e.val(),o=v(this).closest(".wpforms-field-option-row").data("field-id"),t="datepicker"===i?"wpforms-date-type-datepicker":"wpforms-date-type-dropdown",r="datepicker"===i?"wpforms-date-type-dropdown":"wpforms-date-type-datepicker",t=(v("#wpforms-field-"+o).find(".wpforms-date").addClass(t).removeClass(r),v("#wpforms-field-option-"+o).addClass(t).removeClass(r),e.closest(".wpforms-field-option-group-advanced").find(".wpforms-field-option-row-date_limit_days, .wpforms-field-option-row-date_limit_days_options, .wpforms-field-option-row-date_disable_past_dates")),r=v("#wpforms-field-option-row-"+o+"-date_limit_days_options");"dropdown"===i?((e=v("#wpforms-field-option-"+o+"-date_format")).find("option:selected").hasClass("datepicker-only")&&e.prop("selectedIndex",0).trigger("change"),t.hide()):(t.show(),v("#wpforms-field-option-"+o+"-date_limit_days").is(":checked")?r.show():r.hide())}),y.on("change",".wpforms-field-option-row-date .format select",function(){var e=v(this).val(),i=v(this).closest(".wpforms-field-option-row").data("field-id"),i=v("#wpforms-field-"+i);"m/d/Y"===e||"m.d.Y"===e?(i.find(".wpforms-date-dropdown .first option").text(wpforms_builder.date_select_month),i.find(".wpforms-date-dropdown .second option").text(wpforms_builder.date_select_day),i.find(".wpforms-date-dropdown .third option").text(wpforms_builder.date_select_year)):"d/m/Y"===e||"d.m.Y"===e?(i.find(".wpforms-date-dropdown .first option").text(wpforms_builder.date_select_day),i.find(".wpforms-date-dropdown .second option").text(wpforms_builder.date_select_month),i.find(".wpforms-date-dropdown .third option").text(wpforms_builder.date_select_year)):"Y/m/d"!==e&&"Y.m.d"!==e||(i.find(".wpforms-date-dropdown .first option").text(wpforms_builder.date_select_year),i.find(".wpforms-date-dropdown .second option").text(wpforms_builder.date_select_month),i.find(".wpforms-date-dropdown .third option").text(wpforms_builder.date_select_day))}),y.on("change",".wpforms-field-option-row-time .format select",function(){let e=v(this),r=e.closest(".wpforms-field-option-row").data("field-id"),s="",i,l=e.val().match(/[gh]/)?12:24,o=12==l?1:0,t=12==l?13:24;for(let e=o;e{hh}'.replace(/{hh}/g,i);_.forEach(["start","end"],function(e){var i=y.find("#wpforms-field-option-"+r+"-time_limit_hours_"+e+"_hour"),e=y.find("#wpforms-field-option-"+r+"-time_limit_hours_"+e+"_ampm");let o=parseInt(i.val(),10),t=e.val();o=(o=24==l?"pm"===t?o+12:o:(t=12=e.data("minimum-price"),e=e.parent(),r=v("#wpforms-field-"+e.data("field-id"));e.find(".wpforms-item-minimum-price-alert").toggleClass("wpforms-hidden",o),r.find(".item-min-price").toggleClass("wpforms-hidden",t),r.toggleClass("min-price-warning",!o),r.find(".fa-exclamation-triangle").toggleClass("wpforms-hidden",o),t||r.find(".min-price").text(wpf.amountFormatCurrency(i))}),y.on("input",".wpforms-single-item-price-label-display",function(){var e=v(this),i=wpf.sanitizeHTML(e.val(),"<>"),o=e.parent().data("field-id"),t=v("#wpforms-field-"+o),o=wpf.amountFormatCurrency(v(`#wpforms-field-option-${o}-price`).val());i?t.find(".price-label").html(i.replaceAll("{price}",` ${o} `)):(e.val("{price}"),t.find(".price-label").html(` ${o} `))}),y.on("change",".wpforms-field-option-credit-card .payment-icons input",function(){var e=v(this),i=e.data("card"),e=e.parent().data("field-id");v("#wpforms-field-"+e).find("img.icon-"+i).toggleClass("card_hide")}),y.on("input",".wpforms-field-option input.placeholder-update",function(){var e=v(this),i=e.val(),o=e.data("field-id"),e=e.data("subfield");v("#wpforms-field-"+o).find(".wpforms-"+e+" input").attr("placeholder",i)}),y.on("change",".wpforms-field-option-row-input_columns select",function(){var e=v(this),i=e.val(),e=e.parent().data("field-id");let o="";"2"===i?o="wpforms-list-2-columns":"3"===i?o="wpforms-list-3-columns":"inline"===i&&(o="wpforms-list-inline"),v("#wpforms-field-"+e).removeClass("wpforms-list-2-columns wpforms-list-3-columns wpforms-list-inline").addClass(o)}),y.on("change",".wpforms-field-option-row .wpforms-toggle-control input",function(){var e=v(this),i=e.closest(".wpforms-toggle-control").find(".wpforms-toggle-control-status"),e=e.is(":checked")?"on":"off";i.html(i.data(e))}),y.on("change",".wpforms-field-option-row-dynamic_choices select",function(){k.fieldDynamicChoiceToggle(v(this))}),y.on("change",".wpforms-field-option-row-dynamic_taxonomy select, .wpforms-field-option-row-dynamic_post_type select",function(){k.fieldDynamicChoiceSource(v(this))}),y.on("click",".toggle-layout-selector-display",function(e){e.preventDefault(),k.fieldLayoutSelectorToggle(this)}),y.on("click",".layout-selector-display-layout",function(e){e.preventDefault(),k.fieldLayoutSelectorLayout(this)}),y.on("click",".layout-selector-display-columns span",function(e){e.preventDefault(),k.fieldLayoutSelectorInsert(this)}),v(r).on("change",".wpforms-field-option-row-scale select",function(){let e=v(this),i=e.val(),o=e.parent().data("field-id"),t=v("#wpforms-field-"+o+" .rating-icon"),r=1;t.each(function(){r<=i?v(this).show():v(this).hide(),r++})}),v(r).on("change",".wpforms-field-option-row-icon select",function(){var e=v(this),i=e.val(),e=e.parent().data("field-id"),e=v("#wpforms-field-"+e+" .rating-icon");let o="fa-star";"heart"===i?o="fa-heart":"thumb"===i?o="fa-thumbs-up":"smiley"===i&&(o="fa-smile-o"),e.removeClass("fa-star fa-heart fa-thumbs-up fa-smile-o").addClass(o)}),v(r).on("change",".wpforms-field-option-row-icon_size select",function(){var e=v(this),i=e.val(),e=e.parent().data("field-id"),e=v("#wpforms-field-"+e+" .rating-icon");let o="28";"small"===i?o="18":"large"===i&&(o="38"),e.css("font-size",o+"px")}),v(r).on("input",".wpforms-field-option-row-icon_color input.wpforms-color-picker",function(){var e=v(this),i=e.closest(".wpforms-field-option-row").data("field-id");v(`#wpforms-field-${i} .wpforms-rating-field-icons i.fa`).css("color",k.getValidColorPickerValue(e))}),v(r).on("change",".wpforms-field-option-row-disclaimer_format input",function(){var e=v(this).closest(".wpforms-field-option-row").data("field-id");v("#wpforms-field-"+e+" .description").toggleClass("disclaimer")}),y.on("change",".wpforms-field-option-row-limit_enabled input",function(e){k.updateTextFieldsLimitControls(v(e.target).closest(".wpforms-field-option-row-limit_enabled").data().fieldId,e.target.checked)}),y.on("change",".wpforms-field-option-row-date_disable_past_dates input",function(e){k.updateDisableTodaysDateControls(v(e.target).closest(".wpforms-field-option-row-date_disable_past_dates").data().fieldId,e.target?.checked)}),y.on("change",".wpforms-field-option-row-password-visibility input",k.togglePasswordEyeIcon),y.on("change",".wpforms-field-option-row-password-strength input",function(e){k.updatePasswordStrengthControls(v(e.target).parents(".wpforms-field-option-row-password-strength").data().fieldId,e.target.checked)}),y.on("change",".wpforms-field-option-richtext .wpforms-field-option-row-media_enabled input",k.updateRichTextMediaFieldsLimitControls),y.on("change",".wpforms-field-option-richtext .wpforms-field-option-row-style select",k.updateRichTextStylePreview),y.on("change",".wpforms-field-option-file-upload .wpforms-field-option-row-style select, .wpforms-field-option-file-upload .wpforms-field-option-row-max_file_number input, .wpforms-field-option-file-upload .wpforms-field-option-row-camera input",function(e){k.fieldFileUploadPreviewUpdate(e.target)}),k.numberSliderEvents(y),k.fieldDynamicChoiceToggleImageChoices(),k.fieldDynamicChoiceToggleIconChoices(),y.on("change",".wpforms-field-option-row-show_price_after_labels input",function(){var e=v(this).closest(".wpforms-field-option-group-basic").find(".wpforms-field-option-row-choices .choices-list");k.fieldChoiceUpdate(e.data("field-type"),e.data("field-id"))}),y.on("input",".wpforms-field-option-row-preview-notice textarea",k.updatePreviewNotice).on("change",".wpforms-field-option-row-preview-notice-enable input",k.toggleEntryPreviewNotice).on("wpformsFieldAdd",k.maybeLockEntryPreviewGroupOnAdd).on("wpformsFieldMove",k.maybeLockEntryPreviewGroupOnMove).on("click",".wpforms-entry-preview-block",k.entryPreviewBlockField),k.defaultStateEntryPreviewNotice()},fieldReadOnlyToggleChange(){var e=v(this),i=Number(e.closest(".wpforms-field-option-row").data("field-id")),e=e.is(":checked"),o=v(`#wpforms-field-option-row-${i}-required, #wpforms-field-option-row-${i}-unique_answer`),t=o.filter(".wpforms-field-option-row-required").find("input");k.fieldReadOnlyToggleDependentToggles(o,e),v("#wpforms-field-"+i).toggleClass("readonly",e).toggleClass("required",t.is(":checked"))},fieldReadOnlyToggleDependentToggles(e,s=!0){e.each(function(){var e=v(this),i=e.find(":input"),o=s?i.is(":checked"):null,t=!s&&i.data("enabled-state-checked"),r=s?wp.i18n.__("Disabled because this field is set to Read-Only in the Advanced tab.","wpforms"):"";e.toggleClass("wpforms-disabled",s).find(".wpforms-toggle-control").attr("title",r),i.data("enabled-state-checked",o).prop("checked",t).prop("disabled",s)})},focusOutEvent(){if(null!==C.$focusOutTarget){if(C.$defaultEmail.is(C.$focusOutTarget)){let i=C.$focusOutTarget;if(i.next(".wpforms-alert").remove(),""===i.val())return;v.get(wpforms_builder.ajax_url,{nonce:wpforms_builder.nonce,content:i.val(),action:"wpforms_sanitize_default_email"},function(e){e.success&&(i.val(e.data),i.trigger("input"),e.data||i.after('

        '+wpforms_builder.restricted_default_email+"

        "))})}C.$focusOutTarget=null}},isFieldPreviewActionsDisabled(e){return k.isFormPreviewActionsDisabled(e)||v(e).closest(".wpforms-field").hasClass("ui-sortable-disabled")},isFormPreviewActionsDisabled(e){return v(e).closest(".wpforms-field-wrap").hasClass("ui-sortable-disabled")},fieldGroupToggle(e,i){e=v(e);let o=e.next(".wpforms-add-fields-buttons"),t=o.parent(),r=e.find("i"),s=e.data("group"),l="wpforms_field_group_"+s;"click"===i?(t.hasClass("wpforms-closed")?wpCookies.remove(l):wpCookies.set(l,"true",2592e3),r.toggleClass("wpforms-angle-right"),o.stop().slideToggle("",function(){t.toggleClass("wpforms-closed")})):"load"===i&&(o=e.find(".wpforms-add-fields-buttons"),r=e.find(".wpforms-add-fields-heading i"),s=e.find(".wpforms-add-fields-heading").data("group"),"true"===wpCookies.get("wpforms_field_group_"+s))&&(r.toggleClass("wpforms-angle-right"),o.hide(),e.toggleClass("wpforms-closed"))},updateDescription(e,i){e.hasClass("nl2br")&&(i=i.replace(/\n/g,"
        ")),e.html(i)},defaultStateEntryPreviewNotice(){v(".wpforms-field-option-row-preview-notice-enable input").each(function(){v(this).trigger("change")})},updatePreviewNotice(){var e=v(this),i=wpf.sanitizeHTML(e.val()).trim(),e=e.parent().data("field-id"),e=v("#wpforms-field-"+e).find(".wpforms-entry-preview-notice"),i=i||wpforms_builder.entry_preview_default_notice;k.updateDescription(e,i)},toggleEntryPreviewNotice(){var e=v(this),i=e.closest(".wpforms-field-option").data("field-id"),o=v("#wpforms-field-"+i),i=v("#wpforms-field-option-"+i+" .wpforms-field-option-row-preview-notice"),t=o.find(".wpforms-entry-preview-notice"),o=o.find(".wpforms-alert-info");(e.is(":checked")?(o.hide(),t.show(),i):(i.hide(),t.hide(),o)).show()},fieldDelete(e){var i=v("#wpforms-field-"+e),o=i.data("field-type");"pagebreak"===o&&i.hasClass("wpforms-field-entry-preview-not-deleted")?k.youCantRemovePageBreakFieldPopup():i.hasClass("no-delete")?k.youCantRemoveFieldPopup():k.confirmFieldDeletion(e,o)},youCantRemovePageBreakFieldPopup(){v.alert({title:wpforms_builder.heads_up,content:wpforms_builder.entry_preview_require_page_break,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})},youCantReorderFieldPopup(){console.warn('WARNING! Function "WPFormsBuilder.youCantReorderFieldPopup()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.youCantReorderFieldPopup()" function instead!'),WPForms.Admin.Builder.DragFields.youCantReorderFieldPopup()},youCantRemoveFieldPopup(){v.alert({title:wpforms_builder.field_locked,content:wpforms_builder.field_locked_no_delete_msg,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.close,btnClass:"btn-confirm",keys:["enter"]}}})},validationErrorNotificationPopup(e){console.warn('WARNING! Function "WPFormsBuilder.validationErrorNotificationPopup()" has been deprecated.'),v.alert({title:wpforms_builder.heads_up,content:e,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:wpforms_builder.close,btnClass:"btn-confirm",keys:["enter"]}}})},confirmFieldDeletion(e,i){var o={id:e,message:wpforms_builder.delete_confirm};WPFormsUtils.triggerEvent(y,"wpformsBeforeFieldDeleteAlert",[o,i]).isDefaultPrevented()||v.confirm({title:!1,content:o.message,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){k.fieldDeleteById(e)}},cancel:{text:wpforms_builder.cancel}}})},fieldDeleteById(t,r="",e=400){v("#wpforms-field-"+t).fadeOut(e,function(){var e=v(this),i=e.parents(".wpforms-field-layout-columns"),e=(r=e.data("field-type"),y.trigger("wpformsBeforeFieldDelete",[t,r]),e.remove(),v("#wpforms-field-option-"+t).remove(),v(".wpforms-field, .wpforms-title-desc").removeClass("active"),k.fieldTabToggle("add-fields"),v(".wpforms-field-option")),o=y.find(".wpforms-field-submit");e.length<1&&(C.$sortableFieldsWrap.append(C.$noFieldsPreview.clone()),C.$fieldOptions.append(C.$noFieldsOptions.clone()),o.hide()),e.filter(":not(.wpforms-field-option-layout)").length||o.hide(),y.trigger("wpformsFieldDelete",[t,r,i])})},determineActiveSections(){let t=wpf.getQueryString("section");v(".wpforms-panel").each(function(){var e,i=v(this),o=(e=i,(!(o=t)||!e.hasClass("active")||0===(e=e.find(`.wpforms-panel-sidebar-section[data-section="${o}"]`)).length||e.hasClass("wpforms-panel-sidebar-section-no-access")?null:e)||(e=>{e=e.find(".wpforms-panel-sidebar-section.configured").first();return e.length?e:null})(i)||i.find(".wpforms-panel-sidebar-section:first-of-type"));e=i,(i=o)&&(o=i.data("section"),i.addClass("active"),(i=e.find(".wpforms-panel-content-section-"+o)).length?(i.show().addClass("active"),e.find(".wpforms-panel-content-section-default").toggle("default"===o)):e.find(".wpforms-panel-content-section-default").show().addClass("active"),WPFormsUtils.triggerEvent(y,"wpformsPanelSectionSwitch",o))})},loadEntryPreviewFields(){var e=v("#wpforms-panel-fields .wpforms-field-wrap .wpforms-field-entry-preview");e.length&&e.each(function(){k.lockEntryPreviewFieldsPosition(v(this).data("field-id"))})},fieldEntryPreviewDelete(e,i,o){"entry-preview"===o&&(i=(o=v("#wpforms-field-"+i)).prevAll(".wpforms-field-pagebreak").first(),o=o.nextAll(".wpforms-field-pagebreak").first().data("field-id"),o=v("#wpforms-field-option-"+o),i.removeClass("wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted"),o.find(".wpforms-entry-preview-block").removeClass("wpforms-entry-preview-block"),y.trigger("wpformsFieldDragToggle",[i.data("field-id"),i.data("field-type")]))},maybeLockEntryPreviewGroupOnMove(e,i){i.item.hasClass("wpforms-field-pagebreak")&&k.maybeLockEntryPreviewGroupOnAdd(e,i.item.data("field-id"),"pagebreak")},maybeLockEntryPreviewGroupOnAdd(e,i,o){var t,r,s,l,a;"pagebreak"===o&&(r=(t=v("#wpforms-field-"+i)).prevAll(".wpforms-field-entry-preview,.wpforms-field-pagebreak").first(),a=t.nextAll(".wpforms-field-entry-preview,.wpforms-field-pagebreak").first(),r.hasClass("wpforms-field-entry-preview")||a.hasClass("wpforms-field-entry-preview"))&&(s=(l=v("#wpforms-field-option-"+i+" .wpforms-field-option-row-prev_toggle")).find("input"),a=v("#wpforms-field-option-"+a.data("field-id")+" .wpforms-field-option-row-prev_toggle"),r.hasClass("wpforms-field-entry-preview")?(s.attr("checked","checked").trigger("change"),l.addClass("wpforms-entry-preview-block"),a.removeClass("wpforms-entry-preview-block")):(s=r.data("field-id"),a=(l=v("#wpforms-field-option-"+s+" .wpforms-field-option-row-prev_toggle")).find("input"),t.addClass("wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted"),y.trigger("wpformsFieldDragToggle",[i,o]),r.removeClass("wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted"),y.trigger("wpformsFieldDragToggle",[s,r.data("field-type")]),r.prevAll(".wpforms-field-entry-preview,.wpforms-field-pagebreak").first().hasClass("wpforms-field-entry-preview")&&(a.attr("checked","checked").trigger("change"),l.addClass("wpforms-entry-preview-block"))))},entryPreviewBlockField(e){e.preventDefault(),v.alert({title:wpforms_builder.heads_up,content:wpforms_builder.entry_preview_require_previous_button,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})},isUncheckedEntryPreviewField(e,i){return!("entry-preview"!==e||i&&i.passed)},addEntryPreviewField(e,i){var o,t,r,s=v("#wpforms-add-fields-entry-preview");s.hasClass("wpforms-entry-preview-adding")||(r=v("#wpforms-panel-fields .wpforms-field-wrap > .wpforms-field"),o=i?.position?i.position:r.length,t=k.isEntryPreviewFieldRequiresPageBreakBefore(r,o),r=k.isEntryPreviewFieldRequiresPageBreakAfter(r,o),s.addClass("wpforms-entry-preview-adding"),(i=i||{}).passed=!0,t||r?t?k.addPageBreakAndEntryPreviewFields(i,o):k.addEntryPreviewAndPageBreakFields(i,o):k.fieldAdd("entry-preview",i).done(function(e){k.lockEntryPreviewFieldsPosition(e.data.field.id)}))},addEntryPreviewFieldAfterPageBreak(e){let i=setInterval(function(){2===v("#wpforms-panel-fields .wpforms-field-wrap").find(".wpforms-pagebreak-bottom, .wpforms-pagebreak-top").length&&(k.fieldAdd("entry-preview",e).done(function(e){k.lockEntryPreviewFieldsPosition(e.data.field.id)}),clearInterval(i))},100)},addPageBreakAndEntryPreviewFields(i,o){let t=3<=v("#wpforms-panel-fields .wpforms-field-wrap > .wpforms-field-pagebreak").length;k.fieldAdd("pagebreak",{position:o}).done(function(e){i.position=t?o+1:o+2,k.addEntryPreviewFieldAfterPageBreak(i);e=v("#wpforms-field-option-"+e.data.field.id).find(".wpforms-field-option-row-prev_toggle");e.find("input").attr("checked","checked").trigger("change"),e.addClass("wpforms-entry-preview-block")})},fieldDuplicate(o){let t=v("#wpforms-field-"+o);t.hasClass("no-duplicate")?v.alert({title:wpforms_builder.field_locked,content:wpforms_builder.field_locked_no_duplicate_msg,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.close,btnClass:"btn-confirm",keys:["enter"]}}}):v.confirm({title:!1,content:wpforms_builder.duplicate_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){var e,i;this.$$confirm.prop("disabled",!0),WPFormsUtils.triggerEvent(y,"wpformsBeforeFieldDuplicate",[o,t]).isDefaultPrevented()||(e=k.fieldDuplicateRoutine(o,!0),i=v("#wpforms-field-"+e),k.increaseNextFieldIdAjaxRequest(),WPFormsUtils.triggerEvent(y,"wpformsFieldDuplicated",[o,t,e,i]))}},cancel:{text:wpforms_builder.cancel}}})},increaseNextFieldIdAjaxRequest(){v.post(wpforms_builder.ajax_url,{form_id:m.formID,field_id:C.$nextFieldId.val(),nonce:wpforms_builder.nonce,action:"wpforms_builder_increase_next_field_id"})},fieldDuplicateRoutine(e,i=!0){var o=v("#wpforms-field-"+e),t=v("#wpforms-field-option-"+e),r=C.$sortableFieldsWrap.find(">.active"),s=C.$fieldOptions.find(">:visible"),l=s.find(">.active"),a=o.data("field-type"),n=t.attr("class"),d=k.dropdownField.helpers.isModernSelect(o.find("> .choices .primary-input"));wpf.restoreTooltips(t),d&&k.dropdownField.helpers.convertModernToClassic(e);let p=t.html(),f=o.clone(),c=parseInt(C.$nextFieldId.val(),10),m=v(`#wpforms-field-option-${e}-label`),w=(m.length?m:v(`#wpforms-field-option-${e}-name`)).val(),u=c+1,h={};var g=""!==w?w+" "+wpforms_builder.duplicate_copy:wpforms_builder.field+` #${e} `+wpforms_builder.duplicate_copy;h.fieldOptionsID=new RegExp("ID #"+e,"g"),h.fieldID=new RegExp("fields\\["+e+"\\]","g"),h.dataFieldID=new RegExp('data-field-id="'+e+'"',"g"),h.referenceID=new RegExp('data-reference="'+e+'"',"g"),h.elementID=new RegExp('\\b(id|for)="wpforms-(.*?)'+e+'(.*?)"',"ig"),o.after(f),r.removeClass("active"),f.addClass("active").attr({id:"wpforms-field-"+c,"data-field-id":c}),h.elementIdReplace=function(e,i,o,t){return`${i}="wpforms-${o}${c}${t}"`},p=(p=(p=(p=(p=p.replace(h.fieldOptionsID,"ID #"+c)).replace(h.fieldID,`fields[${c}]`)).replace(h.dataFieldID,`data-field-id="${c}"`)).replace(h.referenceID,`data-reference="${c}"`)).replace(h.elementID,h.elementIdReplace),s.hide(),t.after(`
        ${p}
        `);let b=v("#wpforms-field-option-"+c);r.data("field-id")===e&&l.length&&(o=l.attr("class").match(/wpforms-field-option-group-\S*/i)[0],s=b.find(">."+o),b.find(">").removeClass("active"),s.addClass("active")),r.data("field-id")!==e&&l.length&&(b.find(">").removeClass("active"),b.find(">.wpforms-field-option-group-basic").addClass("active")),t.find(":input").each(function(){var e=v(this),i=e.attr("name");if(!i)return"continue";var i=i.replace(h.fieldID,`fields[${c}]`),o=e.attr("type");"checkbox"===o||"radio"===o?e.is(":checked")?b.find(`[name="${i}"]`).prop("checked",!0).attr("checked","checked"):b.find(`[name="${i}"]`).prop("checked",!1).attr("checked",!1):e.is("select")?e.find("option:selected").length&&(o=e.find("option:selected").val(),b.find(`[name="${i}"]`).find(`[value="${o}"]`).prop("selected",!0)):""===(o=e.val())&&e.hasClass("wpforms-money-input")?b.find(`[name="${i}"]`).val(wpf.numberFormat("0",wpforms_builder.currency_decimals,wpforms_builder.currency_decimal,wpforms_builder.currency_thousands)):b.find(`[name="${i}"]`).val(o)}),b.find(".wpforms-field-option-hidden-id").val(c),C.$nextFieldId.val(u);n=v("html"===a?`#wpforms-field-option-${c}-name`:`#wpforms-field-option-${c}-label`);return i&&n.val(g).trigger("input"),y.trigger("wpformsFieldAdd",[c,a]),wpf.initTooltips(),d&&(k.dropdownField.helpers.convertClassicToModern(e),k.dropdownField.helpers.convertClassicToModern(c)),k.fieldChoiceUpdate(f.data("field-type"),c),k.loadColorPickers(),c},addEntryPreviewAndPageBreakFields(e,o){k.fieldAdd("entry-preview",e).done(function(e){let i=e.data.field.id;k.fieldAdd("pagebreak",{position:o+1}).done(function(e){k.lockEntryPreviewFieldsPosition(i);e=v("#wpforms-field-"+e.data.field.id).nextAll(".wpforms-field-pagebreak, .wpforms-field-entry-preview").first();e.hasClass("wpforms-field-entry-preview")&&k.lockEntryPreviewFieldsPosition(e.data("field-id"))})})},lockEntryPreviewFieldsPosition(e){var i=v("#wpforms-field-"+e),o=i.prevAll(".wpforms-field-pagebreak:not(.wpforms-pagebreak-bottom)").first(),t=i.nextAll(".wpforms-field-pagebreak").first().data("field-id"),t=v("#wpforms-field-option-"+t).find(".wpforms-field-option-row-prev_toggle"),r=t.find("input");i.addClass("wpforms-field-not-draggable"),o.addClass("wpforms-field-not-draggable wpforms-field-entry-preview-not-deleted"),r.prop("checked","checked").trigger("change"),t.addClass("wpforms-entry-preview-block"),v("#wpforms-add-fields-entry-preview").removeClass("wpforms-entry-preview-adding"),y.trigger("wpformsFieldDragToggle",[e,i.data("field-type")]),y.trigger("wpformsFieldDragToggle",[o.data("field-id"),o.data("field-type")])},isEntryPreviewFieldRequiresPageBreakBefore(e,i){e=e.slice(0,i).filter(".wpforms-field-pagebreak,.wpforms-field-entry-preview");let o=!0;return e.length&&v(e.get().reverse()).each(function(){var e=v(this);return!e.hasClass("wpforms-field-entry-preview")&&(e.hasClass("wpforms-field-pagebreak")&&!e.hasClass("wpforms-field-stick")?o=!1:void 0)}),o},isEntryPreviewFieldRequiresPageBreakAfter(e,i){e=e.slice(i).filter(".wpforms-field-pagebreak,.wpforms-field-entry-preview");let o=Boolean(e.length);return e.length&&e.each(function(){var e=v(this);return!e.hasClass("wpforms-field-entry-preview")&&(e.hasClass("wpforms-field-pagebreak")?o=!1:void 0)}),o},fieldAdd(s,l){var e=v("#wpforms-add-fields-"+s);if(!(e.hasClass("upgrade-modal")||e.hasClass("education-modal")||e.hasClass("warning-modal")))if(["captcha_turnstile","captcha_hcaptcha","captcha_recaptcha","captcha_none"].includes(s))k.captchaUpdate();else{if(n=!0,WPForms.Admin.Builder.DragFields.disableDragAndDrop(),k.disableFormActions(),!k.isUncheckedEntryPreviewField(s,l))return l=v.extend({},{position:"bottom",$sortable:"base",placeholder:!1,scroll:!0,defaults:!1},l),e={action:"wpforms_new_field_"+s,id:m.formID,type:s,defaults:l.defaults,nonce:wpforms_builder.nonce},v.post(wpforms_builder.ajax_url,e,function(i){if(i.success){var o=C.$sortableFieldsWrap,t=v(i.data.preview),r=v(i.data.options);let e=l.$sortable;n=!1,t.css("display","none"),l.placeholder&&l.placeholder.remove(),"default"!==l.$sortable&&l.$sortable.length||(e=o.find(".wpforms-fields-sortable-default")),"base"!==l.$sortable&&e.length||(e=o);o=WPFormsUtils.triggerEvent(y,"wpformsBeforeFieldAddToDOM",[l,t,r,e]);o.isDefaultPrevented()||(o.skipAddFieldToBaseLevel||k.fieldAddToBaseLevel(l,t,r),t.fadeIn(),y.find(".no-fields, .no-fields-preview").remove(),v(".wpforms-field-option:not(.wpforms-field-option-layout)").length&&y.find(".wpforms-field-submit").show(),l.scroll&&l.position.length&&k.scrollPreviewToField(i.data.field.id),C.$nextFieldId.val(i.data.field.id+1),wpf.initTooltips(),k.loadColorPickers(),k.toggleAllOptionGroups(),y.trigger("wpformsFieldAdd",[i.data.field.id,s]))}else wpf.debug("Add field AJAX call is unsuccessful:",i)}).fail(function(e){n=!1,wpf.debug("Add field AJAX call failed:",e.responseText)}).always(function(){n||(WPForms.Admin.Builder.DragFields.enableDragAndDrop(),k.enableFormActions())});k.addEntryPreviewField(s,l)}},fieldAddToBaseLevel(e,i,o){var t,r=C.$sortableFieldsWrap,s=r.children(":not(.wpforms-field-drag-pending, .no-fields-preview)"),l=s.length,a=C.$fieldOptions;"top"===e.position?(r.prepend(i),a.prepend(o)):(t=s.last(),"bottom"!==e.position||t.length&&t.hasClass("wpforms-field-stick")?("bottom"===e.position&&(e.position=l),e.position===l&&t.length&&t.hasClass("wpforms-field-stick")?(l=t.data("field-id"),t.before(i),a.find("#wpforms-field-option-"+l).before(o)):(t=s.eq(e.position)).length?(l=t.data("field-id"),t.before(i),a.find("#wpforms-field-option-"+l).before(o)):(r.append(i),a.append(o))):(r.append(i),a.append(o)))},scrollPreviewToField(e){var e=v("#wpforms-field-"+e),i=C.$fieldsPreviewWrap.scrollTop(),o=e.closest(".wpforms-field-layout");let t=e.position().top;e=(t=o.length?o.position().top+t+20:t)>i?t-i:t+i;C.$fieldsPreviewWrap.scrollTop(e)},captchaUpdate(){var e={action:"wpforms_update_field_captcha",id:m.formID,nonce:wpforms_builder.nonce};return v.post(wpforms_builder.ajax_url,e,function(t){if(t.success){let e={title:!1,content:!1,icon:"fa fa-exclamation-circle",type:"orange",boxWidth:"450px",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}},i=v("#wpforms-panel-field-settings-recaptcha"),o=t.data.current;i.data("provider",t.data.provider),"configured_not_enabled"!==o&&"configured_enabled"!==o||(o=i.prop("checked")?"configured_enabled":"configured_not_enabled",e.buttons.confirm.action=function(){i.prop("checked","configured_not_enabled"===o).trigger("change")}),e.title=t.data.cases[o].title,e.content=t.data.cases[o].content,t.data.cases[o].cancel&&(e.buttons.cancel={text:wpforms_builder.cancel,keys:["esc"]}),v.confirm(e)}else console.log(t)}).fail(function(e){console.log(e.responseText)})},disableDragAndDrop(){console.warn('WARNING! Function "WPFormsBuilder.disableDragAndDrop()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.disableDragAndDrop()" function instead!'),WPForms.Admin.Builder.DragFields.disableDragAndDrop()},enableDragAndDrop(){console.warn('WARNING! Function "WPFormsBuilder.enableDragAndDrop()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.enableDragAndDrop()" function instead!'),WPForms.Admin.Builder.DragFields.enableDragAndDrop()},disableFormActions(){v.each([C.$previewButton,C.$embedButton,C.$saveButton,C.$exitButton],function(e,i){i.prop("disabled",!0).addClass("wpforms-disabled")})},enableFormActions(){v.each([C.$previewButton,C.$embedButton,C.$saveButton,C.$exitButton],function(e,i){i.prop("disabled",!1).removeClass("wpforms-disabled")})},fieldSortable(){console.warn('WARNING! Function "WPFormsBuilder.fieldSortable()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.initSortableFields()" function instead!'),WPForms.Admin.Builder.DragFields.initSortableFields()},fieldDragDisable(e,i=!0){console.warn('WARNING! Function "WPFormsBuilder.fieldDragDisable()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.fieldDragDisable()" function instead!'),WPForms.Admin.Builder.DragFields.fieldDragDisable(e,i)},fieldDragEnable(e){console.warn('WARNING! Function "WPFormsBuilder.fieldDragEnable()" has been deprecated, please use the new "WPForms.Admin.Builder.DragFields.fieldDragEnable()" function instead!'),WPForms.Admin.Builder.DragFields.fieldDragEnable(e)},fieldChoiceAdd(e,i){e.preventDefault();var e=v(i),i=e.parent(),o=i.find("input.default").is(":checked"),e=e.closest(".wpforms-field-option-row-choices").data("field-id");let t=i.parent().attr("data-next-id");var r=i.parent().data("field-type"),s=i.clone().insertAfter(i);s.attr("data-key",t),s.find(".wpforms-icon-select .ic-fa-preview").removeClass().addClass("ic-fa-preview ic-fa-"+wpforms_builder.icon_choices.default_icon_style+" ic-fa-"+wpforms_builder.icon_choices.default_icon),s.find(".wpforms-icon-select .ic-fa-preview + span").text(wpforms_builder.icon_choices.default_icon),s.find(".preview").empty(),s.find(".wpforms-image-upload-add").show(),s.find(".wpforms-money-input").trigger("focusout"),s.find("input, select").each(function(){var e=v(this),i=e.attr("type");e.attr("name",v(this).attr("name").replace(/\[choices]\[(\d+)]/g,`[choices][${t}]`)),"radio"===i||"checkbox"===i?e.prop("checked",!1):e.val("")}),s.find(".wpforms-icon-select input.source-icon").val(wpforms_builder.icon_choices.default_icon),s.find(".wpforms-icon-select input.source-icon-style").val(wpforms_builder.icon_choices.default_icon_style),!0===o&&i.find("input.default").prop("checked",!0),t++,i.parent().attr("data-next-id",t),y.trigger("wpformsFieldChoiceAdd",[e]),k.fieldChoiceUpdate(r,e)},fieldChoiceDelete(e,i){e.preventDefault();let o=v(i),t=o.parent().parent(),r=t.find("li").not(".wpforms-choice-other-option").length,s={id:t.data("field-id"),choiceId:o.closest("li").data("key"),message:""+wpforms_builder.delete_choice_confirm+"",trigger:!1};if(y.trigger("wpformsBeforeFieldDeleteAlert",[s]),1===r)k.fieldChoiceDeleteAlert();else{let e=function(){o.parent().remove(),k.fieldChoiceUpdate(t.data("field-type"),t.data("field-id")),y.trigger("wpformsFieldChoiceDelete",[t.data("field-id")])};s.trigger?v.confirm({title:!1,content:s.message,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){e()}},cancel:{text:wpforms_builder.cancel}}}):e()}},fieldChoiceDeleteAlert(){v.alert({title:!1,content:wpforms_builder.error_choice,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})},fieldChoiceSortable(t,e=void 0){v(e=void 0!==e?e:".wpforms-field-option-"+t+" .wpforms-field-option-row-choices ul").one("mouseenter",function(){v(this).sortable({items:"li:not(.not-draggable)",axis:"y",delay:100,opacity:.6,handle:".move",stop(e,i){var o=i.item.parent().data("field-id");k.fieldChoiceUpdate(t,o),y.trigger("wpformsFieldChoiceMove",i)},update(){}})})},fieldChoiceLabel(e,i){var o=["payment-multiple","payment-checkbox"].includes(e.settings.type),t=e.settings.choices_icons||e.settings.choices_images,r=void 0===e.settings.choices[i].label||0===e.settings.choices[i].label.length;if(r&&!o&&t)return"";t=o?wpforms_builder.payment_choice_empty_label_tpl:wpforms_builder.choice_empty_label_tpl;let s=r?t.replace("{number}",i):wpf.sanitizeHTML(e.settings.choices[i].label,wpforms_builder.allowed_label_html_tags);return e.settings.show_price_after_labels&&(s+=" - "+wpf.amountFormatCurrency(e.settings.choices[i].value)),s},fieldChoiceUpdate:(p,t,r=-1)=>{let f=k.dropdownField.helpers.isDynamicChoices(t);if(!k.replaceChoicesWithTemplate(p,t,f)){-1===r&&(r=k.settings.choicesLimitLong),"payment-select"===p&&(p="select");let s=v("#wpforms-field-"+t+" .primary-input"),l="",e=("select"===p?f||(l='',s.find("option").not(".placeholder").remove()):"radio"!==p&&"checkbox"!==p&&"gdpr-checkbox"!==p||(p="gdpr-checkbox"===p?"checkbox":p,s.find("li").remove(),l='
      • {label}
      • '),v(`#wpforms-field-option-row-${t}-choices .choices-list`)),i=e.find("li").slice(0,r),o=!!e.find("input.default:checked").length,a=[],n=v("#wpforms-field-option-"+t+"-show_price_after_labels").prop("checked"),d=k.dropdownField.helpers.isModernSelect(s);var c;i.get().forEach(function(e){var e=v(e),i=e.find("input.value").val(),o=e.data("key");let t=wpf.sanitizeHTML(e.find("input.label").val().trim(),wpforms_builder.allowed_label_html_tags),r;if(t=""!==t?t:wpforms_builder.choice_empty_label_tpl.replace("{number}",o),t+=n&&i?" - "+wpf.amountFormatCurrency(i):"",d?a.push({value:t,label:t}):f||(r=v(l.replace(/{label}/g,t)),s.append(r)),!0===e.find("input.default").is(":checked"))switch(p){case"select":d?a[a.length-1].selected=!0:k.setClassicSelectedChoice(r);break;case"radio":case"checkbox":r.find("input").prop("checked","true")}}),d&&(r=s.prop("multiple")?"input.choices__input":".choices__inner .choices__placeholder",c=k.dropdownField.helpers.getInstance(s),f||c.removeActiveItems(),c.setChoices(a,"value","label",!0),k.dropdownField.helpers.update(t,f),s.closest(".choices").find(r).toggleClass("wpforms-hidden",o))}},replaceChoicesWithTemplate:(e,i,o)=>{if("radio"!==e&&"checkbox"!==e&&"payment-multiple"!==e&&"payment-checkbox"!==e)return!1;var t=wpf.getChoicesOrder(i),r=wp.template("wpforms-field-preview-checkbox-radio-payment-multiple");let s=wpf.getField(i),l={},a=t.slice(0,k.settings.choicesLimit),n={settings:s,order:a,type:"radio"};return s.choices_icons&&(n.settings.choices_icons_color=k.getValidColorPickerValue(v("#wpforms-field-option-"+i+"-choices_icons_color"))),a.forEach(function(e){l[e]=s.choices[e]}),s.choices=l,"checkbox"!==e&&"payment-checkbox"!==e||(n.type="checkbox"),o||v("#wpforms-field-"+i).find("ul.primary-input").replaceWith(r(n)),k.firstNChoicesAlert(i,t.length),!0},setClassicSelectedChoice(e){void 0!==e&&e.prop("selected","true")},fieldChoiceBulkAddToggle(i){var i=v(i),o=i.closest("label");if(i.hasClass("bulk-add-showing")){let e=o.next(".bulk-add-display");e.slideUp(400,function(){e.remove()}),i.find("span").text(wpforms_builder.bulk_add_show)}else{let e='
        ';for(var t in e=e+('

        '+wpforms_builder.bulk_add_heading+' '+wpforms_builder.bulk_add_presets_show+"

        ")+"")+(''))+('")+"
        ",o.after(e),o.next(".bulk-add-display").slideDown(400,function(){v(this).find("textarea").trigger("focus")}),i.find("span").text(wpforms_builder.bulk_add_hide)}i.toggleClass("bulk-add-showing")},fieldChoiceBulkAddInsert(e){var i,e=v(e),o=e.closest(".wpforms-field-option-row"),t=o.find("textarea"),r=o.find(".choices-list"),s=r.find("li:first-of-type").clone().wrap("
        ").parent(),l=o.data("field-id"),a=r.data("field-type");let n=Number(r.attr("data-next-id"));var d,p=t.val().split("\n");let f="";for(d in e.prop("disabled",!0).html(e.html()+" "+m.spinner),s.find("input.value,input.label").attr("value",""),s.find("input.default").attr("checked",!1),s.find("input.source-icon").attr("value",wpforms_builder.icon_choices.default_icon),s.find("input.source-icon-style").attr("value",wpforms_builder.icon_choices.default_icon_style),s.find(".ic-fa-preview").removeClass().addClass(`ic-fa-preview ic-fa-${wpforms_builder.icon_choices.default_icon_style} ic-fa-`+wpforms_builder.icon_choices.default_icon),s.find(".ic-fa-preview + span").text(wpforms_builder.icon_choices.default_icon),i=s.html(),p)if(p.hasOwnProperty(d)){var c=wpf.sanitizeHTML(p[d]).trim().replace(/"/g,""");let e=i;e=(e=(e=(e=e.replace(/\[choices]\[(\d+)]/g,"[choices]["+n+"]")).replace(/data-key="(\d+)"/g,'data-key="'+n+'"')).replace(/value="" class="label"/g,'value="'+c+'" class="label"')).replace(/class="label" type="text" value=""/g,'class="label" type="text" value="'+c+'"'),f+=e,n++}r.attr("data-next-id",n);t=r.find("li.wpforms-choice-other-option").first();t.length?t.before(f):r.append(f),k.fieldChoiceUpdate(a,l,n),y.trigger("wpformsFieldChoiceAdd"),k.fieldChoiceBulkAddToggle(o.find(".toggle-bulk-add-display"))},triggerBuilderEvent(e){y.trigger(e)},fieldTabToggle(e){var i;if(WPFormsUtils.triggerEvent(y,"wpformsFieldTabToggle",[e]).isDefaultPrevented())return!1;v(".wpforms-tab a").removeClass("active"),v(".wpforms-field, .wpforms-title-desc").removeClass("active"),"add-fields"===e?(C.$addFieldsTab.addClass("active"),v(".wpforms-field-options").hide(),v(".wpforms-add-fields").show()):(v("#field-options a").addClass("active"),"field-options"===e?((i=v(".wpforms-field").first()).addClass("active"),e=i.data("field-id")):v("#wpforms-field-"+e).addClass("active"),v(".wpforms-field-option").hide(),v("#wpforms-field-option-"+e).show(),v(".wpforms-add-fields").hide(),v(".wpforms-field-options").show(),y.trigger("wpformsFieldOptionTabToggle",[e]))},fieldPagebreakAdd(e,i,o){if("pagebreak"===o){let e;m.pagebreakTop?m.pagebreakBottom||(m.pagebreakBottom=!0,e={position:"bottom",scroll:!1,defaults:{position:"bottom"}},k.fieldAdd("pagebreak",e).done(function(e){m.pagebreakBottom=e.data.field.id;var i=v("#wpforms-field-"+e.data.field.id);v("#wpforms-field-option-"+e.data.field.id).find(".wpforms-field-option-group").addClass("wpforms-pagebreak-bottom"),i.addClass("wpforms-field-stick wpforms-pagebreak-bottom")})):(m.pagebreakTop=!0,e={position:"top",scroll:!1,defaults:{position:"top",nav_align:"left"}},k.fieldAdd("pagebreak",e).done(function(e){m.pagebreakTop=e.data.field.id;var i=v("#wpforms-field-"+e.data.field.id);v("#wpforms-field-option-"+e.data.field.id).find(".wpforms-field-option-group").addClass("wpforms-pagebreak-top"),i.addClass("wpforms-field-stick wpforms-pagebreak-top")}))}},fieldPagebreakDelete(e,i,o){var t,r,s;"pagebreak"!==o||v("#wpforms-panel-fields .wpforms-field-pagebreak").not(".wpforms-pagebreak-top, .wpforms-pagebreak-bottom").length||(r=(t=(o=v("#wpforms-panel-fields .wpforms-preview-wrap")).find(".wpforms-pagebreak-top")).data("field-id"),s=(o=o.find(".wpforms-pagebreak-bottom")).data("field-id"),t.remove(),v("#wpforms-field-option-"+r).remove(),m.pagebreakTop=!1,o.remove(),v("#wpforms-field-option-"+s).remove(),m.pagebreakBottom=!1)},fieldPageBreakInitDisplayPrevious(e){var i=e.data("field-id"),o=v("#wpforms-field-option-row-"+i+"-prev_toggle"),i=v("#wpforms-field-option-row-"+i+"-prev"),t=e.find(".wpforms-pagebreak-prev");0":">")+i[o].label+"",e.append(s)}else for(o in t="radio",a.hasClass("wpforms-field-checkbox")&&(t="checkbox"),e.empty(),i)s='
      • ":">")+i[o].label+"
      • ",e.append(s);r.find("ul").removeClass("wpforms-hidden"),r.find(".wpforms-alert").addClass("wpforms-hidden"),e.removeClass("wpforms-hidden")}wpf.fieldOptionLoading(i,!0)}},fieldDynamicChoiceSource(e){let i=v(e),o=i.parent(),t=i.val(),r=o.data("field-id"),s=v("#wpforms-builder-form").data("id"),l=v("#wpforms-field-option-row-"+r+"-choices"),a=v("#wpforms-field-"+r),n=v(`#wpforms-field-option-${r}-dynamic_choices option:selected`).val(),d=20;wpf.fieldOptionLoading(o);e={type:n,source:t,field_id:r,form_id:s,action:"wpforms_builder_dynamic_source",nonce:wpforms_builder.nonce};v.post(wpforms_builder.ajax_url,e,function(i){if(i.success){if(l.find(".dynamic-name").text(i.data.source_name),l.find(".dynamic-type").text(i.data.type_name),l.find("ul").addClass("wpforms-hidden"),l.find(".wpforms-alert").removeClass("wpforms-hidden"),k.fieldDynamicChoiceSourceItems(a,i.data.items),a.hasClass("wpforms-field-select")&&(d=200),a.find(".wpforms-notice-dynamic-empty").remove(),Number(i.data.total)>d){let e=wpforms_builder.dynamic_choices.limit_message;e=(e=(e=(e=e.replace("{source}",i.data.source_name)).replace("{type}",i.data.type_name)).replace("{limit}",d)).replace("{total}",i.data.total),v.alert({title:wpforms_builder.heads_up,content:e,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})}k.firstNChoicesAlert(r,i.data.total),0===Number(i.data.total)&&k.emptyChoicesNotice(r,i.data.source_name,i.data.type)}else console.log(i);wpf.fieldOptionLoading(o,!0)}).fail(function(e){console.log(e.responseText)})},fieldDynamicChoiceSourceItems(i,o){var t=i.find(".primary-input");let r=0;if(i.hasClass("wpforms-field-select"))k.dropdownField.helpers.isModernSelect(t)?k.fieldDynamicChoiceSourceForModernSelect(t,o):k.fieldDynamicChoiceSourceForClassicSelect(t,o);else{let e="radio";for(r in i.hasClass("wpforms-field-checkbox")&&(e="checkbox"),t.empty(),o)t.append('
      • '+wpf.sanitizeHTML(o[r])+"
      • ")}},fieldDynamicChoiceSourceForModernSelect(e,i){var o=k.dropdownField.helpers.getInstance(e),t=e.closest(".wpforms-field").data().fieldId;o.destroy(),k.dropdownField.helpers.updatePlaceholderChoice(o,t),k.fieldDynamicChoiceSourceForClassicSelect(e,i),k.dropdownField.events.choicesInit(e)},fieldDynamicChoiceSourceForClassicSelect(e,i){let o=0;var t=i.length;for(e.find("option").not(".placeholder").remove();o'+r+"")}e.toggleClass("wpforms-hidden",!t)},fieldDynamicChoiceToggleImageChoices(){v(`#wpforms-builder .wpforms-field-options .wpforms-field-option-checkbox, + #wpforms-builder .wpforms-field-options .wpforms-field-option-radio`).each(function(e,i){var i=v(i),o=i.find(".wpforms-field-option-row-dynamic_choices select").val(),o=void 0!==o&&""!==o,t=i.find(".wpforms-field-option-row-choices_images input").is(":checked");i.find(".wpforms-field-option-row-choices_images").toggleClass("wpforms-hidden",o),t&&!o||i.find(".wpforms-field-option-row-choices_images_style").addClass("wpforms-hidden")})},fieldDynamicChoiceToggleIconChoices(){v(`#wpforms-builder .wpforms-field-options .wpforms-field-option-checkbox, + #wpforms-builder .wpforms-field-options .wpforms-field-option-radio`).each(function(e,i){var i=v(i),o=i.find(".wpforms-field-option-row-dynamic_choices select").val(),o=void 0!==o&&""!==o,t=i.find(".wpforms-field-option-row-choices_icons input").is(":checked");i.find(".wpforms-field-option-row-choices_icons").toggleClass("wpforms-hidden",o),t&&!o||(i.find(".wpforms-field-option-row-choices_icons_color").addClass("wpforms-hidden"),i.find(".wpforms-field-option-row-choices_icons_size").addClass("wpforms-hidden"),i.find(".wpforms-field-option-row-choices_icons_style").addClass("wpforms-hidden"))})},fieldDynamicChoiceToggleOtherOption(){v("#wpforms-builder .wpforms-field-options .wpforms-field-option-radio").each(function(e,i){var i=v(i),o=i.find(".wpforms-field-option-row-dynamic_choices select"),t=o.val(),t=void 0!==t&&""!==t,r=i.find(".wpforms-field-option-row-choices_other input").is(":checked"),o=o.closest(".wpforms-field-option-row").data("field-id"),s=v("#wpforms-field-option-"+o).find(".wpforms-field-option-row-choices_other input");t?s.is(":checked")&&s.prop("checked",!1).trigger("change"):WPForms.Admin.Builder.MultipleChoices.updatePreviewState(o),i.find(".wpforms-field-option-row-choices_other").toggleClass("wpforms-hidden",t),r&&!t||(i.find(".wpforms-field-option-row-other_placeholder").addClass("wpforms-hidden"),i.find(".wpforms-field-option-row-other_size").addClass("wpforms-hidden"))})},firstNChoicesAlert:(e,i)=>{var o,t,r,e=v("#wpforms-field-"+e);e.hasClass("wpforms-field-select")||(o=wp.template("wpforms-choices-limit-message"),t={total:i},r=k.settings.choicesLimit,e.find(".wpforms-alert-dynamic").remove(),r .layout-selector-display`);if(!e.length){var t,r={"layout-1":[{class:"one-half",data:"wpforms-one-half wpforms-first"},{class:"one-half",data:"wpforms-one-half"}],"layout-2":[{class:"one-third",data:"wpforms-one-third wpforms-first"},{class:"one-third",data:"wpforms-one-third"},{class:"one-third",data:"wpforms-one-third"}],"layout-3":[{class:"one-fourth",data:"wpforms-one-fourth wpforms-first"},{class:"one-fourth",data:"wpforms-one-fourth"},{class:"one-fourth",data:"wpforms-one-fourth"},{class:"one-fourth",data:"wpforms-one-fourth"}],"layout-4":[{class:"one-third",data:"wpforms-one-third wpforms-first"},{class:"two-third",data:"wpforms-two-thirds"}],"layout-5":[{class:"two-third",data:"wpforms-two-thirds wpforms-first"},{class:"one-third",data:"wpforms-one-third"}],"layout-6":[{class:"one-fourth",data:"wpforms-one-fourth wpforms-first"},{class:"one-fourth",data:"wpforms-one-fourth"},{class:"two-fourth",data:"wpforms-two-fourths"}],"layout-7":[{class:"two-fourth",data:"wpforms-two-fourths wpforms-first"},{class:"one-fourth",data:"wpforms-one-fourth"},{class:"one-fourth",data:"wpforms-one-fourth"}],"layout-8":[{class:"one-fourth",data:"wpforms-one-fourth wpforms-first"},{class:"two-fourth",data:"wpforms-two-fourths"},{class:"one-fourth",data:"wpforms-one-fourth"}]};let e,i=`
        +

        ${wpforms_builder.layout_selector_layout}

        +
        `;for(t in r){for(var s in e=r[t],i+='
        ',e)i+=``;i+="
        "}i+="
        ",v(`#wpforms-field-option-row-${o}-css > label`).after(i)}},fieldLayoutSelectorLayout(e){e=v(e);e.parent().find(".layout-selector-display-layout").not(e).remove(),e.parent().find(".heading").text(wpforms_builder.layout_selector_column),e.toggleClass("layout-selector-display-layout layout-selector-display-columns")},fieldLayoutSelectorInsert(e){let i=v(e),o=i.closest(".layout-selector-display"),t=o.parent(),r=t.data("field-id"),s=t.find("label"),l=t.find("input[type=text]"),a=i.data("classes"),n=l.val();n&&(["wpforms-one-half","wpforms-first","wpforms-one-third","wpforms-one-fourth","wpforms-two-thirds","wpforms-two-fourths"].forEach(e=>{n=n.replace(new RegExp("\\b"+e+"\\b","gi"),"")}),n=n.replace(/\s\s+/g," ").trim(),a+=" "+n),l.val(a),o.slideUp(400,function(){o.remove(),k.fieldLayoutSelectorInit(r)}),s.find(".toggle-layout-selector-display").removeClass("layout-selector-showing"),s.find(".toggle-layout-selector-display span").text(wpforms_builder.layout_selector_show)},toggleOrderSummaryConfirmation(e,i,o){"payment-total"===o&&v(".wpforms-confirmation").each(function(){v(this).find(".wpforms-panel-field-confirmations-message_order_summary").closest(".wpforms-panel-field").toggle(0!==v("#wpforms-panel-fields .wpforms-field-payment-total").length)})},bindUIActionsSettings(){y.on("click","#wpforms-panel-fields .wpforms-title-desc, #wpforms-panel-fields .wpforms-field-submit-button, .wpforms-center-form-name",function(e){e.preventDefault(),k.panelSwitch("settings"),(v(this).hasClass("wpforms-center-form-name")||v(this).hasClass("wpforms-title-desc"))&&setTimeout(function(){v("#wpforms-panel-field-settings-form_title").trigger("focus")},300)}),y.on("click",".wpforms-field-pagebreak-last button",function(e){e.preventDefault(),k.panelSwitch("settings"),v("#wpforms-panel-field-settings-pagebreak_prev").trigger("focus")}),y.on("click",".wpforms-panel-content-also-available-item-add-captcha",function(e){e.preventDefault();e=y.find("#wpforms-add-fields-captcha");e.data("action")?e.trigger("click"):k.fieldAdd("captcha",{}).done(function(e){k.panelSwitch("fields"),v("#wpforms-field-"+e.data.field.id).trigger("click")})}),y.on("input","#wpforms-panel-field-settings-pagebreak_prev",function(){v(".wpforms-field-pagebreak-last button").text(v(this).val())}),y.on("input","#wpforms-panel-field-settings-form_title, #wpforms-setup-name",function(){var e=v(this).val().toString().trim();v(".wpforms-preview .wpforms-form-name").text(e),v(".wpforms-center-form-name.wpforms-form-name").text(e),k.trimFormTitle()}),y.on("input","#wpforms-panel-field-settings-form_desc",function(){v(".wpforms-form-desc").text(v(this).val())}),y.on("input","#wpforms-panel-field-settings-submit_text",function(){var e=v(this).val()||wpforms_builder.submit_text;v(".wpforms-field-submit input[type=submit]").val(e)}),y.on("change","#wpforms-panel-field-settings-recaptcha",function(){k.captchaToggle()}),y.on("change",".wpforms-panel-field-confirmations-type",function(){k.confirmationFieldsToggle(v(this))}),y.on("change",".wpforms-panel-field-confirmations-message_entry_preview",k.confirmationEntryPreviewToggle),y.on("change","#wpforms-panel-field-settings-notification_enable",k.notificationToggle),y.on("click",".wpforms-builder-settings-block-add",function(e){e.preventDefault(),wpforms_builder.pro&&k.settingsBlockAdd(v(this))}),y.on("click",".wpforms-builder-settings-block-edit",function(e){e.preventDefault();e=v(this);e.parents(".wpforms-builder-settings-block-header").find(".wpforms-builder-settings-block-name").hasClass("editing")?k.settingsBlockNameEditingHide(e):k.settingsBlockNameEditingShow(e)}),y.on("blur",".wpforms-builder-settings-block-name-edit input",function(e){v(e.relatedTarget).hasClass("wpforms-builder-settings-block-edit")||k.settingsBlockNameEditingHide(v(this))}),y.on("keypress",".wpforms-builder-settings-block-name-edit input",function(e){13===e.keyCode&&(k.settingsBlockNameEditingHide(v(this)),e.preventDefault())}),y.on("click",".wpforms-builder-settings-block-clone",function(e){e.preventDefault(),k.settingsBlockPanelClone(v(this))}),y.on("click",".wpforms-builder-settings-block-toggle",function(e){e.preventDefault(),k.settingsBlockPanelToggle(v(this))}),y.on("click",".wpforms-builder-settings-block-delete",function(e){e.preventDefault(),k.settingsBlockDelete(v(this))}),y.on("wpformsSettingsBlockAdded wpformsSettingsBlockCloned",function(e,i){i.hasClass("wpforms-notification")&&k.notificationUpdateStatus(i)}),y.on("click",".wpforms-status-button",function(){v(this).hasClass("wpforms-notification-status-button")?k.notificationChangeStatus(v(this)):k.handleStatusButton(v(this))}),y.on("change","#wpforms-panel-field-settings-ajax_submit",function(){k.hideOpenConfirmationsInNewTabOptions(!v(this).is(":checked"))})},hideOpenConfirmationsInNewTabOptions(o){var e=v(".wpforms-panel-field-confirmations-redirect_new_tab");e.length&&e.each(function(){var e=v(this),i=e.closest(".wpforms-builder-settings-block").find(".wpforms-panel-field-confirmations-type").val();e.closest(".wpforms-panel-field").toggle(!o&&["redirect","page"].includes(i))})},captchaToggle(){var e=y.find(".wpforms-field-recaptcha"),i=v("#wpforms-panel-field-settings-recaptcha"),o=i.data("provider")||"recaptcha";e.length&&(i.is(":checked")?e.show().toggleClass("is-recaptcha","recaptcha"===o):e.hide())},initConfirmationsType(){v(".wpforms-panel-field-confirmations-type").each(function(){k.confirmationFieldsToggle(v(this))})},initElementsTinyMCE(e,t={}){if("undefined"!=typeof tinymce&&void 0!==wp.editor){let i={...m.tinymceDefaults,...t},o=i.tinymce.setup;i.tinymce.toolbar1.includes("wpf_insert_smart_tag")||(i.tinymce.toolbar1+=",wpf_insert_smart_tag"),i.tinymce.setup=function(e){o?.call(this,e),e.addButton("wpf_insert_smart_tag",{text:"",tooltip:wpforms_builder.smart_tags_dropdown_title,icon:!1,image:wpforms_builder.smart_tags_dropdown_mce_icon,classes:"wpforms-smart-tags-mce-button"})},e.each(function(){var e=v(this).attr("id");wp.editor.remove(e),wp.editor.initialize(e,i)})}},confirmationsSetup(){k.initConfirmationsType(),k.initElementsTinyMCE(v(".wpforms-panel-field-confirmations-message")),y.on("focusout",".wpforms-panel-field-confirmations-redirect",function(){let e=v(this);var i=e.val().trim();e.val(i),wpf.isURL(i)||""===i||k.confirmationRedirectValidationError(function(){e.trigger("focus")})}),y.on("wpformsBeforeSave wpformsPanelSectionSwitch wpformsPanelSwitch",function(t){v(".wpforms-confirmation").each(function(e,i){i=v(i);let o=i.find(".wpforms-panel-field-confirmations-redirect");if(!o.is(":hidden")){i=i.find(".wpforms-panel-field-confirmations-type");if(!("redirect"!==i.val()||0`,t='

        '+wpforms_builder[c+"_error"]+"

        ",r=i+o+t,s=v.confirm({container:y,title:!1,content:r,icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){var e=this.$content.find("input#settings-block-name").val().toString().trim(),i=this.$content.find(".error");if(""===e)return i.show(),!1;var i=d.closest(".wpforms-panel-content-section").find(".wpforms-builder-settings-block").first(),o=(wpf.restoreTooltips(i),"#wpforms-"+c+"-template-block"),o=v(o);let t,r;if(o.length){let e=o.text();e=e.replace(/{CLONE}/g,p).replace(/CLONE/g,p),t=v(e),r=p}else t=i.clone(),r=i.data("block-id");let s,l=(t.attr("data-block-id",p),t.find(".wpforms-builder-settings-block-name-holder span").text(e),t.find("input, textarea, select").each(function(){var e=v(this),i=e.parent();e.hasClass("wpforms-disabled")&&(i.hasClass("from-name")||i.hasClass("from-email"))||i.hasClass("wpforms-pdf-file-name")||(i=e).attr("name")&&(i.val("").attr("name",i.attr("name").replace(/\[(\d+)]/,"["+p+"]")),i.is("select")?(i.find("option").prop("selected",!1).attr("selected",!1),i.find("option").first().prop("selected",!0).attr("selected","selected")):"checkbox"===i.attr("type")?(e=i.closest(".wpforms-panel-field").hasClass("js-wpforms-enabled-notification"),i.prop("checked",e).attr("checked",e).val("1")):i.val("").attr("value",""))}),"wpforms-panel-field-"+f+"-"),a=l+r,n=(t.find('[id^="'+a+'"], [for^="'+a+'"]').each(function(){var e=v(this),i="LABEL"===e.prop("tagName")?"for":"id",o=e.attr(i).replace(new RegExp(a,"g"),l+p);e.attr(i,o)}),r+"-notification-by-status");t.find('[data-radio-group="'+n+'"]').each(function(){v(this).removeClass("wpforms-radio-group-"+n).addClass("wpforms-radio-group-"+p+"-notification-by-status").attr("data-radio-group",p+"-notification-by-status")}),t.find(".wpforms-builder-settings-block-name-holder input").val(e).attr("value",e),"notification"===c&&(t.find(".email-msg textarea").val("{all_fields}").text("{all_fields}").attr("value","{all_fields}"),t.find(".email-recipient input").val("{admin_email}").attr("value","{admin_email}")),t.removeClass("wpforms-builder-settings-block-default"),"confirmation"===c&&(t.find(".wpforms-panel-field-tinymce").remove(),"undefined"!=typeof WPForms)&&t.find(".wpforms-panel-field-confirmations-type-wrap").after(WPForms.Admin.Builder.Templates.get("wpforms-builder-confirmations-message-field")({id:p}));o=t.find(".wpforms-conditional-block"),o.length&&"undefined"!=typeof WPForms&&o.html(WPForms.Admin.Builder.Templates.get("wpforms-builder-conditional-logic-toggle-field")({id:p,type:c,actions:JSON.stringify(t.find(".wpforms-panel-field-conditional_logic-checkbox").data("actions")),actionDesc:t.find(".wpforms-panel-field-conditional_logic-checkbox").data("action-desc"),reference:t.find(".wpforms-panel-field-conditional_logic-checkbox").data("reference")})),e=t.find(".wpforms-field-map-table"),e.length&&e.each(function(e,i){var i=v(i),o=(i.find("tr:not(:first-child)").remove(),i.find(".key input")),i=i.find(".field select"),t=i.data("name");o.attr("value",""),i.attr("name","").attr("data-name",t.replace(/\[(\d+)]/,"["+p+"]"))}),s=(s=t.wrap("
        ").parent().html()).replace(/\[conditionals]\[(\d+)]\[(\d+)]/g,"[conditionals][0][0]"),0===i.length?d.closest(".wpforms-panel-content-section").append(s):i.before(s),o=0===i.length?d.closest(".wpforms-panel-content-section").find(".wpforms-builder-settings-block").first():i.prev();"confirmation"===c&&(k.prepareChoicesJSField(o,p),k.confirmationFieldsToggle(v(".wpforms-panel-field-confirmations-type").first())),"undefined"!=typeof tinymce&&void 0!==wp.editor&&"confirmation"===c&&wp.editor.initialize("wpforms-panel-field-confirmations-message-"+p,m.tinymceDefaults),wpf.initTooltips(),y.trigger("wpformsSettingsBlockAdded",[o]),d.attr("data-next-id",p+1)}},cancel:{text:wpforms_builder.cancel}}});y.on("keypress","#settings-block-name",function(e){13===e.keyCode&&v(s.buttons.confirm.el).trigger("click")})},prepareChoicesJSField(e,i){var o,e=e.find(`#wpforms-panel-field-confirmations-${i}-page-wrap`);e.length<=0||(i=e.find(`#wpforms-panel-field-confirmations-${i}-page`)).length<=0&&!i.hasClass("choicesjs-select")||(o=e.find(".choices")).length<=0||((i=i.first()).removeAttr("data-choice"),i.removeAttr("hidden"),i.removeClass("choices__input"),v(i).appendTo(e.first()),o.first().remove(),k.dropdownField.events.choicesInit(i))},settingsBlockNameEditingShow(e){e=e.parents(".wpforms-builder-settings-block-name-holder");e.find(".wpforms-builder-settings-block-name").addClass("editing").hide(),e.find(".wpforms-builder-settings-block-name-edit").addClass("active"),wpf.focusCaretToEnd(e.find("input"))},settingsBlockNameEditingHide(e){var i=e.parents(".wpforms-builder-settings-block-header"),o=i.find(".wpforms-builder-settings-block-name"),i=i.find(".wpforms-builder-settings-block-name-edit");let t=i.find("input").val().trim();e=e.data("block-type")||e.closest(".wpforms-builder-settings-block").data("block-type");t.length||(t=wpforms_builder[e+"_def_name"]),i.find("input").val(t),o.text(t),o.removeClass("editing").show(),i.removeClass("active")},settingsBlockPanelClone(e){let i=e.closest(".wpforms-panel-content-section"),o=i.find(".wpforms-builder-settings-block-add"),t=e.closest(".wpforms-builder-settings-block"),r=t.find(".wpforms-builder-settings-block-content"),s=parseInt(o.attr("data-next-id"),10),l=t.data("block-type"),a=t.find(".wpforms-builder-settings-block-name").text().trim()+wpforms_builder[l+"_clone"],n=r.is(":hidden"),d=(wpf.restoreTooltips(t),t.clone(!1,!0));k.settingsBlockUpdateState(n,s,l),d.data("block-id",s).attr("data-block-id",s),d.find(".wpforms-builder-settings-block-name-holder span").text(a),d.find(".wpforms-builder-settings-block-name-holder input").val(a),d.removeClass("wpforms-builder-settings-block-default"),o.attr("data-next-id",s+1),d.find("input, textarea, select").each(function(){var e=v(this);e.attr("name")&&e.attr("name",e.attr("name").replace(/\[(\d+)]/,"["+s+"]")),e.data("name")&&e.data("name",e.data("name").replace(/\[(\d+)]/,"["+s+"]")),e.attr("class")&&e.attr("class",e.attr("class").replace(/-(\d+)/,"-"+s)),e.attr("data-radio-group")&&e.attr("data-radio-group",e.attr("data-radio-group").replace(/(\d+)-/,s+"-"))}),d.find("*").each(function(){var e=v(this);e.attr("id")&&e.attr("id",e.attr("id").replace(/-(\d+)/,"-"+s)),e.attr("for")&&e.attr("for",e.attr("for").replace(/-(\d+)-/,"-"+s+"-")),e.data("input-name")&&e.data("input-name",e.data("input-name").replace(/\[(\d+)]/,"["+s+"]"))}),t.find("select").each(function(){var e=v(this).attr("name"),i=v(this).attr("name").replace(/\[(\d+)]/,"["+s+"]");d.find('select[name="'+i+'"]').val(v(this).attr("name",e).val())}),d.css("display","none").insertBefore(t).show("fast",function(){wpf.initTooltips()}),y.trigger("wpformsSettingsBlockCloned",[d,t.data("block-id")])},settingsBlockPanelToggle(e,i=null){let o=e.closest(".wpforms-builder-settings-block"),t=o.data("block-id"),r=o.data("block-type"),s=o.find(".wpforms-builder-settings-block-content"),l=s.is(":visible"),a={duration:400,start(){k.settingsBlockUpdateState(l,t,r)},always(){s.is(":visible")?e.html(''):e.html('')}};s.stop(),!0===i?s.slideDown(a):!1===i?s.slideUp(a):s.slideToggle(a)},settingsBlockDelete(e){var i=e.closest(".wpforms-panel-content-section");if(!(i.find(".wpforms-builder-settings-block").length<2&&"pdf"!==e.parents(".wpforms-builder-settings-block").data("block-type"))){let o=e.closest(".wpforms-builder-settings-block"),t=o.data("block-type");v.confirm({title:!1,content:wpforms_builder[t+"_delete"],icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){var e=o.data("block-id"),i=o.data("block-type");v.post(wpforms_builder.ajax_url,{action:"wpforms_builder_settings_block_state_remove",nonce:wpforms_builder.nonce,block_id:e,block_type:i,form_id:m.formID}),o.remove(),y.trigger("wpformsSettingsBlockDeleted",[t,e])}},cancel:{text:wpforms_builder.cancel}}})}},settingsBlockUpdateState(e,i,o){v.post(wpforms_builder.ajax_url,{action:"wpforms_builder_settings_block_state_save",state:e?"closed":"opened",form_id:m.formID,block_id:i,block_type:o,nonce:wpforms_builder.nonce})},notificationsUpdateElementsVisibility(){console.warn('WARNING! Function "WPFormsBuilder.notificationsUpdateElementsVisibility()" has been deprecated.')},notificationUpdateStatus(e){var i=e.data("block-id"),i=v(`#wpforms-panel-field-notifications-${i}-enable`),e=e.find(".wpforms-builder-settings-block-status");k.changeStatusButton(e,"0"!==i.val()),i.val()||i.val("1")},notificationChangeStatus(e){var i=e.closest(".wpforms-notification").data("block-id"),i=v(`#wpforms-panel-field-notifications-${i}-enable`),o=e.data("active");k.changeStatusButton(e,!o),i.val(o?"0":"1")},handleStatusButton(e){var i=e.data("connection-id"),o=e.data("active");k.changeStatusButton(e,!o),v("#wpforms-connection-status-"+i).val(o?"0":"1")},changeStatusButton(e,i){e.removeClass("wpforms-badge-green wpforms-badge-silver");var o=e.find(".fa"),t=e.find(".wpforms-status-label");o.removeClass("fa-check fa-times"),i?(e.addClass("wpforms-badge-green"),o.addClass("fa-check"),t.text(wpforms_builder.active),e.attr("title",wpforms_builder.deactivate)):(e.addClass("wpforms-badge-silver"),o.addClass("fa-times"),t.text(wpforms_builder.inactive),e.attr("title",wpforms_builder.activate)),e.data("active",i)},bindUIActionsRevisions(){y.on("wpformsPanelSwitched",function(e,i){"revisions"===i&&(k.updateRevisionsList(),k.updateRevisionPreview())}),y.on("wpformsSaved",function(){"revisions"===wpf.getQueryString("view")&&k.updateRevisionsList()}),y.on("click",".wpforms-panel-content-revisions-link",function(e){e.preventDefault(),k.panelSwitch("revisions")})},updateRevisionsList(){let i=v(".wpforms-panel-revisions-button .badge-exclamation");if(i.length&&v.post(wpforms_builder.ajax_url,{action:"wpforms_mark_panel_viewed",form_id:m.formID,nonce:wpforms_builder.nonce}).done(function(e){e.success?i.remove():wpf.debug(e)}).fail(function(e,i){wpf.debug(e.responseText||i||"")}),y.hasClass("wpforms-revisions-enabled")){let o=v("#wpforms-panel-revisions .wpforms-revisions-content");o.fadeTo(250,.25,function(){v.post(wpforms_builder.ajax_url,{action:"wpforms_get_form_revisions",form_id:m.formID,revision_id:wpf.getQueryString("revision_id"),nonce:wpforms_builder.nonce}).done(function(e){e.success?o.replaceWith(e.data.html):wpf.debug(e)}).fail(function(e,i){wpf.debug(e.responseText||i||""),o.fadeTo(250,1)})})}},updateRevisionPreview(){var e=C.$formPreview.clone();e.find(".wpforms-field-duplicate, .wpforms-field-delete, .wpforms-field-helper, .wpforms-debug").remove().end(),e.find(".wpforms-field-wrap").removeClass("ui-sortable").addClass("ui-sortable-disabled"),e.find(".wpforms-field").removeClass("ui-sortable-handle ui-draggable ui-draggable-handle active").removeAttr("id data-field-id data-field-type").removeData(),e.find(".wpforms-field-submit-button").prop("disabled",!0),C.$revisionPreview.hasClass("has-preview")?C.$revisionPreview.find(".wpforms-preview-wrap").replaceWith(e):C.$revisionPreview.append(e).addClass("has-preview")},confirmSaveRevision(){v.confirm({title:wpforms_builder.heads_up,content:wpforms_builder.revision_update_confirm,icon:"fa fa-exclamation-circle",type:"orange",closeIcon:!1,buttons:{confirm:{text:wpforms_builder.save,btnClass:"btn-confirm",keys:["enter"],action(){y.addClass("wpforms-revision-is-saving"),WPFormsBuilder.formSave(!1).done(k.revisionSavedReload)}},cancel:{text:wpforms_builder.cancel,action(){WPFormsBuilder.setCloseConfirmation(!0)}}}})},revisionSavedReload(){wpf.updateQueryString("view",wpf.getQueryString("view")),wpf.removeQueryParam("revision_id"),a.location.reload()},bindUIActionsSaveExit(){y.on("click","#wpforms-embed",function(e){e.preventDefault(),v(this).hasClass("wpforms-disabled")||v(this).hasClass("wpforms-btn-light-grey-disabled")||WPFormsFormEmbedWizard.openPopup()}),y.on("click","#wpforms-save",function(e){e.preventDefault(),k.formSave(!1)}),y.on("click","#wpforms-exit",function(e){e.preventDefault(),k.formExit()}),y.on("wpformsSaved",function(){wpf.removeQueryParam("newform")})},formSave(s){if(y.hasClass("wpforms-is-revision")&&!y.hasClass("wpforms-revision-is-saving"))k.confirmSaveRevision();else{"undefined"!=typeof tinyMCE&&tinyMCE.triggerSave();var l=WPFormsUtils.triggerEvent(y,"wpformsBeforeSave");if(!l.isDefaultPrevented()){let e=C.$saveButton,i=e.find("i.fa-check"),o=e.find("i.wpforms-loading-spinner"),t=e.find("span"),r=t.text();t.text(wpforms_builder.saving),e.prop("disabled",!0),i.addClass("wpforms-hidden"),o.removeClass("wpforms-hidden");l={action:"wpforms_save_form",data:JSON.stringify(k.serializeAllData(v("#wpforms-builder-form"))),id:m.formID,nonce:wpforms_builder.nonce};return v.post(wpforms_builder.ajax_url,l,function(e){e.success?(wpf.initialSave=!1,setTimeout(()=>{wpf._updateFormState(),y.trigger("wpformsSaved",e.data),!0===s&&(k.isBuilderInPopup()?k.builderInPopupClose("saved"):a.location.href=wpforms_builder.exit_url)},0)):(wpf.debug(e),k.formSaveError(e.data))}).fail(function(e){wpf.debug(e);let i="";403===e.status&&(i=wpforms_builder.error_save_form_forbidden),k.formSaveError(i)}).always(function(){t.text(r),e.prop("disabled",!1),o.addClass("wpforms-hidden"),i.removeClass("wpforms-hidden")})}}},serializeAllData(e){let o=e.serializeArray();return e.find(".wpforms-field-option-layout .wpforms-field-option-row-label_hide input[type=checkbox]").each(function(){var e=v(this),i=e.attr("name"),e=e.is(":checked")?"1":"";e||o.push({name:i,value:e})}),o},formSaveError(e=""){wpf.empty(e)&&(e=wpforms_builder.error_save_form),v.confirm({title:wpforms_builder.heads_up,content:"

        "+e+"

        "+wpforms_builder.error_contact_support+"

        ",icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})},formExit(){k.isBuilderInPopup()&&k.formIsSaved()?k.builderInPopupClose("saved"):k.formIsSaved()?a.location.href=wpforms_builder.exit_url:v.confirm({title:!1,content:wpforms_builder.exit_confirm,icon:"fa fa-exclamation-circle",type:"orange",closeIcon:!0,buttons:{confirm:{text:wpforms_builder.save_exit,btnClass:"btn-confirm",keys:["enter"],action(){k.formSave(!0)}},cancel:{text:wpforms_builder.exit,action(){o=!1,k.isBuilderInPopup()?k.builderInPopupClose("canceled"):a.location.href=wpforms_builder.exit_url}}}})},setCloseConfirmation(e){o=!!e},formIsSaved(){if("object"==typeof wpf.savedFormState&&0!==Object.keys(wpf.savedFormState).length){var e,i,o=wpf.isDebug(),t={},r=wpf._getCurrentFormState();for(e in r)if(r[e]!==wpf.savedFormState[e]){if(!o)return!1;t[e]={old:wpf.savedFormState[e],new:r[e]}}for(i in wpf.savedFormState)if(!(i in r)){if(!o)return!1;t[i]={old:wpf.savedFormState[i],new:void 0}}if(!Object.keys(t).length)return!0;wpf.debug("Form state differences:",t)}return!1},isBuilderInPopup(){return a.self!==a.parent&&"wpforms-builder-iframe"===a.self.frameElement.id},builderInPopupClose(e){var i=a.parent.jQuery(".wpforms-builder-popup"),o=v(".wpforms-center-form-name").text();i.find("#wpforms-builder-iframe").attr("src","about:blank"),i.fadeOut(),i.trigger("wpformsBuilderInPopupClose",[e,m.formID,o])},bindUIActionsGeneral(){y.on("click",".toggle-smart-tag-display",k.smartTagToggle),y.on("click",".smart-tags-list-display a",k.smartTagInsert),y.on("click",".wpforms-panel-fields-group.unfoldable .wpforms-panel-fields-group-title",k.toggleUnfoldableGroup),y.on("click",".wpforms-field-helper-hide ",k.hideFieldHelper),y.on("input",".wpforms-money-input",function(){var e=v(this),i=e.val(),o=e[0].selectionStart,t=e[0].selectionEnd;e.val(i.replace(/[^0-9.,]/g,"")),e[0].setSelectionRange(o,t)}),y.on("focusout",".wpforms-money-input",function(){var e=v(this),i=e.val();if(!i)return i;i=wpf.amountSanitize(i),i=wpf.amountFormat(i);e.val(i)}),y.on("change",".wpforms-panel-field-toggle",function(){var e=v(this);e.prop("disabled")||(e.prop("disabled",!0),k.toggleOptionsGroup(e))}),y.on("click",".wpforms-image-upload-add",function(e){e.preventDefault();let o=v(this),t=o.parent(),r=wpf.initMediaLibrary({title:wpforms_builder.upload_image_title,extensions:wpforms_builder.upload_image_extensions,extensionsError:wpforms_builder.upload_image_extensions_error,buttonText:wpforms_builder.upload_image_button});r.on("select",function(){var e=r.state().get("selection").first().toJSON(),i=t.find(".preview");t.find(".source").val(e.url),i.empty(),i.prepend(''),"hide"===o.data("after-upload")&&o.hide(),y.trigger("wpformsImageUploadAdd",[o,t])}).on("close",function(){r.off("library:selection:add")}),r.open()}),y.on("click",".wpforms-image-upload-remove",function(e){e.preventDefault();e=v(this).parent().parent();e.find(".preview").empty(),e.find(".wpforms-image-upload-add").show(),e.find(".source").val(""),y.trigger("wpformsImageUploadRemove",[v(this),e])}),y.on("blur",'.wpforms-notification .wpforms-panel-field-text input:not([type="search"])',function(){k.validateEmailSmartTags(v(this))}),y.on("blur",".wpforms-notification .wpforms-panel-field-textarea textarea",function(){k.validateEmailSmartTags(v(this))}),y.on("focusout",'.wpforms-notification .wpforms-panel-field.js-wpforms-from-email-validation input:not([type="search"])',k.validateFromEmail),y.on("wpformsPanelSectionSwitch",k.notificationsPanelSectionSwitch),y.on("click","#wpforms-builder-mobile-notice .wpforms-fullscreen-notice-button-primary, #wpforms-builder-mobile-notice .close",function(){a.location.href=wpforms_builder.exit_url}),y.on("click","#wpforms-builder-mobile-notice .wpforms-fullscreen-notice-button-secondary",function(){a.location.href=wpf.updateQueryString("force_desktop_view",1,a.location.href)}),v("#wpforms-builder-license-alert .close").on("click",function(){a.location.href=wpforms_builder.exit_url}),v("#wpforms-builder-license-alert .dismiss").on("click",function(e){e.preventDefault(),v("#wpforms-builder-license-alert").remove(),wpCookies.set("wpforms-builder-license-alert","true",3600)}),y.on("change","#wpforms-panel-field-settings-akismet.wpforms-akismet-disabled",function(){let e=v(this),i=e.data("akismet-status");e.prop("checked")&&v.alert({title:wpforms_builder.heads_up,content:wpforms_builder[i],icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}},onClose(){e.prop("checked",!1)}})}),y.on("wpformsPanelSectionSwitch wpformsPanelSwitched",function(){wpf.reInitShowMoreChoices(v("#wpforms-panel-providers, #wpforms-panel-settings"))})},notificationsPanelSectionSwitch(e,i){"notifications"===i&&v(".wpforms-notification .wpforms-panel-field.js-wpforms-from-email-validation input").trigger("focusout")},isPaymentsEnabled(){let e=!1;return v(k.getPaymentsTogglesSelector()).each(function(){if(v(this).prop("checked"))return!(e=!0)}),e},getPaymentsTogglesSelector(){return`.wpforms-panel-content-section-payment-toggle-one-time input, + .wpforms-panel-content-section-payment-toggle-recurring input, + #wpforms-panel-field-stripe-enable, + #wpforms-panel-field-paypal_standard-enable, + #wpforms-panel-field-authorize_net-enable, + #wpforms-panel-field-square-enable`},toggleOptionsGroup(e){var i=e.attr("name");function o(){e.prop("disabled",!1)}let t="",r=v('.wpforms-panel-field-toggle-body[data-toggle="'+i+'"]');k.toggleProviderActiveIcon(e),0===r.length?o():(i=e.attr("type"),t="checkbox"!==i&&"radio"!==i||e.prop("checked")?e.val():"0",r.each(function(){var e=v(this);e.attr("data-toggle-value").toString()===t.toString()?e.slideDown(150,o):e.slideUp(150,o)}))},toggleProviderActiveIcon(e){var o=e.closest(".wpforms-panel-content-section").data("provider"),t=["wpforms-panel-field-"+o+"-enable-wrap","wpforms-panel-field-"+o+"-enable_one_time-wrap","wpforms-panel-field-"+o+"-enable_recurring-wrap"];if(o&&t.includes(e.attr("id"))){let i=!1;t.forEach(e=>{e=v("#"+e);e.length&&e.find("input").is(":checked")&&(i=!0)}),v(`.wpforms-panel-sidebar-section[data-section=${o}]`).find(".fa-check-circle-o").toggleClass("wpforms-hidden",!i)}},toggleAllOptionGroups(e){(e=e||y||v("#wpforms-builder")||v("body"))&&e.find(".wpforms-panel-field-toggle").each(function(){var e=v(this);e.prop("disabled",!0),k.toggleOptionsGroup(e)})},toggleUnfoldableGroup(e){e.preventDefault();let i=v(e.target),o=i.closest(".wpforms-panel-fields-group"),t=o.find(".wpforms-panel-fields-group-inner"),r="wpforms_fields_group_"+o.data("group");o.hasClass("opened")?(wpCookies.remove(r),t.stop().slideUp(150,function(){o.removeClass("opened")})):(wpCookies.set(r,"true",2592e3),o.addClass("opened"),t.stop().slideDown(150))},hideFieldHelper(e){e.preventDefault(),e.stopPropagation();e=v(".wpforms-field-helper");wpCookies.set("wpforms_field_helper_hide","true",2592e3),e.hide()},smartTagToggle(e){console.warn('WARNING! Function "WPFormsBuilder.smartTagToggle()" has been deprecated.'),e.preventDefault(),C.$focusOutTarget=null;var e=v(this),i=e.closest(".wpforms-panel-field,.wpforms-field-option-row");i.hasClass("smart-tags-toggling")||(i.addClass("smart-tags-toggling"),e.hasClass("smart-tag-showing")?k.removeSmartTagsList(e):k.insertSmartTagsList(e))},removeSmartTagsList(e){console.warn('WARNING! Function "WPFormsBuilder.removeSmartTagsList()" has been deprecated.');let i=e.closest(".wpforms-panel-field,.wpforms-field-option-row"),o=i.find(".smart-tags-list-display");e.find("span").text(wpforms_builder.smart_tags_show),o.slideUp("",function(){o.remove(),e.removeClass("smart-tag-showing"),i.removeClass("smart-tags-toggling")})},insertSmartTagsList(e){console.warn('WARNING! Function "WPFormsBuilder.insertSmartTagsList()" has been deprecated.');let i=e.closest(".wpforms-panel-field,.wpforms-field-option-row"),o=e.closest("label"),t=!0;o.length||(o=i.find("label"),t=!1);var r=k.getSmartTagsList(e,-1!==o.attr("for").indexOf("wpforms-field-option-"));(t?o:e).after(r),e.find("span").text(wpforms_builder.smart_tags_hide),i.find(".smart-tags-list-display").slideDown("",function(){e.addClass("smart-tag-showing"),i.removeClass("smart-tags-toggling")})},getSmartTagsList(e,i){var o;return console.warn('WARNING! Function "WPFormsBuilder.getSmartTagsList()" has been deprecated.'),o='
          ',(o+=k.getSmartTagsListFieldsElements(e))+k.getSmartTagsListOtherElements(e,i)+"
        "},getSmartTagsListFieldsElements(e){console.warn('WARNING! Function "WPFormsBuilder.getSmartTagsListFieldsElements()" has been deprecated.');var i=e.data("type");if(!["fields","all"].includes(i))return"";var o,t=k.getSmartTagsFields(e);if(!t)return'
      • '+wpforms_builder.fields_unavailable+"
      • ";let r="";for(o in r+='
      • '+wpforms_builder.fields_available+"
      • ",t)r+=k.getSmartTagsListFieldsElement(t[o]);return r},getSmartTagsFields(e){console.warn('WARNING! Function "WPFormsBuilder.getSmartTagsFields()" has been deprecated.');var i=e.data("fields"),e=e.data("allow-repeated-fields"),i=i?i.split(","):void 0;return wpf.getFields(i,!0,e)},getSmartTagsListFieldsElement(o){console.warn('WARNING! Function "WPFormsBuilder.getSmartTagsListFieldsElement()" has been deprecated.');let t=o.label?wpf.encodeHTMLEntities(wpf.sanitizeHTML(o.label)):wpforms_builder.field+" #"+o.id,r=`
      • ${t}
      • `;var e=o.additional||[];return 1{var i=e.charAt(0).toUpperCase()+e.slice(1).replace(/(\D)(\d)/g,"$1 $2");r+=`
      • ${t} – ${i}
      • `}),r},getSmartTagsListOtherElements(e,i){console.warn('WARNING! Function "WPFormsBuilder.getSmartTagsListOtherElements()" has been deprecated.');var o,t=e.data("type");let r;if("other"!==t&&"all"!==t)return"";for(o in r='
      • '+wpforms_builder.other+"
      • ",wpforms_builder.smart_tags)i&&wpforms_builder.smart_tags_disabled_for_fields.includes(o)||"confirmations"===e.data("location")&&wpforms_builder.smart_tags_disabled_for_confirmations.includes(o)||(r+='
      • "+wpforms_builder.smart_tags[o]+"
      • ");return r},smartTagInsert(e){console.warn('WARNING! Function "WPFormsBuilder.smartTagInsert()" has been deprecated.'),e.preventDefault();let i=v(this),o=i.closest(".smart-tags-list-display"),t=o.closest(".wpforms-panel-field,.wpforms-field-option-row"),r=t.find(".toggle-smart-tag-display"),s=t.find("input[type=text], textarea"),l=i.data("meta"),a=i.data("additional")?"|"+i.data("additional"):"",n=i.data("type"),d="field"===n?'{field_id="'+l+a+'"}':"{"+l+"}",p;"undefined"!=typeof tinyMCE&&(p=tinyMCE.get(s.prop("id")))&&!p.hasFocus()&&p.focus(!0),p&&!p.isHidden()?p.insertContent(d):(s.insertAtCaret(" "+d+" "),s.val(s.val().trim().replace(" "," ")),s.trigger("focus").trigger("input")),o.slideUp("",function(){o.remove()}),r.find("span").text(wpforms_builder.smart_tags_show),t.find(".toggle-smart-tag-display").removeClass("smart-tag-showing")},validateEmailSmartTags(e){console.warn('WARNING! Function "WPFormsBuilder.validateEmailSmartTags()" has been deprecated.');let i=e.val();i&&(i=i.replace(/{(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))}/g,function(e){return e.slice(1,-1)}),e.val(i))},getEmailFieldSmartTagError(e){var i=/\{field_id="(\d+)"}/g;if(!i.test(e))return null;i.lastIndex=0;i=i.exec(e),e=i?i[1]:null,i=wpf.getField(e);return i&&"email"===i.type?"":wpforms_builder.allow_only_email_fields},validateFromEmail(){var e,i,o;wpf.isRepeatedCall("validateFromEmail")||(e=(i=v(this)).val(),i.data("value")!==e&&(i.data("value",e),i=i.parent(),o="wpforms-panel-field-warning",/[\s,;]/g.test(e.trim())?(i.addClass(o),k.printNotice(wpforms_builder.allow_only_one_email,i)):k.shouldCallAjaxValidation(e,i,o)&&k.ajaxValidation(e,i,o)))},shouldCallAjaxValidation(e,i,o){let t="",r=!0;return""===(t=""===e?wpforms_builder.empty_email_address:"")&&(t=k.getEmailFieldSmartTagError(e),r=null===t),t?(i.addClass(o),k.printNotice(t,i,""===e),!1):!!r||(i.removeClass(o),k.removeNotice(i),!1)},ajaxValidation(e,i,o){e={form_id:m.formID,email:e,nonce:wpforms_builder.nonce,action:"wpforms_builder_notification_from_email_validate"};v.post(wpforms_builder.ajax_url,e,function(e){k.removeNotice(i),e.success?i.removeClass(o):(i.addClass(o),i.append(e.data))}).fail(function(e){console.log(e.responseText)})},disabledFields:{init(){k.disabledFields.initCouponsChoicesJS(),k.disabledFields.initFileUploadChoicesJS()},initCouponsChoicesJS(){"function"!=typeof a.Choices||WPForms.Admin.Builder.Coupons||v(".wpforms-field-option-row-allowed_coupons select:not(.choices__input)").each(function(){var e=v(this),i=new Choices(e.get(0),{shouldSort:!1,removeItemButton:!0,renderChoicesLimit:5,callbackOnInit(){wpf.showMoreButtonForChoices(this.containerOuter.element)}});e.data("choicesjs",i)})},initFileUploadChoicesJS(){"function"!=typeof a.Choices||WPForms.Admin.Builder.FieldFileUpload||v(".wpforms-file-upload-user-roles-select, .wpforms-file-upload-user-names-select").each(function(){new Choices(v(this)[0],{removeItemButton:!0})})}},iconChoices:{cache:{},config:{colorPropertyName:"--wpforms-icon-choices-color"},init(){k.iconChoices.extendJqueryConfirm(),y.on("wpformsBuilderReady",function(e){wpforms_builder.icon_choices.is_active&&!wpforms_builder.icon_choices.is_installed&&(k.iconChoices.openInstallPromptModal(!0),e.preventDefault())}),y.on("change",".wpforms-field-option-row-choices_icons input",k.iconChoices.toggleIconChoices),y.on("change",".wpforms-field-option-row-choices_icons_color .wpforms-color-picker",k.iconChoices.changeIconsColor),y.on("change",".wpforms-field-option-row-choices_icons_style select, .wpforms-field-option-row-choices_icons_size select",function(){var e=v(this).parent().data("field-id"),i=v("#wpforms-field-option-"+e).find(".wpforms-field-option-hidden-type").val();k.fieldChoiceUpdate(i,e)}),y.on("click",".wpforms-field-option-row-choices .choices-list .wpforms-icon-select",k.iconChoices.openIconPickerModal)},toggleIconChoices(){var e,i,o,t=v(this),r=t.is(":checked");r&&!wpforms_builder.icon_choices.is_installed?(k.iconChoices.cache.toggle=t,k.iconChoices.openInstallPromptModal()):(t=t.closest(".wpforms-field-option-row").data("field-id"),o=(e=v("#wpforms-field-option-"+t)).find(`#wpforms-field-option-${t}-choices_images`),i=e.find(`#wpforms-field-option-row-${t}-choices ul`),r&&o.is(":checked")&&o.prop("checked",!1).trigger("change"),e.find(`#wpforms-field-option-row-${t}-dynamic_choices`).toggleClass("wpforms-hidden",r),e.find(`#wpforms-field-option-row-${t}-choices_icons_color`).toggleClass("wpforms-hidden"),e.find(`#wpforms-field-option-row-${t}-choices_icons_size`).toggleClass("wpforms-hidden"),e.find(`#wpforms-field-option-row-${t}-choices_icons_style`).toggleClass("wpforms-hidden"),o=e.find(`#wpforms-field-option-${t}-choices_icons_color`),o=_.isEmpty(o.val())?wpforms_builder.icon_choices.default_color:o.val(),i.prop("style",k.iconChoices.config.colorPropertyName+`: ${o};`),i.toggleClass("show-icons",r),e.find(`#wpforms-field-option-${t}-input_columns`).val(r?"inline":"").trigger("change"),v(`#wpforms-field-option-row-${t}-choices_icons_hide`).toggleClass("wpforms-hidden",!r),k.fieldChoiceUpdate(e.find(".wpforms-field-option-hidden-type").val(),t))},changeIconsColor(){var e=v(this),i=e.parents(".wpforms-field-option-row").data("field-id"),o=v("#wpforms-field-option-"+i),t=o.find(".wpforms-field-option-hidden-type").val(),o=o.find(".wpforms-field-option-row-choices .choices-list"),e=k.getValidColorPickerValue(e);o.prop("style",k.iconChoices.config.colorPropertyName+`: ${e};`),k.fieldChoiceUpdate(t,i)},openInstallPromptModal(e=!1){var i=e?wpforms_builder.icon_choices.strings.reinstall_prompt_content:wpforms_builder.icon_choices.strings.install_prompt_content,i=v.confirm({title:wpforms_builder.heads_up,content:i,icon:"fa fa-info-circle",type:"orange",buttons:{continue:{text:wpforms_builder.continue,btnClass:"btn-confirm",keys:["enter"],action(){return this.setIcon("fa fa-cloud-download"),this.setTitle(wpforms_builder.icon_choices.strings.install_title),this.setContent(wpforms_builder.icon_choices.strings.install_content),v.each(this.buttons,function(e,i){i.hide()}),k.iconChoices.installIconLibrary(),!1}}},onOpen(){!e&&k.iconChoices.cache.toggle&&k.iconChoices.cache.toggle.prop("checked",!1),k.iconChoices.cache.previousModal=this}});e||(i.buttons.cancel={text:wpforms_builder.cancel,keys:["esc"],action(){k.iconChoices.cache.toggle.prop("checked",!1)}})},installIconLibrary(){var e={_wp_http_referer:wpf.updateQueryString("_wp_http_referer",null),nonce:wpforms_builder.nonce,action:"wpforms_icon_choices_install"};v.ajaxSetup({type:"POST",timeout:12e4}),v.post(wpforms_builder.ajax_url,e,function(e){e.success?k.iconChoices.openInstallSuccessModal():k.iconChoices.openInstallErrorModal(e)}).fail(function(e){k.iconChoices.openInstallErrorModal(e)})},openInstallSuccessModal(){v.confirm({title:wpforms_builder.done,content:wpforms_builder.icon_choices.strings.install_success_content,icon:"fa fa-check-circle",type:"green",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){var e;k.iconChoices.cache.toggle&&(k.iconChoices.cache.toggle.prop("checked",!0),e=k.iconChoices.cache.toggle.parents(".wpforms-field-option-row").data("field-id"),(e=y.find(`#wpforms-field-option-${e}-choices_images`)).is(":checked"))&&e.prop("checked",!1),wpforms_builder.exit_url=a.location.href,k.formSave(!0)}}},onOpen(){var e;k.iconChoices.cache.toggle&&(e=k.iconChoices.cache.toggle.parents(".wpforms-field-option-row-choices_icons").data("field-id"),y.find(`#wpforms-field-option-${e}-input_columns`).val("inline")),k.iconChoices.cache.previousModal.close()}})},openInstallErrorModal(e){v.confirm({title:wpforms_builder.uh_oh,content:wpforms_builder.icon_choices.strings.install_error_content,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){k.iconChoices.cache.toggle?k.iconChoices.cache.toggle.prop("checked",!1):k.formSaveError()}}},onOpen(){wpf.debug(e),k.iconChoices.cache.previousModal.close()},onDestroy(){delete k.iconChoices.cache.previousModal,delete k.iconChoices.cache.toggle}})},extendJqueryConfirm(){a.Jconfirm.prototype._updateContentMaxHeight=function(){var e=v(a).height()-(this.$jconfirmBox.outerHeight()-this.$contentPane.outerHeight())-(this.offsetTop+this.offsetBottom),i=this.contentMaxHeight||e;this.$contentPane.css({"max-height":Math.min(i,e)+"px"})}},openIconPickerModal(){var e=v(this);let i={fieldId:e.parents(".wpforms-field-option-row").data("field-id"),choiceId:e.parent().data("key"),selectedIcon:e.find(".source-icon").val(),selectedIconStyle:e.find(".source-icon-style").val()};var e=` + ${wpforms_builder.icon_choices.strings.icon_picker_title} + ${wpforms_builder.icon_choices.strings.icon_picker_description} + + `,o=` +
        +
          +
            +

            +

            `;v.confirm({title:e,titleClass:"wpforms-icon-picker-title",content:o,icon:!1,closeIcon:!0,type:"orange",backgroundDismiss:!0,boxWidth:800,contentMaxHeight:368,smoothContent:!1,buttons:!1,onOpenBefore(){this.$body.addClass("wpforms-icon-picker-jconfirm-box"),this.$contentPane.addClass("wpforms-icon-picker-jconfirm-content-pane")},onContentReady(){let e=this;k.iconChoices.initIconsList(i),e.$title.find(".search").focus(),e.$content.find(".wpforms-icon-picker-icons").on("click","li",function(){k.iconChoices.selectIcon(e,v(this))})}})},initIconsList(o){var e={valueNames:["name"],listClass:"wpforms-icon-picker-icons",page:wpforms_builder.icon_choices.icons_per_page,pagination:{paginationClass:"wpforms-icon-picker-pagination"},item(e){var i=e.icon===o.selectedIcon&&e.style===o.selectedIconStyle?'class="selected"':"";return` +
          • + + ${e.icon} +
          • `},indexAsync:!0};let t=new List("wpforms-icon-picker-icons",e,wpforms_builder.icon_choices.icons);k.iconChoices.infiniteScrollPagination(t),v("#wpforms-icon-picker-search").on("keyup",function(){t.search(v(this).val(),["name"],function(o){for(let e=0,i=t.items.length;ealt
            s")}})},registerTemplates(){"undefined"!=typeof WPForms&&WPForms.Admin.Builder.Templates.add(["wpforms-builder-confirmations-message-field","wpforms-builder-conditional-logic-toggle-field"])},exitBack(){console.warn('WARNING! Function "WPFormsBuilder.exitBack()" has been deprecated.')},onUpdateSelectPlaceholder(e,i){!["select","payment-select"].includes(i.data("field-type"))||!i.hasClass("required")||v(`#wpforms-field-option-${e}-multiple`).prop("checked")||k.dropdownField.helpers.hasDefaults(e)||k.updateSelectPlaceholder(e)},updateSelectPlaceholder(e){e=v(`#wpforms-field-option-${e}-placeholder`);e.val()||e.val(wpforms_builder.select_choice).trigger("input")},maybeUpdateRequiredPlaceholder(e){v(`#wpforms-field-option-${e}-required`).is(":checked")&&k.updateSelectPlaceholder(e)}};return k})(document,window,jQuery);WPFormsBuilder.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/chocolate-choices.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/chocolate-choices.js new file mode 100755 index 00000000..fa426489 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/chocolate-choices.js @@ -0,0 +1,81 @@ +/** + * Chocolate choices' functionality. + * + * @since 1.9.6.1 + */ +// eslint-disable-next-line no-unused-vars +const WPFormsChocolateChoices = { + /** + * Initializes the chocolate choices component. + * + * @since 1.9.6.1 + * + * @param {Object} $grid The grid container for the choices. + * @param {Object} options Object with name and choices properties. + * @param {string} options.name The name attribute for the checkbox inputs. + * @param {Array} options.choices Array of choice objects with label and value properties. + * @param {Array} options.selected Array of selected choice values. + */ + init( $grid, options ) { + const selected = options.selected?.map?.( String ) ?? []; + const $ = jQuery; + /** + * Generate a random ID string. + * The ID is based on current timestamp and converted to a base-16 string. + * + * @since 1.9.6.1 + * + * @return {string} A hexadecimal string representation of the current timestamp. + */ + const getRandomId = () => new Date().getTime().toString( 16 ); + + /** + * Creates a single choice item. + * + * @since 1.9.6.1 + * + * @param {Object|string|number} itemData The choice data object with label and value. + * @param {number} index The index of the choice item. + * + * @return {jQuery} The created choice item element. + */ + const createChoiceItem = ( itemData, index ) => { + const id = `choice-${ index }-${ getRandomId() }`; + const itemValue = String( typeof itemData === 'object' ? itemData.value : itemData ); + + // Create the container div. + const $itemDiv = $( '
            ', { + class: 'choice-item', + } ); + + // Create the checkbox input. + const $checkbox = $( '', { + type: 'checkbox', + id, + value: itemValue, + checked: selected.includes( itemValue ), + name: options.name.replace( '{index}', index ), + } ); + + // Create the label. + const $label = $( '
            ",{class:"choice-item"}),i=o("",{type:"checkbox",id:c,value:i,checked:l.includes(i),name:n.name.replace("{index}",t)}),t=o("
            ' ); + + vars.fieldType = $this.data( 'field-type' ); + + return $el.html( $this.html() ); + }, + + start( e, ui ) { + const event = WPFormsUtils.triggerEvent( + el.$builder, + 'wpformsFieldAddDragStart', + [ vars.fieldType, ui ] + ); + + // Allow callbacks on `wpformsFieldAddDragStart` to cancel dragging the field + // by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return false; + } + }, + + stop( e, ui ) { + const event = WPFormsUtils.triggerEvent( + el.$builder, + 'wpformsFieldAddDragStop', + [ vars.fieldType, ui ] + ); + + // Allow callbacks on `wpformsFieldAddDragStop` to cancel dragging the field + // by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return false; + } + }, + } ); + }, + + /** + * Revert moving the field to the column. + * + * @since 1.7.7 + * + * @param {jQuery} $field Field object. + */ + revertMoveFieldToColumn( $field ) { + const isNewField = $field.data( 'field-id' ) === undefined; + + if ( isNewField ) { + // Remove the field. + $field.remove(); + + return; + } + + // Restore existing field on the previous position. + $field = $field.detach(); + + const $fieldInStartPosition = vars.$sortableStart + .find( '> .wpforms-field' ) + .eq( vars.startPosition ); + + $field + .removeClass( 'wpforms-field-dragging' ) + .removeClass( 'wpforms-field-drag-over' ) + .attr( 'style', '' ); + + if ( $fieldInStartPosition.length ) { + $fieldInStartPosition.before( $field ); + + return; + } + + vars.$sortableStart.append( $field ); + }, + }; + + /** + * Layout field functions holder. + * + * @since 1.7.7 + * + * @type {Object} + */ + fieldLayout = { + + /** + * Position field in the column inside the Layout Field. + * + * @since 1.7.7 + * + * @param {number} fieldId Field ID. + * @param {number} position The new position of the field inside the column. + * @param {jQuery} $sortable Sortable column container. + */ + positionFieldInColumn( fieldId, position, $sortable ) { + if ( ! WPForms.Admin.Builder.FieldLayout ) { + return; + } + + WPForms.Admin.Builder.FieldLayout.positionFieldInColumn( fieldId, position, $sortable ); + }, + + /** + * Receive field to column inside the Layout Field. + * + * @since 1.7.7 + * + * @param {number} fieldId Field ID. + * @param {number} position Field position inside the column. + * @param {jQuery} $sortable Sortable column container. + */ + receiveFieldToColumn( fieldId, position, $sortable ) { + if ( ! WPForms.Admin.Builder.FieldLayout ) { + return; + } + + WPForms.Admin.Builder.FieldLayout.receiveFieldToColumn( fieldId, position, $sortable ); + }, + + /** + * Update field options according to the position of the field. + * Event `wpformsFieldOptionTabToggle` handler. + * + * @since 1.7.7 + * + * @param {Event} e Event. + * @param {number} fieldId Field id. + */ + fieldOptionsUpdate( e, fieldId ) { + if ( ! WPForms.Admin.Builder.FieldLayout ) { + return; + } + + WPForms.Admin.Builder.FieldLayout.fieldOptionsUpdate( e, fieldId ); + }, + + /** + * Reorder fields options of the fields in columns. + * It is not critical, but it's better to keep some order in the `fields` data array. + * + * @since 1.7.7 + * + * @param {jQuery} $layoutField Layout field object. + */ + reorderLayoutFieldsOptions( $layoutField ) { + if ( ! WPForms.Admin.Builder.FieldLayout ) { + return; + } + + WPForms.Admin.Builder.FieldLayout.reorderLayoutFieldsOptions( $layoutField ); + }, + + /** + * Whether the field type is allowed to be in column. + * + * @since 1.7.7 + * + * @param {string} fieldType Field type to check. + * @param {jQuery} $targetColumn Target column element. + * + * @return {boolean} True if allowed. + */ + isFieldAllowedInColum( fieldType, $targetColumn ) { + if ( ! WPForms.Admin.Builder.FieldLayout ) { + return true; + } + + const isAllowed = WPForms.Admin.Builder.FieldLayout.isFieldAllowedInColum( fieldType, $targetColumn ); + + /** + * Allows developers to determine whether the field is allowed to be dragged in column. + * + * @since 1.8.9 + * + * @param {boolean} isAllowed Whether the field is allowed to be placed in the column. + * @param {string} fieldType Field type. + * @param {jQuery} $targetColumn Target column element. + * + * @return {boolean} True if allowed. + */ + return wp.hooks.applyFilters( 'wpforms.LayoutField.isFieldAllowedDragInColumn', isAllowed, fieldType, $targetColumn ); + }, + + /** + * Determine whether the field type is a layout-based field. + * + * @since 1.8.9 + * + * @param {string} fieldType Field type to check. + * + * @return {boolean} True if it is the Layout-based field. + */ + isLayoutBasedField( fieldType ) { + if ( ! WPForms.Admin.Builder.FieldLayout ) { + return false; + } + + return WPForms.Admin.Builder.FieldLayout.isLayoutBasedField( fieldType ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPForms.Admin.Builder.DragFields.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/drag-fields.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/drag-fields.min.js new file mode 100755 index 00000000..cad73641 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/drag-fields.min.js @@ -0,0 +1 @@ +var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.DragFields=WPForms.Admin.Builder.DragFields||((e,g,w)=>{let c={},b={},F,v={init(){w(v.ready)},ready(){v.setup(),v.initSortableFields(),v.events()},setup(){c={$builder:w("#wpforms-builder"),$sortableFieldsWrap:w("#wpforms-panel-fields .wpforms-field-wrap"),$addFieldsButtons:w(".wpforms-add-fields-button").not(".not-draggable").not(".warning-modal").not(".education-modal")}},events(){c.$builder.on("wpformsFieldDragToggle",v.fieldDragToggleEvent).on("wpformsFieldAdd",function(e,r,l){"layout"===l&&setTimeout(function(){w("#wpforms-field-"+r).find(".wpforms-layout-column").each(function(){v.initSortableHandler(w(this)),w(this).sortable("enable")})},100)}),w(e).on("wpformsLayoutPresetChanged",v.layoutPresetChanged)},disableDragAndDrop(){c.$sortableFieldsWrap.trigger("initSortableImmediately"),c.$addFieldsButtons.filter(".ui-draggable").draggable("disable"),c.$sortableFieldsWrap.sortable("disable"),c.$sortableFieldsWrap.find(".wpforms-layout-column.ui-sortable").data("ui-sortable")&&c.$sortableFieldsWrap.find(".wpforms-layout-column.ui-sortable").sortable("disable")},enableDragAndDrop(){c.$addFieldsButtons.filter(".ui-draggable").draggable("enable"),c.$sortableFieldsWrap.sortable("enable"),c.$sortableFieldsWrap.find(".wpforms-layout-column.ui-sortable").sortable("enable")},fieldDragDisable(e,i=!0){if(e.hasClass("ui-draggable-disabled"))e.draggable("enable");else{let l;e.draggable({revert:!0,axis:"y",delay:100,opacity:1,cursor:"move",start(e,r){l=r.position.top},drag(e,r){if(15 .wpforms-field:not(.wpforms-field-stick):not(.no-fields-preview)",connectWith:".wpforms-field-wrap, .wpforms-layout-column",delay:100,opacity:1,cursor:"move",cancel:".wpforms-field-not-draggable",placeholder:"wpforms-field-drag-placeholder",appendTo:"#wpforms-panel-fields",zindex:1e4,tolerance:"pointer",distance:1,start(e,r){s=r.item.data("field-id"),t=r.item.data("field-type"),n=void 0===s,f=w("#wpforms-field-option-"+s),b.fieldReceived=!1,b.fieldRejected=!1,b.$sortableStart=a,b.startPosition=r.item.first().index(),c.$builder.trigger("wpformsFieldDragStart",[s])},beforeStop(e,r){!b.glitchChange||F.isFieldAllowedInColum(t,r.item.first().parent())||(b.fieldRejected=!0)},stop(e,r){var l=r.item.first(),i=l.parent();l.hasClass("wpforms-field-layout")&&l.find(".wpforms-layout-column").each(function(){v.initSortableHandler(w(this)),w(this).sortable("enable")}),i.hasClass("wpforms-field-wrap")&&g.wpformsLastReceive&&g.wpformsLastReceive.isColumn&&!l.hasClass("wpforms-field-layout")&&!l.hasClass("wpforms-field-repeater")&&(l.detach(),g.wpformsLastReceive.sortable.append(l),b.fieldRejected=!0,g.wpformsLastReceive=null,g.wpformsLastReceiveForMainWrap=null),r.placeholder.removeClass("wpforms-field-drag-not-allowed"),l.removeClass("wpforms-field-drag-not-allowed"),b.fieldRejected?(i=n?a:l.parent(),v.revertMoveFieldToColumn(l),c.$builder.trigger("wpformsFieldMoveRejected",[l,r,i])):(p=l.prev(".wpforms-field, .wpforms-alert").data("field-id"),0<(m=w("#wpforms-field-option-"+p)).length?m.after(f):o.prepend(f),!n&&l.closest(".wpforms-layout-column").is(a)&&F.positionFieldInColumn(s,l.index()-1,a),i=l.closest(".wpforms-field-layout, .wpforms-field-repeater"),F.fieldOptionsUpdate(null,s),F.reorderLayoutFieldsOptions(i),n||l.removeClass("wpforms-field-dragging").removeClass("wpforms-field-drag-over"),l.attr("style",""),c.$builder.trigger("wpformsFieldMove",r),b.fieldReceived=!1)},over(e,r){var r=r.item.first(),e=w(e.target),l=e.find(".wpforms-field-drag-placeholder"),i=e.hasClass("wpforms-layout-column"),o={width:e.outerWidth(),height:r.outerHeight()};let a=i?" wpforms-field-drag-to-column":"";i&&(d=e.attr("class").match(/wpforms-layout-column-(\d+)/)[1],a=(a+=" wpforms-field-drag-to-column-"+d)+" wpforms-field-drag-to-"+e.parents(".wpforms-field").data("field-type")),s=r.data("field-id"),t=r.data("field-type")||b.fieldType,n=void 0===s,r.addClass("wpforms-field-dragging"+a),i&&F.isLayoutBasedField(t)||r.css({width:i?o.width-5:o.width,height:"auto"});var d=i?90:o.height;l.removeClass("wpforms-field-drag-not-allowed").css({height:n?d+18:o.height}),i&&!F.isFieldAllowedInColum(t,e)&&(l.addClass("wpforms-field-drag-not-allowed"),r.addClass("wpforms-field-drag-not-allowed")),c.$builder.trigger("wpformsFieldDragOver",[s,e]),n&&r.addClass("wpforms-field-drag-over").removeClass("wpforms-field-drag-out")},out(e,r){var l=r.item.first(),i=void 0===l.data("field-id");l.removeClass("wpforms-field-drag-not-allowed").removeClass("wpforms-field-drag-to-repeater").removeClass("wpforms-field-drag-to-layout").removeClass(v.getDragColumnClasses(l.attr("class"))),b.fieldReceived?l.attr("style",""):i?l.addClass("wpforms-field-drag-out").removeClass("wpforms-field-drag-over"):w(r.sender).closest(".wpforms-field-layout, .wpforms-field-repeater").removeClass("wpforms-field-child-hovered")},receive(e,r){var l=w(r.helper||r.item),i=a.hasClass("wpforms-layout-column"),o=a.hasClass("wpforms-field-wrap");g.wpformsLastReceive={isColumn:i,isMainWrap:o,sender:r.sender?w(r.sender).attr("class"):null,sortable:a,time:(new Date).getTime()},i&&g.wpformsLastReceiveForMainWrap&&(new Date).getTime()-g.wpformsLastReceiveForMainWrap.time<100?(b.fieldRejected=!0,g.wpformsLastReceiveForMainWrap=null,g.wpformsLastReceive=null):(o&&(g.wpformsLastReceiveForMainWrap=g.wpformsLastReceive),s=l.data("field-id"),t=l.data("field-type")||b.fieldType,o=void 0===s,i&&!F.isFieldAllowedInColum(t,a)?b.fieldRejected=!0:(b.fieldReceived=!0,l.removeClass("wpforms-field-drag-over"),o?(o=a.data("ui-sortable")?.currentItem?.index()||0,l.addClass("wpforms-field-drag-over wpforms-field-drag-pending").removeClass("wpforms-field-drag-out").append(WPFormsBuilder.settings.spinnerInline).css("width","100%"),c.$builder.find(".no-fields-preview").remove(),WPFormsBuilder.fieldAdd(b.fieldType,{position:i?o-1:o,placeholder:l,$sortable:a}),b.fieldType=void 0):F.receiveFieldToColumn(s,r.item.index()-1,l.parent())))},change(e,r){r=r.placeholder.parent(),e=w(e.target);b.glitchChange=!1,!a.is(r)&&a.hasClass("wpforms-field-wrap")&&r.hasClass("wpforms-layout-column")&&(b.glitchChange=!0),c.$builder.trigger("wpformsFieldDragChange",[s,e])},sort(r){if(!u){var r=r.clientY,l=d.offset(),i=d.height(),o=l.top+i;let e;if(r>l.top&&r');return b.fieldType=e.data("field-type"),r.html(e.html())},start(e,r){if(WPFormsUtils.triggerEvent(c.$builder,"wpformsFieldAddDragStart",[b.fieldType,r]).isDefaultPrevented())return!1},stop(e,r){if(WPFormsUtils.triggerEvent(c.$builder,"wpformsFieldAddDragStop",[b.fieldType,r]).isDefaultPrevented())return!1}})},revertMoveFieldToColumn(e){var r;void 0===e.data("field-id")?e.remove():(e=e.detach(),r=b.$sortableStart.find("> .wpforms-field").eq(b.startPosition),e.removeClass("wpforms-field-dragging").removeClass("wpforms-field-drag-over").attr("style",""),r.length?r.before(e):b.$sortableStart.append(e))}};return F={positionFieldInColumn(e,r,l){WPForms.Admin.Builder.FieldLayout&&WPForms.Admin.Builder.FieldLayout.positionFieldInColumn(e,r,l)},receiveFieldToColumn(e,r,l){WPForms.Admin.Builder.FieldLayout&&WPForms.Admin.Builder.FieldLayout.receiveFieldToColumn(e,r,l)},fieldOptionsUpdate(e,r){WPForms.Admin.Builder.FieldLayout&&WPForms.Admin.Builder.FieldLayout.fieldOptionsUpdate(e,r)},reorderLayoutFieldsOptions(e){WPForms.Admin.Builder.FieldLayout&&WPForms.Admin.Builder.FieldLayout.reorderLayoutFieldsOptions(e)},isFieldAllowedInColum(e,r){var l;return!WPForms.Admin.Builder.FieldLayout||(l=WPForms.Admin.Builder.FieldLayout.isFieldAllowedInColum(e,r),wp.hooks.applyFilters("wpforms.LayoutField.isFieldAllowedDragInColumn",l,e,r))},isLayoutBasedField(e){return!!WPForms.Admin.Builder.FieldLayout&&WPForms.Admin.Builder.FieldLayout.isLayoutBasedField(e)}},v})(document,window,jQuery),WPForms.Admin.Builder.DragFields.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.js new file mode 100755 index 00000000..dc533744 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.js @@ -0,0 +1,389 @@ +/* global List, wpforms_builder */ +/** + * WPForms Builder Dropdown List module. + * + * @since 1.8.4 + */ + +/* + Usage: + + dropdownList = WPForms.Admin.Builder.DropdownList.init( { + class: 'insert-field-dropdown', // Additional CSS class. + title: 'Dropdown Title', // Dropdown title. + list: [ // Items list. + { value: '1', text: 'Item 1' }, + { value: '2', text: 'Item 2' }, + { value: '3', text: 'Item 3' }, + ], + container: $( '.holder-container' ), // Holder container. Optional. + scrollableContainer: $( '.scrollable-container' ), // Scrollable container. Optional. + search: { + enabled: false, // Enable search. Optional. + searchBy : [], // Search by fields. + placeholder: 'Search', // Search input placeholder. + noResultsText: 'Sorry, no results found', // No results text. + }, + button: $( '.button' ), // Button. + buttonDistance: 21, // Distance from dropdown to the button. + noLeftOffset: false, // Disable left offset for the dropdown. + itemFormat( item ) { // Item element renderer. Optional. + return `${ item.text }`; + }, + onSelect( event, value, text, $item, instance ) { // On select event handler. + console.log( 'Item selected:', text ); + instance.close(); + $button.removeClass( 'active' ); + }, + } ); +*/ + +// noinspection ES6ConvertVarToLetConst +var WPForms = window.WPForms || {}; // eslint-disable-line no-var + +WPForms.Admin = WPForms.Admin || {}; +WPForms.Admin.Builder = WPForms.Admin.Builder || {}; + +WPForms.Admin.Builder.DropdownList = WPForms.Admin.Builder.DropdownList || ( function( document, window, $ ) { + /** + * DropdownList object constructor. + * + * @since 1.8.4 + * + * @type {Object} + */ + function DropdownList( options ) { // eslint-disable-line max-lines-per-function + const self = this; + + /** + * Default options. + * + * @since 1.8.4 + * + * @type {Object} + */ + const defaultOptions = { + class: '', + title: '', + list: [], + container: null, + scrollableContainer: null, + search: { + enabled: false, + searchBy : [], + placeholder: wpforms_builder.search, + noResultsText: wpforms_builder.no_results_found, + }, + button: null, + buttonDistance: 10, + noLeftOffset: false, + onSelect: null, + itemFormat( item ) { + return item.text; + }, + }; + + /** + * Options. + * + * @since 1.8.4 + * + * @type {jQuery} + */ + self.options = $.extend( defaultOptions, options ); + + /** + * Main dropdown container. + * + * @since 1.8.4 + * + * @type {jQuery} + */ + self.$el = null; + + /** + * Form builder container. + * + * @since 1.8.4 + * + * @type {jQuery} + */ + self.$builder = $( '#wpforms-builder' ); + + /** + * List.js instance. + * + * @since 1.9.5 + * + * @type {Object} + */ + self.searchItems = null; + + /** + * Close the dropdown. + * + * @since 1.8.4 + */ + self.close = function() { + self.$el.addClass( 'closed' ); + + // Clear search input. + if ( self.options.search.enabled ) { + self.clearSearch(); + } + }; + + /** + * Open the dropdown. + * + * @since 1.8.4 + */ + self.open = function() { + self.$el.removeClass( 'closed open-down' ); + self.setPosition(); + + // Close dropdown on click outside. + self.$builder.on( 'click.DropdownList', function( e ) { + const $target = $( e.target ); + const excludedSelectors = '.button-insert-field, .wpforms-smart-tags-enabled, .wpforms-show-smart-tags, .mce-ico'; + + if ( $target.closest( self.$el ).length || $target.is( excludedSelectors ) ) { + return; + } + + self.$builder.off( 'click.DropdownList' ); + + const $button = $( self.options.button ); + + if ( $button.hasClass( 'active' ) ) { + $button.trigger( 'click' ); + } + } ); + }; + + /** + * Generate the dropdown HTML. + * + * @since 1.8.4 + * + * @return {string} HTML. + */ + self.generateHtml = function() { + const list = self.options.list; + + if ( ! list || list.length === 0 ) { + return ''; + } + + const itemFormat = typeof self.options.itemFormat === 'function' ? self.options.itemFormat : defaultOptions.itemFormat; + + // Generate HTML list items. + const items = list.map( ( item ) => `
          • ${ itemFormat( item ) }
          • ` ); + + // Generate search HTML if enabled. + const searchHtml = self.options.search.enabled + ? `
            + + +
            ` + : ''; + + const listClass = self.options.search.enabled ? 'list' : ''; + + return `
            +
            ${ self.options.title }
            + ${ searchHtml } +
              ${ items.join( '' ) }
            +
            ${ self.options.search.noResultsText }
            +
            `; + }; + + /** + * Attach dropdown to DOM. + * + * @since 1.8.4 + */ + self.attach = function() { + const html = self.generateHtml(); + + // Remove old dropdown. + if ( self.$el && self.$el.length ) { + self.$el.remove(); + } + + // Create jQuery objects. + self.$el = $( html ); + self.$button = $( self.options.button ); + self.$container = self.options.container ? $( self.options.container ) : self.$button.parent(); + self.$scrollableContainer = self.options.scrollableContainer ? $( self.options.scrollableContainer ) : null; + + // Init List.js if search is enabled. + if ( self.options.search.enabled ) { + self.searchItems = new List( self.$el[ 0 ], { + valueNames: self.options.search.searchBy, + } ); + } + + // Add the dropdown to the container. + self.$container.append( self.$el ); + + self.setPosition(); + }; + + /** + * Set dropdown position. + * + * @since 1.8.4 + */ + self.setPosition = function() { + // Calculate position. + const buttonOffset = self.$button.offset(), + containerOffset = self.$container.offset(), + containerPosition = self.$container.position(), + dropdownHeight = self.$el.height(), + scrollTop = self.$scrollableContainer ? self.$scrollableContainer.scrollTop() : 0; + + let top = buttonOffset.top - containerOffset.top - dropdownHeight - self.options.buttonDistance; + + // In the case of the dropdown doesn't fit into the scrollable container to top, + // it is necessary to open the dropdown to the bottom. + if ( scrollTop + containerPosition.top - dropdownHeight < 0 ) { + top = buttonOffset.top - containerOffset.top + self.$button.height() + self.options.buttonDistance - 11; + self.$el.addClass( 'open-down' ); + } + + self.$el.css( 'top', top ); + + // If noLeftOffset is set, do not set `left` positioning value. + if ( self.options.noLeftOffset ) { + return; + } + + // The dropdown is outside the field options, it is necessary to set `left` positioning value. + if ( self.$container.closest( '.wpforms-field-option' ).length === 0 ) { + self.$el.css( 'left', buttonOffset.left - containerOffset.left ); + } + }; + + /** + * Events. + * + * @since 1.8.4 + */ + self.events = function() { + // Click (select) the item. + self.$el.find( 'li' ).off() + .on( 'click', function( event ) { + // Bail if callback is not a function. + if ( typeof self.options.onSelect !== 'function' ) { + return; + } + + const $item = $( this ); + + // Clear search input. + if ( self.options.search.enabled ) { + self.clearSearch(); + } + + // Trigger callback. + self.options.onSelect( event, $item.data( 'value' ), $item.text(), $item, self ); + } ); + + // Search. + if ( self.options.search.enabled ) { + self.$el.find( 'input[type="search"]' ).on( 'keyup search', self.search ); + self.$el.find( '.wpforms-builder-dropdown-list-search-close' ).on( 'click', self.clearSearch ); + } + }; + + /** + * Initialize. + * + * @since 1.8.4 + * + * @param {Array} list List of items. + */ + self.init = function( list = null ) { + self.options.list = list ? list : self.options.list; + + self.attach(); + self.events(); + + self.$button.data( 'dropdown-list', self ); + }; + + /** + * Destroy. + * + * @since 1.8.4 + */ + self.destroy = function() { + self.$button.data( 'dropdown-list', null ); + self.$el.remove(); + }; + + /** + * Search. + * + * @since 1.9.5 + * @param {Object } event Event. + */ + self.search = function( event ) { + const searchTerm = event.target.value.toLowerCase(); + const $noResults = self.$el.find( '.wpforms-no-results' ); + + // Show/hide close button. + if ( searchTerm !== '' ) { + self.$el.find( '.wpforms-builder-dropdown-list-search-close' ).addClass( 'active' ); + } + + // Search. + self.searchItems.search( searchTerm ); + + // Show/hide no result message. + $noResults.toggle( self.searchItems.visibleItems.length === 0 ); + }; + + /** + * Clear search input. + * + * @since 1.9.5 + */ + self.clearSearch = function() { + // Clear search input. + self.$el.find( 'input[type="search"]' ).val( '' ); + self.$el.find( '.wpforms-no-results' ).hide(); + self.$el.find( '.wpforms-builder-dropdown-list-search-close' ).removeClass( 'active' ); + + // Clear search results. + self.searchItems.search(); + }; + + // Initialize. + self.init(); + } + + /** + * Public functions and properties. + * + * @since 1.8.4 + * + * @type {Object} + */ + return { + + /** + * Start the engine. DOM is not ready yet, use only to init something. + * + * @since 1.8.4 + * + * @param {Object} options Options. + * + * @return {Object} DropdownList instance. + */ + init( options ) { + return new DropdownList( options ); + }, + }; +}( document, window, jQuery ) ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.min.js new file mode 100755 index 00000000..69b19351 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/dropdown-list.min.js @@ -0,0 +1,9 @@ +var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.DropdownList=WPForms.Admin.Builder.DropdownList||(t=>{function o(e){let i=this,s={class:"",title:"",list:[],container:null,scrollableContainer:null,search:{enabled:!1,searchBy:[],placeholder:wpforms_builder.search,noResultsText:wpforms_builder.no_results_found},button:null,buttonDistance:10,noLeftOffset:!1,onSelect:null,itemFormat(e){return e.text}};i.options=t.extend(s,e),i.$el=null,i.$builder=t("#wpforms-builder"),i.searchItems=null,i.close=function(){i.$el.addClass("closed"),i.options.search.enabled&&i.clearSearch()},i.open=function(){i.$el.removeClass("closed open-down"),i.setPosition(),i.$builder.on("click.DropdownList",function(e){var e=t(e.target);e.closest(i.$el).length||e.is(".button-insert-field, .wpforms-smart-tags-enabled, .wpforms-show-smart-tags, .mce-ico")||(i.$builder.off("click.DropdownList"),(e=t(i.options.button)).hasClass("active")&&e.trigger("click"))})},i.generateHtml=function(){var e=i.options.list;if(!e||0===e.length)return"";let o=("function"==typeof i.options.itemFormat?i.options:s).itemFormat;var e=e.map(e=>`
          • ${o(e)}
          • `),t=i.options.search.enabled?`
            + + +
            `:"",n=i.options.search.enabled?"list":"";return`
            +
            ${i.options.title}
            + ${t} +
              ${e.join("")}
            +
            ${i.options.search.noResultsText}
            +
            `},i.attach=function(){var e=i.generateHtml();i.$el&&i.$el.length&&i.$el.remove(),i.$el=t(e),i.$button=t(i.options.button),i.$container=i.options.container?t(i.options.container):i.$button.parent(),i.$scrollableContainer=i.options.scrollableContainer?t(i.options.scrollableContainer):null,i.options.search.enabled&&(i.searchItems=new List(i.$el[0],{valueNames:i.options.search.searchBy})),i.$container.append(i.$el),i.setPosition()},i.setPosition=function(){var e=i.$button.offset(),o=i.$container.offset(),t=i.$container.position(),n=i.$el.height(),s=i.$scrollableContainer?i.$scrollableContainer.scrollTop():0;let l=e.top-o.top-n-i.options.buttonDistance;s+t.top-n<0&&(l=e.top-o.top+i.$button.height()+i.options.buttonDistance-11,i.$el.addClass("open-down")),i.$el.css("top",l),i.options.noLeftOffset||0===i.$container.closest(".wpforms-field-option").length&&i.$el.css("left",e.left-o.left)},i.events=function(){i.$el.find("li").off().on("click",function(e){var o;"function"==typeof i.options.onSelect&&(o=t(this),i.options.search.enabled&&i.clearSearch(),i.options.onSelect(e,o.data("value"),o.text(),o,i))}),i.options.search.enabled&&(i.$el.find('input[type="search"]').on("keyup search",i.search),i.$el.find(".wpforms-builder-dropdown-list-search-close").on("click",i.clearSearch))},i.init=function(e=null){i.options.list=e||i.options.list,i.attach(),i.events(),i.$button.data("dropdown-list",i)},i.destroy=function(){i.$button.data("dropdown-list",null),i.$el.remove()},i.search=function(e){var e=e.target.value.toLowerCase(),o=i.$el.find(".wpforms-no-results");""!==e&&i.$el.find(".wpforms-builder-dropdown-list-search-close").addClass("active"),i.searchItems.search(e),o.toggle(0===i.searchItems.visibleItems.length)},i.clearSearch=function(){i.$el.find('input[type="search"]').val(""),i.$el.find(".wpforms-no-results").hide(),i.$el.find(".wpforms-builder-dropdown-list-search-close").removeClass("active"),i.searchItems.search()},i.init()}return{init(e){return new o(e)}}})((document,window,jQuery)); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.js new file mode 100755 index 00000000..e044c8c7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.js @@ -0,0 +1,217 @@ +/* eslint-disable camelcase */ +/* global wpforms_builder_email_template */ + +// noinspection ES6ConvertVarToLetConst +/** + * Script for manipulating DOM events in the "Builder" settings page. + * This script will be accessible in the "WPForms" → "Builder" → "Notifications" tab/page. + * + * @since 1.8.5 + */ +// eslint-disable-next-line no-var +var WPFormsBuilderEmailTemplate = window.WPFormsBuilderEmailTemplate || ( function( document, window, $, l10n ) { + /** + * Elements holder. + * + * @since 1.8.5 + * + * @type {Object} + */ + const el = {}; + + /** + * Runtime variables. + * + * @since 1.8.5 + * + * @type {Object} + */ + const vars = { + /** + * Modal instance. + * + * @since 1.8.5 + */ + modal: null, + + /** + * Generic CSS class names for applying visual changes. + * + * @since 1.8.5 + */ + classNames: { + modalBox: 'wpforms-modal-content-box', + modalOpen: 'wpforms-email-template-modal-open', + }, + }; + + /** + * Public functions and properties. + * + * @since 1.8.5 + */ + const app = { + + /** + * Start the engine. + * + * @since 1.8.5 + */ + init() { + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 1.8.5 + */ + ready() { + app.setup(); + app.bindEvents(); + }, + + /** + * Setup. Prepare some variables. + * + * @since 1.8.5 + */ + setup() { + // Cache DOM elements. + el.$document = $( document ); + el.$body = $( 'body' ); + }, + + /** + * Bind events. + * + * @since 1.8.5 + */ + bindEvents() { + el.$document + .on( 'change', '.wpforms-email-template-modal-content input[type="radio"]', app.handleOnChangeTemplate ) + .on( 'click', '.wpforms-all-email-template-modal', app.handleOnOpenModal ); + }, + + /** + * Handle the "change" event for the template radio buttons. + * This function updates the select field based on the selected radio button. + * + * @since 1.8.5 + * + * @param {Object} event The DOM event that triggered the function. + */ + handleOnChangeTemplate( event ) { + // Prevent the default action, which is to handle the change event. + event.preventDefault(); + + // Extract the ID of the field from the element. + const id = app.getIdFromElm( $( this ) ); + + // Get the corresponding select field. + const $field = $( `#wpforms-panel-field-notifications-${ id }-template` ); + + // If the select field doesn't exist, no further action is needed. + if ( ! $field.length ) { + return; + } + + // If the modal doesn't exist, no further action is needed. + if ( ! vars.modal ) { + return; + } + + // Get the value of the radio button that triggered the change. + const value = $( this ).val(); + + // Update the select field with the selected value and trigger the change event. + $field.val( value ).trigger( 'change' ); + + // Close the modal. + vars.modal.close(); + }, + + /** + * Handle the "click" event for opening the modal. + * This will open the modal with the available templates. + * + * @since 1.8.5 + */ + handleOnOpenModal() { + // Get the email template modal template. + const template = wp.template( 'wpforms-email-template-modal' ); + + // If the template doesn't exist, exit the function. + if ( ! template.length ) { + return; + } + + // Find the closest wrapper and select element. + const $wrapper = $( this ).closest( '.wpforms-panel-field-email-template-wrap' ); + const $select = $wrapper.find( 'select' ); + + // Get the selected value from the select element and its ID. + const selected = $select.val() || ''; + const id = app.getIdFromElm( $select ); + + // Extract relevant data from l10n. + const { templates, is_pro } = l10n; + + // Prepare the data to be passed to the template. + const data = { templates, selected, is_pro, id }; + + // Generate the modal's content using the template and data. + const content = template( data ); + + // Open the modal. + vars.modal = $.confirm( { + content, + title: '', + boxWidth: 800, + contentMaxHeight: 'none', + backgroundDismiss: true, + smoothContent: false, + closeIcon: true, + buttons: false, + // Callback function before the modal opens. + onOpenBefore() { + this.$body.addClass( vars.classNames.modalBox ); + el.$body.addClass( vars.classNames.modalOpen ); + }, + // Callback function when the modal is closed. + onClose() { + el.$body.removeClass( vars.classNames.modalOpen ); + }, + } ); + }, + + /** + * Get the ID from the element. + * This is a helper function for extracting the numeric ID from an element's ID attribute. + * + * @since 1.8.5 + * + * @param {Object} $elm jQuery object representing the element. + * + * @return {number} The numeric ID extracted from the element's ID attribute. + */ + getIdFromElm( $elm ) { + // Get the ID attribute from the element. + const id = $elm.attr( 'id' ); + + // If no ID attribute is found, return 0. + if ( ! id ) { + return 0; + } + + // Extract and parse the numeric part from the ID. + return parseInt( id.match( /\d+/ )[ 0 ], 10 ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery, wpforms_builder_email_template ) ); + +// Initialize. +WPFormsBuilderEmailTemplate.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.min.js new file mode 100755 index 00000000..c49a7a88 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/email-template.min.js @@ -0,0 +1 @@ +var WPFormsBuilderEmailTemplate=window.WPFormsBuilderEmailTemplate||((e,m,n)=>{let d={},s={modal:null,classNames:{modalBox:"wpforms-modal-content-box",modalOpen:"wpforms-email-template-modal-open"}},i={init(){m(i.ready)},ready(){i.setup(),i.bindEvents()},setup(){d.$document=m(e),d.$body=m("body")},bindEvents(){d.$document.on("change",'.wpforms-email-template-modal-content input[type="radio"]',i.handleOnChangeTemplate).on("click",".wpforms-all-email-template-modal",i.handleOnOpenModal)},handleOnChangeTemplate(e){e.preventDefault();var a,e=i.getIdFromElm(m(this)),e=m(`#wpforms-panel-field-notifications-${e}-template`);e.length&&s.modal&&(a=m(this).val(),e.val(a).trigger("change"),s.modal.close())},handleOnOpenModal(){var e,a,l,t,o=wp.template("wpforms-email-template-modal");o.length&&(e=(a=m(this).closest(".wpforms-panel-field-email-template-wrap").find("select")).val()||"",a=i.getIdFromElm(a),{templates:l,is_pro:t}=n,o=o({templates:l,selected:e,is_pro:t,id:a}),s.modal=m.confirm({content:o,title:"",boxWidth:800,contentMaxHeight:"none",backgroundDismiss:!0,smoothContent:!1,closeIcon:!0,buttons:!1,onOpenBefore(){this.$body.addClass(s.classNames.modalBox),d.$body.addClass(s.classNames.modalOpen)},onClose(){d.$body.removeClass(s.classNames.modalOpen)}}))},getIdFromElm(e){e=e.attr("id");return e?parseInt(e.match(/\d+/)[0],10):0}};return i})(document,(window,jQuery),wpforms_builder_email_template);WPFormsBuilderEmailTemplate.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/field-map.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/field-map.js new file mode 100755 index 00000000..9518b2a1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/field-map.js @@ -0,0 +1,236 @@ +/* global wpforms_builder, WPFormsUtils, wpf */ + +/** + * @param wpforms_builder.add_custom_value_label + * @param wpforms_builder.select_field + */ + +// noinspection ES6ConvertVarToLetConst +/** + * Form Builder Field Map. + * + * @since 1.9.5 + */ +var WPForms = window.WPForms || {}; // eslint-disable-line no-var + +WPForms.Admin = WPForms.Admin || {}; +WPForms.Admin.Builder = WPForms.Admin.Builder || {}; + +WPForms.Admin.Builder.FieldMap = WPForms.Admin.Builder.FieldMap || ( function( document, window, $ ) { + /** + * Elements holder. + * + * @since 1.9.5 + * + * @type {Object} + */ + const el = {}; + + /** + * Public functions and properties. + * + * @since 1.9.5 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.9.5 + */ + init() { + $( app.ready ); + }, + + /** + * DOM is fully loaded. + * + * @since 1.9.5 + */ + ready() { + app.setup(); + app.events(); + }, + + /** + * Setup. Prepare some variables. + * + * @since 1.9.5 + */ + setup() { + // Cache DOM elements. + el.$builder = $( '#wpforms-builder' ); + }, + + /** + * Bind events. + * + * @since 1.9.5 + */ + events() { + // Field map table, update a key source. + el.$builder.on( 'input', '.wpforms-field-map-table .key-source', function() { + const value = $( this ).val(), + $dest = $( this ).parent().parent().find( '.key-destination' ), + name = $dest.data( 'name' ); + + if ( value ) { + $dest.attr( 'name', name.replace( '{source}', value.replace( /[^0-9a-zA-Z_-]/gi, '' ) ) ); + } + } ); + + // Field map table, delete row + el.$builder.on( 'click', '.wpforms-field-map-table .remove', function( e ) { + e.preventDefault(); + app.fieldMapTableDeleteRow( e, $( this ) ); + } ); + + // Field map table, Add row + el.$builder.on( 'click', '.wpforms-field-map-table .add', function( e ) { + e.preventDefault(); + app.fieldMapTableAddRow( e, $( this ) ); + } ); + + // Global select field mapping + $( document ).on( 'wpformsFieldUpdate', app.fieldMapSelect ); + }, + + /** + * Field map table - Delete row. + * + * @since 1.2.0 + * @since 1.6.1.2 Registered `wpformsFieldMapTableDeletedRow` trigger. + * + * @param {Event} e Event. + * @param {Element} element Element. + */ + fieldMapTableDeleteRow( e, element ) { + const $this = $( element ), + $row = $this.closest( 'tr' ), + $table = $this.closest( 'table' ), + $block = $row.closest( '.wpforms-builder-settings-block' ), + total = $table.find( 'tr' ).length; + + if ( total > '1' ) { + $row.remove(); + + el.$builder.trigger( 'wpformsFieldMapTableDeletedRow', [ $block ] ); + } + }, + + /** + * Field map table - Add row. + * + * @since 1.2.0 + * @since 1.6.1.2 Registered `wpformsFieldMapTableAddedRow` trigger. + * + * @param {Event} e Event. + * @param {Element} element Element. + */ + fieldMapTableAddRow( e, element ) { + const $this = $( element ), + $row = $this.closest( 'tr' ), + $block = $row.closest( '.wpforms-builder-settings-block' ), + choice = $row.clone().insertAfter( $row ); + + choice.find( 'input' ).val( '' ); + choice.find( 'select :selected' ).prop( 'selected', false ); + choice.find( '.key-destination' ).attr( 'name', '' ); + + el.$builder.trigger( 'wpformsFieldMapTableAddedRow', [ $block, choice ] ); + }, + + /** + * Update field mapped select items on form updates. + * Use data attributes to configure field mapping: + * - data-field-map-placeholder - A custom placeholder text shown in the select dropdown field. + * - data-field-map-allowed - Space-separated list of allowed field types (e.g. "email textarea"). Use "all-fields" to allow all available form fields. + * - data-field-map-allow-repeated-fields - Controls whether fields inside repeater blocks are included in the options (true/false). + * - data-custom-value-support - When true, adds a "Custom Value" option at the end of the dropdown list. + * + * @since 1.2.0 + * @since 1.6.1.2 Registered `wpformsFieldSelectMapped` trigger. + * @since 1.9.7 Removed all passed arguments. + * @since 1.9.7 The list of fields is received via the `wpf.getFields` function. + * @since 1.9.7 Added multiple fields support. + */ + fieldMapSelect() { + const event = WPFormsUtils.triggerEvent( el.$builder, 'wpformsBeforeFieldMapSelectUpdate' ); + + // Allow callbacks on `wpformsBeforeFieldMapSelectUpdate` to cancel adding field + // by triggering `event.preventDefault()`. + if ( event.isDefaultPrevented() ) { + return; + } + + // eslint-disable-next-line complexity + $( '.wpforms-field-map-select' ).each( function() { + const $this = $( this ); + + let placeholder = $this.data( 'field-map-placeholder' ); + + // Check if a custom placeholder was provided. + if ( typeof placeholder === 'undefined' || ! placeholder ) { + placeholder = wpforms_builder.select_field; + } + + let allowedFields = $this.data( 'field-map-allowed' ); + + // If allowed, fields are not defined, bail. + if ( typeof allowedFields === 'undefined' || ! allowedFields ) { + return; + } + + allowedFields = allowedFields.split( ' ' ); + allowedFields = $.inArray( 'all-fields', allowedFields ) >= 0 ? false : allowedFields; + + const isAllowedRepeatedFields = Boolean( $this.data( 'field-map-allow-repeated-fields' ) ); + const selectedValue = $this.val(); + const fields = wpf.getFields( allowedFields, true, isAllowedRepeatedFields ); + + $this.empty(); + $this.append( $( '
            '+wpforms_form_templates.activating),this.$$cancel.prop("disabled",!0),_.installActivateAddons(a,this,e,t,o),!1}},cancel:{text:wpforms_form_templates.cancel,action(){WPFormsFormTemplates.selectTemplateCancel()}}}})},action(e,t=""){return 1 -1 ) { + docsByCategory.push( doc ); + } + } ); + docsByCategories[ categorySlug ] = docsByCategory; + } ); + + return docsByCategories; + }, + + /** + * Get docs recommended by search term. + * + * @since 1.6.3 + * + * @param {string} term Search term. + * + * @returns {Array} Recommended docs. + */ + getRecommendedDocs: function( term ) { + + if ( wpf.empty( term ) ) { + return []; + } + + term = term.toLowerCase(); + + var docs = wpforms_builder_help.docs, + recommendedDocs = []; + + if ( wpf.empty( wpforms_builder_help.context.docs[ term ] ) ) { + return []; + } + + _.each( wpforms_builder_help.context.docs[ term ], function( docId ) { + if ( ! wpf.empty( docs[ docId ] ) ) { + recommendedDocs.push( docs[ docId ] ); + } + } ); + + return recommendedDocs; + }, + + /** + * Get docs filtered by search term. + * + * @since 1.6.3 + * + * @param {string} term Search term. + * + * @returns {Array} Filtered docs. + */ + getFilteredDocs: function( term ) { + + if ( wpf.empty( term ) ) { + return []; + } + + var docs = wpforms_builder_help.docs, + filteredDocs = []; + + term = term.toLowerCase(); + + _.each( docs, function( doc ) { + if ( doc.title && doc.title.toLowerCase().indexOf( term ) > -1 ) { + filteredDocs.push( doc ); + } + } ); + + return filteredDocs; + }, + + /** + * Get the current context (state) of the form builder. + * + * @since 1.6.3 + * + * @returns {string} Builder context string. For example 'fields/add_field' or 'settings/notifications'. + */ + getBuilderContext: function() { + + // New (not saved) form. + if ( wpf.empty( el.$builderForm.data( 'id' ) ) ) { + return 'new_form'; + } + + // Determine builder panel and section. + var panel = el.$builder.find( '#wpforms-panels-toggle button.active' ).data( 'panel' ), + $panel = el.$builder.find( '#wpforms-panel-' + panel ), + section = '', + subsection = '', + context; + + switch ( panel ) { + case 'fields': + section = $panel.find( '.wpforms-panel-sidebar .wpforms-tab a.active' ).parent().attr( 'id' ); + break; + case 'setup': + section = ''; + break; + default: + section = $panel.find( '.wpforms-panel-sidebar a.active' ).data( 'section' ); + } + + section = ! wpf.empty( section ) ? section.replace( /-/g, '_' ) : ''; + + // Detect field type. + if ( section === 'field_options' ) { + subsection = $panel.find( '#wpforms-field-options .wpforms-field-option:visible .wpforms-field-option-hidden-type' ).val(); + } + + // Combine to context array. + context = [ panel, section, subsection ].filter( function( el ) { + return ! wpf.empty( el ) && el !== 'default'; + } ); + + // Return imploded string. + return context.join( '/' ); + }, + + /** + * Get the search term for the current builder context. + * + * @since 1.6.3 + * + * @returns {string} Builder context term string. + */ + getBuilderContextTerm: function() { + + return wpforms_builder_help.context.terms[ app.getBuilderContext() ] || ''; + }, + }; + + /** + * UI functions. + */ + ui = { + + /** + * Configuration. + * + * @since 1.6.3 + * + * @type {object} + */ + config: { + speed: 300, // Fading/sliding duration in milliseconds. + }, + + /** + * Display the element by fading them to opaque using CSS. + * + * @since 1.6.3 + * + * @param {jQuery} $el Element object. + */ + fadeIn: function( $el ) { + + if ( ! $el.length ) { + return; + } + + $el.css( { + display: '', + transition: `opacity ${ui.config.speed}ms ease-in 0s`, + } ); + + setTimeout( function() { + $el.css( 'opacity', '1' ); + }, 0 ); + }, + + /** + * Hide the element by fading them to transparent using CSS. + * + * @since 1.6.3 + * + * @param {jQuery} $el Element object. + */ + fadeOut: function( $el ) { + + if ( ! $el.length ) { + return; + } + + $el.css( { + opacity: '0', + transition: `opacity ${ui.config.speed}ms ease-in 0s`, + } ); + + setTimeout( function() { + $el.css( 'display', 'none' ); + }, ui.config.speed ); + }, + + /** + * Collapse all categories. + * + * @since 1.6.3 + */ + collapseAllCategories: function() { + + el.$categories.find( '.wpforms-builder-help-category' ).removeClass( 'opened' ); + el.$categories.find( '.wpforms-builder-help-docs' ).slideUp(); + }, + }; + + /** + * Event handlers. + */ + event = { + + /** + * Open help modal. + * + * @since 1.6.3 + * + * @param {object} e Event object. + */ + openHelp: function( e ) { + + e.preventDefault(); + + $( 'body' ).addClass( 'wpforms-builder-help-open' ); + + var $firstCategory = el.$categories.find( '.wpforms-builder-help-category' ).first(), + builderContextTerm = app.getBuilderContextTerm(); + + if ( builderContextTerm === '' && ! $firstCategory.hasClass( 'opened' ) ) { + $firstCategory.find( 'header' ).first().trigger( 'click' ); + } else { + ui.collapseAllCategories(); + } + + el.$search.find( 'input' ).val( builderContextTerm ).trigger( 'keyup' ); + + ui.fadeIn( el.$help ); + + setTimeout( function() { + + ui.fadeIn( el.$result ); + ui.fadeIn( el.$categories ); + ui.fadeIn( el.$footer ); + + }, ui.config.speed ); + }, + + /** + * Close help modal. + * + * @since 1.6.3 + * + * @param {object} e Event object. + */ + closeHelp: function( e ) { + + e.preventDefault(); + + $( 'body' ).removeClass( 'wpforms-builder-help-open' ); + + ui.fadeOut( el.$result ); + ui.fadeOut( el.$categories ); + ui.fadeOut( el.$footer ); + + ui.fadeOut( el.$help ); + + }, + + /** + * Toggle category. + * + * @since 1.6.3 + * + * @param {object} e Event object. + */ + toggleCategory: function( e ) { + + var $category = $( this ).parent(), + $categoryDocs = $category.find( '.wpforms-builder-help-docs' ); + + if ( ! $categoryDocs.is( ':visible' ) ) { + $category.addClass( 'opened' ); + } else { + $category.removeClass( 'opened' ); + } + + $categoryDocs.stop().slideToggle( ui.config.speed ); + }, + + /** + * View All Category Docs button click. + * + * @since 1.6.3 + * + * @param {object} e Event object. + */ + viewAllCategoryDocs: function( e ) { + + var $btn = $( this ); + + $btn.prev( 'div' ).stop().slideToggle( ui.config.speed, function() { + $btn.closest( '.wpforms-builder-help-category' ).addClass( 'viewall' ); + } ); + ui.fadeOut( $btn ); + $btn.slideUp(); + }, + + /** + * Input into search field. + * + * @since 1.6.3 + * + * @param {object} e Event object. + */ + inputSearch: function( e ) { + + var $input = $( this ), + term = $input.val(); + + var tmpl = wp.template( 'wpforms-builder-help-docs' ), + recommendedDocs = app.getRecommendedDocs( term ), + filteredDocs = event.removeDuplicates( recommendedDocs, app.getFilteredDocs( term ) ), + resultHTML = ''; + + el.$search.toggleClass( 'wpforms-empty', ! term ); + + if ( ! wpf.empty( recommendedDocs ) ) { + resultHTML += tmpl( { + docs: recommendedDocs, + } ); + } + + if ( ! wpf.empty( filteredDocs ) ) { + resultHTML += tmpl( { + docs: filteredDocs, + } ); + } + + el.$noResult.toggle( resultHTML === '' && term !== '' ); + + el.$result.html( resultHTML ); + + el.$help[0].scrollTop = 0; + }, + + /** + * Remove duplicated items in the filtered docs. + * + * @since 1.6.3 + * + * @param {Array} recommendedDocs Recommended docs. + * @param {Array} filteredDocs Filtered docs. + * + * @returns {Array} Filtered docs without duplicated items in the recommended docs. + */ + removeDuplicates: function( recommendedDocs, filteredDocs ) { + + if ( wpf.empty( recommendedDocs ) || wpf.empty( filteredDocs ) ) { + return filteredDocs; + } + + var docs = []; + + for ( var i = 0; i < recommendedDocs.length, i++; ) { + for ( var k = 0; k < filteredDocs.length, k++; ) { + if ( filteredDocs[ k ].url !== recommendedDocs[ i ].url ) { + docs.push( filteredDocs[ k ] ); + } + } + } + + return docs; + }, + + /** + * Clear search field. + * + * @since 1.6.3 + * + * @param {object} e Event object. + */ + clearSearch: function( e ) { + + el.$search.find( 'input' ).val( '' ).trigger( 'keyup' ); + }, + }; + + // Provide access to public functions/properties. + return app; + +}( document, window, jQuery ) ); + +// Initialize. +WPForms.Admin.Builder.Help.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/help.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/help.min.js new file mode 100755 index 00000000..3d4c51fc --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/help.min.js @@ -0,0 +1 @@ +var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.Help=WPForms.Admin.Builder.Help||(l=>{var n,p={init:function(){l(p.ready)},ready:function(){p.setup(),p.initCategories(),p.events()},setup:function(){n={$builder:l("#wpforms-builder"),$builderForm:l("#wpforms-builder-form"),$helpBtn:l(".js-wpforms-help"),$help:l("#wpforms-builder-help"),$closeBtn:l("#wpforms-builder-help-close"),$search:l("#wpforms-builder-help-search"),$result:l("#wpforms-builder-help-result"),$noResult:l("#wpforms-builder-help-no-result"),$categories:l("#wpforms-builder-help-categories"),$footer:l("#wpforms-builder-help-footer")}},events:function(){n.$helpBtn.on("click",a.openHelp),n.$closeBtn.on("click",a.closeHelp),n.$categories.on("click",".wpforms-builder-help-category header",a.toggleCategory),n.$categories.on("click",".wpforms-builder-help-category button.viewall",a.viewAllCategoryDocs),n.$search.on("keyup","input",_.debounce(a.inputSearch,250)),n.$search.on("click","#wpforms-builder-help-search-clear",a.clearSearch)},initCategories:function(){var e,r;wpf.empty(wpforms_builder_help.docs)?n.$categories.html(wp.template("wpforms-builder-help-categories-error")):(e=wp.template("wpforms-builder-help-categories"),r={categories:wpforms_builder_help.categories,docs:p.getDocsByCategories()},n.$categories.html(e(r)))},getDocsByCategories:function(){var e=wpforms_builder_help.categories,t=wpforms_builder_help.docs||[],i={};return _.each(e,function(e,r){var o=[];_.each(t,function(e){e.categories&&-1{let a={init(){d(e).ready(a.ready)},ready(){a.$builder=d("#wpforms-builder"),a.bindEvents()},bindEvents(){d(e).on("click",".wpforms-image-upload-button",a.openMediaUploader),d(e).on("click",".wpforms-image-remove-button",a.removeImage)},openMediaUploader(e){e.preventDefault();let r=d(this).closest(".wpforms-image-upload-control");e=r.attr("id");a.frames=a.frames??{},a.frames[e]?(a.frame=a.frames[e],a.frame.open()):(a.frame=wpf.initMediaLibrary({extensions:wpforms_builder.upload_image_extensions,extensionsError:wpforms_builder.upload_image_extensions_error,buttonText:wpforms_builder.upload_image_button}),a.frame.on("select",function(){var e=a.frame.state().get("selection").first().toJSON();a.setImage(r,e)}),a.frame.open(),a.frames[e]=a.frame)},getControlElements(e){return{$control:e,$idField:e.find(".wpforms-image-upload-id"),$urlField:e.find(".wpforms-image-upload-url"),$preview:e.find(".wpforms-image-preview img"),$uploadBtn:e.find(".wpforms-image-upload-button"),$removeBtn:e.find(".wpforms-image-remove-button")}},setImage(e,r){var{$idField:o,$urlField:i,$preview:m,$uploadBtn:t,$removeBtn:d}=a.getControlElements(e);m.attr("src",r.url),o.val(r.id),i.val(r.url),t.addClass("wpforms-hidden"),d.removeClass("wpforms-hidden"),WPFormsUtils.triggerEvent(a.$builder,"wpformsImageUploadChange",[e,r])},removeImage(e){e.preventDefault();var e=d(this).closest(".wpforms-image-upload-control"),{$idField:r,$urlField:o,$preview:i,$uploadBtn:m,$removeBtn:t}=a.getControlElements(e);i.attr("src",""),r.val(""),o.val(""),m.removeClass("wpforms-hidden"),t.addClass("wpforms-hidden"),WPFormsUtils.triggerEvent(a.$builder,"wpformsImageUploadChange",[e,null])}};return a})(document,(window,jQuery)),WPForms.Admin.Builder.Settings.ImageUpload.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.js new file mode 100755 index 00000000..ff5aa1f4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.js @@ -0,0 +1,443 @@ +/* global wpforms_builder, WPFormsBuilder */ + +// noinspection ES6ConvertVarToLetConst +var WPForms = window.WPForms || {}; // eslint-disable-line no-var +WPForms.Admin = WPForms.Admin || {}; +WPForms.Admin.Builder = WPForms.Admin.Builder || {}; + +/** + * Multiple Choices functionality. + * + * @since 1.9.8.3 + */ +WPForms.Admin.Builder.MultipleChoices = WPForms.Admin.Builder.MultipleChoices || ( function( document, window, $ ) { + /** + * Multiple Choices methods and properties. + * + * @since 1.9.8.3 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.9.8.3 + */ + init() { + $( app.ready ); + }, + + /** + * Init. + * + * @since 1.9.8.3 + */ + ready() { + app.bindEvents(); + }, + + /** + * Bind actions. + * + * @since 1.9.8.3 + */ + // eslint-disable-next-line max-lines-per-function + bindEvents() { + // Cache builder element. + app.$builder = $( '#wpforms-builder' ); + + // Switch Add other option toggle. + app.$builder.on( 'change', '.wpforms-field-option-row-choices_other input', app.toggleOtherOption ); + + // Real-time update Other input placeholder in preview. + app.$builder.on( 'input', '.wpforms-field-option-row-other_placeholder input', app.updateOtherOptionPlaceholder ); + + // Real-time update Other input size in preview. + app.$builder.on( 'change', '.wpforms-field-option-row-other_size select', app.updateOptionInputFieldSize ); + + // When AI inserts choices, append the Other choice if the toggle is enabled. + $( document ).on( 'wpformsAIModalAfterChoicesInsert', app.appendOtherOption ); + + // Real-time preview Other input value while typing in the Other choice Value when Show Values is enabled. + app.$builder.on( 'input', '.wpforms-field-option-row-choices li.wpforms-choice-other-option input.value', app.updateOptionInputPreview ); + + // When Dynamic Choices is toggled ON, force-disable Other option. + app.$builder.on( 'change', '.wpforms-field-option-row-dynamic_choices select', app.toggleDynamicChoices ); + + app.$builder.on( 'wpformsChoicesSetDefault', app.updateDefaultOptionState ); + }, + + /** + * Updates the preview of the "Other" input field in a form field based on the updated option value. + * This method checks if the "Show Values" option is enabled, fetches the current value from the input field, + * and updates the corresponding preview input with the value or a placeholder. + * + * @since 1.9.8.3 + */ + updateOptionInputPreview() { + const $val = $( this ); + const $list = $val.closest( '.choices-list' ); + const fieldID = $list.data( 'field-id' ); + const $options = $( '#wpforms-field-option-' + fieldID ); + const showValuesOn = $options.find( '.wpforms-field-option-row-show_values input' ).is( ':checked' ); + + if ( ! showValuesOn ) { + return; + } + const value = $val.val(); + const $preview = $( '#wpforms-field-' + fieldID ); + const $otherInput = $preview.find( '.wpforms-other-input' ); + const placeholder = $options.find( '.wpforms-field-option-row-other_placeholder input' ).val() || ''; + $otherInput.val( value ?? placeholder ); + }, + + /** + * Updates the size of an option input field based on its selected value. + * + * This method retrieves the selected value of a dropdown associated with an option input field, + * determines its size, and applies the updated size to the respective container using the application logic. + * + * @since 1.9.8.3 + */ + updateOptionInputFieldSize() { + const $select = $( this ); + const fieldID = $select.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + const val = $select.val() || 'medium'; + app.setOtherSizeOnContainer( fieldID, val ); + }, + + /** + * Updates the default option state for a choice field, particularly handling behavior for Radio fields + * and the "Other" choice option. Manages UI adjustments, such as showing or hiding the "Other" input field + * in the preview based on the selected default option. + * + * @since 1.9.8.3 + * + * @param {Event} e The event object triggered during the state change. + * @param {HTMLElement} el The HTML element representing the choice being toggled. + */ + updateDefaultOptionState( e, el ) { + const $this = $( el ), + $choicesList = $this.closest( '.choices-list' ), + fieldType = $choicesList.data( 'field-type' ); + + if ( fieldType !== 'radio' ) { + return; + } + + const fieldId = $choicesList.data( 'field-id' ); + + // If toggling default for Radio field's Other choice, show/hide preview Other input accordingly. + const $li = $this.closest( 'li' ), + $previewField = $( '#wpforms-field-' + fieldId ), + $otherInput = $previewField.find( '.wpforms-other-input' ); + + if ( ! $li.hasClass( 'wpforms-choice-other-option' ) ) { + $otherInput.addClass( 'wpforms-hidden' ).val( '' ); + return; + } + + // Toggle visibility based on whether this radio is checked. + const checked = $this.is( ':checked' ); + $otherInput.toggleClass( 'wpforms-hidden', ! checked ); + }, + + /** + * Toggles the "Other" option functionality in the options interface of a form field. + * This includes adding or removing the "Other" choice, updating its placeholder and size options, + * and updating the preview state accordingly. + * + * @since 1.9.8.3 + * + * @param {Event} e The event object triggered during the state change. + */ + toggleOtherOption( e ) { + const $this = $( this ), + $optionRow = $this.closest( '.wpforms-field-option-row' ), + fieldID = $optionRow.data( 'field-id' ), + $fieldOptions = $( '#wpforms-field-option-' + fieldID ), + checked = $this.is( ':checked' ), + type = $fieldOptions.find( '.wpforms-field-option-hidden-type' ).val(), + $choicesList = $( '#wpforms-field-option-row-' + fieldID + '-choices .choices-list' ); + + let id = $choicesList.attr( 'data-next-id' ); + + if ( checked ) { + app.fieldChoiceAddOther( e, $( this ), id ); + id++; + $choicesList.attr( 'data-next-id', id ); + } else { + $choicesList.find( 'li.wpforms-choice-other-option' ).remove(); + $( '#wpforms-field-' + fieldID ).find( '.wpforms-other-input' ).addClass( 'wpforms-hidden' ); + } + + // Toggle the visibility of the Other Placeholder and Field Size option rows. + $fieldOptions.find( '.wpforms-field-option-row-other_placeholder' ).toggleClass( 'wpforms-hidden', ! checked ); + $fieldOptions.find( '.wpforms-field-option-row-other_size' ).toggleClass( 'wpforms-hidden', ! checked ); + + // Apply/remove container size class accordingly. + if ( checked ) { + const sizeVal = $fieldOptions.find( '.wpforms-field-option-row-other_size select' ).val() || 'medium'; + app.setOtherSizeOnContainer( fieldID, sizeVal ); + } else { + app.setOtherSizeOnContainer( fieldID, null ); + } + + // Update preview. + WPFormsBuilder.fieldChoiceUpdate( type, fieldID ); + app.updatePreviewState( fieldID ); + }, + + /** + * Toggles the placeholder attribute of the "other" input field in a form preview + * based on the value from the corresponding field option settings. + * + * Finds the relevant field ID based on the context of the input element, and + * updates the placeholder text of the "other" input field in the preview if it exists. + * + * @return {void} Does not return a value. + */ + updateOtherOptionPlaceholder() { + const $input = $( this ); + const fieldID = $input.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + const value = $input.val(); + const $previewOther = $( '#wpforms-field-' + fieldID + ' .wpforms-other-input' ); + if ( $previewOther.length ) { + $previewOther.attr( 'placeholder', value ); + } + }, + + /** + * Toggles the state of dynamic choices for a select input field. + * Verifies if a selected value exists, performs operations on associated field options, + * and updates the preview state based on user interaction. + * + * @since 1.9.8.3 + * + * @return {void} Does not return a value. + */ + toggleDynamicChoices() { + const $select = $( this ); + const dynamicOn = $select.val() !== ''; + if ( ! dynamicOn ) { + return; + } + const fieldID = $select.closest( '.wpforms-field-option-row' ).data( 'field-id' ); + const $fieldOptions = $( '#wpforms-field-option-' + fieldID ); + const $otherToggle = $fieldOptions.find( '.wpforms-field-option-row-choices_other input' ); + + if ( $otherToggle.is( ':checked' ) ) { + $otherToggle.prop( 'checked', false ).trigger( 'change' ); + } + + app.updatePreviewState( fieldID ); + }, + + /** + * Create a new "Other" choice element. + * + * @since 1.9.8.3 + * + * @param {jQuery} $choicesList The choices list container. + * @param {string} fieldID Field ID. + * @param {number} key Next choice key. + * + * @return {jQuery} The cloned and prepared Other choice element. + */ + createOtherChoice( $choicesList, fieldID, key ) { + const $last = $choicesList.children( 'li' ).last(); + const $clone = $last.clone(); + + const otherLabel = wpforms_builder.other; + + $clone.attr( 'data-key', key ); + $clone.find( 'input.label' ).val( otherLabel ).attr( 'name', `fields[${ fieldID }][choices][${ key }][label]` ); + $clone.find( 'input.value' ).val( '' ).attr( 'name', `fields[${ fieldID }][choices][${ key }][value]` ); + $clone.find( '.wpforms-image-upload input.source' ).val( '' ).attr( 'name', `fields[${ fieldID }][choices][${ key }][image]` ); + $clone.find( '.wpforms-icon-select input.source-icon' ).val( wpforms_builder.icon_choices.default_icon ).attr( 'name', `fields[${ fieldID }][choices][${ key }][icon]` ); + $clone.find( '.wpforms-icon-select input.source-icon-style' ).val( wpforms_builder.icon_choices.default_icon_style ).attr( 'name', `fields[${ fieldID }][choices][${ key }][icon_style]` ); + $clone.find( '.wpforms-icon-select .ic-fa-preview' ).removeClass().addClass( `ic-fa-preview ic-fa-${ wpforms_builder.icon_choices.default_icon_style } ic-fa-${ wpforms_builder.icon_choices.default_icon }` ); + $clone.find( '.wpforms-icon-select .ic-fa-preview + span' ).text( wpforms_builder.icon_choices.default_icon ); + $clone.find( 'input.default' ).attr( 'name', `fields[${ fieldID }][choices][${ key }][default]` ).prop( 'checked', false ); + $clone.find( '.preview' ).empty(); + $clone.find( '.wpforms-image-upload-add' ).show(); + + // Mark as special "Other" item for clarity and sorting prevention. + $clone.addClass( 'wpforms-choice-other-option not-draggable' ); + $clone.find( '.move, .add, .remove' ).addClass( 'wpforms-disabled' ); + + // Add hidden input flag to identify this choice as "Other". + $clone.find( 'input.other-flag' ).remove(); + $clone.append( + `` + ); + + return $clone; + }, + + /** + * Add Other choice to a field. + * + * @since 1.9.8.3 + * + * @param {Event|null} event Event object. + * @param {Element} el The toggle element. + * @param {number} key Next choice key. + */ + fieldChoiceAddOther( event, el, key ) { + const $optionRow = $( el ).closest( '.wpforms-field-option-row' ); + const fieldID = $optionRow.data( 'field-id' ); + const $choicesList = $( `#wpforms-field-option-row-${ fieldID }-choices .choices-list` ); + + const $clone = app.createOtherChoice( $choicesList, fieldID, key ); + $choicesList.append( $clone ); + }, + + /** + * Append Other option at the end of the choices list when toggle is on. + * + * @since 1.9.8.3 + * + * @param {Object} event Event object. + */ + appendOtherOption( event ) { + const fieldId = event?.detail?.fieldId; + const $fieldOptions = $( `#wpforms-field-option-${ fieldId }` ); + const $toggle = $fieldOptions.find( '.wpforms-field-option-row-choices_other input' ); + + if ( ! $toggle.length || ! $toggle.is( ':checked' ) ) { + return; + } + + const $choicesList = $( `#wpforms-field-option-row-${ fieldId }-choices .choices-list` ); + + // Prevent duplicate Other choice. + if ( $choicesList.find( 'li.wpforms-choice-other-option' ).length > 0 ) { + return; + } + + let nextId = parseInt( $choicesList.attr( 'data-next-id' ), 10 ); + nextId = isNaN( nextId ) ? 1 : nextId; + + const $clone = app.createOtherChoice( $choicesList, fieldId, nextId ); + $choicesList.append( $clone ); + $choicesList.attr( 'data-next-id', nextId + 1 ); + + const type = $fieldOptions.find( '.wpforms-field-option-hidden-type' ).val(); + WPFormsBuilder.fieldChoiceUpdate( type, fieldId ); + }, + + /** + * Set size for the container of other option to reach the correct style changes. + * + * @since 1.9.8.3 + * + * @param {string} fieldId Field ID. + * @param {string} size The size. + */ + setOtherSizeOnContainer( fieldId, size ) { + const $container = $( '#wpforms-field-' + fieldId + '.wpforms-field-radio' ); + + $container.removeClass( 'size-small size-medium size-large' ); + + if ( size ) { + $container.addClass( 'size-' + size ); + } + }, + + /** + * Show other input on the preview. + * + * @since 1.9.8.3 + * + * @param {jQuery} $field A field or list of fields. + */ + showPreviewOther( $field ) { + const $otherInput = $field.find( '.wpforms-other-input' ); + + if ( ! $otherInput.length ) { + return; + } + + $otherInput.removeClass( 'wpforms-hidden' ); + + const $otherRadio = $field.find( 'li.wpforms-other-choice input[type="radio"]' ); + + if ( ! $otherRadio.length ) { + return; + } + + $otherRadio.val( $otherInput.val() ); + }, + + /** + * Hide other input on the preview. + * + * @since 1.9.8.3 + * + * @param {jQuery} $field A field or list of fields. + */ + hidePreviewOther( $field ) { + const $otherInput = $field.find( '.wpforms-other-input' ); + + if ( ! $otherInput.length ) { + return; + } + + $otherInput.addClass( 'wpforms-hidden' ).val( '' ); + }, + + /** + * Update other input preview state configuration changes. + * + * @since 1.9.8.3 + * + * @param {number|string} fieldId Field ID. + */ + updatePreviewState( fieldId ) { + const $options = $( '#wpforms-field-option-' + fieldId ); + const $preview = $( '#wpforms-field-' + fieldId ); + const addOtherOn = $options.find( '.wpforms-field-option-row-choices_other input' ).is( ':checked' ); + + // 1. Handle Add Other toggle. + if ( ! addOtherOn ) { + app.hidePreviewOther( $preview ); + return; + } + + // 2. Show/hide Other input in preview depending on radio state. + const $otherRadio = $options.find( '.choices-list li.wpforms-choice-other-option input[type="radio"]' ); + if ( $otherRadio.length && $otherRadio.is( ':checked' ) ) { + app.showPreviewOther( $preview ); + } else { + app.hidePreviewOther( $preview ); + } + + // 3. Handle the Show Values toggle. + const $otherInput = $preview.find( '.wpforms-other-input' ); + + if ( ! $otherInput.length ) { + return; + } + + const showValuesOn = $options.find( '.wpforms-field-option-row-show_values input' ).is( ':checked' ); + const placeholder = $options.find( '.wpforms-field-option-row-other_placeholder input' ).val() || ''; + + if ( ! showValuesOn ) { + $otherInput.val( '' ).attr( 'placeholder', placeholder ); + return; + } + + // 4. Sync value from choices into preview input. + const val = $options.find( '.choices-list li.wpforms-choice-other-option input.value' ).val() || ''; + $otherInput.val( val ).attr( 'placeholder', placeholder ); + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPForms.Admin.Builder.MultipleChoices.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.min.js new file mode 100755 index 00000000..64d8b6ee --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/multiple-choices.min.js @@ -0,0 +1 @@ +var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.MultipleChoices=WPForms.Admin.Builder.MultipleChoices||((e,l)=>{let n={init(){l(n.ready)},ready(){n.bindEvents()},bindEvents(){n.$builder=l("#wpforms-builder"),n.$builder.on("change",".wpforms-field-option-row-choices_other input",n.toggleOtherOption),n.$builder.on("input",".wpforms-field-option-row-other_placeholder input",n.updateOtherOptionPlaceholder),n.$builder.on("change",".wpforms-field-option-row-other_size select",n.updateOptionInputFieldSize),l(e).on("wpformsAIModalAfterChoicesInsert",n.appendOtherOption),n.$builder.on("input",".wpforms-field-option-row-choices li.wpforms-choice-other-option input.value",n.updateOptionInputPreview),n.$builder.on("change",".wpforms-field-option-row-dynamic_choices select",n.toggleDynamicChoices),n.$builder.on("wpformsChoicesSetDefault",n.updateDefaultOptionState)},updateOptionInputPreview(){var e=l(this),i=e.closest(".choices-list").data("field-id"),o=l("#wpforms-field-option-"+i);o.find(".wpforms-field-option-row-show_values input").is(":checked")&&(e=e.val(),i=l("#wpforms-field-"+i).find(".wpforms-other-input"),o=o.find(".wpforms-field-option-row-other_placeholder input").val()||"",i.val(e??o))},updateOptionInputFieldSize(){var e=l(this),i=e.closest(".wpforms-field-option-row").data("field-id"),e=e.val()||"medium";n.setOtherSizeOnContainer(i,e)},updateDefaultOptionState(e,i){var o,i=l(i),t=i.closest(".choices-list");"radio"===t.data("field-type")&&(t=t.data("field-id"),o=i.closest("li"),t=l("#wpforms-field-"+t).find(".wpforms-other-input"),o.hasClass("wpforms-choice-other-option")?(o=i.is(":checked"),t.toggleClass("wpforms-hidden",!o)):t.addClass("wpforms-hidden").val(""))},toggleOtherOption(e){var i=l(this),o=i.closest(".wpforms-field-option-row").data("field-id"),t=l("#wpforms-field-option-"+o),i=i.is(":checked"),r=t.find(".wpforms-field-option-hidden-type").val(),d=l("#wpforms-field-option-row-"+o+"-choices .choices-list"),s=d.attr("data-next-id");i?(n.fieldChoiceAddOther(e,l(this),s),d.attr("data-next-id",++s)):(d.find("li.wpforms-choice-other-option").remove(),l("#wpforms-field-"+o).find(".wpforms-other-input").addClass("wpforms-hidden")),t.find(".wpforms-field-option-row-other_placeholder").toggleClass("wpforms-hidden",!i),t.find(".wpforms-field-option-row-other_size").toggleClass("wpforms-hidden",!i),i?(e=t.find(".wpforms-field-option-row-other_size select").val()||"medium",n.setOtherSizeOnContainer(o,e)):n.setOtherSizeOnContainer(o,null),WPFormsBuilder.fieldChoiceUpdate(r,o),n.updatePreviewState(o)},updateOtherOptionPlaceholder(){var e=l(this),i=e.closest(".wpforms-field-option-row").data("field-id"),e=e.val(),i=l("#wpforms-field-"+i+" .wpforms-other-input");i.length&&i.attr("placeholder",e)},toggleDynamicChoices(){var e,i=l(this);""!==i.val()&&(i=i.closest(".wpforms-field-option-row").data("field-id"),(e=l("#wpforms-field-option-"+i).find(".wpforms-field-option-row-choices_other input")).is(":checked")&&e.prop("checked",!1).trigger("change"),n.updatePreviewState(i))},createOtherChoice(e,i,o){var e=e.children("li").last().clone(),t=wpforms_builder.other;return e.attr("data-key",o),e.find("input.label").val(t).attr("name",`fields[${i}][choices][${o}][label]`),e.find("input.value").val("").attr("name",`fields[${i}][choices][${o}][value]`),e.find(".wpforms-image-upload input.source").val("").attr("name",`fields[${i}][choices][${o}][image]`),e.find(".wpforms-icon-select input.source-icon").val(wpforms_builder.icon_choices.default_icon).attr("name",`fields[${i}][choices][${o}][icon]`),e.find(".wpforms-icon-select input.source-icon-style").val(wpforms_builder.icon_choices.default_icon_style).attr("name",`fields[${i}][choices][${o}][icon_style]`),e.find(".wpforms-icon-select .ic-fa-preview").removeClass().addClass(`ic-fa-preview ic-fa-${wpforms_builder.icon_choices.default_icon_style} ic-fa-`+wpforms_builder.icon_choices.default_icon),e.find(".wpforms-icon-select .ic-fa-preview + span").text(wpforms_builder.icon_choices.default_icon),e.find("input.default").attr("name",`fields[${i}][choices][${o}][default]`).prop("checked",!1),e.find(".preview").empty(),e.find(".wpforms-image-upload-add").show(),e.addClass("wpforms-choice-other-option not-draggable"),e.find(".move, .add, .remove").addClass("wpforms-disabled"),e.find("input.other-flag").remove(),e.append(``),e},fieldChoiceAddOther(e,i,o){var i=l(i).closest(".wpforms-field-option-row").data("field-id"),t=l(`#wpforms-field-option-row-${i}-choices .choices-list`),i=n.createOtherChoice(t,i,o);t.append(i)},appendOtherOption(e){var i,o,e=e?.detail?.fieldId,t=l("#wpforms-field-option-"+e),r=t.find(".wpforms-field-option-row-choices_other input");r.length&&r.is(":checked")&&(0<(r=l(`#wpforms-field-option-row-${e}-choices .choices-list`)).find("li.wpforms-choice-other-option").length||(i=parseInt(r.attr("data-next-id"),10),i=isNaN(i)?1:i,o=n.createOtherChoice(r,e,i),r.append(o),r.attr("data-next-id",i+1),o=t.find(".wpforms-field-option-hidden-type").val(),WPFormsBuilder.fieldChoiceUpdate(o,e)))},setOtherSizeOnContainer(e,i){e=l("#wpforms-field-"+e+".wpforms-field-radio");e.removeClass("size-small size-medium size-large"),i&&e.addClass("size-"+i)},showPreviewOther(e){var i=e.find(".wpforms-other-input");i.length&&(i.removeClass("wpforms-hidden"),(e=e.find('li.wpforms-other-choice input[type="radio"]')).length)&&e.val(i.val())},hidePreviewOther(e){e=e.find(".wpforms-other-input");e.length&&e.addClass("wpforms-hidden").val("")},updatePreviewState(e){var i,o,t,r=l("#wpforms-field-option-"+e),e=l("#wpforms-field-"+e);r.find(".wpforms-field-option-row-choices_other input").is(":checked")?((i=r.find('.choices-list li.wpforms-choice-other-option input[type="radio"]')).length&&i.is(":checked")?n.showPreviewOther(e):n.hidePreviewOther(e),(i=e.find(".wpforms-other-input")).length&&(t=r.find(".wpforms-field-option-row-show_values input").is(":checked"),o=r.find(".wpforms-field-option-row-other_placeholder input").val()||"",(t?(t=r.find(".choices-list li.wpforms-choice-other-option input.value").val()||"",i.val(t)):i.val("")).attr("placeholder",o))):n.hidePreviewOther(e)}};return n})(document,(window,jQuery)),WPForms.Admin.Builder.MultipleChoices.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.js new file mode 100755 index 00000000..e0d9423d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.js @@ -0,0 +1,236 @@ +/* global wpforms_builder, wpf */ + +/** + * Form Builder Panel Loader module. + * + * @since 1.8.6 + */ + +var WPForms = window.WPForms || {}; // eslint-disable-line no-var + +WPForms.Admin = WPForms.Admin || {}; +WPForms.Admin.Builder = WPForms.Admin.Builder || {}; + +WPForms.Admin.Builder.PanelLoader = WPForms.Admin.Builder.PanelLoader || ( function( document, window, $ ) { + /** + * Elements holder. + * + * @since 1.8.6 + * + * @type {Object} + */ + const el = {}; + + /** + * Runtime variables. + * + * @since 1.8.6 + * + * @type {Object} + */ + const vars = []; + + /** + * Public functions and properties. + * + * @since 1.8.6 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.8.6 + */ + init() { + $( app.ready ); + }, + + /** + * DOM is fully loaded. + * + * @since 1.8.6 + */ + ready() { + app.setup(); + app.events(); + + el.$builder.trigger( 'wpformsBuilderLoaderReady' ); + }, + + /** + * Setup. Prepare some variables. + * + * @since 1.8.6 + */ + setup() { + // Cache DOM elements. + el.$builder = $( '#wpforms-builder' ); + el.$form = $( '#wpforms-builder-form' ); + el.$panels = el.$builder.find( '.wpforms-panels' ); + + // Init vars. + vars.currentPanel = wpf.getQueryString( 'view' ); + }, + + /** + * Bind events. + * + * @since 1.8.6 + */ + events() { + // Panel switching. + el.$builder.on( 'wpformsPanelSwitch', function( e, panel ) { + // Skip if the panel is still loading. + if ( el.$builder.find( `.wpforms-panel-${ panel }-button .wpforms-loading-spinner` ).length ) { + e.preventDefault(); + + return; + } + + // Open the panel if it is already loaded. + if ( el.$panels.find( '#wpforms-panel-' + panel ).length ) { + return; + } + + // Load panel. + e.preventDefault(); + app.loadPanel( panel ); + } ); + }, + + /** + * Load panel. + * + * @since 1.8.6 + * + * @param {string} panel Panel name. + */ + loadPanel( panel ) { + app.showSpinner( panel ); + + // Load panel. + $.post( wpforms_builder.ajax_url, { + nonce: wpforms_builder.nonce, + action: 'wpforms_builder_load_panel', + panel, + form_id: wpf.getQueryString( 'form_id' ), // eslint-disable-line camelcase + } ) + .done( function( response ) { + if ( ! response.success || ! response.data?.length ) { + // Show an error message. + app.displayErrorModal( `

            ${ wpforms_builder.error_load_templates }

            ${ wpforms_builder.error_contact_support }

            ` ); + + return; + } + + // Append panel to the DOM. + app.embedPanel( panel, response.data ); + + // Finalize switching to the panel. + app.switchPanel( panel ); + + // Trigger panel loaded event. + el.$builder.trigger( 'wpformsBuilderPanelLoaded', [ panel ] ); + } ) + .fail( function() { + // Show an error message. + app.displayErrorModal( `

            ${ wpforms_builder.something_went_wrong }.

            ${ wpforms_builder.error_contact_support }

            ` ); + } ) + .always( function() { + // Hide loading spinner. + app.hideSpinner( panel ); + } ); + }, + + /** + * Show spinner. + * + * @since 1.8.6 + * + * @param {string} panel Panel name. + */ + showSpinner( panel ) { + const $button = $( `.wpforms-panel-${ panel }-button` ); + + $button.find( `i.fa` ).addClass( 'wpforms-hidden' ); + $button.prepend( '' ); + }, + + /** + * Hide spinner. + * + * @since 1.8.6 + * + * @param {string} panel Panel name. + */ + hideSpinner( panel ) { + const $button = $( `.wpforms-panel-${ panel }-button` ); + + $button.find( `i.fa` ).removeClass( 'wpforms-hidden' ); + $button.find( `i.wpforms-loading-spinner` ).remove(); + }, + + /** + * Embed panel to DOM. + * + * @since 1.8.6 + * + * @param {string} panel Panel slug. + * @param {string} panelHtml Panel HTML. + */ + embedPanel( panel, panelHtml ) { + // Append panel to the DOM. + el.$panels.append( panelHtml ); + }, + + /** + * Finalize switching to the panel. + * + * @since 1.8.6 + * + * @param {string} panel Panel slug. + */ + switchPanel( panel ) { + $( '#wpforms-panels-toggle' ).find( 'button' ).removeClass( 'active' ); + $( '.wpforms-panel' ).removeClass( 'active' ); + $( `.wpforms-panel-${ panel }-button` ).addClass( 'active' ); + $( `#wpforms-panel-${ panel }` ).addClass( 'active' ); + + history.replaceState( {}, null, wpf.updateQueryString( 'view', panel ) ); + + el.$builder.trigger( 'wpformsPanelSwitched', [ panel ] ); + }, + + /** + * Display modal window with an error message. + * + * @since 1.8.6 + * + * @param {string} content Modal content. + */ + displayErrorModal( content ) { + $.alert( { + title : wpforms_builder.uh_oh, + content, + icon : 'fa fa-exclamation-circle', + type : 'red', + buttons: { + cancel: { + text : wpforms_builder.close, + btnClass: 'btn-confirm', + keys : [ 'enter' ], + }, + }, + } ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPForms.Admin.Builder.PanelLoader.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.min.js new file mode 100755 index 00000000..a61d3282 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/panel-loader.min.js @@ -0,0 +1 @@ +var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.PanelLoader=WPForms.Admin.Builder.PanelLoader||(n=>{let o={},e=[],i={init(){n(i.ready)},ready(){i.setup(),i.events(),o.$builder.trigger("wpformsBuilderLoaderReady")},setup(){o.$builder=n("#wpforms-builder"),o.$form=n("#wpforms-builder-form"),o.$panels=o.$builder.find(".wpforms-panels"),e.currentPanel=wpf.getQueryString("view")},events(){o.$builder.on("wpformsPanelSwitch",function(e,r){o.$builder.find(`.wpforms-panel-${r}-button .wpforms-loading-spinner`).length?e.preventDefault():o.$panels.find("#wpforms-panel-"+r).length||(e.preventDefault(),i.loadPanel(r))})},loadPanel(r){i.showSpinner(r),n.post(wpforms_builder.ajax_url,{nonce:wpforms_builder.nonce,action:"wpforms_builder_load_panel",panel:r,form_id:wpf.getQueryString("form_id")}).done(function(e){e.success&&e.data?.length?(i.embedPanel(r,e.data),i.switchPanel(r),o.$builder.trigger("wpformsBuilderPanelLoaded",[r])):i.displayErrorModal(`

            ${wpforms_builder.error_load_templates}

            ${wpforms_builder.error_contact_support}

            `)}).fail(function(){i.displayErrorModal(`

            ${wpforms_builder.something_went_wrong}.

            ${wpforms_builder.error_contact_support}

            `)}).always(function(){i.hideSpinner(r)})},showSpinner(e){e=n(`.wpforms-panel-${e}-button`);e.find("i.fa").addClass("wpforms-hidden"),e.prepend('')},hideSpinner(e){e=n(`.wpforms-panel-${e}-button`);e.find("i.fa").removeClass("wpforms-hidden"),e.find("i.wpforms-loading-spinner").remove()},embedPanel(e,r){o.$panels.append(r)},switchPanel(e){n("#wpforms-panels-toggle").find("button").removeClass("active"),n(".wpforms-panel").removeClass("active"),n(`.wpforms-panel-${e}-button`).addClass("active"),n("#wpforms-panel-"+e).addClass("active"),history.replaceState({},null,wpf.updateQueryString("view",e)),o.$builder.trigger("wpformsPanelSwitched",[e])},displayErrorModal(e){n.alert({title:wpforms_builder.uh_oh,content:e,icon:"fa fa-exclamation-circle",type:"red",buttons:{cancel:{text:wpforms_builder.close,btnClass:"btn-confirm",keys:["enter"]}}})}};return i})((document,window,jQuery)),WPForms.Admin.Builder.PanelLoader.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.js new file mode 100755 index 00000000..a9678029 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.js @@ -0,0 +1,119 @@ +/* global wpforms_builder, wpforms_builder_payments_utils */ + +// eslint-disable-next-line no-unused-vars +const WPFormsBuilderPaymentsUtils = window.WPFormsBuilderPaymentsUtils || ( function( document, window, $ ) { + /** + * Public functions and properties. + * + * @since 1.9.5 + * + * @type {Object} + */ + const app = { + + /** + * Toggle payments content. + * + * @since 1.9.5 + */ + // eslint-disable-next-line complexity + toggleContent() { + const $input = $( this ), + $paymentSettings = $input.closest( '.wpforms-payment-settings' ); + + if ( + $paymentSettings.find( '.wpforms-panel-content-section-payment-toggle-one-time .wpforms-toggle-control > input' ).is( ':checked' ) && + $paymentSettings.find( '.wpforms-panel-content-section-payment-toggle-recurring .wpforms-toggle-control > input' ).is( ':checked' ) + ) { + $input.prop( 'checked', false ); + + $.alert( { + title: wpforms_builder.heads_up, + content: $input.attr( 'name' ).includes( 'enable_recurring' ) ? wpforms_builder_payments_utils.payments_disabled_recurring : wpforms_builder_payments_utils.payments_disabled_one_time, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + } + + const $wrapper = $input.closest( '.wpforms-panel-content-section-payment' ), + isChecked = $input.prop( 'checked' ) && ! $( '#wpforms-panel-field-settings-disable_entries' ).prop( 'checked' ); + + $wrapper.find( '.wpforms-panel-content-section-payment-toggled-body' ).toggle( isChecked ); + $wrapper.toggleClass( 'wpforms-panel-content-section-payment-open', isChecked ); + }, + + /** + * Check a plan name on empty value. + * + * @since 1.9.5 + */ + checkPlanName() { + const $input = $( this ), + $plan = $input.closest( '.wpforms-panel-content-section-payment-plan' ), + $planName = $plan.find( '.wpforms-panel-content-section-payment-plan-head-title' ); + + if ( $input.val() ) { + $planName.html( $input.val() ); + + return; + } + + const defaultValue = wpforms_builder_payments_utils.payments_plan_placeholder; + + $planName.html( defaultValue ); + $input.val( defaultValue ); + }, + + /** + * Toggle a plan content. + * + * @since 1.9.5 + */ + togglePlan() { + const $plan = $( this ).closest( '.wpforms-panel-content-section-payment-plan' ), + $icon = $plan.find( '.wpforms-panel-content-section-payment-plan-head-buttons-toggle' ); + + $icon.toggleClass( 'fa-chevron-circle-up fa-chevron-circle-down' ); + $plan.find( '.wpforms-panel-content-section-payment-plan-body' ).toggle( $icon.hasClass( 'fa-chevron-circle-down' ) ); + }, + + /** + * Delete a plan. + * + * @since 1.9.5 + */ + deletePlan() { + // Trigger a warning modal when trying to delete a single plan without pro addon. + $( this ).closest( '.wpforms-panel-content-section-payment' ).find( '.wpforms-panel-content-section-payment-button-add-plan' ).trigger( 'click' ); + }, + + /** + * Rename a plan. + * + * @since 1.9.5 + */ + renamePlan() { + const $input = $( this ), + $plan = $input.closest( '.wpforms-panel-content-section-payment-plan' ), + $planName = $plan.find( '.wpforms-panel-content-section-payment-plan-head-title' ); + + if ( ! $input.val() ) { + $planName.html( '' ); + + return; + } + + $planName.html( $input.val() ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.min.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.min.js new file mode 100755 index 00000000..002ca064 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/payments-utils.min.js @@ -0,0 +1 @@ +let WPFormsBuilderPaymentsUtils=window.WPFormsBuilderPaymentsUtils||(o=>({toggleContent(){var e=o(this),n=e.closest(".wpforms-payment-settings"),n=(n.find(".wpforms-panel-content-section-payment-toggle-one-time .wpforms-toggle-control > input").is(":checked")&&n.find(".wpforms-panel-content-section-payment-toggle-recurring .wpforms-toggle-control > input").is(":checked")&&(e.prop("checked",!1),o.alert({title:wpforms_builder.heads_up,content:e.attr("name").includes("enable_recurring")?wpforms_builder_payments_utils.payments_disabled_recurring:wpforms_builder_payments_utils.payments_disabled_one_time,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"]}}})),e.closest(".wpforms-panel-content-section-payment")),e=e.prop("checked")&&!o("#wpforms-panel-field-settings-disable_entries").prop("checked");n.find(".wpforms-panel-content-section-payment-toggled-body").toggle(e),n.toggleClass("wpforms-panel-content-section-payment-open",e)},checkPlanName(){var e,n=o(this),t=n.closest(".wpforms-panel-content-section-payment-plan").find(".wpforms-panel-content-section-payment-plan-head-title");n.val()?t.html(n.val()):(e=wpforms_builder_payments_utils.payments_plan_placeholder,t.html(e),n.val(e))},togglePlan(){var e=o(this).closest(".wpforms-panel-content-section-payment-plan"),n=e.find(".wpforms-panel-content-section-payment-plan-head-buttons-toggle");n.toggleClass("fa-chevron-circle-up fa-chevron-circle-down"),e.find(".wpforms-panel-content-section-payment-plan-body").toggle(n.hasClass("fa-chevron-circle-down"))},deletePlan(){o(this).closest(".wpforms-panel-content-section-payment").find(".wpforms-panel-content-section-payment-button-add-plan").trigger("click")},renamePlan(){var e=o(this),n=e.closest(".wpforms-panel-content-section-payment-plan").find(".wpforms-panel-content-section-payment-plan-head-title");e.val()?n.html(e.val()):n.html("")}}))((document,window,jQuery)); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/admin/builder/providers.js b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/providers.js new file mode 100755 index 00000000..5d57ad76 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/admin/builder/providers.js @@ -0,0 +1,1159 @@ +/* global wpforms_builder, wpforms_builder_providers, wpf */ + +// noinspection ES6ConvertVarToLetConst +var WPForms = window.WPForms || {}; // eslint-disable-line no-var +WPForms.Admin = WPForms.Admin || {}; +WPForms.Admin.Builder = WPForms.Admin.Builder || {}; + +/** + * @param wpforms_builder_providers.custom_fields_placeholder + */ + +/** + * WPForms Providers module. + * + * @since 1.4.7 + */ +WPForms.Admin.Builder.Providers = WPForms.Admin.Builder.Providers || ( function( document, window, $ ) { + /** + * Private functions and properties. + * + * @since 1.4.7 + * + * @type {Object} + */ + const __private = { + + /** + * Flag to determine if we have a new connection which is unsaved. + * + * @since 1.9.6 + * + * @type {boolean} + */ + hasUnsavedNewConnection: false, + + /** + * Internal cache storage. + * Do not use it directly, but app.cache.{(get|set|delete|clear)()} instead. + * Key is the provider slug, value is a Map, that will have its own key as a connection id (or not). + * + * @since 1.4.7 + * + * @type {Object.} + */ + cache: {}, + + /** + * Config contains all configuration properties. + * + * @since 1.4.7 + * + * @type {Object.} + */ + config: { + + /** + * List of default templates that should be compiled. + * + * @since 1.4.7 + * + * @type {string[]} + */ + templates: [ + 'wpforms-providers-builder-content-connection-fields', + 'wpforms-providers-builder-content-connection-conditionals', + ], + }, + + /** + * Form fields for the current state. + * + * @since 1.6.1.2 + * + * @type {Object} + */ + fields: {}, + }; + + /** + * Public functions and properties. + * + * @since 1.4.7 + * + * @type {Object} + */ + const app = { + + /** + * Panel holder. + * + * @since 1.5.9 + * + * @type {Object} + */ + panelHolder: {}, + + /** + * Form holder. + * + * @since 1.4.7 + * + * @type {Object} + */ + form: $( '#wpforms-builder-form' ), + + /** + * Spinner HTML. + * + * @since 1.4.7 + * + * @type {Object} + */ + spinner: '', + + /** + * All ajax requests are grouped together with own properties. + * + * @since 1.4.7 + */ + ajax: { + + /** + * Merge a custom AJAX data object with defaults. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider + * + * @param {string} provider Current provider slug. + * @param {Object} custom Ajax data object with custom settings. + * + * @return {Object} Ajax data. + */ + _mergeData( provider, custom ) { + const data = { + id: app.form.data( 'id' ), + // eslint-disable-next-line camelcase + revision_id: app.form.data( 'revision' ), + nonce: wpforms_builder.nonce, + action: 'wpforms_builder_provider_ajax_' + provider, + }; + + $.extend( data, custom ); + + return data; + }, + + /** + * Make an AJAX request. It's basically a wrapper around jQuery.ajax, but with some defaults. + * + * @since 1.4.7 + * + * @param {string} provider Current provider slug. + * @param {*} custom Object of user-defined $.ajax()-compatible parameters. + * + * @return {Promise} Promise. + */ + request( provider, custom ) { + const $holder = app.getProviderHolder( provider ), + $lock = $holder.find( '.wpforms-builder-provider-connections-save-lock' ), + $addNewConnectionBtn = $holder.find( '.js-wpforms-builder-provider-connection-add' ), + isInitialConnectionsGetTask = custom?.data?.task === 'connections_get'; + + const params = { + url: wpforms_builder.ajax_url, + type: 'post', + dataType: 'json', + beforeSend() { + $holder.addClass( 'loading' ); + + // Disable the "Add new connection" button for initial get connections request to prevent interaction before the data is ready. + if ( isInitialConnectionsGetTask ) { + $addNewConnectionBtn.addClass( 'wpforms-disabled' ); + } + + $lock.val( 1 ); + app.ui.getProviderError( provider ).hide(); + }, + }; + + // Hidden class is used only for initial get connections request when connections are not set yet. + if ( ! isInitialConnectionsGetTask ) { + $holder.find( '.wpforms-builder-provider-title-spinner' ).removeClass( 'wpforms-hidden' ); + } + + custom.data = app.ajax._mergeData( provider, custom.data || {} ); + $.extend( params, custom ); + + // noinspection SpellCheckingInspection, JSUnusedLocalSymbols + return $.ajax( params ) + .fail( function( jqXHR, textStatus, errorThrown ) { // eslint-disable-line no-unused-vars + /* + * Right now we are logging into the browser console. + * In the future, that might be better. + */ + console.error( 'provider:', provider ); // eslint-disable-line no-console + console.error( jqXHR ); // eslint-disable-line no-console + console.error( textStatus ); // eslint-disable-line no-console + + $lock.val( 1 ); + app.ui.showError( provider ); + } ) + .always( function( dataOrjqXHR, textStatus, jqXHROrerrorThrown ) { // eslint-disable-line no-unused-vars + $holder.removeClass( 'loading' ); + } ) + .done( function() { + $lock.val( 0 ); + // Enable the "Add new connection" button for initial get connections request when the data is successfully loaded. + if ( isInitialConnectionsGetTask ) { + $addNewConnectionBtn.removeClass( 'wpforms-disabled' ); + } + } ); + }, + }, + + /** + * Temporary in-memory cache handling for all providers. + * + * @since 1.4.7 + */ + cache: { + + /** + * Get the value from cache by key. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @param {string} provider Current provider slug. + * @param {string} key Cache key. + * + * @return {*} Null if some error occurs. + */ + get( provider, key ) { + if ( + typeof __private.cache[ provider ] === 'undefined' || + ! ( __private.cache[ provider ] instanceof Map ) + ) { + return null; + } + + return __private.cache[ provider ].get( key ); + }, + + /** + * Get the value from cache by key and an ID. + * Useful when an Object is stored under a key, and we need specific value. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @param {string} provider Current provider slug. + * @param {string} key Cache key. + * @param {string} id Cached object ID. + * + * @return {*} Null if some error occurs. + */ + getById( provider, key, id ) { + if ( typeof this.get( provider, key ) === 'undefined' || typeof this.get( provider, key )[ id ] === 'undefined' ) { + return null; + } + + return this.get( provider, key )[ id ]; + }, + + /** + * Save the data to cache. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @param {string} provider Current provider slug. + * @param {string} key Intended to be a string, but can be everything that Map supports as a key. + * @param {*} value Data you want to save in cache. + * + * @return {Map} All the cache for the provider. IE11 returns 'undefined' for an undefined reason. + */ + set( provider, key, value ) { + if ( + typeof __private.cache[ provider ] === 'undefined' || + ! ( __private.cache[ provider ] instanceof Map ) + ) { + __private.cache[ provider ] = new Map(); + } + + return __private.cache[ provider ].set( key, value ); + }, + + /** + * Add the data to cache to a particular key. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @example app.cache.as('provider').addTo('connections', connection_id, connection); + * + * @param {string} provider Current provider slug. + * @param {string} key Intended to be a string, but can be everything that Map supports as a key. + * @param {string} id ID for a value that should be added to a certain key. + * @param {*} value Data you want to save in cache. + * + * @return {Map} All the cache for the provider. IE11 returns 'undefined' for an undefined reason. + */ + addTo( provider, key, id, value ) { + if ( + typeof __private.cache[ provider ] === 'undefined' || + ! ( __private.cache[ provider ] instanceof Map ) + ) { + __private.cache[ provider ] = new Map(); + this.set( provider, key, {} ); + } + + const data = this.get( provider, key ); + data[ id ] = value; + + return this.set( + provider, + key, + data + ); + }, + + /** + * Delete the cache by key. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @param {string} provider Current provider slug. + * @param {string} key Cache key. + * + * @return {boolean|null} True on success, null on data holder failure, false on error. + */ + delete( provider, key ) { + if ( + typeof __private.cache[ provider ] === 'undefined' || + ! ( __private.cache[ provider ] instanceof Map ) + ) { + return null; + } + + return __private.cache[ provider ].delete( key ); + }, + + /** + * Delete particular data from a certain key. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @example app.cache.as('provider').deleteFrom('connections', connection_id); + * + * @param {string} provider Current provider slug. + * @param {string} key Intended to be a string, but can be everything that Map supports as a key. + * @param {string} id ID for a value that should be deleted from a certain key. + * + * @return {Map} All the cache for the provider. IE11 returns 'undefined' for an undefined reason. + */ + deleteFrom( provider, key, id ) { + if ( + typeof __private.cache[ provider ] === 'undefined' || + ! ( __private.cache[ provider ] instanceof Map ) + ) { + return null; + } + + const data = this.get( provider, key ); + + delete data[ id ]; + + return this.set( + provider, + key, + data + ); + }, + + /** + * Clear all the cache data. + * + * @since 1.4.7 + * @since 1.5.9 Added a new parameter - provider. + * + * @param {string} provider Current provider slug. + */ + clear( provider ) { + if ( + typeof __private.cache[ provider ] === 'undefined' || + ! ( __private.cache[ provider ] instanceof Map ) + ) { + return; + } + + __private.cache[ provider ].clear(); + }, + }, + + /** + * Start the engine. DOM is not ready yet, use only to init something. + * + * @since 1.4.7 + */ + init() { + // Do that when DOM is ready. + $( app.ready ); + }, + + /** + * DOM is fully loaded. + * Should be hooked into in addons; that need to work with DOM, templates, etc. + * + * @since 1.4.7 + * @since 1.6.1.2 Added initialization for `__private.fields` property. + */ + ready() { + // Save a current form fields state. + __private.fields = $.extend( {}, wpf.getFields( false, true ) ); + + app.panelHolder = $( '#wpforms-panel-providers, #wpforms-panel-settings' ); + + app.Templates = WPForms.Admin.Builder.Templates; + app.Templates.add( __private.config.templates ); + + app.bindActions(); + app.ui.bindActions(); + + app.panelHolder.trigger( 'WPForms.Admin.Builder.Providers.ready' ); + }, + + /** + * Process all generic actions/events, mostly custom that were fired by our API. + * + * @since 1.4.7 + * @since 1.6.1.2 Added a calling `app.updateMapSelects()` method. + */ + bindActions() { + // On Form save - notify user about required fields. + $( document ).on( 'wpformsSaved', function() { + __private.hasUnsavedNewConnection = false; + + const $connectionBlocks = app.panelHolder.find( '.wpforms-builder-provider-connection' ); + + if ( ! $connectionBlocks.length ) { + return; + } + + // We need to show him "Required fields empty" popup only once. + let isShownOnce = false; + + $connectionBlocks.each( function() { + let isRequiredEmpty = false; + + // Do actually require fields checking. + $( this ).find( 'input.wpforms-required, select.wpforms-required, textarea.wpforms-required' ).each( function() { + const $this = $( this ), + value = $this.val(); + + if ( _.isEmpty( value ) && ! $this.closest( '.wpforms-builder-provider-connection-block' ).hasClass( 'wpforms-hidden' ) ) { + $( this ).addClass( 'wpforms-error' ); + isRequiredEmpty = true; + + return; + } + + $( this ).removeClass( 'wpforms-error' ); + } ); + + // Notify user. + if ( isRequiredEmpty && ! isShownOnce ) { + const $titleArea = $( this ).closest( '.wpforms-builder-provider' ).find( '.wpforms-builder-provider-title' ).clone(); + $titleArea.find( 'button' ).remove(); + const msg = wpforms_builder.provider_required_flds; + + $.alert( { + title: wpforms_builder.heads_up, + content: msg.replace( '{provider}', '' + $titleArea.text().trim() + '' ), + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + } ); + + // Save that we have already showed the user, so we won't bug it anymore. + isShownOnce = true; + } + } ); + + // On the "Fields" page additional update provider's field mapped items. + if ( 'fields' === wpf.getQueryString( 'view' ) ) { + app.updateMapSelects( $connectionBlocks ); + } + } ); + + $( document ).on( 'wpformsFieldUpdate', function() { + const $connectionBlocks = app.panelHolder.find( '.wpforms-builder-provider-connection' ); + + app.updateMapSelects( $connectionBlocks ); + } ); + + app.panelHolder.on( 'connectionCreate', function() { + __private.hasUnsavedNewConnection = true; + } ); + + /* + * Update form state when each connection is loaded into the DOM. + * This will prevent a please-save-prompt from appearing when navigating + * out and back to the Marketing or Settings tab without doing any changes anywhere. + */ + app.panelHolder.on( 'connectionGeneralSettingsRendered connectionRendered', function( e, provider ) { + if ( typeof provider !== 'string' ) { + return; + } + + if ( __private.hasUnsavedNewConnection ) { + return; + } + + // We need to save the form next tick to ensure that JS fields are already initialized. + setTimeout( () => { + const currentState = wpf._getCurrentFormState(); + + for ( const [ key, value ] of Object.entries( currentState ) ) { + // What it matches: + // - `[provider]` + // - `provider[` + const providerRegex = new RegExp( `\\[?${ provider }[\\[\\]]` ); + + if ( providerRegex.test( key ) && typeof wpf.savedFormState[ key ] === 'undefined' ) { + wpf.savedFormState[ key ] = value; + } + } + }, 0 ); + } ); + }, + + /** + * Update selects for mapping if any form fields were added, deleted or changed. + * + * @since 1.6.1.2 + * + * @param {Object} $connections jQuery selector for active connections. + */ + // eslint-disable-next-line max-lines-per-function + updateMapSelects( $connections ) { + const fields = $.extend( {}, wpf.getFields() ); + + // We should detect changes for labels only. + + // noinspection JSUnusedLocalSymbols + const currentSaveFields = _.mapObject( fields, function( field, key ) { // eslint-disable-line no-unused-vars + return field.label; + } ); + + // noinspection JSUnusedLocalSymbols + const prevSaveFields = _.mapObject( __private.fields, function( field, key ) { // eslint-disable-line no-unused-vars + return field.label; + } ); + + // Check if a form has any fields and if they have changed labels after a previous saving process. + if ( + ( _.isEmpty( currentSaveFields ) && _.isEmpty( prevSaveFields ) ) || + ( JSON.stringify( currentSaveFields ) === JSON.stringify( prevSaveFields ) ) + ) { + return; + } + + // Prepare a current form field IDs. + const fieldIds = Object.keys( currentSaveFields ) + .map( function( id ) { + return parseInt( id, 10 ); + } ); + + // Determine deleted field IDs - it's a diff between previous and current form state. + const deleted = Object.keys( prevSaveFields ) + .map( function( id ) { + return parseInt( id, 10 ); + } ) + .filter( function( id ) { + return ! fieldIds.includes( id ); + } ); + + // Remove from mapping selects "deleted" fields. + for ( let index = 0; index < deleted.length; index++ ) { + $( '.wpforms-builder-provider-connection-fields-table .wpforms-builder-provider-connection-field-value option[value="' + deleted[ index ] + '"]', $connections ).remove(); + } + + const options = []; + const optionsWithSubfields = []; + + for ( const orderNumber in fields ) { + const field = fields[ orderNumber ]; + const id = field.id; + const type = field.type; + const label = wpf.sanitizeHTML( field.label?.toString().trim() || wpforms_builder.field + ' #' + id ); + + options.push( { value: id, text: label, type } ); + + if ( 'name' !== field.type || ! field.format ) { + optionsWithSubfields.push( { value: id, text: label } ); + + continue; + } + + $.each( wpforms_builder.name_field_formats, function( valueSlug, formatLabel ) { + if ( -1 !== field.format.indexOf( valueSlug ) || valueSlug === 'full' ) { + optionsWithSubfields.push( { value: field.id + '.' + valueSlug, text: label + ' (' + formatLabel + ')' } ); + } + } ); + } + + // Add ability to filter options for providers before rendering them. + app.panelHolder.trigger( 'WPForms.Admin.Builder.Providers.FilterOptions', [ options ] ); + app.panelHolder.trigger( 'WPForms.Admin.Builder.Providers.FilterOptionsWithSubfields', [ optionsWithSubfields ] ); + $( '.wpforms-builder-provider-connection-fields-table .wpforms-builder-provider-connection-field-value' ).each( function() { + const $select = $( this ); + const value = $select.val(); + const $newSelect = $select.clone().empty(); + // Some providers have their own implementation of first/last name subfields + // and don't have the support-subfields attribute. + const isSupportSubfields = $select.data( 'support-subfields' ) || Boolean( $select.find( 'option[value$=".first"]' ).length ); + const newOptions = isSupportSubfields ? optionsWithSubfields : options; + const placeholder = $select.data( 'placeholder' ) && $select.data( 'placeholder' ).length ? $select.data( 'placeholder' ) : wpforms_builder_providers.custom_fields_placeholder; + + $newSelect.append( $( '
            '),i.render(t,{sitekey:e,callback(){wpformsRecaptchaCallback(p("#"+t))}})}},amountTotal(e,t){t=t||!1;let r=p(e),a=r.closest(".wpforms-form"),o=m.amountTotalCalc(a);if(m.allowAmountTotalCalc(a,r,o)){let e=m.amountFormatSymbol(o);a.find(".wpforms-payment-total").each(function(){"hidden"===p(this).attr("type")||"text"===p(this).attr("type")?(p(this).val(e),"text"===p(this).attr("type")&&t&&a.data("validator")&&p(this).valid()):p(this).text(e)}),m.updateOrderSummaryItems(a,r,e)}},allowAmountTotalCalc(e,t,r){var e=e.data("formid");return m.getCache(e,"amountTotal")!==r?(m.updateCache(e,"amountTotal",r),!0):"radio"===(e=t.prop("type"))||"select-one"===e||"checkbox"===e},updateOrderSummaryItems(e,t,r){var a=e.find(".wpforms-order-summary-preview");if(0!==a.length){let o=e.find(".wpforms-payment-price");a.each(function(){let a=p(this),e=(""!==r&&a.find(".wpforms-order-summary-preview-total .wpforms-order-summary-item-price").text(r),t=>{let r=Math.min(t+10,o.length);for(let e=t;ee(r),0)});e(0)})}},updateCache(e,t,r){m.cache[e]=m.cache[e]||{},m.cache[e][t]=r},getCache(e,t){return!(!Object.prototype.hasOwnProperty.call(m.cache,e)||!Object.prototype.hasOwnProperty.call(m.cache[e],t))&&m.cache[e][t]},updateOrderSummaryItem(o,i){if(o.hasClass("wpforms-payment-price")){let t=o.closest(".wpforms-field"),e=t.data("field-id"),r=o.prop("type"),a="block"===t.css("display");var s,n;"checkbox"===r||"radio"===r||"select-one"===r?i.find(`tr[data-field="${e}"]`).each(function(){var e=p(this).data("choice"),e="select-one"===r?e===parseInt(t.find("select").val(),10):t.find(`input[value="${e}"]`).is(":checked");p(this).toggle(a&&e)}):(s=i.find(`tr[data-field="${e}"]`),n=o.val(),s.find(".wpforms-order-summary-item-price").text(m.amountFormatSymbol(m.amountSanitize(n))),s.toggle(a)),t.hasClass("wpforms-payment-quantities-enabled")?m.updateOrderSummaryItemQuantity(o):(m.updateSummaryPriceWidth(i),m.toggleSummaryPlaceholder(i))}},updateOrderSummaryItemQuantity(e){let t=e.closest(".wpforms-field"),a=t.find("input.wpforms-payment-price, select.wpforms-payment-price"),r=e.closest(".wpforms-form"),o=t.data("field-id"),i=m.getPaymentFieldQuantity(a),s=m.getPaymentFieldAmount(a),n=a.prop("type");r.find(".wpforms-order-summary-preview").each(function(){var e,t=p(this);let r;(r="checkbox"===n||"radio"===n||"select-one"===n?(e=a.val(),t.find(`tr[data-field="${o}"][data-choice="${e}"]`)):t.find(`tr[data-field="${o}"]`)).toggle(0'),e.append(''),e.get(0).submit())},formHasCaptcha(e){return!(!e||!e.length||"undefined"==typeof hcaptcha&&"undefined"==typeof grecaptcha&&"undefined"==typeof turnstile)&&(e=e.find(".wpforms-recaptcha-container"),Boolean(e.length))},resetFormRecaptcha(r){if(m.formHasCaptcha(r)){var a=r.find(".wpforms-recaptcha-container");let e,t;e=a.hasClass("wpforms-is-hcaptcha")?hcaptcha:a.hasClass("wpforms-is-turnstile")?turnstile:grecaptcha,t=r.find(".wpforms-submit").get(0).recaptchaID,m.empty(t)&&0!==t&&(a=r.find(".g-recaptcha, .h-captcha, .cf-turnstile")).length&&(t=a.data("recaptcha-id")),m.empty(t)&&0!==t||e.reset(t)}},consoleLogAjaxError(e){e?console.error("WPForms AJAX submit error:\n%s",e):console.error("WPForms AJAX submit error")},displayFormAjaxErrors(e,t){"string"==typeof t?m.displayFormAjaxGeneralErrors(e,t):(t=t&&"errors"in t?t.errors:null,m.empty(t)||m.empty(t.general)&&m.empty(t.field)?m.consoleLogAjaxError():(m.empty(t.general)||m.displayFormAjaxGeneralErrors(e,t.general),m.empty(t.field)||m.displayFormAjaxFieldErrors(e,t.field)))},displayFormAjaxGeneralErrors(e,t){var r,a;e&&e.length&&(m.empty(t)||(m.isModernMarkupEnabled()&&e.attr({"aria-invalid":"true","aria-errormessage":""}),"string"==typeof t?(a=m.isModernMarkupEnabled()?' role="alert"':"",r=m.isModernMarkupEnabled()?`${wpforms_settings.formErrorMessagePrefix}`:"",e.find(".wpforms-submit-container").before(`
            ${r}${t}
            `),m.setCurrentPage(e,{})):(a=e.data("formid"),m.printGeneralErrors(e,t,a))))},printGeneralErrors(o,e,i){p.each(e,function(e,t){switch(e){case"header":case"header_styled":o.prepend(t);break;case"footer":case"footer_styled":r=t,0===o.find(".wpforms-page-indicator").length?o.find(".wpforms-submit-container").before(r):o.find(".wpforms-page-1").append(r);break;case"recaptcha":r=t,o.find(".wpforms-recaptcha-container").append(r)}var r,a;m.isModernMarkupEnabled()&&(a=o.attr("aria-errormessage")||"",o.attr("aria-errormessage",a+` wpforms-${i}-${e}-error`))}),o.find(".wpforms-error-container").length&&m.animateScrollTop(o.find(".wpforms-error-container").first().offset().top-100)},clearFormAjaxGeneralErrors(e){e.find(".wpforms-error-container").remove(),e.find("#wpforms-field_recaptcha-error").remove(),m.isModernMarkupEnabled()&&e.attr({"aria-invalid":"false","aria-errormessage":""})},displayFormAjaxFieldErrors(a,o){var e;a&&a.length&&(m.empty(o)||(e=a.data("validator"))&&(o=m.splitFieldErrors(o),p.each(o,function(e,t){var r=p('[name="'+e+'"]',a);r.length?r.attr("data-server-error",t):delete o[e]}),e.showErrors(o),m.formHasCaptcha(a)||e.focusInvalid()))},splitFieldErrors:i=>(p.each(i,function(o,e){"string"!=typeof e&&p.each(e,function(e,t){var r=o.split("[").pop().replace("]",""),a=o.replace("["+r+"]","");r===e?i[o]=t:"string"==typeof e&&isNaN(e)&&(i[a+"["+e+"]"]=t)})}),i),formSubmitAjax:a=>{if(!a.length)return p.Deferred().reject();let r=a.closest(".wpforms-container"),e=a.find(".wpforms-submit-spinner"),o;r.css("opacity",.6),e.show(),m.clearFormAjaxGeneralErrors(a);var t=new FormData(a.get(0)),t=(t.append("action","wpforms_submit"),t.append("start_timestamp",m.getStartTimestampData(a)),t.append("end_timestamp",m.getTimestampSec()),{type:"post",dataType:"json",url:wpforms_settings.ajaxurl,data:t,cache:!1,contentType:!1,processData:!1});return t.success=function(e){var t;if(e)if(e.data&&e.data.action_required)a.trigger("wpformsAjaxSubmitActionRequired",e);else if(e.success){if(a.trigger("wpformsAjaxSubmitSuccess",e),e.data)return e.data.redirect_url?(t=e.data.new_tab||!1,a.trigger("wpformsAjaxSubmitBeforeRedirect",e),t?(d.open(e.data.redirect_url,"_blank"),void location.reload()):void(d.location=e.data.redirect_url)):void(e.data.confirmation&&(r.html(e.data.confirmation),o=r.find("div.wpforms-confirmation-scroll"),r.trigger("wpformsAjaxSubmitSuccessConfirmation",e),o.length)&&m.animateScrollTop(o.offset().top-100))}else m.resetFormRecaptcha(a),m.displayFormAjaxErrors(a,e.data),a.trigger("wpformsAjaxSubmitFailed",e),m.setCurrentPage(a,e.data);else m.consoleLogAjaxError()},t.error=function(e,t,r){m.consoleLogAjaxError(r),a.trigger("wpformsAjaxSubmitError",[e,t,r])},t.complete=function(e,t){e.responseJSON&&e.responseJSON.data&&(e.responseJSON.data.action_required||"success"===t&&e.responseJSON.data.redirect_url)||(m.restoreSubmitButton(a,r),a.trigger("wpformsAjaxSubmitCompleted",[e,t]))},WPFormsUtils.triggerEvent(a,"wpformsAjaxBeforeSubmit",[a]).isDefaultPrevented()?(m.restoreSubmitButton(a,r),p.Deferred().reject()):p.ajax(t)},setCurrentPage(a,o){if(0!==a.find(".wpforms-page-indicator").length){let r=[];if(a.find(".wpforms-page").each(function(e,t){if(1<=p(t).find(".wpforms-has-error").length)return r.push(p(t))}),0!==r.length||void 0===o.errors||void 0===o.errors.general||void 0!==o.errors.general.footer||void 0===o.errors.general.recaptcha){var i=0=1e3*wpforms_settings.token_cache_lifetime&&!this.isUpdatingToken},updateToken(t,r,a){var e=r.data("formid");let o=r.find(".wpforms-submit");this.isUpdatingToken=!0,o.prop("disabled",!0),p.post(wpforms_settings.ajaxurl,{action:"wpforms_get_token",formId:e}).done(function(e){e.success?(r.attr("data-token-time",t),r.attr("data-token",e.data.token),o.prop("disabled",!1),a.target===o[0]&&o.trigger("click")):console.error("Failed to update token: ",e)}).fail(function(e,t,r){console.error("AJAX request failed: ",t,r)}).always(function(){this.isUpdatingToken=!1,o.prop("disabled",!1)}.bind(this))},restoreSubmitButtonOnEventPersisted(){d.onpageshow=function(e){e.persisted&&p(".wpforms-form").each(function(){var e=p(this);m.restoreSubmitButton(e,e.closest(".wpforms-container"))})}},loadValidationGroups(e){var t=e.closest(".wpforms-form").data("validator");t&&p.extend(t.groups,m.getDateTimeValidationGroups(e))},getDateTimeValidationGroups(e){let a={};return e.find(".wpforms-field.wpforms-field-date-time").each(function(){var e=p(this);if(e.find(".wpforms-field-date-dropdown-wrap").length){let r=e.attr("id").replace("-container","");p.each(["month","day","year"],function(e,t){t=p(`#${r}-`+t).attr("name");a[t]=r})}}),a},getTimestampSec(){return Math.floor(Date.now()/1e3)},lockField(e){var t=e.data("field-type");(wpforms_settings.readOnlyDisallowedFields??[]).includes(t)||(e.addClass(a).find("input, textarea, select:not(.wpforms-field-select-style-modern)").prop("readonly",!0).attr("tabindex","-1"),e.hasClass("wpforms-field-select-style-modern")?((t=e.find("select")).data("choicesjs")?.disable(),t.removeAttr("disabled")):e.hasClass("wpforms-field-richtext")&&d.WPFormsRichTextField?.lockField(e))},unlockField(e){e.removeClass(a).find("input, textarea, select:not(.wpforms-field-select-style-modern)").prop("readonly",!1).attr("tabindex",null),e.hasClass("wpforms-field-select-style-modern")?e.find("select").data("choicesjs")?.enable():e.hasClass("wpforms-field-richtext")&&d.WPFormsRichTextField?.unlockField(e)},readOnlyFieldsInit(){p(".wpforms-field."+a).each(function(){m.lockField(p(this))})},field:{lock(e,t){m.lockField(p(`#wpforms-${e}-field_${t}-container`))},unlock(e,t){m.unlockField(p(`#wpforms-${e}-field_${t}-container`))},toggle(e,t,r="auto"){e=p(`#wpforms-${e}-field_${t}-container`),t=e.hasClass(a);("auto"===r?!t:r)?m.lockField(e):m.unlockField(e)},isLocked(e,t){return p(`#wpforms-${e}-field_${t}-container`).hasClass(a)},lockAll(e){p(`#wpforms-${e} .wpforms-field`).each(function(){m.lockField(p(this))})},unlockAll(e){p("#wpforms-"+e).find(".wpforms-field").each(function(){m.unlockField(p(this))})}}};return m})(document,window,jQuery);wpforms.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.js new file mode 100755 index 00000000..b124275d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.js @@ -0,0 +1,170 @@ +/* global wpforms_ai_chat_element */ + +/** + * @param wpforms_ai_chat_element.ajaxurl + * @param wpforms_ai_chat_element.errors.network + * @param wpforms_ai_chat_element.errors.default + */ + +/** + * The WPForms AI API wrapper. + * + * @since 1.9.1 + * + * @return {Function} The app cloning function. + */ +export default function() { // eslint-disable-line no-unused-vars, max-lines-per-function + /** + * Public functions and properties. + * + * @since 1.9.1 + * + * @type {Object} + */ + const app = { + /** + * AI chat mode. + * + * @since 1.9.1 + * + * @type {string} + */ + mode: '', + + /** + * AI AJAX actions. + * + * @since 1.9.1 + * + * @type {Object} + */ + actions: { + rate: 'wpforms_rate_ai_response', + choices: 'wpforms_get_ai_choices', + forms: 'wpforms_get_ai_form', + }, + + /** + * AJAX request. + * + * @param {Object} data Data to send. + * + * @return {Promise} The fetch result data promise. + */ + // eslint-disable-next-line complexity + async ajax( data ) { + if ( ! data.nonce ) { + data.nonce = wpforms_ai_chat_element.nonce; + } + + const options = { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: new URLSearchParams( data ).toString(), + }; + + const response = await fetch( wpforms_ai_chat_element.ajaxurl, options ) + .catch( ( error ) => { + if ( error.message === 'Failed to fetch' ) { + throw new Error( wpforms_ai_chat_element.errors.network ); + } else { + throw new Error( error.message ); + } + } ); + + if ( ! response.ok ) { + throw new Error( wpforms_ai_chat_element.errors.network ); + } + + const result = await response.json(); + + if ( ! result.success || result.data?.error ) { + throw new Error( + result.data?.error ?? wpforms_ai_chat_element.errors.default, + { + cause: result.data?.code ?? 400, + } ); + } + + return result.data; + }, + + /** + * Prompt. + * + * @param {string} prompt The question to ask. + * @param {string} sessionId Session ID. + * + * @return {Promise} The response data in promise. + */ + async prompt( prompt, sessionId ) { + const data = { + action: app.actions[ this.mode ] ?? app.actions.choices, + prompt, + }; + + if ( sessionId ) { + data.session_id = sessionId; // eslint-disable-line camelcase + } + + return app.ajax( data ); + }, + + /** + * Rate. + * + * @param {boolean} helpful Whether the response was helpful or not. + * @param {string} responseId Response ID. + * + * @return {Promise} The response data in promise. + */ + async rate( helpful, responseId ) { + const data = { + action: app.actions.rate, + helpful, + response_id: responseId, // eslint-disable-line camelcase + }; + + return app.ajax( data ); + }, + + setUp() { + app.actions = { + ...app.actions, + ...wpforms_ai_chat_element.actions, + }; + + return this; + }, + + /** + * Set the AI chat mode. + * + * @since 1.9.1 + * + * @param {string} mode The mode to set. + * + * @return {Object} The app object. + */ + setMode( mode ) { + this.mode = mode; + + return this; + }, + }; + + /** + * Return a clone of an app object. + * + * @since 1.9.1 + * + * @param {string} mode The AI prompt mode. + * + * @return {Object} Cloned app object. + */ + return function( mode ) { + const obj = { ...app }; + + return obj.setUp().setMode( mode ); + }; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.min.js new file mode 100755 index 00000000..74609196 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/api.min.js @@ -0,0 +1 @@ +export default function(){let t={mode:"",actions:{rate:"wpforms_rate_ai_response",choices:"wpforms_get_ai_choices",forms:"wpforms_get_ai_form"},async ajax(e){e.nonce||(e.nonce=wpforms_ai_chat_element.nonce);e={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(e).toString()},e=await fetch(wpforms_ai_chat_element.ajaxurl,e).catch(e=>{throw"Failed to fetch"===e.message?new Error(wpforms_ai_chat_element.errors.network):new Error(e.message)});if(!e.ok)throw new Error(wpforms_ai_chat_element.errors.network);e=await e.json();if(!e.success||e.data?.error)throw new Error(e.data?.error??wpforms_ai_chat_element.errors.default,{cause:e.data?.code??400});return e.data},async prompt(e,r){e={action:t.actions[this.mode]??t.actions.choices,prompt:e};return r&&(e.session_id=r),t.ajax(e)},async rate(e,r){e={action:t.actions.rate,helpful:e,response_id:r};return t.ajax(e)},setUp(){return t.actions={...t.actions,...wpforms_ai_chat_element.actions},this},setMode(e){return this.mode=e,this}};return function(e){return{...t}.setUp().setMode(e)}} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.js new file mode 100755 index 00000000..b364c97c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.js @@ -0,0 +1,319 @@ +/* global WPFormsAIChatHTMLElement, WPFormsBuilder, wpf, wpforms_builder */ + +/** + * The WPForms AI chat element. + * + * Choices helpers module. + * + * @since 1.9.1 + * + * @param {WPFormsAIChatHTMLElement} chat The chat element. + * + * @return {Object} The choices' helpers object. + */ +export default function( chat ) { // eslint-disable-line max-lines-per-function + /** + * The `choices` mode helpers object. + * + * @since 1.9.1 + */ + return { + /** + * Get the `choices` answer based on AI response data. + * + * @since 1.9.1 + * + * @param {Object} response The response data. + * + * @return {string} Answer HTML markup. + */ + getAnswer( response ) { + if ( response.choices?.length < 1 ) { + return ''; + } + + const li = []; + + for ( const i in response.choices ) { + li.push( ` +
          • + ${ chat.htmlSpecialChars( response.choices[ i ] ) } +
          • + ` ); + } + + let answerHtml = ` +

            ${ chat.htmlSpecialChars( response.heading ?? '' ) }

            +
              + ${ li.join( '' ) } +
            + `; + + // Add footer to the first answer only. + if ( ! chat.sessionId ) { + answerHtml += `${ chat.modeStrings.footer }`; + } + + return answerHtml; + }, + + /** + * Get the answer pre-buttons HTML markup. + * + * @since 1.9.1 + * + * @return {string} The answer pre-buttons HTML markup. + */ + getAnswerButtonsPre() { + return ` + + `; + }, + + /** + * Get the warning message HTML markup. + * + * @since 1.9.1 + * + * @return {string} The warning message HTML markup. + */ + getWarningMessage() { + // Trigger event before warning message insert. + chat.triggerEvent( 'wpformsAIModalBeforeWarningMessageInsert', { fieldId: chat.fieldId } ); + + return `
            +
            +
            + ${ chat.modeStrings.warning } +
            +
            `; + }, + + /** + * If the field has default choices, the welcome screen is active. + * + * @since 1.9.1 + * + * @return {boolean} True if the field has default choices, false otherwise. + */ + isWelcomeScreen() { + const items = document.getElementById( `wpforms-field-option-row-${ chat.fieldId }-choices` ) + .querySelectorAll( 'li input.label' ); + + if ( items.length === 1 && ! items[ 0 ].value.trim() ) { + return true; + } + + if ( items.length > 3 ) { + return false; + } + + const defaults = Object.values( chat.modeStrings.defaults ); + + for ( let i = 0; i < items.length; i++ ) { + if ( ! defaults.includes( items[ i ].value ) ) { + return false; + } + } + + return true; + }, + + /** + * Add the `choices` answer. + * + * @since 1.9.1 + * + * @param {HTMLElement} element The answer element. + */ + addedAnswer( element ) { + const button = element.querySelector( '.wpforms-ai-chat-choices-insert' ); + + // Listen to the button click event. + button?.addEventListener( 'click', this.insertButtonClick.bind( this ) ); + }, + + /** + * Sanitize response. + * + * @since 1.9.2 + * + * @param {Object} response The response data to sanitize. + * + * @return {Object} The sanitized response. + */ + sanitizeResponse( response ) { + if ( ! Array.isArray( response?.choices ) ) { + return response; + } + + let choices = response.choices; + + // Sanitize choices. + choices = choices.map( ( choice ) => { + return wpf.sanitizeHTML( choice, wpforms_builder.allowed_label_html_tags ); + } ); + + // Remove empty choices. + response.choices = choices.filter( ( choice ) => { + return choice.trim() !== ''; + } ); + + return response; + }, + + /** + * Check if the response has a prohibited code. + * + * @since 1.9.2 + * + * @param {Object} response The response data. + * @param {Array} sanitizedResponse The sanitized response data. + * + * @return {boolean} Whether the answer has a prohibited code. + */ + hasProhibitedCode( response, sanitizedResponse ) { + // If the number of choices has changed after sanitization, it means that the answer contains prohibited code. + return sanitizedResponse?.choices?.length !== response?.choices?.length; + }, + + /** + * Click on the Use Choices button. + * + * @since 1.9.1 + * + * @param {Event} e The event object. + */ + insertButtonClick( e ) { + const button = e.target; + const answer = button.closest( '.wpforms-chat-item.wpforms-chat-item-choices' ); + const responseId = answer?.getAttribute( 'data-response-id' ); + const choicesList = answer?.querySelector( 'ol' ); + const items = choicesList.querySelectorAll( '.wpforms-ai-chat-choices-item' ); + const choiceItems = []; + + // Get choices data. + for ( const i in items ) { + if ( ! items.hasOwnProperty( i ) || ! items[ i ].textContent ) { + continue; + } + + choiceItems.push( items[ i ].textContent.trim() ); + } + + // Rate the response. + chat.wpformsAiApi.rate( true, responseId ); + + // Replace field choices. + this.replaceChoices( choiceItems ); + + // Toggle to the field. + jQuery( `#wpforms-field-${ chat.fieldId }` ).click().promise().done( function() { + jQuery( `#wpforms-field-option-basic-${ chat.fieldId } a.wpforms-field-option-group-toggle` ).click(); + } ); + }, + + /** + * Replace field choices. + * + * @since 1.9.1 + * + * @param {Array} choices Choices array. + */ + replaceChoices( choices ) { + const choicesOptionRow = document.getElementById( `wpforms-field-option-row-${ chat.fieldId }-choices` ); + const choicesList = choicesOptionRow.querySelector( 'ul.choices-list' ); + const choiceRow = choicesList.querySelector( 'li:first-child' ).cloneNode( true ); + + choiceRow.innerHTML = choiceRow.innerHTML.replace( /\[choices\]\[\d+\]/g, `[choices][{{key}}]` ); + + // Clear existing choices. + choicesList.innerHTML = ''; + + // Add new choices. + for ( const i in choices ) { + const key = ( Number( i ) + 1 ).toString(); + const choice = choices[ i ]; + + // Clone choice item element. + let li = choiceRow.cloneNode( true ); + + // Get updated single choice item. + li = this.getUpdatedSingleChoiceItem( li, key, choice ); + + // Add new choice item. + choicesList.appendChild( li ); + } + + // Update data-next-id attribute for choices list. + choicesList.setAttribute( 'data-next-id', choices.length + 1 ); + + // Update field preview. + const fieldOptions = document.getElementById( `wpforms-field-option-${ chat.fieldId }` ); + const fieldType = fieldOptions.querySelector( 'input.wpforms-field-option-hidden-type' )?.value; + + WPFormsBuilder.fieldChoiceUpdate( fieldType, chat.fieldId, choices.length ); + WPFormsBuilder.triggerBuilderEvent( 'wpformsFieldChoiceAdd' ); + + // Trigger event after choices insert. + chat.triggerEvent( 'wpformsAIModalAfterChoicesInsert', { fieldId: chat.fieldId } ); + }, + + /** + * Get updated single choice item. + * + * @since 1.9.1 + * + * @param {HTMLElement} li Choice item element. + * @param {string} key Choice key. + * @param {string} choice Choice value. + * + * @return {HTMLElement} The updated choice item. + */ + getUpdatedSingleChoiceItem( li, key, choice ) { + li.setAttribute( 'data-key', key.toString() ); + + // Update choice item inputs name attributes. + li.innerHTML = li.innerHTML.replaceAll( '{{key}}', key ); + + // Sanitize choice before set. + choice = wpf.sanitizeHTML( choice ); + + const inputDefault = li.querySelector( 'input.default' ); + + inputDefault.removeAttribute( 'checked' ); + + // Set label + const inputLabel = li.querySelector( 'input.label' ); + + inputLabel.value = choice; + inputLabel.setAttribute( 'value', choice ); + + // Set value. + const inputValue = li.querySelector( 'input.value' ); + + inputValue.value = choice; + inputValue.setAttribute( 'value', choice ); + + // Reset image upload. + const imageUpload = li.querySelector( '.wpforms-image-upload' ); + const inputImage = imageUpload.querySelector( 'input.source' ); + + inputImage.value = ''; + inputImage.setAttribute( 'value', '' ); + imageUpload.querySelector( '.preview' ).innerHTML = ''; + imageUpload.querySelector( '.wpforms-image-upload-add' ).style.display = 'block'; + + // Reset icon choice. + const iconSelect = li.querySelector( '.wpforms-icon-select' ); + + iconSelect.querySelector( '.ic-fa-preview' ).setAttribute( 'class', 'ic-fa-preview ic-fa-regular ic-fa-face-smile' ); + iconSelect.querySelector( 'input.source-icon' ).value = 'face-smile'; + iconSelect.querySelector( 'input.source-icon-style' ).value = 'regular'; + + return li; + }, + }; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.min.js new file mode 100755 index 00000000..65840544 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-choices.min.js @@ -0,0 +1,19 @@ +export default function(c){return{getAnswer(e){if(e.choices?.length<1)return"";var t,r=[];for(t in e.choices)r.push(` +
          • + ${c.htmlSpecialChars(e.choices[t])} +
          • + `);let i=` +

            ${c.htmlSpecialChars(e.heading??"")}

            +
              + ${r.join("")} +
            + `;return c.sessionId||(i+=`${c.modeStrings.footer}`),i},getAnswerButtonsPre(){return` + + `},getWarningMessage(){return c.triggerEvent("wpformsAIModalBeforeWarningMessageInsert",{fieldId:c.fieldId}),`
            +
            +
            + ${c.modeStrings.warning} +
            +
            `},isWelcomeScreen(){var t=document.getElementById(`wpforms-field-option-row-${c.fieldId}-choices`).querySelectorAll("li input.label");if(1!==t.length||t[0].value.trim()){if(3wpf.sanitizeHTML(e,wpforms_builder.allowed_label_html_tags)),t.choices=e.filter(e=>""!==e.trim())}return t},hasProhibitedCode(e,t){return t?.choices?.length!==e?.choices?.length},insertButtonClick(e){var t,e=e.target.closest(".wpforms-chat-item.wpforms-chat-item-choices"),r=e?.getAttribute("data-response-id"),i=(e?.querySelector("ol")).querySelectorAll(".wpforms-ai-chat-choices-item"),o=[];for(t in i)i.hasOwnProperty(t)&&i[t].textContent&&o.push(i[t].textContent.trim());c.wpformsAiApi.rate(!0,r),this.replaceChoices(o),jQuery("#wpforms-field-"+c.fieldId).click().promise().done(function(){jQuery(`#wpforms-field-option-basic-${c.fieldId} a.wpforms-field-option-group-toggle`).click()})},replaceChoices(e){var t,r=document.getElementById(`wpforms-field-option-row-${c.fieldId}-choices`).querySelector("ul.choices-list"),i=r.querySelector("li:first-child").cloneNode(!0);for(t in i.innerHTML=i.innerHTML.replace(/\[choices\]\[\d+\]/g,"[choices][{{key}}]"),r.innerHTML="",e){var o=(Number(t)+1).toString(),l=e[t],s=i.cloneNode(!0),s=this.getUpdatedSingleChoiceItem(s,o,l);r.appendChild(s)}r.setAttribute("data-next-id",e.length+1);var n=document.getElementById("wpforms-field-option-"+c.fieldId).querySelector("input.wpforms-field-option-hidden-type")?.value;WPFormsBuilder.fieldChoiceUpdate(n,c.fieldId,e.length),WPFormsBuilder.triggerBuilderEvent("wpformsFieldChoiceAdd"),c.triggerEvent("wpformsAIModalAfterChoicesInsert",{fieldId:c.fieldId})},getUpdatedSingleChoiceItem(e,t,r){e.setAttribute("data-key",t.toString()),e.innerHTML=e.innerHTML.replaceAll("{{key}}",t),r=wpf.sanitizeHTML(r);e.querySelector("input.default").removeAttribute("checked");t=e.querySelector("input.label"),t.value=r,t.setAttribute("value",r),t=e.querySelector("input.value"),t.value=r,t.setAttribute("value",r),t=e.querySelector(".wpforms-image-upload"),r=t.querySelector("input.source"),r.value="",r.setAttribute("value",""),t.querySelector(".preview").innerHTML="",t.querySelector(".wpforms-image-upload-add").style.display="block",r=e.querySelector(".wpforms-icon-select");return r.querySelector(".ic-fa-preview").setAttribute("class","ic-fa-preview ic-fa-regular ic-fa-face-smile"),r.querySelector("input.source-icon").value="face-smile",r.querySelector("input.source-icon-style").value="regular",e}}} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.js new file mode 100755 index 00000000..ed90aead --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.js @@ -0,0 +1,163 @@ +/* global WPFormsAIChatHTMLElement, WPFormsAIFormGenerator, wpf, wpforms_builder */ + +/** + * @param chat.modeStrings.footerFirst + * @param chat.modeStrings.inactiveAnswerTitle + * @param chat.preventResizeInput + * @param response.form_title + * @param wpforms_builder.allowed_label_html_tags + */ + +/** + * The WPForms AI chat element. + * + * Forms mode helpers module. + * + * @since 1.9.2 + * + * @param {WPFormsAIChatHTMLElement} chat The chat element. + * + * @return {Object} Forms helpers object. + */ +export default function( chat ) { // eslint-disable-line no-unused-vars, max-lines-per-function + /** + * The default `forms` mode helpers object. + * + * @since 1.9.2 + */ + const forms = { + /** + * Init `forms` mode. + * + * @since 1.9.2 + */ + init() { + // Set the initial form generator state. + if ( chat.sessionId ) { + WPFormsAIFormGenerator.state.chatStart = true; + + // Remove the selected state from the current template card. + WPFormsAIFormGenerator.main.el.$templateCard + .next( '.selected' ).removeClass( 'selected' ); + } + }, + + /** + * Reset the message input field. + * + * @since 1.9.2 + */ + resetInput() { + chat.resizeInput(); + }, + + /** + * Get the answer based on AI response data. + * + * @since 1.9.2 + * + * @param {Object} response The AI response data. + * + * @return {string} HTML markup. + */ + getAnswer( response ) { + if ( ! response ) { + return ''; + } + + const rnd = Math.floor( Math.random() * chat.modeStrings.footer.length ); + const footer = chat.modeStrings.footer[ rnd ]; + const answer = response.explanation || ( response.form_title ?? '' ); + + return ` +

            ${ answer }

            + ${ footer } + `; + }, + + /** + * Get the answer pre-buttons HTML markup. + * + * @since 1.9.2 + * + * @return {string} The answer pre-buttons HTML markup. + */ + getAnswerButtonsPre() { + return ` + + `; + }, + + /** + * The answer was added. + * + * @since 1.9.2 + * + * @param {HTMLElement} element The answer element. + */ + addedAnswer( element ) { // eslint-disable-line no-unused-vars + forms.updateInactiveAnswers(); + }, + + /** + * Set active answer. + * + * @since 1.9.2 + * + * @param {HTMLElement} element The answer element. + */ + setActiveAnswer( element ) { + forms.updateInactiveAnswers(); + + element.querySelector( '.wpforms-chat-item-content' ).setAttribute( 'title', '' ); + }, + + /** + * Update inactive answers. + * + * @since 1.9.2 + */ + updateInactiveAnswers() { + chat.messageList.querySelectorAll( '.wpforms-chat-item-answer:not(.active) .wpforms-chat-item-content' ) + .forEach( ( el ) => { + // Set title attribute for inactive answers. + el.setAttribute( 'title', chat.modeStrings.inactiveAnswerTitle ); + } ); + }, + + /** + * Determine whether the Welcome Screen should be displayed. + * + * @since 1.9.2 + * + * @return {boolean} Display the Welcome Screen or not. + */ + isWelcomeScreen() { + return true; + }, + + /** + * Sanitize response. + * + * @since 1.9.2 + * + * @param {Object} response The response data to sanitize. + * + * @return {Object} The sanitized response. + */ + sanitizeResponse( response ) { + if ( ! response.explanation ) { + return response; + } + + // Sanitize explanation string. + response.explanation = wpf.sanitizeHTML( response.explanation, wpforms_builder.allowed_label_html_tags ); + + return response; + }, + }; + + return forms; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.min.js new file mode 100755 index 00000000..fe537780 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-forms.min.js @@ -0,0 +1,8 @@ +export default function(r){let t={init(){r.sessionId&&(WPFormsAIFormGenerator.state.chatStart=!0,WPFormsAIFormGenerator.main.el.$templateCard.next(".selected").removeClass("selected"))},resetInput(){r.resizeInput()},getAnswer(e){var t;return e?(t=Math.floor(Math.random()*r.modeStrings.footer.length),t=r.modeStrings.footer[t],` +

            ${e.explanation||(e.form_title??"")}

            + ${t} + `):""},getAnswerButtonsPre(){return` + + `},addedAnswer(e){t.updateInactiveAnswers()},setActiveAnswer(e){t.updateInactiveAnswers(),e.querySelector(".wpforms-chat-item-content").setAttribute("title","")},updateInactiveAnswers(){r.messageList.querySelectorAll(".wpforms-chat-item-answer:not(.active) .wpforms-chat-item-content").forEach(e=>{e.setAttribute("title",r.modeStrings.inactiveAnswerTitle)})},isWelcomeScreen(){return!0},sanitizeResponse(e){return e.explanation&&(e.explanation=wpf.sanitizeHTML(e.explanation,wpforms_builder.allowed_label_html_tags)),e}};return t} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.js new file mode 100755 index 00000000..68ed7635 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.js @@ -0,0 +1,67 @@ +/* global WPFormsAIChatHTMLElement */ + +/** + * The WPForms AI chat element. + * + * Choices helpers module. + * + * @since 1.9.1 + * + * @param {WPFormsAIChatHTMLElement} chat The chat element. + * + * @return {Function} The app cloning function. + */ +export default function( chat ) { // eslint-disable-line no-unused-vars + /** + * The default `text` mode helpers object. + * + * @since 1.9.1 + */ + return { + /** + * Get the `text` answer based on AI response data. + * + * @since 1.9.1 + * + * @param {Object} response The AI response data. + * + * @return {string} HTML markup. + */ + getAnswer( response ) { + return ` +

            ${ response?.heading ?? '' }

            +

            ${ response?.text ?? '' }

            + ${ response?.footer ?? '' } + `; + }, + + /** + * Get the answer pre-buttons HTML markup. + * + * @since 1.9.1 + * + * @return {string} The answer pre-buttons HTML markup. + */ + getAnswerButtonsPre() { + return ''; + }, + + /** + * Added answer callback. + * + * @since 1.9.1 + */ + addedAnswer() {}, + + /** + * Determine whether the Welcome Screen should be displayed. + * + * @since 1.9.2 + * + * @return {boolean} Display the Welcome Screen or not. + */ + isWelcomeScreen() { + return true; + }, + }; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.min.js new file mode 100755 index 00000000..3a5b172f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/modules/helpers-text.min.js @@ -0,0 +1,5 @@ +export default function(e){return{getAnswer(e){return` +

            ${e?.heading??""}

            +

            ${e?.text??""}

            + ${e?.footer??""} + `},getAnswerButtonsPre(){return""},addedAnswer(){},isWelcomeScreen(){return!0}}} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.js new file mode 100755 index 00000000..f5f91c79 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.js @@ -0,0 +1,1398 @@ +/* global wpforms_ai_chat_element, WPFormsAIModal, wpf */ + +/** + * @param this.modeStrings.learnMore + * @param wpforms_ai_chat_element.dislike + * @param wpforms_ai_chat_element.refresh + * @param wpforms_ai_chat_element.confirm.refreshTitle + * @param wpforms_ai_chat_element.confirm.refreshMessage + * @param this.modeStrings.samplePrompts + * @param this.modeStrings.errors.rate_limit + * @param this.modeStrings.reasons.rate_limit + * @param this.modeStrings.descrEndDot + */ + +/** + * The `WPFormsAIChatHTMLElement` element loader. + * + * @since 1.9.2 + */ +( function() { + // Additional modules provided by wpforms_ai_chat_element. + const modules = wpforms_ai_chat_element.modules || []; + + // Import all modules dynamically. + Promise.all( modules.map( ( module ) => import( module.path ) ) ) + .then( ( importedModules ) => { + // Create the helper object dynamically. + const helpers = {}; + let api; + + importedModules.forEach( ( module, index ) => { + const moduleName = modules[ index ].name; + if ( moduleName === 'api' ) { + api = module.default(); + + return; + } + helpers[ moduleName ] = module.default; + } ); + + window.WPFormsAi = { + api, + helpers, + }; + + // Register the custom HTML element. + customElements.define( 'wpforms-ai-chat', WPFormsAIChatHTMLElement ); // eslint-disable-line no-use-before-define + } ) + .catch( ( error ) => { + wpf.debug( 'Error importing modules:', error ); + } ); +}() ); + +/** + * The WPForms AI chat. + * + * Custom HTML element class. + * + * @since 1.9.1 + */ +class WPFormsAIChatHTMLElement extends HTMLElement { + /** + * Whether the events have been initialized. + * + * @since 1.9.5 + * + * @type {boolean} + */ + eventInitializes = false; + + /** + * Whether the prefilling has been submitted. + * + * @since 1.9.5 + * + * @type {boolean} + */ + prefillSubmitted = false; + + /** + * The input (textarea) height. + * + * @type {Object} + */ + inputHeight = { + min: 54, + max: 95, + }; + + /** + * Element constructor. + * + * @since 1.9.1 + */ + constructor() { // eslint-disable-line no-useless-constructor + // Always call super() first in constructor. + super(); + } + + /** + * Element connected to the DOM. + * + * @since 1.9.1 + */ + connectedCallback() { // eslint-disable-line complexity + // Init chat properties. + this.chatMode = this.getAttribute( 'mode' ) ?? 'text'; + this.fieldId = this.getAttribute( 'field-id' ) ?? ''; + this.prefill = this.getAttribute( 'prefill' ) ?? ''; + this.autoSubmit = this.getAttribute( 'auto-submit' ) === 'true'; + this.modeStrings = wpforms_ai_chat_element[ this.chatMode ] ?? {}; + this.loadingState = false; + + // Init chats helpers according to the chat mode. + this.modeHelpers = this.getHelpers( this ); + + // Bail if chat mode helpers not found. + if ( ! this.modeHelpers ) { + console.error( `WPFormsAI error: chat mode "${ this.chatMode }" helpers not found` ); // eslint-disable-line no-console + + return; + } + + // Render chat HTML. + if ( ! this.innerHTML.trim() ) { + this.innerHTML = this.getInnerHTML(); + } + + // Get chat elements. + this.wrapper = this.querySelector( '.wpforms-ai-chat' ); + this.input = this.querySelector( '.wpforms-ai-chat-message-input input, .wpforms-ai-chat-message-input textarea' ); + this.welcomeScreenSamplePrompts = this.querySelector( '.wpforms-ai-chat-welcome-screen-sample-prompts' ); + this.sendButton = this.querySelector( '.wpforms-ai-chat-send' ); + this.stopButton = this.querySelector( '.wpforms-ai-chat-stop' ); + this.messageList = this.querySelector( '.wpforms-ai-chat-message-list' ); + + // Flags. + this.isTextarea = this.input.tagName === 'TEXTAREA'; + this.preventResizeInput = false; + + // Compact scrollbar for non-Mac devices. + if ( ! navigator.userAgent.includes( 'Macintosh' ) ) { + this.messageList.classList.add( 'wpforms-scrollbar-compact' ); + } + + // Bind events. + this.events(); + + // Init answers. + this.initAnswers(); + + // Init mode. + if ( typeof this.modeHelpers.init === 'function' ) { + this.modeHelpers.init(); + } + + // Auto-submit if enabled and prefill is provided + if ( this.autoSubmit && this.prefill && ! this.prefillSubmitted ) { + this.input.value = this.prefill; + + this.prefillSubmitted = true; + + setTimeout( () => this.sendMessage( true ), 250 ); + } + } + + /** + * Get initial innerHTML markup. + * + * @since 1.9.1 + * + * @return {string} The inner HTML markup. + */ + getInnerHTML() { + if ( this.modeStrings.chatHtml ) { + return this.decodeHTMLEntities( this.modeStrings.chatHtml ); + } + + return ` +
            +
            + ${ this.getWelcomeScreen() } +
            +
            + ${ this.getMessageInputField() } + + +
            +
            + `; + } + + /** + * Get the message input field HTML. + * + * @since 1.9.2 + * + * @return {string} The message input field markup. + */ + getMessageInputField() { + if ( typeof this.modeHelpers.getMessageInputField === 'function' ) { + return this.modeHelpers.getMessageInputField(); + } + + return ``; + } + + /** + * Get the Welcome screen HTML markup. + * + * @since 1.9.1 + * + * @return {string} The Welcome screen markup. + */ + getWelcomeScreen() { + let content; + + if ( this.modeHelpers.isWelcomeScreen() ) { + content = this.getWelcomeScreenContent(); + } else { + this.messagePreAdded = true; + content = this.modeHelpers.getWarningMessage(); + } + + return ` +
            +
            +
            +

            ${ this.modeStrings.title }

            + ${ this.modeStrings.description } + ${ this.modeStrings.learnMore } + +
            + ${ content } +
            +
            + `; + } + + /** + * Get the welcome screen content. + * + * @since 1.9.4 + * + * @return {string} The welcome screen content. + */ + getWelcomeScreenContent() { + const samplePrompts = this.modeStrings?.samplePrompts, + li = []; + + if ( ! samplePrompts && ! this.modeStrings?.initialChat ) { + return ''; + } + + if ( samplePrompts ) { + // Render sample prompts. + for ( const i in samplePrompts ) { + li.push( ` +
          • + + ${ samplePrompts[ i ].title } +
          • + ` ); + } + + return ` +
              + ${ li.join( '' ) } +
            + `; + } + + if ( this.prefill.length > 0 ) { + return ''; + } + + this.messagePreAdded = true; + + return this.modeHelpers?.getInitialChat( this.modeStrings.initialChat ); + } + + /** + * Get the spinner SVG image. + * + * @since 1.9.1 + * + * @return {string} The spinner SVG markup. + */ + getSpinnerSvg() { + return ``; + } + + /** + * Add event listeners. + * + * @since 1.9.1 + */ + events() { + if ( this.eventInitializes ) { + return; + } + + this.sendButton.addEventListener( 'click', this.sendMessage.bind( this ) ); + this.stopButton.addEventListener( 'click', this.stopLoading.bind( this ) ); + this.input.addEventListener( 'keydown', this.keyDown.bind( this ) ); + this.input.addEventListener( 'keyup', this.keyUp.bind( this ) ); + this.bindWelcomeScreenEvents(); + document.addEventListener( 'wpformsAIChatBeforeAddAnswer', this.preAnswer.bind( this ) ); + + this.eventInitializes = true; + } + + /** + * Bind welcome screen events. + * + * @since 1.9.1 + */ + bindWelcomeScreenEvents() { + if ( this.welcomeScreenSamplePrompts === null ) { + return; + } + + // Click on the default item in the welcome screen. + this.welcomeScreenSamplePrompts.querySelectorAll( 'li' ).forEach( ( li ) => { + li.addEventListener( 'click', this.clickDefaultItem.bind( this ) ); + + li.addEventListener( 'keydown', ( e ) => { + if ( e.code === 'Enter' ) { + e.preventDefault(); + this.clickDefaultItem( e ); + } + } ); + } ); + } + + /** + * Init all answers. + * + * @since 1.9.2 + */ + initAnswers() { + if ( ! this.modeStrings.chatHtml ) { + return; + } + + this.wpformsAiApi = this.getAiApi(); + + this.messageList.querySelectorAll( '.wpforms-chat-item-answer' ).forEach( ( answer ) => { + this.initAnswer( answer ); + } ); + } + + /** + * Keyboard `keyUp` event handler. + * + * @since 1.9.1 + * + * @param {KeyboardEvent} e The keyboard event. + */ + keyUp( e ) { // eslint-disable-line complexity + if ( typeof this.modeHelpers.resizeInput === 'function' ) { + this.modeHelpers.resizeInput( e ); + } else { + this.resizeInput( e ); + } + + switch ( e.code ) { + case 'Enter': + // Send a message on the ` Enter ` key press. + // In the case of the textarea, `Shift + Enter` adds a new line. + if ( ! this.isTextarea || ( this.isTextarea && ! e.shiftKey ) ) { + e.preventDefault(); + this.sendMessage(); + } + + break; + + case 'ArrowUp': + // Navigate through the chat history. + // In the case of the textarea, `Ctrl + Up` is used. + if ( ! this.isTextarea || ( this.isTextarea && e.ctrlKey ) ) { + e.preventDefault(); + this.arrowUp(); + } + break; + + case 'ArrowDown': + // Navigate through the chat history. + // In the case of the textarea, `Ctrl + Down` is used. + if ( ! this.isTextarea || ( this.isTextarea && e.ctrlKey ) ) { + e.preventDefault(); + this.arrowDown(); + } + break; + + default: + // Update the chat history. + this.history.update( { question: this.input.value } ); + } + } + + /** + * Detect the Enter key press. + * Prevent resizing the input if an Enter key is pressed without Shift. + * + * @since 1.9.5 + * + * @param {KeyboardEvent} e The keyboard event. + */ + keyDown( e ) { + this.preventResizeInput = e.code === 'Enter' && ! e.shiftKey; + + if ( this.preventResizeInput ) { + e.preventDefault(); + this.setInputHeight( this.inputHeight.min ); + } + } + + /** + * Resize textarea while added new lines. + * + * @since 1.9.5 + */ + resizeInput() { + if ( this.preventResizeInput ) { + this.preventResizeInput = false; + + return; + } + + // Reset style to get the correct scroll height. + this.input.style.height = ''; + this.input.style.paddingTop = '10px'; + this.input.style.paddingBottom = '10px'; + + let height; + const scrollHeight = this.input.scrollHeight; + + // Calculate the height based on the scroll height. + height = Math.min( scrollHeight, this.inputHeight.max ); + height = Math.max( height, this.inputHeight.min ); + + this.setInputHeight( height ); + } + + /** + * Set textarea height. + * + * @since 1.9.5 + * + * @param {number} height The height. + */ + setInputHeight( height ) { + // Adjust padding based on the height. + if ( height <= this.inputHeight.min ) { + this.input.style.paddingTop = ''; + this.input.style.paddingBottom = ''; + } + + // Set the height. + this.input.style.height = height + 'px'; + this.style.setProperty( '--wpforms-ai-chat-input-height', height + 'px' ); + } + + /** + * Send a question message to the chat. + * + * @since 1.9.1 + * + * @param {boolean} allowHTML Whether to allow HTML in the message. + */ + sendMessage( allowHTML = false ) { + let message = this.input.value; + + if ( ! message ) { + return; + } + + if ( ! allowHTML ) { + message = this.htmlSpecialChars( message ); + } + + // Fire event before sending the message. + this.triggerEvent( 'wpformsAIChatBeforeSendMessage', { fieldId: this.fieldId, mode: this.chatMode } ); + + this.addFirstMessagePre(); + this.welcomeScreenSamplePrompts?.remove(); + + this.resetInput(); + this.addMessage( message, true ); + this.startLoading(); + + if ( message.trim() === '' ) { + this.addEmptyResultsError(); + + return; + } + + if ( typeof this.modeHelpers.prepareMessage === 'function' ) { + message = this.modeHelpers.prepareMessage( message ); + } + + this.getAiApi() + .prompt( message, this.sessionId ) + .then( this.addAnswer.bind( this ) ) + .catch( this.apiResponseError.bind( this ) ); + } + + /** + * AI API error handler. + * + * @since 1.9.2 + * + * @param {Object|string} error The error object or string. + */ + apiResponseError( error ) { // eslint-disable-line complexity + const cause = error?.cause ?? null; + + this.triggerEvent( 'wpformsAIChatBeforeError', { fieldId: this.fieldId } ); + + // Handle the rate limit error. + if ( cause === 429 ) { + this.addError( + this.modeStrings.errors.rate_limit || wpforms_ai_chat_element.errors.rate_limit, + this.modeStrings.reasons.rate_limit || wpforms_ai_chat_element.reasons.rate_limit + ); + + return; + } + + // Handle the Internal Server Error. + if ( cause === 500 ) { + this.addEmptyResultsError(); + + return; + } + + this.addError( + error.message || this.modeStrings.errors.default || wpforms_ai_chat_element.errors.default, + this.modeStrings.reasons.default || wpforms_ai_chat_element.reasons.default + ); + + wpf.debug( 'WPFormsAI error: ', error ); + } + + /** + * Before the first message. + * + * @since 1.9.1 + */ + addFirstMessagePre() { + if ( this.sessionId || this.messagePreAdded ) { + return; + } + + this.messagePreAdded = true; + + const divider = document.createElement( 'div' ); + + divider.classList.add( 'wpforms-ai-chat-divider' ); + this.messageList.appendChild( divider ); + } + + /** + * Click on the default item in the welcome screen. + * + * @since 1.9.1 + * + * @param {Event} e The event object. + */ + clickDefaultItem( e ) { + const li = e.target.nodeName === 'LI' ? e.target : e.target.closest( 'li' ); + const message = li.querySelector( 'a' )?.textContent; + + e.preventDefault(); + + if ( ! message ) { + return; + } + + this.input.value = message; + + // Update the chat history. + this.history.push( { question: message } ); + + this.sendMessage(); + } + + /** + * Click on the dislike button. + * + * @since 1.9.1 + * + * @param {Event} e The event object. + */ + clickDislikeButton( e ) { + const button = e.target; + const answer = button?.closest( '.wpforms-chat-item-answer' ); + + if ( ! answer ) { + return; + } + + button.classList.add( 'clicked' ); + button.setAttribute( 'disabled', true ); + + const responseId = answer.getAttribute( 'data-response-id' ); + + this.wpformsAiApi.rate( false, responseId ); + } + + /** + * Click on the refresh button. + * + * @since 1.9.1 + */ + async clickRefreshButton() { + const refreshConfirm = () => { + // Restore the welcome screen. + this.prefill = ''; + this.messageList.innerHTML = this.getWelcomeScreen(); + this.welcomeScreenSamplePrompts = this.querySelector( '.wpforms-ai-chat-welcome-screen-sample-prompts' ); + this.bindWelcomeScreenEvents(); + this.scrollMessagesTo( 'top' ); + + // Clear the session ID. + this.wpformsAiApi = null; + this.sessionId = null; + this.messagePreAdded = null; + this.wrapper.removeAttribute( 'data-session-id' ); + + // Clear the chat history. + this.history.clear(); + + // Fire the event after refreshing the chat. + this.triggerEvent( 'wpformsAIChatAfterRefresh', { fieldId: this.fieldId } ); + }; + + const refreshCancel = () => { + // Fire the event when refresh is canceled. + this.triggerEvent( 'wpformsAIChatCancelRefresh', { fieldId: this.fieldId } ); + }; + + // Fire the event before refresh confirmation is opened. + this.triggerEvent( 'wpformsAIChatBeforeRefreshConfirm', { fieldId: this.fieldId } ); + + // Open a confirmation modal. + WPFormsAIModal.confirmModal( { + title: wpforms_ai_chat_element.confirm.refreshTitle, + content: wpforms_ai_chat_element.confirm.refreshMessage, + onConfirm: refreshConfirm, + onCancel: refreshCancel, + } ); + } + + /** + * Start loading. + * + * @since 1.9.1 + */ + startLoading() { + this.loadingState = true; + this.sendButton.classList.add( 'wpforms-hidden' ); + this.stopButton.classList.remove( 'wpforms-hidden' ); + this.input.setAttribute( 'disabled', true ); + this.input.setAttribute( 'placeholder', this.modeStrings.waiting ); + } + + /** + * Stop loading. + * + * @since 1.9.1 + */ + stopLoading() { + this.loadingState = false; + this.messageList.querySelector( '.wpforms-chat-item-answer-waiting' )?.remove(); + this.sendButton.classList.remove( 'wpforms-hidden' ); + this.stopButton.classList.add( 'wpforms-hidden' ); + this.input.removeAttribute( 'disabled' ); + this.input.setAttribute( 'placeholder', this.modeStrings.placeholder ); + this.input.focus(); + } + + /** + * Keyboard `ArrowUp` key event handler. + * + * @since 1.9.1 + */ + arrowUp() { + const prev = this.history.prev()?.question; + + if ( typeof prev !== 'undefined' ) { + this.input.value = prev; + } + } + + /** + * Keyboard `ArrowDown` key event handler. + * + * @since 1.9.1 + */ + arrowDown() { + const next = this.history.next()?.question; + + if ( typeof next !== 'undefined' ) { + this.input.value = next; + } + } + + /** + * Get AI API object instance. + * + * @since 1.9.1 + * + * @return {Object} The AI API object. + */ + getAiApi() { + if ( this.wpformsAiApi ) { + return this.wpformsAiApi; + } + + // Attempt to get the session ID from the element attribute OR the data attribute. + // It is necessary to restore the session ID after restoring the chat element. + this.sessionId = this.wrapper.getAttribute( 'data-session-id' ) || null; + + // Create a new AI API object instance. + this.wpformsAiApi = window.WPFormsAi.api( this.chatMode, this.sessionId ); + + return this.wpformsAiApi; + } + + /** + * Scroll a message list to given edge. + * + * @since 1.9.1 + * + * @param {string} edge The edge to scroll to; `top` or `bottom`. + */ + scrollMessagesTo( edge = 'bottom' ) { + if ( edge === 'top' ) { + this.messageList.scrollTop = 0; + + return; + } + + if ( this.messageList.scrollHeight - this.messageList.scrollTop < 22 ) { + return; + } + + this.messageList.scrollTop = this.messageList.scrollHeight; + } + + /** + * Add a message to the chat. + * + * @since 1.9.1 + * + * @param {string} message The message to add. + * @param {boolean} isQuestion Whether it is a question. + * @param {Object} response The response data, optional. + * @param {boolean} preMessage Add a preliminary message, optional. + */ + addMessage( message, isQuestion, response = null, preMessage = false ) { + const { messageList } = this; + const element = document.createElement( 'div' ); + + element.classList.add( 'wpforms-chat-item' ); + + if ( preMessage ) { + element.classList.add( 'wpforms-chat-item-pre-message' ); + element.classList.add( 'pre-active' ); + } + + messageList.appendChild( element ); + + if ( isQuestion ) { + // Add a question. + element.innerHTML = message; + element.classList.add( 'wpforms-chat-item-question' ); + + // Add a waiting spinner. + const spinnerWrapper = document.createElement( 'div' ), + spinner = document.createElement( 'div' ); + + spinnerWrapper.classList.add( 'wpforms-chat-item-answer-waiting' ); + spinner.classList.add( 'wpforms-chat-item-spinner' ); + spinner.innerHTML = this.getSpinnerSvg(); + spinnerWrapper.appendChild( spinner ); + messageList.appendChild( spinnerWrapper ); + + // Add an empty chat history item. + this.history.push( {} ); + } else { + // Add an answer. + const itemContent = document.createElement( 'div' ); + + itemContent.classList.add( 'wpforms-chat-item-content' ); + element.appendChild( itemContent ); + + // Remove the waiting spinner. + messageList.querySelector( '.wpforms-chat-item-answer-waiting' )?.remove(); + + // Remove the active class from the previous answer. + this.messageList.querySelector( '.wpforms-chat-item-answer.active' )?.classList.remove( 'active' ); + this.messageList.querySelector( '.wpforms-chat-item-answer.pre-active' )?.classList.add( 'active' ); + this.messageList.querySelector( '.wpforms-chat-item-answer.pre-active' )?.classList.remove( 'pre-active' ); + + // Update element classes and attributes. + element.classList.add( 'wpforms-chat-item-answer' ); + element.classList.add( 'active' ); + element.classList.add( 'wpforms-chat-item-typing' ); + element.classList.add( 'wpforms-chat-item-' + this.chatMode ); + element.setAttribute( 'data-response-id', response?.responseId ?? '' ); + + // Update the answer in the chat history. + this.history.update( { answer: message } ); + + // Type the message with the typewriter effect. + if ( ! preMessage ) { + this.typeText( itemContent, message, this.addedAnswer.bind( this ) ); + + return; + } + + itemContent.innerHTML = message; + } + + this.scrollMessagesTo( 'bottom' ); + } + + /** + * Add an error to the chat. + * + * @since 1.9.1 + * + * @param {string} errorTitle The error title. + * @param {string} errorReason The error title. + */ + addError( errorTitle, errorReason ) { + this.addNotice( errorTitle, errorReason ); + } + + /** + * Add a warning to the chat. + * + * @since 1.9.2 + * + * @param {string} warningTitle The warning title. + * @param {string} warningReason The warning reason. + */ + addWarning( warningTitle, warningReason ) { + this.addNotice( warningTitle, warningReason, 'warning' ); + } + + /** + * Add a notice to the chat. + * + * @since 1.9.2 + * + * @param {string} title The notice title. + * @param {string} reason The notice reason. + * @param {string} type The notice type. + */ + addNotice( title, reason, type = 'error' ) { + let content = ``; + + // Bail if loading was stopped. + if ( ! this.loadingState ) { + return; + } + + if ( title ) { + content += `

            ${ title }

            `; + } + + if ( reason ) { + content += `${ reason }`; + } + + const chatItem = document.createElement( 'div' ); + const itemContent = document.createElement( 'div' ); + + chatItem.classList.add( 'wpforms-chat-item' ); + chatItem.classList.add( 'wpforms-chat-item-' + type ); + itemContent.classList.add( 'wpforms-chat-item-content' ); + chatItem.appendChild( itemContent ); + + this.messageList.querySelector( '.wpforms-chat-item-answer-waiting' )?.remove(); + this.messageList.appendChild( chatItem ); + + // Add the error to the chat. + // Type the message with the typewriter effect. + this.typeText( itemContent, content, () => { + this.stopLoading(); + } ); + } + + /** + * Add an empty results error to the chat. + * + * @since 1.9.1 + */ + addEmptyResultsError() { + this.addError( + this.modeStrings.errors.empty || wpforms_ai_chat_element.errors.empty, + this.modeStrings.reasons.empty || wpforms_ai_chat_element.reasons.empty + ); + } + + /** + * Add a prohibited code warning to the chat. + * + * @since 1.9.2 + */ + addProhibitedCodeWarning() { + this.addWarning( + this.modeStrings.warnings.prohibited_code || wpforms_ai_chat_element.warnings.prohibited_code, + this.modeStrings.reasons.prohibited_code || wpforms_ai_chat_element.reasons.prohibited_code + ); + } + + /** + * Display a speech bubble with a pre-answer message if it is available. + * + * @since 1.9.7 + * + * @param {Object} event The event object. + */ + preAnswer( event ) { + const { response } = event.detail; + + if ( ! response.preMessage ) { + return; + } + + // Sanitize response. + const sanitizedResponse = this.sanitizeResponse( { ...response } ); + + if ( ! sanitizedResponse.preMessage || ! sanitizedResponse.preMessage.title || ! sanitizedResponse.preMessage.text ) { + return; + } + + const preAnswerHTML = `

            ${ sanitizedResponse.preMessage.title }

            ${ sanitizedResponse.preMessage.text }`; + this.addMessage( preAnswerHTML, false, sanitizedResponse, true ); + } + + /** + * Add an answer to the chat. + * + * @since 1.9.1 + * + * @param {Object} response The response data to add. + */ + addAnswer( response ) { + // Bail if loading was stopped. + if ( ! this.loadingState || ! response ) { + return; + } + + // Output processing time to console if available. + if ( response.processingData ) { + wpf.debug( 'WPFormsAI processing data:', response.processingData ); + } + + // Sanitize response. + const sanitizedResponse = this.sanitizeResponse( { ...response } ); + + if ( this.hasProhibitedCode( response, sanitizedResponse ) ) { + this.triggerEvent( 'wpformsAIChatBeforeError', { fieldId: this.fieldId } ); + + this.addProhibitedCodeWarning(); + + return; + } + + const answerHTML = this.modeHelpers.getAnswer( sanitizedResponse ); + + if ( ! answerHTML ) { + this.triggerEvent( 'wpformsAIChatBeforeError', { fieldId: this.fieldId } ); + + this.addEmptyResultsError(); + + return; + } + + // Store the session ID from response. + this.sessionId = response.sessionId; + + // Set the session ID to the chat wrapper data attribute. + this.wrapper.setAttribute( 'data-session-id', this.sessionId ); + + // Fire the event before adding the answer to the chat. + this.triggerEvent( 'wpformsAIChatBeforeAddAnswer', { chat: this, response: sanitizedResponse } ); + + // Add the answer to the chat. + this.addMessage( answerHTML, false, sanitizedResponse ); + + this.triggerEvent( 'wpformsAIChatAfterAddAnswer', { fieldId: this.fieldId } ); + } + + /** + * Check if the response has a prohibited code. + * + * @since 1.9.2 + * + * @param {Object} response The response data. + * @param {Array} sanitizedResponse The sanitized response data. + * + * @return {boolean} Whether the answer has a prohibited code. + */ + hasProhibitedCode( response, sanitizedResponse ) { + if ( typeof this.modeHelpers.hasProhibitedCode === 'function' ) { + return this.modeHelpers.hasProhibitedCode( response, sanitizedResponse ); + } + + return false; + } + + /** + * Sanitize response. + * + * @since 1.9.2 + * + * @param {Object} response The response data to sanitize. + * + * @return {Object} The sanitized response. + */ + sanitizeResponse( response ) { + if ( typeof this.modeHelpers.sanitizeResponse === 'function' ) { + return this.modeHelpers.sanitizeResponse( response ); + } + + return response; + } + + /** + * The added answer callback. + * + * @since 1.9.1 + * + * @param {HTMLElement} element The answer element. + */ + addedAnswer( element ) { + // Add answer buttons when typing is finished. + element.innerHTML += this.getAnswerButtons(); + element.parentElement.classList.remove( 'wpforms-chat-item-typing' ); + + this.stopLoading(); + this.initAnswer( element ); + + // Added answer callback. + this.modeHelpers.addedAnswer( element ); + + // Fire the event when the answer added to the chat. + this.triggerEvent( 'wpformsAIChatAddedAnswer', { chat: this, element } ); + } + + /** + * Init answer. + * + * @since 1.9.2 + * + * @param {HTMLElement} element The answer element. + */ + initAnswer( element ) { + if ( ! element ) { + return; + } + + // Prepare answer buttons and init the tooltips. + element.querySelectorAll( '.wpforms-help-tooltip' ).forEach( ( icon ) => { + let title = icon.getAttribute( 'title' ); + + if ( ! title ) { + title = icon.classList.contains( 'dislike' ) ? wpforms_ai_chat_element.dislike : ''; + title = icon.classList.contains( 'refresh' ) ? wpforms_ai_chat_element.refresh : title; + + icon.setAttribute( 'title', title ); + } + + icon.classList.remove( 'tooltipstered' ); + } ); + + wpf.initTooltips( element ); + + // Add event listeners. + element.addEventListener( 'click', this.setActiveAnswer.bind( this ) ); + + element.querySelector( '.wpforms-ai-chat-answer-button.dislike' ) + ?.addEventListener( 'click', this.clickDislikeButton.bind( this ) ); + + element.querySelector( '.wpforms-ai-chat-answer-button.refresh' ) + ?.addEventListener( 'click', this.clickRefreshButton.bind( this ) ); + } + + /** + * Set an active answer. + * + * @since 1.9.2 + * + * @param {Event} e The event object. + */ + setActiveAnswer( e ) { + let answer = e.target.closest( '.wpforms-chat-item-answer' ); + + answer = answer || e.target; + + if ( answer.classList.contains( 'active' ) ) { + return; + } + + this.messageList.querySelector( '.wpforms-chat-item-answer.active' )?.classList.remove( 'active' ); + answer.classList.add( 'active' ); + + const responseId = answer.getAttribute( 'data-response-id' ); + + if ( this.modeHelpers.setActiveAnswer ) { + this.modeHelpers.setActiveAnswer( answer ); + } + + // Trigger the event. + this.triggerEvent( 'wpformsAIChatSetActiveAnswer', { chat: this, responseId } ); + } + + /** + * Get the answer buttons HTML markup. + * + * @since 1.9.1 + * + * @return {string} The answer buttons HTML markup. + */ + getAnswerButtons() { + return ` +
            + ${ this.modeHelpers.getAnswerButtonsPre() } +
            + + +
            +
            + `; + } + + /** + * Type text into an element with the typewriter effect. + * + * @since 1.9.1 + * + * @param {HTMLElement} element The element to type into. + * @param {string} text The text to type. + * @param {Function} finishedCallback The callback function to call when typing is finished. + */ + typeText( element, text, finishedCallback ) { + const chunkSize = 5; + const chat = this; + let index = 0; + let content = ''; + + /** + * Type a single character. + * + * @since 1.9.1 + */ + function type() { + const chunk = text.substring( index, index + chunkSize ); + + content += chunk; + // Remove a broken HTML tag from the end of the string. + element.innerHTML = content.replace( /<[^>]{0,300}$/g, '' ); + index += chunkSize; + + if ( index < text.length && chat.loadingState ) { + // Recursive call to output the next chunk. + setTimeout( type, 20 ); + } else if ( typeof finishedCallback === 'function' ) { + // Call the callback function when typing is finished. + chat.triggerEvent( 'wpformsAIChatAfterTypeText', { chat } ); + + finishedCallback( element ); + } + + chat.scrollMessagesTo( 'bottom' ); + } + + type(); + } + + /** + * Get the `helpers` object, according to the chat mode. + * + * @since 1.9.1 + * + * @param {WPFormsAIChatHTMLElement} chat Chat element. + * + * @return {Object} Choices helpers object. + */ + getHelpers( chat ) { + const helpers = window.WPFormsAi.helpers; + + return helpers[ chat.chatMode ]( chat ) ?? null; + } + + /** + * Reset the message input field. + * + * @since 1.9.2 + */ + resetInput() { + this.input.value = ''; + + if ( this.modeHelpers.resetInput ) { + this.modeHelpers.resetInput(); + } + } + + /** + * Escape HTML special characters. + * + * @since 1.9.1 + * + * @param {string} html HTML string. + * + * @return {string} Escaped HTML string. + */ + htmlSpecialChars( html ) { + return html.replace( /[<>]/g, ( x ) => '�' + x.charCodeAt( 0 ) + ';' ); + } + + /** + * Decode HTML entities. + * + * @since 1.9.2 + * + * @param {string} html Encoded HTML string. + * + * @return {string} Decoded HTML string. + */ + decodeHTMLEntities( html ) { + const txt = document.createElement( 'textarea' ); + + txt.innerHTML = html; + + return txt.value; + } + + /** + * Wrapper to trigger a custom event and return the event object. + * + * @since 1.9.1 + * + * @param {string} eventName Event name to trigger (custom or native). + * @param {Object} args Trigger arguments. + * + * @return {Event} Event object. + */ + triggerEvent( eventName, args = {} ) { + const event = new CustomEvent( eventName, { detail: args } ); + + document.dispatchEvent( event ); + + return event; + } + + /** + * Chat history object. + * + * @since 1.9.1 + */ + history = { + /** + * Chat history data. + * + * @since 1.9.1 + * + * @type {Array} + */ + data: [], + + /** + * Chat history pointer. + * + * @since 1.9.1 + * + * @type {number} + */ + pointer: 0, + + /** + * Default item. + * + * @since 1.9.1 + * + * @type {Object} + */ + defaultItem: { + question: '', + answer: null, + }, + + /** + * Get history data by pointer. + * + * @since 1.9.1 + * + * @param {number|null} pointer The history pointer. + * + * @return {Object} The history item. + */ + get( pointer = null ) { + if ( pointer ) { + this.pointer = pointer; + } + + if ( this.pointer < 1 ) { + this.pointer = 0; + } else if ( this.pointer >= this.data.length ) { + this.pointer = this.data.length - 1; + } + + return this.data[ this.pointer ] ?? {}; + }, + + /** + * Get history data by pointer. + * + * @since 1.9.1 + * + * @return {Object} The history item. + */ + prev() { + this.pointer -= 1; + + return this.get(); + }, + + /** + * Get history data by pointer. + * + * @since 1.9.1 + * + * @return {Object} The history item. + */ + next() { + this.pointer += 1; + + return this.get(); + }, + + /** + * Push an item to the chat history. + * + * @since 1.9.1 + * + * @param {Object} item The item to push. + * + * @return {void} + */ + push( item ) { + if ( item.answer ) { + this.data[ this.data.length - 1 ].answer = item.answer; + + return; + } + + this.data.push( { ...this.defaultItem, ...item } ); + this.pointer = this.data.length - 1; + }, + + /** + * Update the last history item. + * + * @since 1.9.1 + * + * @param {Object} item The updated history item. + * + * @return {void} + */ + update( item ) { + const lastKey = this.data.length > 0 ? this.data.length - 1 : 0; + const lastItem = this.data[ lastKey ] ?? this.defaultItem; + + this.pointer = lastKey; + this.data[ lastKey ] = { ...lastItem, ...item }; + }, + + /** + * Clear the chat history. + * + * @since 1.9.1 + */ + clear() { + this.data = []; + this.pointer = 0; + }, + }; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.min.js new file mode 100755 index 00000000..d47b6746 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-chat-element.min.js @@ -0,0 +1,43 @@ +(()=>{let r=wpforms_ai_chat_element.modules||[];Promise.all(r.map(e=>import(e.path))).then(e=>{let s={},i;e.forEach((e,t)=>{t=r[t].name;"api"===t?i=e.default():s[t]=e.default}),window.WPFormsAi={api:i,helpers:s},customElements.define("wpforms-ai-chat",WPFormsAIChatHTMLElement)}).catch(e=>{wpf.debug("Error importing modules:",e)})})();class WPFormsAIChatHTMLElement extends HTMLElement{eventInitializes=!1;prefillSubmitted=!1;inputHeight={min:54,max:95};constructor(){super()}connectedCallback(){this.chatMode=this.getAttribute("mode")??"text",this.fieldId=this.getAttribute("field-id")??"",this.prefill=this.getAttribute("prefill")??"",this.autoSubmit="true"===this.getAttribute("auto-submit"),this.modeStrings=wpforms_ai_chat_element[this.chatMode]??{},this.loadingState=!1,this.modeHelpers=this.getHelpers(this),this.modeHelpers?(this.innerHTML.trim()||(this.innerHTML=this.getInnerHTML()),this.wrapper=this.querySelector(".wpforms-ai-chat"),this.input=this.querySelector(".wpforms-ai-chat-message-input input, .wpforms-ai-chat-message-input textarea"),this.welcomeScreenSamplePrompts=this.querySelector(".wpforms-ai-chat-welcome-screen-sample-prompts"),this.sendButton=this.querySelector(".wpforms-ai-chat-send"),this.stopButton=this.querySelector(".wpforms-ai-chat-stop"),this.messageList=this.querySelector(".wpforms-ai-chat-message-list"),this.isTextarea="TEXTAREA"===this.input.tagName,this.preventResizeInput=!1,navigator.userAgent.includes("Macintosh")||this.messageList.classList.add("wpforms-scrollbar-compact"),this.events(),this.initAnswers(),"function"==typeof this.modeHelpers.init&&this.modeHelpers.init(),this.autoSubmit&&this.prefill&&!this.prefillSubmitted&&(this.input.value=this.prefill,this.prefillSubmitted=!0,setTimeout(()=>this.sendMessage(!0),250))):console.error(`WPFormsAI error: chat mode "${this.chatMode}" helpers not found`)}getInnerHTML(){return this.modeStrings.chatHtml?this.decodeHTMLEntities(this.modeStrings.chatHtml):` +
            +
            + ${this.getWelcomeScreen()} +
            +
            + ${this.getMessageInputField()} + + +
            +
            + `}getMessageInputField(){return"function"==typeof this.modeHelpers.getMessageInputField?this.modeHelpers.getMessageInputField():``}getWelcomeScreen(){let e;return e=this.modeHelpers.isWelcomeScreen()?this.getWelcomeScreenContent():(this.messagePreAdded=!0,this.modeHelpers.getWarningMessage()),` +
            +
            +
            +

            ${this.modeStrings.title}

            + ${this.modeStrings.description} + ${this.modeStrings.learnMore} + +
            + ${e} +
            +
            + `}getWelcomeScreenContent(){var e=this.modeStrings?.samplePrompts,t=[];if(!e&&!this.modeStrings?.initialChat)return"";if(e){for(var s in e)t.push(` +
          • + + ${e[s].title} +
          • + `);return` +
              + ${t.join("")} +
            + `}return 0'}events(){this.eventInitializes||(this.sendButton.addEventListener("click",this.sendMessage.bind(this)),this.stopButton.addEventListener("click",this.stopLoading.bind(this)),this.input.addEventListener("keydown",this.keyDown.bind(this)),this.input.addEventListener("keyup",this.keyUp.bind(this)),this.bindWelcomeScreenEvents(),document.addEventListener("wpformsAIChatBeforeAddAnswer",this.preAnswer.bind(this)),this.eventInitializes=!0)}bindWelcomeScreenEvents(){null!==this.welcomeScreenSamplePrompts&&this.welcomeScreenSamplePrompts.querySelectorAll("li").forEach(e=>{e.addEventListener("click",this.clickDefaultItem.bind(this)),e.addEventListener("keydown",e=>{"Enter"===e.code&&(e.preventDefault(),this.clickDefaultItem(e))})})}initAnswers(){this.modeStrings.chatHtml&&(this.wpformsAiApi=this.getAiApi(),this.messageList.querySelectorAll(".wpforms-chat-item-answer").forEach(e=>{this.initAnswer(e)}))}keyUp(e){switch(("function"==typeof this.modeHelpers.resizeInput?this.modeHelpers:this).resizeInput(e),e.code){case"Enter":this.isTextarea&&(this.isTextarea,e.shiftKey)||(e.preventDefault(),this.sendMessage());break;case"ArrowUp":this.isTextarea&&(this.isTextarea,!e.ctrlKey)||(e.preventDefault(),this.arrowUp());break;case"ArrowDown":this.isTextarea&&(this.isTextarea,!e.ctrlKey)||(e.preventDefault(),this.arrowDown());break;default:this.history.update({question:this.input.value})}}keyDown(e){this.preventResizeInput="Enter"===e.code&&!e.shiftKey,this.preventResizeInput&&(e.preventDefault(),this.setInputHeight(this.inputHeight.min))}resizeInput(){var e;this.preventResizeInput?this.preventResizeInput=!1:(this.input.style.height="",this.input.style.paddingTop="10px",this.input.style.paddingBottom="10px",e=this.input.scrollHeight,e=Math.min(e,this.inputHeight.max),e=Math.max(e,this.inputHeight.min),this.setInputHeight(e))}setInputHeight(e){e<=this.inputHeight.min&&(this.input.style.paddingTop="",this.input.style.paddingBottom=""),this.input.style.height=e+"px",this.style.setProperty("--wpforms-ai-chat-input-height",e+"px")}sendMessage(e=!1){let t=this.input.value;t&&(e||(t=this.htmlSpecialChars(t)),this.triggerEvent("wpformsAIChatBeforeSendMessage",{fieldId:this.fieldId,mode:this.chatMode}),this.addFirstMessagePre(),this.welcomeScreenSamplePrompts?.remove(),this.resetInput(),this.addMessage(t,!0),this.startLoading(),""===t.trim()?this.addEmptyResultsError():("function"==typeof this.modeHelpers.prepareMessage&&(t=this.modeHelpers.prepareMessage(t)),this.getAiApi().prompt(t,this.sessionId).then(this.addAnswer.bind(this)).catch(this.apiResponseError.bind(this))))}apiResponseError(e){var t=e?.cause??null;this.triggerEvent("wpformsAIChatBeforeError",{fieldId:this.fieldId}),429===t?this.addError(this.modeStrings.errors.rate_limit||wpforms_ai_chat_element.errors.rate_limit,this.modeStrings.reasons.rate_limit||wpforms_ai_chat_element.reasons.rate_limit):500===t?this.addEmptyResultsError():(this.addError(e.message||this.modeStrings.errors.default||wpforms_ai_chat_element.errors.default,this.modeStrings.reasons.default||wpforms_ai_chat_element.reasons.default),wpf.debug("WPFormsAI error: ",e))}addFirstMessagePre(){var e;this.sessionId||this.messagePreAdded||(this.messagePreAdded=!0,(e=document.createElement("div")).classList.add("wpforms-ai-chat-divider"),this.messageList.appendChild(e))}clickDefaultItem(e){var t=("LI"===e.target.nodeName?e.target:e.target.closest("li")).querySelector("a")?.textContent;e.preventDefault(),t&&(this.input.value=t,this.history.push({question:t}),this.sendMessage())}clickDislikeButton(e){var e=e.target,t=e?.closest(".wpforms-chat-item-answer");t&&(e.classList.add("clicked"),e.setAttribute("disabled",!0),e=t.getAttribute("data-response-id"),this.wpformsAiApi.rate(!1,e))}async clickRefreshButton(){this.triggerEvent("wpformsAIChatBeforeRefreshConfirm",{fieldId:this.fieldId}),WPFormsAIModal.confirmModal({title:wpforms_ai_chat_element.confirm.refreshTitle,content:wpforms_ai_chat_element.confirm.refreshMessage,onConfirm:()=>{this.prefill="",this.messageList.innerHTML=this.getWelcomeScreen(),this.welcomeScreenSamplePrompts=this.querySelector(".wpforms-ai-chat-welcome-screen-sample-prompts"),this.bindWelcomeScreenEvents(),this.scrollMessagesTo("top"),this.wpformsAiApi=null,this.sessionId=null,this.messagePreAdded=null,this.wrapper.removeAttribute("data-session-id"),this.history.clear(),this.triggerEvent("wpformsAIChatAfterRefresh",{fieldId:this.fieldId})},onCancel:()=>{this.triggerEvent("wpformsAIChatCancelRefresh",{fieldId:this.fieldId})}})}startLoading(){this.loadingState=!0,this.sendButton.classList.add("wpforms-hidden"),this.stopButton.classList.remove("wpforms-hidden"),this.input.setAttribute("disabled",!0),this.input.setAttribute("placeholder",this.modeStrings.waiting)}stopLoading(){this.loadingState=!1,this.messageList.querySelector(".wpforms-chat-item-answer-waiting")?.remove(),this.sendButton.classList.remove("wpforms-hidden"),this.stopButton.classList.add("wpforms-hidden"),this.input.removeAttribute("disabled"),this.input.setAttribute("placeholder",this.modeStrings.placeholder),this.input.focus()}arrowUp(){var e=this.history.prev()?.question;void 0!==e&&(this.input.value=e)}arrowDown(){var e=this.history.next()?.question;void 0!==e&&(this.input.value=e)}getAiApi(){return this.wpformsAiApi||(this.sessionId=this.wrapper.getAttribute("data-session-id")||null,this.wpformsAiApi=window.WPFormsAi.api(this.chatMode,this.sessionId)),this.wpformsAiApi}scrollMessagesTo(e="bottom"){"top"===e?this.messageList.scrollTop=0:this.messageList.scrollHeight-this.messageList.scrollTop<22||(this.messageList.scrollTop=this.messageList.scrollHeight)}addMessage(e,t,s=null,i=!1){var r=this.messageList,a=document.createElement("div");if(a.classList.add("wpforms-chat-item"),i&&(a.classList.add("wpforms-chat-item-pre-message"),a.classList.add("pre-active")),r.appendChild(a),t){a.innerHTML=e,a.classList.add("wpforms-chat-item-question");var t=document.createElement("div"),n=document.createElement("div");t.classList.add("wpforms-chat-item-answer-waiting"),n.classList.add("wpforms-chat-item-spinner"),n.innerHTML=this.getSpinnerSvg(),t.appendChild(n),r.appendChild(t),this.history.push({})}else{n=document.createElement("div");if(n.classList.add("wpforms-chat-item-content"),a.appendChild(n),r.querySelector(".wpforms-chat-item-answer-waiting")?.remove(),this.messageList.querySelector(".wpforms-chat-item-answer.active")?.classList.remove("active"),this.messageList.querySelector(".wpforms-chat-item-answer.pre-active")?.classList.add("active"),this.messageList.querySelector(".wpforms-chat-item-answer.pre-active")?.classList.remove("pre-active"),a.classList.add("wpforms-chat-item-answer"),a.classList.add("active"),a.classList.add("wpforms-chat-item-typing"),a.classList.add("wpforms-chat-item-"+this.chatMode),a.setAttribute("data-response-id",s?.responseId??""),this.history.update({answer:e}),!i)return void this.typeText(n,e,this.addedAnswer.bind(this));n.innerHTML=e}this.scrollMessagesTo("bottom")}addError(e,t){this.addNotice(e,t)}addWarning(e,t){this.addNotice(e,t,"warning")}addNotice(e,t,s="error"){let i="";this.loadingState&&(e&&(i+=`

            ${e}

            `),t&&(i+=`${t}`),e=document.createElement("div"),t=document.createElement("div"),e.classList.add("wpforms-chat-item"),e.classList.add("wpforms-chat-item-"+s),t.classList.add("wpforms-chat-item-content"),e.appendChild(t),this.messageList.querySelector(".wpforms-chat-item-answer-waiting")?.remove(),this.messageList.appendChild(e),this.typeText(t,i,()=>{this.stopLoading()}))}addEmptyResultsError(){this.addError(this.modeStrings.errors.empty||wpforms_ai_chat_element.errors.empty,this.modeStrings.reasons.empty||wpforms_ai_chat_element.reasons.empty)}addProhibitedCodeWarning(){this.addWarning(this.modeStrings.warnings.prohibited_code||wpforms_ai_chat_element.warnings.prohibited_code,this.modeStrings.reasons.prohibited_code||wpforms_ai_chat_element.reasons.prohibited_code)}preAnswer(e){var t,e=e.detail.response;e.preMessage&&(e=this.sanitizeResponse({...e})).preMessage&&e.preMessage.title&&e.preMessage.text&&(t=`

            ${e.preMessage.title}

            ${e.preMessage.text}`,this.addMessage(t,!1,e,!0))}addAnswer(e){var t,s;this.loadingState&&e&&(e.processingData&&wpf.debug("WPFormsAI processing data:",e.processingData),t=this.sanitizeResponse({...e}),this.hasProhibitedCode(e,t)?(this.triggerEvent("wpformsAIChatBeforeError",{fieldId:this.fieldId}),this.addProhibitedCodeWarning()):(s=this.modeHelpers.getAnswer(t))?(this.sessionId=e.sessionId,this.wrapper.setAttribute("data-session-id",this.sessionId),this.triggerEvent("wpformsAIChatBeforeAddAnswer",{chat:this,response:t}),this.addMessage(s,!1,t),this.triggerEvent("wpformsAIChatAfterAddAnswer",{fieldId:this.fieldId})):(this.triggerEvent("wpformsAIChatBeforeError",{fieldId:this.fieldId}),this.addEmptyResultsError()))}hasProhibitedCode(e,t){return"function"==typeof this.modeHelpers.hasProhibitedCode&&this.modeHelpers.hasProhibitedCode(e,t)}sanitizeResponse(e){return"function"==typeof this.modeHelpers.sanitizeResponse?this.modeHelpers.sanitizeResponse(e):e}addedAnswer(e){e.innerHTML+=this.getAnswerButtons(),e.parentElement.classList.remove("wpforms-chat-item-typing"),this.stopLoading(),this.initAnswer(e),this.modeHelpers.addedAnswer(e),this.triggerEvent("wpformsAIChatAddedAnswer",{chat:this,element:e})}initAnswer(e){e&&(e.querySelectorAll(".wpforms-help-tooltip").forEach(e=>{var t;e.getAttribute("title")||(t=e.classList.contains("dislike")?wpforms_ai_chat_element.dislike:"",t=e.classList.contains("refresh")?wpforms_ai_chat_element.refresh:t,e.setAttribute("title",t)),e.classList.remove("tooltipstered")}),wpf.initTooltips(e),e.addEventListener("click",this.setActiveAnswer.bind(this)),e.querySelector(".wpforms-ai-chat-answer-button.dislike")?.addEventListener("click",this.clickDislikeButton.bind(this)),e.querySelector(".wpforms-ai-chat-answer-button.refresh")?.addEventListener("click",this.clickRefreshButton.bind(this)))}setActiveAnswer(e){var t=(t=e.target.closest(".wpforms-chat-item-answer"))||e.target;t.classList.contains("active")||(this.messageList.querySelector(".wpforms-chat-item-answer.active")?.classList.remove("active"),t.classList.add("active"),e=t.getAttribute("data-response-id"),this.modeHelpers.setActiveAnswer&&this.modeHelpers.setActiveAnswer(t),this.triggerEvent("wpformsAIChatSetActiveAnswer",{chat:this,responseId:e}))}getAnswerButtons(){return` +
            + ${this.modeHelpers.getAnswerButtonsPre()} +
            + + +
            +
            + `}typeText(s,i,r){let a=this,n=0,o="";!function e(){var t=i.substring(n,n+5);o+=t,s.innerHTML=o.replace(/<[^>]{0,300}$/g,""),(n+=5)]/g,e=>"�"+e.charCodeAt(0)+";")}decodeHTMLEntities(e){var t=document.createElement("textarea");return t.innerHTML=e,t.value}triggerEvent(e,t={}){e=new CustomEvent(e,{detail:t});return document.dispatchEvent(e),e}history={data:[],pointer:0,defaultItem:{question:"",answer:null},get(e=null){return e&&(this.pointer=e),this.pointer<1?this.pointer=0:this.pointer>=this.data.length&&(this.pointer=this.data.length-1),this.data[this.pointer]??{}},prev(){return--this.pointer,this.get()},next(){return this.pointer+=1,this.get()},push(e){e.answer?this.data[this.data.length-1].answer=e.answer:(this.data.push({...this.defaultItem,...e}),this.pointer=this.data.length-1)},update(e){var t=0 AIModalPin.addClass( 'not-allowed' ) ) + .on( 'wpformsAIChatBeforeError wpformsAIChatAfterTypeText', () => AIModalPin.removeClass( 'not-allowed' ) ); + + $( '#wpforms-panels-toggle button' ) + .off( 'click', onPanelToggleClick ) + .on( 'click', onPanelToggleClick ); + } + + /** + * Get the modal element. + * + * @since 1.9.5 + * + * @param {number} fieldId Field ID. + * + * @return {jQuery} Modal element. + */ + function getModal( fieldId ) { + const $chatElement = $( 'wpforms-ai-chat[field-id="' + fieldId + '"]' ); + + return $chatElement.closest( '.jconfirm.jconfirm-wpforms-ai-modal' ).last(); + } + + /** + * Prepare dock by adding pin button. + * + * @since 1.9.5 + * + * @param {number} fieldId Field ID. + */ + function prepareDock( fieldId ) { + const $jconfirmAIModal = getModal( fieldId ), + dockAlreadyPrepared = $jconfirmAIModal.find( '.wpforms-ai-modal-pin' ).length; + + if ( dockAlreadyPrepared ) { + return; + } + + const $closeIcon = $jconfirmAIModal.find( '.jconfirm-closeIcon' ); + + // Append new bar after close icon and move close icon inside this bar. + $closeIcon.after( + `
            +
            +
            ` + ).promise().done( function() { + const $topBar = $jconfirmAIModal.find( '.wpforms-ai-modal-top-bar' ); + + $closeIcon.appendTo( $topBar ); + } ); + + $closeIcon.attr( 'title', wpforms_ai_chat_element.close ); + + const $topBar = $jconfirmAIModal.find( '.wpforms-ai-modal-top-bar' ), + $messageList = $jconfirmAIModal.find( '.wpforms-ai-chat-message-list' ); + + $messageList.off( 'scroll' ); + $messageList.on( 'scroll', function() { + if ( $messageList.scrollTop() > 0 ) { + $topBar.addClass( 'scrolled' ); + + return; + } + + $topBar.removeClass( 'scrolled' ); + } ); + + $jconfirmAIModal.on( 'remove', function() { + $messageList.off( 'scroll' ); + } ); + } + + /** + * Maybe pin modal on open. + * + * @since 1.9.5 + * + * @param {string} fieldId Field ID. + */ + function onOpen( fieldId ) { + const savedState = localStorage.getItem( 'wpforms-ai-chat-prefers-pinned' ) || '0'; + + if ( savedState === '0' ) { + return; + } + + pinModal( getModal( fieldId ) ); + } + + /** + * Initialize the dock. + * + * @since 1.9.5 + * + * @param {number} fieldId Field ID. + */ + function init( fieldId ) { + prepareDock( fieldId ); + bindEvents(); + onOpen( fieldId ); + } + + return { init }; +}( jQuery ) ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-dock.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-dock.min.js new file mode 100755 index 00000000..9c18fe84 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/chat-element/wpforms-ai-dock.min.js @@ -0,0 +1,3 @@ +let wpFormsAIDock=(e=>{function s(o){localStorage.setItem("wpforms-ai-chat-prefers-pinned","1"),o.find(".wpforms-ai-modal-pin").attr("title",wpforms_ai_chat_element.unpinChat);var a=e("#wpforms-builder-form .wpforms-toolbar");let i=a.offset().top+a.outerHeight();o.addClass("pinned"),e("#wpadminbar").is(":visible")&&o.addClass("with-wpadminbar"),o.insertAfter(a).promise().done(function(){o.css({top:i})})}function a(o){localStorage.setItem("wpforms-ai-chat-prefers-pinned","0"),o.find(".wpforms-ai-modal-pin").attr("title",wpforms_ai_chat_element.pinChat),o.removeClass("pinned"),o.removeClass("with-wpadminbar"),o.appendTo(e("body")).promise().done(function(){o.css({top:0})}),o.find(".wpforms-ai-modal-top-bar").removeClass("scrolled")}function n(){var o;e(this).hasClass("not-allowed")||(((o=e(this).closest(".jconfirm.jconfirm-wpforms-ai-modal")).hasClass("pinned")?a:s)(o),e(".jconfirm.jconfirm-wpforms-ai-modal").not(o).each(function(){var o=e(this);(o.hasClass("pinned")?a:s)(o),o.hide()}))}function t(o){"fields"!==e(o.target).closest("button").data("panel")&&e(".jconfirm.jconfirm-wpforms-ai-modal.pinned").each(function(){e(this).hide()})}function r(o){return e('wpforms-ai-chat[field-id="'+o+'"]').closest(".jconfirm.jconfirm-wpforms-ai-modal").last()}return{init:function(a){{var i=a;let e=r(i),o=e.find(".wpforms-ai-modal-pin").length;if(!o){let a=e.find(".jconfirm-closeIcon"),o=(a.after(`
            +
            +
            `).promise().done(function(){var o=e.find(".wpforms-ai-modal-top-bar");a.appendTo(o)}),a.attr("title",wpforms_ai_chat_element.close),e.find(".wpforms-ai-modal-top-bar")),i=e.find(".wpforms-ai-chat-message-list");i.off("scroll"),i.on("scroll",function(){0o.addClass("not-allowed")).on("wpformsAIChatBeforeError wpformsAIChatAfterTypeText",()=>o.removeClass("not-allowed")),e("#wpforms-panels-toggle button").off("click",t).on("click",t)}i=a,"0"!==(localStorage.getItem("wpforms-ai-chat-prefers-pinned")||"0")&&s(r(i))}}})(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.js new file mode 100755 index 00000000..cab5e60f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.js @@ -0,0 +1,307 @@ +/* global wpforms_ai_chat_element, wpFormsAIDock */ + +// noinspection ES6ConvertVarToLetConst +/** + * AI modal. + * + * @since 1.9.1 + */ +// eslint-disable-next-line no-var +var WPFormsAIModal = window.WPFormsAIModal || ( function( document, window, $ ) { + /** + * Public functions and properties. + * + * @since 1.9.1 + * + * @type {Object} + */ + const app = { + /** + * Default modal options. + * + * @since 1.9.1 + */ + defaultOptions: { + title: false, + content: '', + type: 'ai', + smoothContent: true, + bgOpacity: 1, + boxWidth: 650, + contentMaxHeight: 600, + closeIcon: true, + buttons: false, + }, + + /** + * Start the engine. + * + * @since 1.9.1 + */ + init() { + $( app.ready ); + }, + + /** + * Initialized once the DOM is fully loaded. + * + * @since 1.9.1 + */ + ready() { + app.extendJqueryConfirm(); + app.bindChoicesActions(); + }, + + /** + * Process various events for choices modal. + * + * @since 1.9.1 + */ + bindChoicesActions() { + $( document ) + .on( 'click', '.wpforms-ai-choices-button', app.initChoicesModal ) + .on( 'wpformsAIChatBeforeRefreshConfirm', app.beforeChoicesRefreshConfirm ) + .on( 'wpformsAIModalBeforeWarningMessageInsert', app.refreshModalHeight ) + .on( 'wpformsAIChatAfterRefresh', app.refreshModalHeight ) + .on( 'wpformsAIChatCancelRefresh', app.cancelChoicesRefresh ) + .on( 'wpformsAIChatBeforeSendMessage', function( e ) { + app.resizeModalHeight( e.detail.fieldId ); + } ) + .on( 'wpformsAIChatAfterAddAnswer', function( e ) { + app.resizeModalHeight( e.detail.fieldId ); + } ) + .on( 'wpformsAIModalAfterChoicesInsert', function( e ) { + app.hideChoicesModal( e.detail.fieldId ); + } ); + + $( window ).on( 'resize', function() { + $( '.jconfirm-wpforms-ai-modal wpforms-ai-chat' ).each( function() { + app.resizeModalHeight( $( this ).attr( 'field-id' ) ); + } ); + } ); + }, + + /** + * Init modal window. + * + * @since 1.9.1 + * + * @param {Object} args Modal window arguments. + */ + initModal( args ) { + // Open the modal window. + $.confirm( { ...app.defaultOptions, ...args } ); + }, + + /** + * Init choices modal window. + * + * @since 1.9.1 + */ + initChoicesModal() { + const $button = $( this ); + + if ( $button.hasClass( 'wpforms-prevent-default' ) ) { + $button.trigger( 'blur' ); + return; + } + + const fieldId = $button.data( 'field-id' ), + $modal = $( `.jconfirm-wpforms-ai-modal-choices-${ fieldId }` ); + + // Close any other modals. + $( `.jconfirm-wpforms-ai-modal:not(.jconfirm-wpforms-ai-modal-choices-${ fieldId })` ) + .addClass( 'wpforms-hidden' ) + .fadeOut(); + + if ( $modal.length ) { + $modal.removeClass( 'wpforms-hidden' ).fadeIn(); + return; + } + + const args = {}, + hideChoices = function() { + app.hideChoicesModal( fieldId ); + return false; + }; + + args.content = ``; + args.theme = `wpforms-ai-modal, wpforms-ai-purple, wpforms-ai-modal-choices-${ fieldId }`; + args.backgroundDismiss = hideChoices; + args.backgroundDismissAnimation = ''; + args.contentMaxHeight = Math.min( app.defaultOptions.contentMaxHeight, app.getMaxModalHeight() ); + args.onOpen = function() { + // Unbind the click event from the close icon and use our own instead. + this.$closeIcon.off( 'click' ); + this.$closeIcon.on( 'click', hideChoices ); + }; + args.onOpenBefore = function() { + wpFormsAIDock.init( fieldId ); + }; + + app.initModal( args ); + }, + + /** + * Hide the choices modal window. + * + * @since 1.9.1 + * + * @param {string} fieldId Choice field ID. + */ + hideChoicesModal( fieldId ) { + $( `.jconfirm-wpforms-ai-modal-choices-${ fieldId }` ).addClass( 'wpforms-hidden' ).fadeOut(); + }, + + /** + * Show the choices modal window. + * + * @since 1.9.1 + * + * @param {string} fieldId Choice field ID. + */ + showChoicesModal( fieldId ) { + $( `.jconfirm-wpforms-ai-modal-choices-${ fieldId }` ).removeClass( 'wpforms-hidden' ).fadeIn(); + }, + + /** + * Resize choices modal window height. + * + * @since 1.9.4 + * + * @param {string} fieldId Field ID. + */ + resizeModalHeight( fieldId ) { + const modalHeight = app.getMaxModalHeight(); + const $modal = $( '.jconfirm-wpforms-ai-modal' ).filter( function() { + // find class starts with jconfirm-wpforms-ai-modal- and ends with -{fieldId}. + return $( this ).attr( 'class' ).match( new RegExp( 'jconfirm-wpforms-ai-modal-.*-' + fieldId, 'i' ) ); + } ); + + $modal.find( '.jconfirm-content-pane' ) + .css( { + height: modalHeight, + 'max-height': modalHeight, + } ); + }, + + /** + * Before choices refresh confirm is displayed. + * + * @since 1.9.1 + * + * @param {Event} e Event object. + */ + beforeChoicesRefreshConfirm( e ) { + const fieldId = e.detail?.fieldId || 0; + + app.hideChoicesModal( fieldId ); + }, + + /** + * Cancel choices' refresh. + * + * @since 1.9.1 + * + * @param {Event} e Event object. + */ + cancelChoicesRefresh( e ) { + const fieldId = e.detail?.fieldId || 0; + + app.showChoicesModal( fieldId ); + }, + + /** + * Refresh the main modal window height. + * + * @since 1.9.1 + * + * @param {Event} e Event object. + */ + refreshModalHeight( e ) { + const fieldId = e.detail?.fieldId || 0; + const maxHeight = Math.min( app.getMaxModalHeight(), app.defaultOptions.contentMaxHeight ); + + app.showChoicesModal( fieldId ); + + // Reset choices modal window height. + $( `.jconfirm-wpforms-ai-modal-choices-${ fieldId } .jconfirm-content-pane` ) + .css( { + height: maxHeight, + 'max-height': maxHeight, + } ); + }, + + /** + * Get the max modal height. + * + * @since 1.9.1 + * + * @return {number} The max modal height. + */ + getMaxModalHeight() { + // 80% of the window height, but not more than 800 px. + return Math.min( $( window ).height() * 0.8, 800 ); + }, + + /** + * Extend jquery-confirm plugin with support of max-height for the content area. + * + * @since 1.9.1 + */ + extendJqueryConfirm() { + // Extend a method of global instance. + window.Jconfirm.prototype._updateContentMaxHeight = function() { + this.$contentPane.css( { + 'max-height': this.contentMaxHeight + 'px', + } ); + }; + }, + + /** + * Confirm a modal window. + * + * This is a wrapper for the `jquery.confirm` plugin. + * + * @since 1.9.1 + * + * @param {Object} args Modal window arguments. + */ + confirmModal( args ) { + const options = { + title: false, + content: '', + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_ai_chat_element.btnYes, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + if ( typeof args.onConfirm === 'function' ) { + args.onConfirm(); + } + }, + }, + cancel: { + text: wpforms_ai_chat_element.btnCancel, + action() { + if ( typeof args.onCancel === 'function' ) { + args.onCancel(); + } + }, + }, + }, + }; + + $.confirm( { ...options, ...args } ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsAIModal.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.min.js new file mode 100755 index 00000000..2b7a5c59 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/choices/wpforms-ai-modal.min.js @@ -0,0 +1 @@ +var WPFormsAIModal=window.WPFormsAIModal||((e,o,t)=>{let n={defaultOptions:{title:!1,content:"",type:"ai",smoothContent:!0,bgOpacity:1,boxWidth:650,contentMaxHeight:600,closeIcon:!0,buttons:!1},init(){t(n.ready)},ready(){n.extendJqueryConfirm(),n.bindChoicesActions()},bindChoicesActions(){t(e).on("click",".wpforms-ai-choices-button",n.initChoicesModal).on("wpformsAIChatBeforeRefreshConfirm",n.beforeChoicesRefreshConfirm).on("wpformsAIModalBeforeWarningMessageInsert",n.refreshModalHeight).on("wpformsAIChatAfterRefresh",n.refreshModalHeight).on("wpformsAIChatCancelRefresh",n.cancelChoicesRefresh).on("wpformsAIChatBeforeSendMessage",function(e){n.resizeModalHeight(e.detail.fieldId)}).on("wpformsAIChatAfterAddAnswer",function(e){n.resizeModalHeight(e.detail.fieldId)}).on("wpformsAIModalAfterChoicesInsert",function(e){n.hideChoicesModal(e.detail.fieldId)}),t(o).on("resize",function(){t(".jconfirm-wpforms-ai-modal wpforms-ai-chat").each(function(){n.resizeModalHeight(t(this).attr("field-id"))})})},initModal(e){t.confirm({...n.defaultOptions,...e})},initChoicesModal(){var o=t(this);if(o.hasClass("wpforms-prevent-default"))o.trigger("blur");else{let i=o.data("field-id"),e=t(".jconfirm-wpforms-ai-modal-choices-"+i);if(t(`.jconfirm-wpforms-ai-modal:not(.jconfirm-wpforms-ai-modal-choices-${i})`).addClass("wpforms-hidden").fadeOut(),e.length)e.removeClass("wpforms-hidden").fadeIn();else{let e={},o=function(){return n.hideChoicesModal(i),!1};e.content=``,e.theme="wpforms-ai-modal, wpforms-ai-purple, wpforms-ai-modal-choices-"+i,e.backgroundDismiss=o,e.backgroundDismissAnimation="",e.contentMaxHeight=Math.min(n.defaultOptions.contentMaxHeight,n.getMaxModalHeight()),e.onOpen=function(){this.$closeIcon.off("click"),this.$closeIcon.on("click",o)},e.onOpenBefore=function(){wpFormsAIDock.init(i)},n.initModal(e)}}},hideChoicesModal(e){t(".jconfirm-wpforms-ai-modal-choices-"+e).addClass("wpforms-hidden").fadeOut()},showChoicesModal(e){t(".jconfirm-wpforms-ai-modal-choices-"+e).removeClass("wpforms-hidden").fadeIn()},resizeModalHeight(e){var o=n.getMaxModalHeight();t(".jconfirm-wpforms-ai-modal").filter(function(){return t(this).attr("class").match(new RegExp("jconfirm-wpforms-ai-modal-.*-"+e,"i"))}).find(".jconfirm-content-pane").css({height:o,"max-height":o})},beforeChoicesRefreshConfirm(e){e=e.detail?.fieldId||0;n.hideChoicesModal(e)},cancelChoicesRefresh(e){e=e.detail?.fieldId||0;n.showChoicesModal(e)},refreshModalHeight(e){var e=e.detail?.fieldId||0,o=Math.min(n.getMaxModalHeight(),n.defaultOptions.contentMaxHeight);n.showChoicesModal(e),t(`.jconfirm-wpforms-ai-modal-choices-${e} .jconfirm-content-pane`).css({height:o,"max-height":o})},getMaxModalHeight(){return Math.min(.8*t(o).height(),800)},extendJqueryConfirm(){o.Jconfirm.prototype._updateContentMaxHeight=function(){this.$contentPane.css({"max-height":this.contentMaxHeight+"px"})}},confirmModal(e){var o={title:!1,content:"",icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_ai_chat_element.btnYes,btnClass:"btn-confirm",keys:["enter"],action(){"function"==typeof e.onConfirm&&e.onConfirm()}},cancel:{text:wpforms_ai_chat_element.btnCancel,action(){"function"==typeof e.onCancel&&e.onCancel()}}}};t.confirm({...o,...e})}};return n})(document,window,jQuery);WPFormsAIModal.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.js new file mode 100755 index 00000000..92062a8b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.js @@ -0,0 +1,223 @@ +/* global wpforms_ai_form_generator, wpf, wpforms_ai_chat_element, WPFormsBuilder */ + +/** + * @param strings.dismissed.installAddons + * @param strings.isLicenseActive + * @param strings.modules.main + * @param strings.templateCard.buttonTextInit + * @param strings.templateCard.imageSrc + * @param strings.liteConnectAllowed + * @param strings.liteConnectEnabled + * @param strings.liteConnectNotAllowed + * @param window.WPFormsAIFormGenerator + * @param wpforms_builder.is_ai_disabled + */ + +// noinspection ES6ConvertVarToLetConst +/** + * WPForms AI Form Generator. + * + * @since 1.9.2 + */ +// eslint-disable-next-line no-var +var WPFormsAIFormGenerator = window.WPFormsAIFormGenerator || ( function( document, window, $ ) { + /** + * Localized strings. + * + * @since 1.9.2 + * + * @type {Object} + */ + const strings = wpforms_ai_form_generator; + + /** + * Public functions and properties. + * + * @since 1.9.2 + * + * @type {Object} + */ + const app = { + /** + * State data holder. + * + * @since 1.9.2 + * + * @type {Object} + */ + state: {}, + + /** + * Main module. + * + * @since 1.9.2 + * + * @type {Object} + */ + main: null, + + /** + * The form preview module. + * + * @since 1.9.2 + * + * @type {Object} + */ + preview: null, + + /** + * Start the engine. + * + * @since 1.9.2 + */ + init() { + if ( window.wpforms_builder?.is_ai_disabled || app.isLoaded ) { + return; + } + + app.updateLocationUrl(); + app.events(); + + app.isLoaded = true; + }, + + /** + * Events. + * + * @since 1.9.2 + */ + events() { + $( document ) + .on( 'wpformsSetupPanelBeforeInitTemplatesList', app.addTemplateCard ); + + $( '#wpforms-builder' ) + .on( 'wpformsBuilderReady', app.maybeSaveForm ) + .on( 'wpformsBuilderPanelLoaded', app.panelLoaded ); + }, + + /** + * Panel loaded event. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + * @param {string} panel Panel name. + */ + panelLoaded( e, panel ) { + if ( panel !== 'setup' ) { + return; + } + + // Load generator modules and run the main module. + Promise.all( [ + import( strings.modules.main ), + import( strings.modules.preview ), + import( strings.modules.modals ), + ] ) + .then( ( [ moduleMain, modulePreview, moduleModals ] ) => { + app.main = moduleMain.default( app, $ ); + app.preview = modulePreview.default( app, $ ); + app.modals = moduleModals.default( app, $ ); + + // Run the main module. + app.main.init(); + } ); + }, + + /** + * Add the generator template card to the list. + * + * At this point, before the list is rendered, we can add our card. + * The card will be added to the top of the list. + * Event handlers will be attached later by the main module. + * + * @since 1.9.2 + */ + addTemplateCard() { + if ( $( '#wpforms-template-generate' ).length ) { + return; + } + + $( '#wpforms-setup-templates-list .list' ).prepend( app.renderTemplateCard() ); + + wpf.initTooltips( $( '#wpforms-template-generate .wpforms-template-buttons' ) ); + }, + + /** + * Render the template card HTML. + * + * @since 1.9.2 + * + * @return {string} The card markup. + */ + renderTemplateCard() { // eslint-disable-line complexity + const cardClass = window.wpforms_builder?.template_slug === 'generate' ? 'selected' : ''; + + let buttonAttr = ''; + let buttonClass = ! Object.keys( strings.addonsData ).length || strings.dismissed.installAddons + ? 'wpforms-template-generate' + : 'wpforms-template-generate-install-addons'; + + // In Lite, we should disable the button in the case Lite Connect is not allowed. + if ( ! strings.isPro && ! strings.liteConnectAllowed ) { + buttonClass += ' wpforms-inactive wpforms-help-tooltip wpforms-prevent-default'; + buttonAttr = `data-tooltip-position="top" title="${ strings.templateCard.liteConnectNotAllowed }"`; + } + + // In Lite, we should show the modal to enable Lite Connect if it is allowed. + if ( ! strings.isPro && ! strings.liteConnectEnabled && strings.liteConnectAllowed ) { + buttonClass += ' enable-lite-connect-modal wpforms-prevent-default'; + } + + return ` +
            +
            +
            + ${ strings.templateCard.name } +
            +
            +
            +

            + ${ strings.templateCard.name } +

            + ${ strings.templateCard.new } +
            +

            + ${ strings.templateCard.desc } +

            + +
            + `; + }, + + /** + * Save the form when the generated form opened. + * + * @since 1.9.2 + */ + maybeSaveForm() { + // Only in case the generated form was used, we have a chat session in the localized vars. + if ( wpforms_ai_chat_element.forms?.chatHtml && ! wpf.getQueryString( 'newform' ) ) { + WPFormsBuilder.formSave( false ); + } + }, + + /** + * Remove the session from URL. + * + * @since 1.9.2 + */ + updateLocationUrl() { + history.replaceState( {}, null, wpf.updateQueryString( 'session', null ) ); + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsAIFormGenerator.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.min.js new file mode 100755 index 00000000..6b19de9b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/form-generator.min.js @@ -0,0 +1,23 @@ +var WPFormsAIFormGenerator=window.WPFormsAIFormGenerator||((e,r,s)=>{let l=wpforms_ai_form_generator,o={state:{},main:null,preview:null,init(){r.wpforms_builder?.is_ai_disabled||o.isLoaded||(o.updateLocationUrl(),o.events(),o.isLoaded=!0)},events(){s(e).on("wpformsSetupPanelBeforeInitTemplatesList",o.addTemplateCard),s("#wpforms-builder").on("wpformsBuilderReady",o.maybeSaveForm).on("wpformsBuilderPanelLoaded",o.panelLoaded)},panelLoaded(e,t){"setup"===t&&Promise.all([import(l.modules.main),import(l.modules.preview),import(l.modules.modals)]).then(([e,t,a])=>{o.main=e.default(o,s),o.preview=t.default(o,s),o.modals=a.default(o,s),o.main.init()})},addTemplateCard(){s("#wpforms-template-generate").length||(s("#wpforms-setup-templates-list .list").prepend(o.renderTemplateCard()),wpf.initTooltips(s("#wpforms-template-generate .wpforms-template-buttons")))},renderTemplateCard(){var e="generate"===r.wpforms_builder?.template_slug?"selected":"";let t="",a=!Object.keys(l.addonsData).length||l.dismissed.installAddons?"wpforms-template-generate":"wpforms-template-generate-install-addons";return l.isPro||l.liteConnectAllowed||(a+=" wpforms-inactive wpforms-help-tooltip wpforms-prevent-default",t=`data-tooltip-position="top" title="${l.templateCard.liteConnectNotAllowed}"`),l.isPro||l.liteConnectEnabled||!l.liteConnectAllowed||(a+=" enable-lite-connect-modal wpforms-prevent-default"),` +
            +
            +
            + ${l.templateCard.name} +
            +
            +
            +

            + ${l.templateCard.name} +

            + ${l.templateCard.new} +
            +

            + ${l.templateCard.desc} +

            + +
            + `},maybeSaveForm(){wpforms_ai_chat_element.forms?.chatHtml&&!wpf.getQueryString("newform")&&WPFormsBuilder.formSave(!1)},updateLocationUrl(){history.replaceState({},null,wpf.updateQueryString("session",null))}};return o})(document,window,jQuery);WPFormsAIFormGenerator.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.js new file mode 100755 index 00000000..90a2cd9e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.js @@ -0,0 +1,563 @@ +/* global wpf, wpforms_ai_form_generator, wpforms_ai_chat_element, WPFormsBuilder, wpforms_builder, WPFormsChallenge */ + +/** + * @param strings.panel.backToTemplates + * @param strings.panel.emptyStateDesc + * @param strings.panel.emptyStateTitle + * @param strings.templateCard.buttonTextContinue + * @param wpforms_ai_chat_element.forms.responseHistory + * @param wpforms_builder.template_slug + */ + +/** + * The WPForms AI form generator app. + * + * Main module. + * + * @since 1.9.2 + * + * @param {Object} generator The AI form generator. + * @param {Object} $ jQuery function. + * + * @return {Object} The main module object. + */ +export default function( generator, $ ) { // eslint-disable-line max-lines-per-function + /** + * Localized strings. + * + * @since 1.9.2 + * + * @type {Object} + */ + const strings = wpforms_ai_form_generator; + + /** + * The main module object. + * + * @since 1.9.2 + */ + const main = { + /** + * DOM elements. + * + * @since 1.9.2 + */ + el: {}, + + /** + * Init generator. + * + * @since 1.9.2 + */ + init() { + main.initState(); + main.initElementsCache(); + main.initStateProxy(); + + // Magic, we just need to set the state property to `true` to add the panel to the DOM. + generator.state.panelAdd = true; + + generator.preview.init(); + generator.modals.init(); + main.events(); + }, + + /** + * Init generator state. + * + * @since 1.9.2 + */ + initState() { + generator.state = { + formId: $( '#wpforms-builder-form' ).data( 'id' ), + panelAdd: false, + panelOpen: false, + chatStart: false, + aiResponse: null, + }; + }, + + /** + * Events. + * + * @since 1.9.2 + */ + events() { + // Setup panel events. + main.el.$setupPanel + .on( 'click', '.wpforms-template-generate', main.event.clickGenerateFormBtn ) + .on( 'click', '.wpforms-template-generate-install-addons', generator.modals.openAddonsModal ); + + // Generator panel events. + main.el.$generatorPanel + .on( 'click', '.wpforms-btn-back-to-templates', main.event.clickBackToTemplatesBtn ) + .on( 'click', '.wpforms-ai-chat-reload-link', main.event.reloadPage ) + .on( 'click', '.wpforms-ai-chat-use-form', main.event.useForm ); + + // The Form Builder events + main.el.$builder + .on( 'wpformsPanelSwitch', main.event.panelSwitch ); + + // AI chat events. + main.el.$doc + .on( 'wpformsBuilderReady', main.maybeOpenPanel ) + .on( 'wpformsAIChatBeforeAddAnswer', main.event.chatBeforeAddAnswer ) + .on( 'wpformsAIChatAddedAnswer', main.event.chatAddedAnswer ) + .on( 'wpformsAIChatAfterRefresh', main.event.chatAfterRefresh ) + .on( 'wpformsAIChatSetActiveAnswer', main.event.chatSetActiveAnswer ); + }, + + /** + * Init elements cache. + * + * @since 1.9.2 + */ + initElementsCache() { + // Cache DOM elements. + main.el.$doc = $( document ); + main.el.$builder = $( '#wpforms-builder' ); + main.el.$builderToolbar = $( '#wpforms-builder .wpforms-toolbar' ); + main.el.$templatesList = $( '#wpforms-setup-templates-list .list' ); // The templates list container. + main.el.$templateCard = $( '#wpforms-template-generate' ); // The generator template card. + main.el.$generatorPanel = $( '#wpforms-panel-ai-form' ); // The generator panel. + main.el.$setupPanel = $( '#wpforms-panel-setup' ); // The Setup panel. + main.el.$panelsContainer = $( '.wpforms-panels' ); // All panels container. + main.el.$allPanels = $( '.wpforms-panel' ); // All panels. + main.el.$chat = main.el.$generatorPanel.find( 'wpforms-ai-chat .wpforms-ai-chat' ); // The chat container. + }, + + /** + * Init state proxy. + * + * @since 1.9.2 + */ + initStateProxy() { + generator.state = new Proxy( generator.state, { + set( state, key, value ) { + // Set the state property. + state[ key ] = value; + + if ( typeof main.setStateHandler[ key ] !== 'function' ) { + return true; + } + + // Run the set state property handler. + main.setStateHandler[ key ]( value ); + + // Debug log. + wpf.debug( 'Form Generator state changed:', key, '=', value ); + + return true; + }, + } ); + }, + + /** + * Event handlers + * + * @since 1.9.2 + */ + event: { + /** + * Click on the `Generate Form` button. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + clickGenerateFormBtn( e ) { + e.preventDefault(); + + if ( $( this ).hasClass( 'wpforms-prevent-default' ) ) { + return; + } + + // Open the Form Generator panel. + generator.state.panelOpen = true; + }, + + /** + * Click on the `Back to Templates` button. + * + * @since 1.9.2 + */ + clickBackToTemplatesBtn() { + // Close the Form Generator panel. + generator.state.panelOpen = false; + }, + + /** + * Before adding the answer to the chat. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + chatBeforeAddAnswer( e ) { + // Store the AI response data in state. + generator.state.aiResponse = e.originalEvent.detail?.response; + generator.state.aiResponseHistory = generator.state.aiResponseHistory || {}; + generator.state.aiResponseHistory[ generator.state.aiResponse?.responseId ] = generator.state.aiResponse; + }, + + /** + * The answer added to the chat. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + chatAddedAnswer( e ) { + const chat = e.originalEvent.detail?.chat || {}; + + // Set chatStart state. + if ( chat?.sessionId && ! generator.state.chatStart ) { + generator.state.chatStart = true; + } + }, + + /** + * Refresh the chat triggered. + * + * @since 1.9.2 + */ + chatAfterRefresh() { + generator.preview.clear(); + }, + + /** + * Set active answer. Switch form preview to the active answer. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + chatSetActiveAnswer( e ) { + generator.state.aiResponse = generator.state.aiResponseHistory[ e.originalEvent.detail?.responseId ]; + }, + + /** + * Click on the "use this form" button. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + useForm( e ) { + e?.preventDefault(); + + const $button = $( this ); + const formId = generator.state.formId; + + if ( ! formId || wpforms_builder.template_slug === 'generate' ) { + main.useFormAjax( $button ); + } else { + generator.modals.openExistingFormModal( $button ); + } + }, + + /** + * Click on the "reload" link. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + reloadPage( e ) { + e?.preventDefault(); + window.location = window.location + '&ai-form'; + }, + + /** + * Switch the Form Builder panel. + * + * @since 1.9.2 + */ + panelSwitch() { + generator.state.panelOpen = false; + }, + }, + + /** + * Set state property handlers. + * + * Each handler runs when the appropriate state property was set. + * For example, when `panelAdd` state property was set, the `setStateHandler.panelAdd()` handler will run. + * + * @since 1.9.2 + */ + setStateHandler: { + /** + * `panelAdd` state handler. + * + * When the value is `true`, the panel will be added to the DOM, otherwise removed. + * + * @since 1.9.2 + * + * @param {boolean} value The state value. + */ + panelAdd( value ) { + // Remove the panel from DOM. + if ( ! value ) { + main.el.$generatorPanel?.remove(); + + return; + } + + // The panel already added, no need to add again. + if ( main.el.$generatorPanel?.length ) { + return; + } + + // Add panel to DOM. + main.el.$panelsContainer.append( main.render.generatorPanel() ); + + // Cache elements. + main.el.$generatorPanel = $( '#wpforms-panel-ai-form' ); + main.el.$chat = main.el.$generatorPanel.find( 'wpforms-ai-chat .wpforms-ai-chat' ); + }, + + /** + * Panel open state handler. + * + * @since 1.9.2 + * + * @param {boolean} value The state value. + */ + panelOpen( value ) { + main.el.$generatorPanel.toggleClass( 'active', value ); + main.el.$templateCard.addClass( 'selected' ); + main.setToolbarState( value ); + + // Freeze/unfreeze the Challenge. + window.WPFormsChallenge?.core.freezeChallenge( value, strings.misc.frozenChallengeTooltip ); + $( 'body' ).toggleClass( 'wpforms-ai-form-generator-active', value ); + + if ( + generator.state.aiResponseHistory || + ! wpforms_ai_chat_element.forms.responseHistory + ) { + return; + } + + // Update the response history if it exists. + generator.state.aiResponseHistory = wpforms_ai_chat_element.forms.responseHistory; + + const $activeResponse = main.el.$chat.find( '.wpforms-chat-item-answer.active' ); + const activeResponseId = $activeResponse.data( 'response-id' ); + + generator.state.aiResponse = generator.state.aiResponseHistory[ activeResponseId ]; + + // Scroll to the active response. + $activeResponse[ 0 ].scrollIntoView( { behavior: 'smooth', block: 'end' } ); + }, + + /** + * Chat start state handler. + * + * @since 1.9.2 + * + * @param {boolean} value The state value. + */ + chatStart( value ) { + if ( ! value ) { + return; + } + + // Update the generator template card button text. + main.el.$templateCard + .addClass( 'selected' ) + .find( '.wpforms-template-generate' ) + .text( strings.templateCard.buttonTextContinue ); + }, + + /** + * AI response state handler. + * + * @since 1.9.2 + * + * @param {Object} response The response data. + */ + aiResponse( response ) { + if ( ! response ) { + return; + } + + // Update the preview. + generator.preview.update(); + }, + + /** + * Is the form preview update in progress. + * + * @since 1.9.2 + * + * @param {boolean} value Flag value. + */ + isPreviewUpdate( value ) { + main.el.$chat.toggleClass( 'wpforms-ai-chat-inactive', value ); + }, + }, + + /** + * HTML renderers. + * + * @since 1.9.2 + */ + render: { + /** + * Render generator panel HTML. + * + * @since 1.9.2 + * + * @return {string} The panel markup. + */ + generatorPanel() { + return ` +
            +
            +
            +
            + +
            + +
            +
            +
            +
            +

            ${ strings.panel.emptyStateTitle }

            +

            ${ strings.panel.emptyStateDesc }

            +
            +
            +
            +
            +
            + `; + }, + }, + + /** + * Maybe open the form generator panel. + * + * @since 1.9.2 + */ + maybeOpenPanel() { + // Open the panel only if the `ai-form` query string parameter exists. + if ( ! window.location.search.includes( '&ai-form' ) ) { + return; + } + + // Remove the query string parameter from the URL. + history.replaceState( {}, null, wpf.updateQueryString( 'ai-form', null ) ); + + // Open the LiteConnect modal if it is not enabled. + const $buttonLiteConnect = $( '.wpforms-template-generate.enable-lite-connect-modal' ); + + if ( $buttonLiteConnect.length ) { + setTimeout( + function() { + $buttonLiteConnect.trigger( 'click' ); + }, + 0 + ); + return; + } + + // Open the panel if all addons are installed OR the modal is dismissed. + if ( ! Object.keys( strings.addonsData ).length || strings.dismissed.installAddons ) { + generator.state.panelOpen = true; + + return; + } + + // Open the addons install modal. + generator.modals.openAddonsModal( null ); + }, + + /** + * The "Use this form" ajax call. + * + * @since 1.9.2 + * + * @param {jQuery} $button Button element. + */ + useFormAjax( $button ) { + const sessionId = $button.closest( '.wpforms-ai-chat' ).data( 'session-id' ); + const responseId = $button.closest( '.wpforms-chat-item' ).data( 'response-id' ); + + WPFormsBuilder.showLoadingOverlay(); + + // Rate the response. + main.getChatElement()?.wpformsAiApi.rate( true, responseId ); + + // Do not display the alert about unsaved changes. + WPFormsBuilder.setCloseConfirmation( false ); + + const data = { + action: 'wpforms_use_ai_form', + nonce: strings.nonce, + formId: generator.state.formId, + formData: generator.state.aiResponseHistory[ responseId ], + sessionId, + chatHtml: $button.closest( 'wpforms-ai-chat' ).html(), + responseHistory: generator.state.aiResponseHistory, + }; + + generator.preview.closeTooltips(); + + $.post( strings.ajaxUrl, data ) + .done( function( res ) { + if ( ! res.success ) { + wpf.debug( 'Form Generator AJAX error:', res.data.error ?? res.data ); + return; + } + + const newForm = ! data.formId ? '&newform=1' : ''; + + if ( ! window.WPFormsChallenge ) { + window.location.assign( res.data.redirect + newForm ); + + return; + } + + // When the Challenge is active, we need to resume it and continue the steps. + WPFormsChallenge.core.resumeChallengeAndExec( {}, () => { + WPFormsChallenge.core.stepCompleted( 2 ) + .done( () => { + window.location.assign( res.data.redirect + newForm ); + } ); + } ); + } ) + .fail( function( xhr ) { + wpf.debug( 'Form Generator AJAX error:', xhr.responseText ?? xhr.statusText ); + } ); + }, + + /** + * Set the Builder's toolbar state. + * + * @since 1.9.2 + * + * @param {boolean} isEmpty The toolbar is empty. + */ + setToolbarState( isEmpty ) { + main.el.$builderToolbar.toggleClass( 'empty', isEmpty ); + main.el.$builderToolbar.find( '.js-wpforms-help span' ).toggleClass( 'screen-reader-text', ! isEmpty ); + }, + + /** + * Get the AI chat element. + * + * @since 1.9.2 + * + * @return {HTMLElement} The chat element. + */ + getChatElement() { + return main.el.$chat.parent()[ 0 ]; + }, + }; + + return main; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.min.js new file mode 100755 index 00000000..6b04e86e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/main.min.js @@ -0,0 +1,22 @@ +export default function(o,n){let r=wpforms_ai_form_generator,l={el:{},init(){l.initState(),l.initElementsCache(),l.initStateProxy(),o.state.panelAdd=!0,o.preview.init(),o.modals.init(),l.events()},initState(){o.state={formId:n("#wpforms-builder-form").data("id"),panelAdd:!1,panelOpen:!1,chatStart:!1,aiResponse:null}},events(){l.el.$setupPanel.on("click",".wpforms-template-generate",l.event.clickGenerateFormBtn).on("click",".wpforms-template-generate-install-addons",o.modals.openAddonsModal),l.el.$generatorPanel.on("click",".wpforms-btn-back-to-templates",l.event.clickBackToTemplatesBtn).on("click",".wpforms-ai-chat-reload-link",l.event.reloadPage).on("click",".wpforms-ai-chat-use-form",l.event.useForm),l.el.$builder.on("wpformsPanelSwitch",l.event.panelSwitch),l.el.$doc.on("wpformsBuilderReady",l.maybeOpenPanel).on("wpformsAIChatBeforeAddAnswer",l.event.chatBeforeAddAnswer).on("wpformsAIChatAddedAnswer",l.event.chatAddedAnswer).on("wpformsAIChatAfterRefresh",l.event.chatAfterRefresh).on("wpformsAIChatSetActiveAnswer",l.event.chatSetActiveAnswer)},initElementsCache(){l.el.$doc=n(document),l.el.$builder=n("#wpforms-builder"),l.el.$builderToolbar=n("#wpforms-builder .wpforms-toolbar"),l.el.$templatesList=n("#wpforms-setup-templates-list .list"),l.el.$templateCard=n("#wpforms-template-generate"),l.el.$generatorPanel=n("#wpforms-panel-ai-form"),l.el.$setupPanel=n("#wpforms-panel-setup"),l.el.$panelsContainer=n(".wpforms-panels"),l.el.$allPanels=n(".wpforms-panel"),l.el.$chat=l.el.$generatorPanel.find("wpforms-ai-chat .wpforms-ai-chat")},initStateProxy(){o.state=new Proxy(o.state,{set(e,t,a){return e[t]=a,"function"==typeof l.setStateHandler[t]&&(l.setStateHandler[t](a),wpf.debug("Form Generator state changed:",t,"=",a)),!0}})},event:{clickGenerateFormBtn(e){e.preventDefault(),n(this).hasClass("wpforms-prevent-default")||(o.state.panelOpen=!0)},clickBackToTemplatesBtn(){o.state.panelOpen=!1},chatBeforeAddAnswer(e){o.state.aiResponse=e.originalEvent.detail?.response,o.state.aiResponseHistory=o.state.aiResponseHistory||{},o.state.aiResponseHistory[o.state.aiResponse?.responseId]=o.state.aiResponse},chatAddedAnswer(e){(e.originalEvent.detail?.chat||{})?.sessionId&&!o.state.chatStart&&(o.state.chatStart=!0)},chatAfterRefresh(){o.preview.clear()},chatSetActiveAnswer(e){o.state.aiResponse=o.state.aiResponseHistory[e.originalEvent.detail?.responseId]},useForm(e){e?.preventDefault();e=n(this);o.state.formId&&"generate"!==wpforms_builder.template_slug?o.modals.openExistingFormModal(e):l.useFormAjax(e)},reloadPage(e){e?.preventDefault(),window.location=window.location+"&ai-form"},panelSwitch(){o.state.panelOpen=!1}},setStateHandler:{panelAdd(e){e?l.el.$generatorPanel?.length||(l.el.$panelsContainer.append(l.render.generatorPanel()),l.el.$generatorPanel=n("#wpforms-panel-ai-form"),l.el.$chat=l.el.$generatorPanel.find("wpforms-ai-chat .wpforms-ai-chat")):l.el.$generatorPanel?.remove()},panelOpen(e){var t;l.el.$generatorPanel.toggleClass("active",e),l.el.$templateCard.addClass("selected"),l.setToolbarState(e),window.WPFormsChallenge?.core.freezeChallenge(e,r.misc.frozenChallengeTooltip),n("body").toggleClass("wpforms-ai-form-generator-active",e),!o.state.aiResponseHistory&&wpforms_ai_chat_element.forms.responseHistory&&(o.state.aiResponseHistory=wpforms_ai_chat_element.forms.responseHistory,t=(e=l.el.$chat.find(".wpforms-chat-item-answer.active")).data("response-id"),o.state.aiResponse=o.state.aiResponseHistory[t],e[0].scrollIntoView({behavior:"smooth",block:"end"}))},chatStart(e){e&&l.el.$templateCard.addClass("selected").find(".wpforms-template-generate").text(r.templateCard.buttonTextContinue)},aiResponse(e){e&&o.preview.update()},isPreviewUpdate(e){l.el.$chat.toggleClass("wpforms-ai-chat-inactive",e)}},render:{generatorPanel(){return` +
            +
            +
            +
            + +
            + +
            +
            +
            +
            +

            ${r.panel.emptyStateTitle}

            +

            ${r.panel.emptyStateDesc}

            +
            +
            +
            +
            +
            + `}},maybeOpenPanel(){if(window.location.search.includes("&ai-form")){history.replaceState({},null,wpf.updateQueryString("ai-form",null));let e=n(".wpforms-template-generate.enable-lite-connect-modal");e.length?setTimeout(function(){e.trigger("click")},0):!Object.keys(r.addonsData).length||r.dismissed.installAddons?o.state.panelOpen=!0:o.modals.openAddonsModal(null)}},useFormAjax(e){var t=e.closest(".wpforms-ai-chat").data("session-id"),a=e.closest(".wpforms-chat-item").data("response-id");WPFormsBuilder.showLoadingOverlay(),l.getChatElement()?.wpformsAiApi.rate(!0,a),WPFormsBuilder.setCloseConfirmation(!1);let s={action:"wpforms_use_ai_form",nonce:r.nonce,formId:o.state.formId,formData:o.state.aiResponseHistory[a],sessionId:t,chatHtml:e.closest("wpforms-ai-chat").html(),responseHistory:o.state.aiResponseHistory};o.preview.closeTooltips(),n.post(r.ajaxUrl,s).done(function(t){if(t.success){let e=s.formId?"":"&newform=1";window.WPFormsChallenge?WPFormsChallenge.core.resumeChallengeAndExec({},()=>{WPFormsChallenge.core.stepCompleted(2).done(()=>{window.location.assign(t.data.redirect+e)})}):window.location.assign(t.data.redirect+e)}else wpf.debug("Form Generator AJAX error:",t.data.error??t.data)}).fail(function(e){wpf.debug("Form Generator AJAX error:",e.responseText??e.statusText)})},setToolbarState(e){l.el.$builderToolbar.toggleClass("empty",e),l.el.$builderToolbar.find(".js-wpforms-help span").toggleClass("screen-reader-text",!e)},getChatElement(){return l.el.$chat.parent()[0]}};return l} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.js new file mode 100755 index 00000000..862b82a3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.js @@ -0,0 +1,389 @@ +/* global wpforms_ai_form_generator, wpf, WPFormsBuilder, wpforms_builder */ + +/** + * @param strings.addonsAction + * @param strings.addonsData + * @param strings.addons.installTitle + * @param strings.addons.installContent + * @param strings.addons.activateContent + * @param strings.addons.installButton + * @param strings.addons.installConfirmButton + * @param strings.addons.activateConfirmButton + * @param strings.addons.cancelButton + * @param strings.addons.dontShow + * @param strings.addons.dismissErrorTitle + * @param strings.addons.dismissError + * @param strings.addons.addonsInstalledTitle + * @param strings.addons.addonsActivatedTitle + * @param strings.addons.addonsInstalledContent + * @param strings.addons.okay + * @param strings.addons.addonsInstallErrorTitle + * @param strings.addons.addonsActivateErrorTitle + * @param strings.addons.addonsInstallError + * @param strings.addons.addonsInstallErrorNetwork + * @param strings.adminNonce + * @param strings.misc.warningExistingForm + * @param this.$$confirm + * @param this.$$cancel + */ + +/** + * The WPForms AI form generator app. + * + * Modal windows' module. + * + * @since 1.9.2 + * + * @param {Object} generator The AI form generator. + * @param {Object} $ jQuery function. + * + * @return {Object} The preview module object. + */ +export default function( generator, $ ) { // eslint-disable-line max-lines-per-function + /** + * Localized strings. + * + * @since 1.9.2 + * + * @type {Object} + */ + const strings = wpforms_ai_form_generator; + + /** + * The preview module object. + * + * @since 1.9.2 + */ + const modals = { + /** + * DOM elements. + * + * @since 1.9.2 + */ + el: {}, + + /** + * AJAX error debug string. + * + * @since 1.9.2 + */ + ajaxError: 'Form Generator AJAX error:', + + /** + * Init generator. + * + * @since 1.9.2 + */ + init() { + modals.el.$doc = $( document ); + modals.el.$templateCard = $( '#wpforms-template-generate' ); + + modals.events(); + }, + + /** + * Register events. + */ + events() { + modals.el.$doc.on( 'change', '.wpforms-ai-forms-install-addons-modal-dismiss', modals.dismissAddonsModal ); + }, + + /** + * Open the addons modal. + * + * @since 1.9.2 + * + * @param {Object} e Event object. + */ + openAddonsModal( e ) { // eslint-disable-line max-lines-per-function + e?.preventDefault(); + + const spinner = ''; + const isInstall = strings.addonsAction === 'install'; + const content = isInstall ? strings.addons.installContent : strings.addons.activateContent; + + const options = { + title: strings.addons.installTitle, + content, + type: 'purple', + icon: 'fa fa-info-circle', + buttons: { + confirm: { + text: isInstall ? strings.addons.installConfirmButton : strings.addons.activateConfirmButton, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + const label = isInstall ? strings.addons.installing : strings.addons.activating; + + this.$$confirm.prop( 'disabled', true ).html( spinner + label ); + this.$$cancel.prop( 'disabled', true ); + + modals.installAddonsAjax( this ); + + return false; + }, + }, + cancel: { + text: strings.addons.cancelButton, + keys: [ 'esc' ], + btnClass: 'btn-cancel', + action() { + modals.updateGenerateFormButton( false ); + + // Open the Form Generator panel. + setTimeout( () => { + generator.state.panelOpen = true; + }, 250 ); + }, + }, + }, + onOpenBefore() { + // Add the checkbox to the modal. + const dontShowAgain = ` + + `; + + this.$body + .addClass( 'wpforms-ai-forms-install-addons-modal' ) + .find( '.jconfirm-buttons' ) + .after( dontShowAgain ); + }, + }; + + $.confirm( options ); + }, + + /** + * Install required addons AJAX. + * + * @since 1.9.2 + * + * @param {Object} previousModal Previous modal instance. + */ + installAddonsAjax( previousModal ) { // eslint-disable-line max-lines-per-function + let chain = null; + let errorDisplayed = false; + + const postDone = function( res ) { + if ( ! res.success ) { + wpf.debug( modals.ajaxError, res.data.error ?? res.data ); + } + + if ( ! res.success && ! errorDisplayed ) { + errorDisplayed = true; + + modals.openErrorModal( { + title: strings.addonsAction === 'install' ? strings.addons.addonsInstallErrorTitle : strings.addons.addonsActivateErrorTitle, + content: strings.addons.addonsInstallError, + } ); + } + }; + + const postFail = function( xhr ) { + if ( errorDisplayed ) { + return; + } + + const error = xhr.responseText || strings.addons.addonsInstallErrorNetwork; + let content = strings.addons.addonsInstallError; + + content += error && error !== 'error' ? '
            ' + error : ''; + + wpf.debug( modals.ajaxError, content ); + + modals.openErrorModal( { + title: strings.addonsAction === 'install' ? strings.addons.addonsInstallErrorTitle : strings.addons.addonsActivateErrorTitle, + content, + } ); + + errorDisplayed = true; + }; + + // Do not display the alert about unsaved changes. + WPFormsBuilder.setCloseConfirmation( false ); + + // Loop through all addons and make a chained AJAX calls. + for ( const slug in strings.addonsData ) { + const url = strings.addonsData[ slug ]?.url; + const data = { + action: url ? 'wpforms_install_addon' : 'wpforms_activate_addon', + nonce : strings.adminNonce, + plugin: url ? url : strings.addonsData[ slug ]?.path, + type : 'addon', + }; + + if ( chain === null ) { + chain = $.post( strings.ajaxUrl, data, postDone ); + } else { + chain = chain.then( () => { + return $.post( strings.ajaxUrl, data, postDone ); + } ); + } + + chain.fail( postFail ); + } + + // Open the Addons Installed modal after the last AJAX call. + chain + .then( () => { + if ( ! errorDisplayed ) { + modals.openAddonsInstalledModal(); + } + } ) + .always( () => { + previousModal.close(); + modals.updateGenerateFormButton( false ); + } ); + }, + + /** + * Dismiss or de-dismiss element. + * + * @since 1.9.2 + */ + dismissAddonsModal() { + const $checkbox = $( this ); + const isChecked = $checkbox.prop( 'checked' ); + + const data = { + action: 'wpforms_dismiss_ai_form', + nonce: strings.nonce, + element: 'install-addons-modal', + dismiss: isChecked, + }; + + modals.updateGenerateFormButton( ! isChecked ); + + $.post( strings.ajaxUrl, data ) + .done( function( res ) { + if ( res.success ) { + return; + } + + modals.openErrorModal( { + title: strings.addons.dismissErrorTitle, + content: strings.addons.dismissError, + } ); + + wpf.debug( modals.ajaxError, res.data.error ?? res.data ); + } ) + .fail( function( xhr ) { + modals.openErrorModal( { + title: strings.addons.dismissErrorTitle, + content: strings.addons.dismissError + '
            ' + strings.addons.addonsInstallErrorNetwork, + } ); + + wpf.debug( modals.ajaxError, xhr.responseText ?? xhr.statusText ); + } ); + }, + + /** + * Update the Generate Form button to enable/disable install addons modal window. + * + * @since 1.9.2 + * + * @param {boolean} shouldInstallAddons Should open install addons modal. + */ + updateGenerateFormButton( shouldInstallAddons ) { + if ( shouldInstallAddons ) { + $( '.wpforms-template-generate' ) + .removeClass( 'wpforms-template-generate' ) + .addClass( 'wpforms-template-generate-install-addons' ); + } else { + $( '.wpforms-template-generate-install-addons' ) + .removeClass( 'wpforms-template-generate-install-addons' ) + .addClass( 'wpforms-template-generate' ); + } + }, + + /** + * Open the Addons Installed modal. + * + * @since 1.9.2 + */ + openAddonsInstalledModal() { + const options = { + title: strings.addonsAction === 'install' ? strings.addons.addonsInstalledTitle : strings.addons.addonsActivatedTitle, + content: strings.addons.addonsInstalledContent, + icon: 'fa fa-check-circle', + type: 'green', + buttons: { + confirm: { + text: strings.addons.okay, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + WPFormsBuilder.showLoadingOverlay(); + window.location = window.location + '&ai-form'; + }, + }, + }, + onOpenBefore() { + this.$body + .addClass( 'wpforms-ai-forms-addons-installed-modal' ); + }, + }; + + $.confirm( options ); + }, + + /** + * Warning for the existing form. + * + * @since 1.9.2 + * + * @param {jQuery} $button The "Use This Form" button. + */ + openExistingFormModal( $button ) { + $.confirm( { + title: wpforms_builder.heads_up, + content: strings.misc.warningExistingForm, + icon: 'fa fa-exclamation-circle', + type: 'orange', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + generator.main.useFormAjax( $button ); + }, + }, + cancel: { + text: wpforms_builder.cancel, + }, + }, + } ); + }, + + /** + * Open the error modal. + * + * @since 1.9.2 + * + * @param {Object} args Arguments. + */ + openErrorModal( args ) { + const options = { + title: args.title ?? false, + content: args.content ?? false, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: strings.addons.okay, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + }, + }, + }; + + $.confirm( options ); + }, + }; + + return modals; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.min.js new file mode 100755 index 00000000..bc29184b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/modals.min.js @@ -0,0 +1,6 @@ +export default function(a,r){let l=wpforms_ai_form_generator,i={el:{},ajaxError:"Form Generator AJAX error:",init(){i.el.$doc=r(document),i.el.$templateCard=r("#wpforms-template-generate"),i.events()},events(){i.el.$doc.on("change",".wpforms-ai-forms-install-addons-modal-dismiss",i.dismissAddonsModal)},openAddonsModal(n){n?.preventDefault();let o="install"===l.addonsAction;n=o?l.addons.installContent:l.addons.activateContent,n={title:l.addons.installTitle,content:n,type:"purple",icon:"fa fa-info-circle",buttons:{confirm:{text:o?l.addons.installConfirmButton:l.addons.activateConfirmButton,btnClass:"btn-confirm",keys:["enter"],action(){var n=o?l.addons.installing:l.addons.activating;return this.$$confirm.prop("disabled",!0).html(''+n),this.$$cancel.prop("disabled",!0),i.installAddonsAjax(this),!1}},cancel:{text:l.addons.cancelButton,keys:["esc"],btnClass:"btn-cancel",action(){i.updateGenerateFormButton(!1),setTimeout(()=>{a.state.panelOpen=!0},250)}}},onOpenBefore(){var n=` + + `;this.$body.addClass("wpforms-ai-forms-install-addons-modal").find(".jconfirm-buttons").after(n)}};r.confirm(n)},installAddonsAjax(n){function o(n){n.success||wpf.debug(i.ajaxError,n.data.error??n.data),n.success||t||(t=!0,i.openErrorModal({title:"install"===l.addonsAction?l.addons.addonsInstallErrorTitle:l.addons.addonsActivateErrorTitle,content:l.addons.addonsInstallError}))}let a=null,t=!1;function e(n){var o;t||(n=n.responseText||l.addons.addonsInstallErrorNetwork,o=l.addons.addonsInstallError,o+=n&&"error"!==n?"
            "+n:"",wpf.debug(i.ajaxError,o),i.openErrorModal({title:"install"===l.addonsAction?l.addons.addonsInstallErrorTitle:l.addons.addonsActivateErrorTitle,content:o}),t=!0)}for(var s in WPFormsBuilder.setCloseConfirmation(!1),l.addonsData){var d=l.addonsData[s]?.url;let n={action:d?"wpforms_install_addon":"wpforms_activate_addon",nonce:l.adminNonce,plugin:d||l.addonsData[s]?.path,type:"addon"};(a=null===a?r.post(l.ajaxUrl,n,o):a.then(()=>r.post(l.ajaxUrl,n,o))).fail(e)}a.then(()=>{t||i.openAddonsInstalledModal()}).always(()=>{n.close(),i.updateGenerateFormButton(!1)})},dismissAddonsModal(){var n=r(this).prop("checked"),o={action:"wpforms_dismiss_ai_form",nonce:l.nonce,element:"install-addons-modal",dismiss:n};i.updateGenerateFormButton(!n),r.post(l.ajaxUrl,o).done(function(n){n.success||(i.openErrorModal({title:l.addons.dismissErrorTitle,content:l.addons.dismissError}),wpf.debug(i.ajaxError,n.data.error??n.data))}).fail(function(n){i.openErrorModal({title:l.addons.dismissErrorTitle,content:l.addons.dismissError+"
            "+l.addons.addonsInstallErrorNetwork}),wpf.debug(i.ajaxError,n.responseText??n.statusText)})},updateGenerateFormButton(n){n?r(".wpforms-template-generate").removeClass("wpforms-template-generate").addClass("wpforms-template-generate-install-addons"):r(".wpforms-template-generate-install-addons").removeClass("wpforms-template-generate-install-addons").addClass("wpforms-template-generate")},openAddonsInstalledModal(){var n={title:"install"===l.addonsAction?l.addons.addonsInstalledTitle:l.addons.addonsActivatedTitle,content:l.addons.addonsInstalledContent,icon:"fa fa-check-circle",type:"green",buttons:{confirm:{text:l.addons.okay,btnClass:"btn-confirm",keys:["enter"],action(){WPFormsBuilder.showLoadingOverlay(),window.location=window.location+"&ai-form"}}},onOpenBefore(){this.$body.addClass("wpforms-ai-forms-addons-installed-modal")}};r.confirm(n)},openExistingFormModal(n){r.confirm({title:wpforms_builder.heads_up,content:l.misc.warningExistingForm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_builder.ok,btnClass:"btn-confirm",keys:["enter"],action(){a.main.useFormAjax(n)}},cancel:{text:wpforms_builder.cancel}}})},openErrorModal(n){n={title:n.title??!1,content:n.content??!1,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:l.addons.okay,btnClass:"btn-confirm",keys:["enter"]}}};r.confirm(n)}};return i} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.js new file mode 100755 index 00000000..6cd3564f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.js @@ -0,0 +1,410 @@ +/* global wpforms_ai_form_generator, wpf, wpforms_addons */ + +/** + * @param strings.dismissed.previewNotice + * @param strings.licenseType + * @param strings.previewNotice.btnUpgrade + * @param strings.previewNotice.msgUpgrade + * @param wpforms_ai_form_generator.addonFields + */ + +/** + * The WPForms AI form generator app. + * + * Form preview module. + * + * @since 1.9.2 + * + * @param {Object} generator The AI form generator. + * @param {Object} $ jQuery function. + * + * @return {Object} The preview module object. + */ +export default function( generator, $ ) { // eslint-disable-line max-lines-per-function + /** + * Localized strings. + * + * @since 1.9.2 + * + * @type {Object} + */ + const strings = wpforms_ai_form_generator; + + /** + * The preview module object. + * + * @since 1.9.2 + */ + const preview = { + /** + * DOM elements. + * + * @since 1.9.2 + */ + el: {}, + + /** + * Mouse coordinates. + * + * @since 1.9.2 + */ + mouse: {}, + + /** + * Init module. + * + * @since 1.9.2 + */ + init() { + preview.el.$contentWrap = generator.main.el.$generatorPanel.find( '.wpforms-panel-content-wrap' ); + preview.el.$content = preview.el.$contentWrap.find( '.wpforms-panel-content' ); + preview.el.$emptyState = preview.el.$content.find( '.wpforms-panel-empty-state' ); + + preview.events(); + }, + + /** + * Preview events. + * + * @since 1.9.2 + */ + events() { + // Track mouse coordinates. + $( document ).on( 'mousemove', ( e ) => { + preview.mouse.x = e.pageX; + preview.mouse.y = e.pageY; + } ); + + preview.el.$contentWrap.on( 'scroll', preview.closeTooltips ); + }, + + /** + * Update the preview according to the response stored in the generator state. + * + * @since 1.9.2 + */ + update() { // eslint-disable-line complexity + /** + * @param response.fieldsOrder.length + * @param response.settings.submit_text + */ + const response = generator.state.aiResponse; + + if ( ! response || ! response.fields ) { + return; + } + + // Set the preview update flag. + generator.state.isPreviewUpdate = true; + + // Reset preview fields. Here we will store the field ids that where added to the preview. + generator.state.previewFields = []; + + // Remove existing fields and hide empty state. + preview.clear( false ); + + // Display the form header. + preview.displayHeader( response ); + + for ( const key in response.fieldsOrder ) { + const fieldId = response.fieldsOrder[ key ]; + preview.field( response.fields[ fieldId ], key ); + } + + // Add submit button. + if ( response.fieldsOrder?.length ) { + preview.displaySubmit( response.settings?.submit_text || strings.panel.submitButton ); + + return; + } + + // Show the empty state if there are no fields. + preview.el.$emptyState.removeClass( 'wpforms-hidden-strict' ); + + generator.state.isPreviewUpdate = false; + }, + + /** + * A single field preview. + * + * @since 1.9.2 + * + * @param {Object} fieldSettings Field settings. + * @param {number} key Field key. + */ + async field( fieldSettings, key ) { + // Add a field placeholder to the preview. + const html = ` +
            +
            +
            +
            + `; + + preview.el.$content.append( html ); + + const data = { + action: 'wpforms_get_ai_form_field_preview', + nonce: strings.nonce, + field: fieldSettings, + }; + + // Delay the AJAX request to simulate one-by-one field loading. + await preview.delay( 300 * key ); + + // Field preview AJAX request. + $.post( strings.ajaxUrl, data ) + .done( function( res ) { + if ( ! res.success ) { + wpf.debug( 'Form Generator AJAX error:', res.data.error ?? res.data ); + return; + } + + preview.displayField( res.data ?? '', fieldSettings ); + } ) + .fail( function( xhr ) { + wpf.debug( 'Form Generator AJAX error:', xhr.responseText ?? xhr.statusText ); + } ); + }, + + /** + * Display the field in his placeholder. + * + * @since 1.9.2 + * + * @param {string} fieldHtml Field HTML. + * @param {Object} fieldSettings Field settings. + */ + displayField( fieldHtml, fieldSettings ) { + if ( ! fieldSettings.id && fieldSettings.id !== 0 ) { + return; + } + + const $fieldBlock = preview.el.$content.find( '#wpforms-generator-field-' + fieldSettings.id ); + const $field = $fieldBlock.find( '.wpforms-field' ); + const $placeholder = $fieldBlock.find( '.placeholder' ); + + $placeholder + .addClass( 'fade-out' ); + + $field + .html( fieldHtml ?? '' ) + .addClass( 'fade-in' ) + .toggleClass( 'wpforms-hidden', ! fieldHtml ) // Hide preview if the field is empty. + .toggleClass( 'required', fieldSettings.required === '1' ) // Display the required field mark (asterisk) on the field label. + .toggleClass( 'label_empty', ! fieldSettings.label ); // The field with an empty label. + + preview.initTooltip( $field ); + preview.initPageBreak( $field, fieldSettings ); + + generator.state.previewFields.push( fieldSettings.id ); + + // Detect whether all the fields are loaded. + if ( generator.state.previewFields.length !== Object.keys( generator.state.aiResponse?.fields ).length ) { + return; + } + + generator.state.isPreviewUpdate = false; + }, + + /** + * Get addons used in AI response. + * + * @since 1.9.4 + * + * @return {string} Addons used in the response. + */ + getAddonsUsedInResponse() { // eslint-disable-line complexity + const response = generator.state.aiResponse; + + if ( ! response || ! response.fields ) { + return ''; + } + + const addons = []; + + for ( const key in response.fields ) { + const addon = wpforms_ai_form_generator.addonFields[ response.fields[ key ].type ]; + + if ( ! addon ) { + continue; + } + + const addonName = wpforms_addons[ 'wpforms-' + addon ]?.title.replace( strings.addons.addon, '' ).trim(); + + if ( ! addonName || addons.includes( addonName ) ) { + continue; + } + + addons.push( addonName ); + } + + if ( ! addons.length ) { + return ''; + } + + let lastAddon = addons.pop(); + + lastAddon += ' ' + strings.addons.addon; + + return addons.length ? addons.join( ', ' ) + ', ' + strings.addons.and + ' ' + lastAddon : lastAddon; + }, + + /** + * Init the page breaks. + * + * @since 1.9.2 + * + * @param {jQuery} $field Field jQuery object. + * @param {Object} fieldSettings Field settings. + */ + initPageBreak( $field, fieldSettings ) { + if ( fieldSettings.type === 'pagebreak' && ! [ 'top', 'bottom' ].includes( fieldSettings.position ) ) { + $field.addClass( 'wpforms-pagebreak-normal' ); + } + }, + + /** + * Init the preview tooltip. + * + * @since 1.9.2 + * + * @param {jQuery} $field Field jQuery object. + */ + initTooltip( $field ) { + const width = 260; + const args = { + content: strings.panel.tooltipTitle + '
            ' + strings.panel.tooltipText, + trigger: 'manual', + interactive: true, + animationDuration: 100, + delay: 0, + side: [ 'top' ], + contentAsHTML: true, + functionPosition: ( instance, helper, position ) => { + // Set the tooltip position based on the mouse coordinates. + position.coord.top = preview.mouse.y - 57; + position.coord.left = preview.mouse.x - ( width / 2 ); + + return position; + }, + }; + + // Initialize. + $field.tooltipster( args ); + preview.toggleTooltipOnClick( $field ); + }, + + /** + * Toggle the preview tooltip on click. + * + * @since 1.9.2 + * + * @param {jQuery} $field Field jQuery object. + */ + toggleTooltipOnClick( $field ) { + $field.on( 'click', () => { + // Close opened tooltips on other fields. + preview.closeTooltips(); + + const status = $field.tooltipster( 'status' ); + + $field.tooltipster( status.state === 'closed' ? 'open' : 'close' ); + + if ( status.state !== 'closed' ) { + return; + } + + const instance = $field.tooltipster( 'instance' ); + + // Adjust tooltip styling. + instance._$tooltip.css( { + height: 'auto', + } ); + + instance._$tooltip.find( '.tooltipster-arrow' ).css( { + left: '50%', + } ); + + // Close the tooltip after 5 seconds. + setTimeout( function() { + preview.closeTooltips(); + }, 5000 ); + } ); + }, + + /** + * Close tooltips. + * + * @since 1.9.2 + */ + closeTooltips() { + preview.el.$content.find( '.wpforms-field' ).each( function() { + const $this = $( this ); + + if ( $this.hasClass( 'tooltipstered' ) && $this.parent().length ) { + $this.tooltipster( 'close' ); + } + } ); + }, + + /** + * Display the form header. + * + * @since 1.9.4 + * + * @param {Object} response Button text. + */ + displayHeader( response ) { + const title = `

            ${ response.form_title ?? '' }

            `; + + // Add form title. + preview.el.$content.prepend( title ); + }, + + /** + * Display the `submit` button. + * + * @since 1.9.2 + * + * @param {string} label Button text. + */ + displaySubmit( label ) { + preview.el.$content + .append( `` ); + }, + + /** + * Clear the preview content. + * + * @since 1.9.2 + * + * @param {boolean} isEmptyState Whether to show the empty state or not. + */ + clear( isEmptyState = true ) { + preview.el.$content.find( '.wpforms-ai-form-generator-preview-field' ).remove(); + preview.el.$content.find( '.wpforms-ai-form-generator-preview-placeholder' ).remove(); + preview.el.$content.find( '.wpforms-ai-form-generator-preview-title' ).remove(); + preview.el.$content.find( '.wpforms-ai-form-generator-preview-addons-notice' ).remove(); + preview.el.$content.find( '.wpforms-ai-form-generator-preview-submit' ).remove(); + preview.el.$emptyState.toggleClass( 'wpforms-hidden-strict', ! isEmptyState ); + }, + + /** + * Delay promise. + * + * @since 1.9.2 + * + * @param {number} time Time in milliseconds. + * + * @return {Promise} Promise. + */ + delay( time ) { + return new Promise( ( res ) => { + setTimeout( res, time ); + } ); + }, + }; + + return preview; +} diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.min.js new file mode 100755 index 00000000..97f0d7aa --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/ai/form-generator/modules/preview.min.js @@ -0,0 +1,6 @@ +export default function(s,i){let n=wpforms_ai_form_generator,r={el:{},mouse:{},init(){r.el.$contentWrap=s.main.el.$generatorPanel.find(".wpforms-panel-content-wrap"),r.el.$content=r.el.$contentWrap.find(".wpforms-panel-content"),r.el.$emptyState=r.el.$content.find(".wpforms-panel-empty-state"),r.events()},events(){i(document).on("mousemove",e=>{r.mouse.x=e.pageX,r.mouse.y=e.pageY}),r.el.$contentWrap.on("scroll",r.closeTooltips)},update(){var e=s.state.aiResponse;if(e&&e.fields){for(var t in s.state.isPreviewUpdate=!0,s.state.previewFields=[],r.clear(!1),r.displayHeader(e),e.fieldsOrder){var o=e.fieldsOrder[t];r.field(e.fields[o],t)}e.fieldsOrder?.length?r.displaySubmit(e.settings?.submit_text||n.panel.submitButton):(r.el.$emptyState.removeClass("wpforms-hidden-strict"),s.state.isPreviewUpdate=!1)}},async field(t,e){var o=` +
            +
            +
            +
            + `,o=(r.el.$content.append(o),{action:"wpforms_get_ai_form_field_preview",nonce:n.nonce,field:t});await r.delay(300*e),i.post(n.ajaxUrl,o).done(function(e){e.success?r.displayField(e.data??"",t):wpf.debug("Form Generator AJAX error:",e.data.error??e.data)}).fail(function(e){wpf.debug("Form Generator AJAX error:",e.responseText??e.statusText)})},displayField(e,t){var o,i;!t.id&&0!==t.id||(i=(o=r.el.$content.find("#wpforms-generator-field-"+t.id)).find(".wpforms-field"),o.find(".placeholder").addClass("fade-out"),i.html(e??"").addClass("fade-in").toggleClass("wpforms-hidden",!e).toggleClass("required","1"===t.required).toggleClass("label_empty",!t.label),r.initTooltip(i),r.initPageBreak(i,t),s.state.previewFields.push(t.id),s.state.previewFields.length!==Object.keys(s.state.aiResponse?.fields).length)||(s.state.isPreviewUpdate=!1)},getAddonsUsedInResponse(){var e=s.state.aiResponse;if(!e||!e.fields)return"";var t,o,i=[];for(t in e.fields){var r=wpforms_ai_form_generator.addonFields[e.fields[t].type];r&&(r=wpforms_addons["wpforms-"+r]?.title.replace(n.addons.addon,"").trim())&&!i.includes(r)&&i.push(r)}return i.length?(o=i.pop(),o+=" "+n.addons.addon,i.length?i.join(", ")+", "+n.addons.and+" "+o:o):""},initPageBreak(e,t){"pagebreak"!==t.type||["top","bottom"].includes(t.position)||e.addClass("wpforms-pagebreak-normal")},initTooltip(e){var t={content:n.panel.tooltipTitle+"
            "+n.panel.tooltipText,trigger:"manual",interactive:!0,animationDuration:100,delay:0,side:["top"],contentAsHTML:!0,functionPosition:(e,t,o)=>(o.coord.top=r.mouse.y-57,o.coord.left=r.mouse.x-130,o)};e.tooltipster(t),r.toggleTooltipOnClick(e)},toggleTooltipOnClick(t){t.on("click",()=>{r.closeTooltips();var e=t.tooltipster("status");t.tooltipster("closed"===e.state?"open":"close"),"closed"===e.state&&((e=t.tooltipster("instance"))._$tooltip.css({height:"auto"}),e._$tooltip.find(".tooltipster-arrow").css({left:"50%"}),setTimeout(function(){r.closeTooltips()},5e3))})},closeTooltips(){r.el.$content.find(".wpforms-field").each(function(){var e=i(this);e.hasClass("tooltipstered")&&e.parent().length&&e.tooltipster("close")})},displayHeader(e){e=`

            ${e.form_title??""}

            `;r.el.$content.prepend(e)},displaySubmit(e){r.el.$content.append(``)},clear(e=!0){r.el.$content.find(".wpforms-ai-form-generator-preview-field").remove(),r.el.$content.find(".wpforms-ai-form-generator-preview-placeholder").remove(),r.el.$content.find(".wpforms-ai-form-generator-preview-title").remove(),r.el.$content.find(".wpforms-ai-form-generator-preview-addons-notice").remove(),r.el.$content.find(".wpforms-ai-form-generator-preview-submit").remove(),r.el.$emptyState.toggleClass("wpforms-hidden-strict",!e)},delay(t){return new Promise(e=>{setTimeout(e,t)})}};return r} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.js new file mode 100755 index 00000000..7fcc5d07 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.js @@ -0,0 +1,249 @@ +/* global wpf, WPFormsBuilder, WPFormsConstantContactV3AuthVars */ + +/** + * @param window.wpforms_admin + * @param window.wpforms_builder + * @param WPFormsConstantContactV3AuthVars.auth_url + */ + +/** + * WPForms Constant Contact V3 Popup. + * + * @since 1.9.3 + */ +const WPFormsConstantContactV3Auth = window.WPFormsConstantContactV3Auth || ( function( document, window, $ ) { + /** + * Public functions and properties. + * + * @since 1.9.3 + * + * @type {Object} + */ + const app = { + /** + * Is the authorization window opened? + * + * @since 1.9.3 + */ + isOpened : false, + + /** + * URL to listen for messages from the window. + * + * @since 1.9.3 + */ + listenURL: '', + + /** + * Start the engine. + * + * @since 1.9.3 + */ + init: () => { + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 1.9.3 + */ + ready: () => { + const redirectUri = new URL( WPFormsConstantContactV3AuthVars.auth_url ).searchParams.get( 'redirect_uri' ); + app.listenURL = new URL( redirectUri ).origin; + + $( document ) + .on( 'click', '.wpforms-constant-contact-v3-auth, .wpforms-builder-constant-contact-v3-provider-sign-up', app.showWindow ) + .on( 'click', '#wpforms-settings-constant-contact-v3-migration-prompt-link', app.promptMigration ); + }, + + /** + * Show a window. + * + * @since 1.9.3 + * + * @param {Event} e Click event. + */ + showWindow: ( e ) => { + e.preventDefault(); + + if ( app.isOpened ) { + return; + } + + const authUrl = WPFormsConstantContactV3AuthVars.auth_url, + width = 500, + height = 600, + left = ( screen.width / 2 ) - ( width / 2 ), + top = ( screen.height / 2 ) - ( height / 2 ), + loginHintEmail = $( '.wpforms-constant-contact-v3-auth' ).data( 'login-hint' ), + url = new URL( authUrl ); + + if ( loginHintEmail ) { + url.searchParams.set( 'login_hint', loginHintEmail ); + } + + const newWindow = window.open( + url.toString(), + 'authPopup', + 'width=' + width + ', height=' + height + ', top=' + top + ', left=' + left + ); + + window.addEventListener( 'message', app.listenResponse ); + const checkWindowClosed = setInterval( () => { + if ( newWindow.closed ) { + clearInterval( checkWindowClosed ); + app.isOpened = false; + } + }, 1000 ); + + app.isOpened = true; + }, + + /** + * Listen for response. + * + * @since 1.9.3 + * + * @param {Event} event Message event. + */ + listenResponse: ( event ) => { + if ( event.origin !== app.listenURL ) { + return; + } + + if ( ! event.data ) { + app.errorModal( WPFormsConstantContactV3AuthVars.strings.error ); + + return; + } + + app.saveAccount( event.data ); + }, + + /** + * Save account. + * + * @since 1.9.3 + * + * @param {string} code Authorization code. + */ + saveAccount: ( code ) => { + const modal = app.waitModal(); + + $.post( + WPFormsConstantContactV3AuthVars.ajax_url, + { + action: 'wpforms_constant_contact_popup_auth', + data: JSON.stringify( { code } ), + nonce: WPFormsConstantContactV3AuthVars.nonce, + } + ) + .done( ( response ) => { + if ( ! response.success ) { + modal.close(); + + const errorMessage = + '

            ' + WPFormsConstantContactV3AuthVars.strings.error + '

            ' + wpf.sanitizeHTML( response.data ) + '

            '; + + app.errorModal( errorMessage ); + + return; + } + + if ( typeof WPFormsBuilder === 'undefined' ) { + modal.close(); + window.location.href = WPFormsConstantContactV3AuthVars.page_url; + + return; + } + + WPFormsBuilder.formSave( false ).done( () => { + WPFormsBuilder.setCloseConfirmation( false ); + WPFormsBuilder.showLoadingOverlay(); + location.reload(); + } ); + } ); + }, + + /** + * Show a waiting modal. + * + * @since 1.9.3 + * + * @return {Object} Modal object. + */ + waitModal: () => { + return $.alert( { + title: '', + content: WPFormsConstantContactV3AuthVars.strings.wait, + icon: 'fa fa-info-circle', + type: 'blue', + buttons: false, + } ); + }, + + /** + * Show an error modal. + * + * @since 1.9.3 + * + * @param {string} content Alert text. + * + * @return {Object} Modal object. + */ + errorModal: ( content ) => { + const strings = window?.wpforms_builder || window?.wpforms_admin; + + return $.alert( { + title: strings.uh_oh, + content, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + cancel: { + text: strings.cancel, + action: () => { + app.isOpened = false; + }, + }, + }, + } ); + }, + + /** + * Prompt and start migration from v2 to v3 in the notice. + * + * @since 1.9.3 + * + * @param {Object} e Event object. + */ + promptMigration( e ) { + e.preventDefault(); + + const modal = app.waitModal(); + + $.post( { + url: WPFormsConstantContactV3AuthVars.ajax_url, + data: { + action: 'wpforms_constant_contact_migration_prompt', + nonce: WPFormsConstantContactV3AuthVars.nonce, + }, + success: () => { + modal.close(); + window.location.href = WPFormsConstantContactV3AuthVars.page_url; + }, + error: () => { + modal.close(); + app.errorModal( WPFormsConstantContactV3AuthVars.strings.error ); + }, + } ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsConstantContactV3Auth.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.min.js new file mode 100755 index 00000000..260b3582 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/auth.min.js @@ -0,0 +1 @@ +let WPFormsConstantContactV3Auth=window.WPFormsConstantContactV3Auth||((o,s,i)=>{let c={isOpened:!1,listenURL:"",init:()=>{i(c.ready)},ready:()=>{var t=new URL(WPFormsConstantContactV3AuthVars.auth_url).searchParams.get("redirect_uri");c.listenURL=new URL(t).origin,i(o).on("click",".wpforms-constant-contact-v3-auth, .wpforms-builder-constant-contact-v3-provider-sign-up",c.showWindow).on("click","#wpforms-settings-constant-contact-v3-migration-prompt-link",c.promptMigration)},showWindow:n=>{if(n.preventDefault(),!c.isOpened){var n=WPFormsConstantContactV3AuthVars.auth_url,a=screen.width/2-250,r=screen.height/2-300,e=i(".wpforms-constant-contact-v3-auth").data("login-hint"),n=new URL(n);e&&n.searchParams.set("login_hint",e);let t=s.open(n.toString(),"authPopup","width=500, height=600, top="+r+", left="+a),o=(s.addEventListener("message",c.listenResponse),setInterval(()=>{t.closed&&(clearInterval(o),c.isOpened=!1)},1e3));c.isOpened=!0}},listenResponse:t=>{t.origin===c.listenURL&&(t.data?c.saveAccount(t.data):c.errorModal(WPFormsConstantContactV3AuthVars.strings.error))},saveAccount:t=>{let o=c.waitModal();i.post(WPFormsConstantContactV3AuthVars.ajax_url,{action:"wpforms_constant_contact_popup_auth",data:JSON.stringify({code:t}),nonce:WPFormsConstantContactV3AuthVars.nonce}).done(t=>{t.success?"undefined"==typeof WPFormsBuilder?(o.close(),s.location.href=WPFormsConstantContactV3AuthVars.page_url):WPFormsBuilder.formSave(!1).done(()=>{WPFormsBuilder.setCloseConfirmation(!1),WPFormsBuilder.showLoadingOverlay(),location.reload()}):(o.close(),t="

            "+WPFormsConstantContactV3AuthVars.strings.error+"

            "+wpf.sanitizeHTML(t.data)+"

            ",c.errorModal(t))})},waitModal:()=>i.alert({title:"",content:WPFormsConstantContactV3AuthVars.strings.wait,icon:"fa fa-info-circle",type:"blue",buttons:!1}),errorModal:t=>{var o=s?.wpforms_builder||s?.wpforms_admin;return i.alert({title:o.uh_oh,content:t,icon:"fa fa-exclamation-circle",type:"red",buttons:{cancel:{text:o.cancel,action:()=>{c.isOpened=!1}}}})},promptMigration(t){t.preventDefault();let o=c.waitModal();i.post({url:WPFormsConstantContactV3AuthVars.ajax_url,data:{action:"wpforms_constant_contact_migration_prompt",nonce:WPFormsConstantContactV3AuthVars.nonce},success:()=>{o.close(),s.location.href=WPFormsConstantContactV3AuthVars.page_url},error:()=>{o.close(),c.errorModal(WPFormsConstantContactV3AuthVars.strings.error)}})}};return c})(document,window,jQuery);WPFormsConstantContactV3Auth.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.js new file mode 100755 index 00000000..8f28c951 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.js @@ -0,0 +1,603 @@ +/* global WPForms, wpf */ + +/** + * WPForms Providers Builder ConstantContactV3 module. + * + * @since 1.9.3 + */ +WPForms.Admin.Builder.Providers.ConstantContactV3 = WPForms.Admin.Builder.Providers.ConstantContactV3 || ( function( document, window, $ ) { + /** + * Public functions and properties. + * + * @since 1.9.3 + * + * @type {Object} + */ + const app = { + /** + * CSS selectors. + * + * @since 1.9.3 + * + * @type {Object} + */ + selectors: { + accountField: '.js-wpforms-builder-constant-contact-v3-provider-connection-account', + actionData: '.wpforms-builder-constant-contact-v3-provider-actions-data', + actionField: '.js-wpforms-builder-constant-contact-v3-provider-connection-action', + connection: '.wpforms-panel-content-section-constant-contact-v3 .wpforms-builder-provider-connection', + }, + + /** + * jQuery elements. + * + * @since 1.9.3 + * + * @type {Object} + */ + $elements: { + $connections: $( '.wpforms-panel-content-section-constant-contact-v3 .wpforms-builder-provider-connections' ), + $holder: $( '#wpforms-panel-providers' ), + $panel: $( '#constant-contact-v3-provider' ), + }, + + /** + * Current provider slug. + * + * @since 1.9.3 + * + * @type {string} + */ + provider: 'constant-contact-v3', + + /** + * This is a shortcut to the WPForms.Admin.Builder.Providers object, + * that handles the parent all-providers functionality. + * + * @since 1.9.3 + * + * @type {Object} + */ + Providers: {}, + + /** + * This is a shortcut to the WPForms.Admin.Builder.Templates object, + * that handles all the template management. + * + * @since 1.9.3 + * + * @type {Object} + */ + Templates: {}, + + /** + * This is a shortcut to the WPForms.Admin.Builder.Providers.cache object, + * that handles all the cache management. + * + * @since 1.9.3 + * + * @type {Object} + */ + Cache: {}, + + /** + * This is a flag for ready state. + * + * @since 1.9.3 + * + * @type {boolean} + */ + isReady: false, + + /** + * Start the engine. + * + * Run initialization on the providers panel only. + * + * @since 1.9.3 + */ + init() { + // We are requesting/loading a Providers panel. + if ( wpf.getQueryString( 'view' ) === 'providers' ) { + app.$elements.$holder.on( 'WPForms.Admin.Builder.Providers.ready', app.ready ); + } + + // We have switched to a Providers panel. + $( document ).on( 'wpformsPanelSwitched', function( event, panel ) { + if ( panel === 'providers' ) { + app.ready(); + } + } ); + }, + + /** + * Initialized once the DOM and Providers are fully loaded. + * + * @since 1.9.3 + */ + ready() { + if ( app.isReady ) { + return; + } + + app.Providers = WPForms.Admin.Builder.Providers; + app.Templates = WPForms.Admin.Builder.Templates; + app.Cache = app.Providers.cache; + + // Register custom Underscore.js templates. + app.Templates.add( [ + 'wpforms-constant-contact-v3-builder-content-connection', + 'wpforms-constant-contact-v3-builder-content-connection-error', + 'wpforms-constant-contact-v3-builder-content-connection-select-field', + 'wpforms-constant-contact-v3-builder-content-connection-conditionals', + ] ); + + // Events registration. + app.bindUIActions(); + app.bindTriggers(); + + app.processInitial(); + + // Save a flag for ready state. + app.isReady = true; + }, + + /** + * Process various events as a response to UI interactions. + * + * @since 1.9.3 + */ + bindUIActions() { + app.$elements.$panel + .on( 'connectionCreate', app.connection.create ) + .on( 'connectionDelete', app.connection.delete ) + .on( 'change', app.selectors.accountField, app.ui.accountField.change ) + .on( 'change', app.selectors.actionField, app.ui.actionField.change ); + }, + + /** + * Fire certain events on certain actions, specific for related connections. + * These are not directly caused by user manipulations. + * + * @since 1.9.3 + */ + bindTriggers() { + app.$elements.$connections.on( 'connectionsDataLoaded', function( event, data ) { + if ( _.isEmpty( data.connections ) ) { + return; + } + + for ( const connectionId in data.connections ) { + app.connection.generate( { + connection: data.connections[ connectionId ], + conditional: data.conditionals[ connectionId ], + } ); + } + } ); + + app.$elements.$connections.on( 'connectionGenerated', function( event, data ) { + const $connection = app.connection.getById( data.connection.id ); + + if ( _.has( data.connection, 'isNew' ) && data.connection.isNew ) { + // Run replacing temporary connection ID if it's a new connection. + app.connection.replaceIds( data.connection.id, $connection ); + return; + } + + $( app.selectors.actionField, $connection ).trigger( 'change' ); + } ); + }, + + /** + * Compile template with data if any and display them on a page. + * + * @since 1.9.3 + */ + processInitial() { + app.connection.dataLoad(); + }, + + /** + * Connection property. + * + * @since 1.9.3 + */ + connection: { + /** + * Sometimes we might need to a get a connection DOM element by its ID. + * + * @since 1.9.3 + * + * @param {string} connectionId Connection ID to search for a DOM element by. + * + * @return {jQuery} jQuery object for connection. + */ + getById( connectionId ) { + return app.$elements.$connections.find( '.wpforms-builder-provider-connection[data-connection_id="' + connectionId + '"]' ); + }, + + /** + * Sometimes in DOM we might have placeholders or temporary connection IDs. + * We need to replace them with actual values. + * + * @since 1.9.3 + * + * @param {string} connectionId New connection ID to replace to. + * @param {Object} $connection jQuery DOM connection element. + */ + replaceIds( connectionId, $connection ) { + // Replace old temporary %connection_id% from PHP code with the new one. + $connection.find( 'input, select, label' ).each( function() { + const $this = $( this ); + + if ( $this.attr( 'name' ) ) { + $this.attr( 'name', $this.attr( 'name' ).replace( /%connection_id%/gi, connectionId ) ); + } + + if ( $this.attr( 'id' ) ) { + $this.attr( 'id', $this.attr( 'id' ).replace( /%connection_id%/gi, connectionId ) ); + } + + if ( $this.attr( 'for' ) ) { + $this.attr( 'for', $this.attr( 'for' ).replace( /%connection_id%/gi, connectionId ) ); + } + + if ( $this.attr( 'data-name' ) ) { + $this.attr( 'data-name', $this.attr( 'data-name' ).replace( /%connection_id%/gi, connectionId ) ); + } + } ); + }, + + /** + * Create a connection using the user entered name. + * + * @since 1.9.3 + * + * @param {Object} event Event object. + * @param {string} name Connection name. + */ + create( event, name ) { + const connectionId = new Date().getTime().toString( 16 ), + connection = { + id: connectionId, + name, + isNew: true, + }; + + app.Cache.addTo( app.provider, 'connections', connectionId, connection ); + + app.connection.generate( { + connection, + } ); + }, + + /** + * Connection is deleted - delete a cache as well. + * + * @since 1.9.3 + * + * @param {Object} event Event object. + * @param {Object} $connection jQuery DOM element for a connection. + */ + delete( event, $connection ) { + const $holder = app.Providers.getProviderHolder( app.provider ); + + if ( ! $connection.closest( $holder ).length ) { + return; + } + + const connectionId = $connection.data( 'connection_id' ); + + if ( _.isString( connectionId ) ) { + app.Cache.deleteFrom( app.provider, 'connections', connectionId ); + } + }, + + /** + * Get the template and data for a connection and process it. + * + * @since 1.9.3 + * + * @param {Object} data Connection data. + * + * @return {void} + */ + generate( data ) { + const accounts = app.Cache.get( app.provider, 'accounts' ); + + if ( _.isEmpty( accounts ) || ! app.account.isAccountExists( data.connection.account_id, accounts ) ) { + return; + } + + const actions = app.Cache.get( app.provider, 'actions' ), + lists = app.Cache.get( app.provider, 'lists' ); + + return app.connection.renderConnections( accounts, lists, actions, data ); + }, + + /** + * Render connections. + * + * @since 1.9.3 + * + * @param {Object} accounts List of accounts. + * @param {Object} lists List of lists. + * @param {Object} actions List of actions. + * @param {Object} data Connection data. + */ + renderConnections( accounts, lists, actions, data ) { + if ( ! app.account.isAccountExists( data.connection.account_id, accounts ) ) { + return; + } + + const tmplConnection = app.Templates.get( 'wpforms-' + app.provider + '-builder-content-connection' ), + tmplConditional = app.Templates.get( 'wpforms-constant-contact-v3-builder-content-connection-conditionals' ), + conditional = _.has( data.connection, 'isNew' ) && data.connection.isNew ? tmplConditional() : data.conditional; + + app.$elements.$connections.prepend( + tmplConnection( { + accounts, + lists, + actions, + connection: data.connection, + conditional, + provider: app.provider, + } ) + ); + + app.$elements.$connections.trigger( 'connectionGenerated', [ data ] ); + }, + + /** + * Fire AJAX-request to retrieve the list of all saved connections. + * + * @since 1.9.3 + */ + dataLoad() { + app + .Providers.ajax + .request( app.provider, { + data: { + task: 'connections_get', + }, + } ) + .done( function( response ) { + if ( + ! response.success || + ! _.has( response.data, 'connections' ) + ) { + return; + } + + [ + 'accounts', + 'actions', + 'actions_fields', + 'conditionals', + 'connections', + 'custom_fields', + 'lists', + ].forEach( ( dataType ) => { + app.Cache.set( app.provider, dataType, jQuery.extend( {}, response.data[ dataType ] ) ); + } ); + + app.$elements.$connections.trigger( 'connectionsDataLoaded', [ response.data ] ); + } ); + }, + }, + + /** + * Account property. + * + * @since 1.9.3 + */ + account: { + /** + * Check if a provided account is listed inside an account list. + * + * @since 1.9.3 + * + * @param {string} accountId Connection account ID to check. + * @param {Object} accounts Array of objects, usually received from API. + * + * @return {boolean} True if an account exists. + */ + isAccountExists( accountId, accounts ) { + if ( _.isEmpty( accounts ) ) { + return false; + } + + // New connections that have not been saved don't have the account ID yet. + if ( _.isEmpty( accountId ) ) { + return true; + } + + return _.has( accounts, accountId ); + }, + }, + + /** + * All methods that modify the UI of a page. + * + * @since 1.9.3 + */ + ui: { + /** + * Account field methods. + * + * @since 1.9.3 + */ + accountField: { + /** + * Callback-function on change event. + * + * @since 1.9.3 + */ + change() { + const $this = $( this ), + $connection = $this.closest( app.selectors.connection ), + $actionName = $( app.selectors.actionField, $connection ); + + $actionName.prop( 'selectedIndex', 0 ).trigger( 'change' ); + + // If an account is empty. + if ( _.isEmpty( $this.val() ) ) { + $actionName.prop( 'disabled', true ); + $( app.selectors.actionData, $connection ).html( '' ); + + return; + } + + $actionName.prop( 'disabled', false ); + $this.removeClass( 'wpforms-error' ); + }, + }, + + /** + * Action methods. + * + * @since 1.9.3 + */ + actionField: { + /** + * Callback-function on change event. + * + * @since 1.9.3 + */ + change() { + const $this = $( this ), + $connection = $this.closest( app.selectors.connection ), + $account = $( app.selectors.accountField, $connection ), + $action = $( app.selectors.actionField, $connection ); + + app.ui.actionField.render( { + action: 'action', + target: $this, + /* eslint-disable camelcase */ + account_id: $account.val(), + action_name: $action.val(), + connection_id: $connection.data( 'connection_id' ), + /* eslint-enable camelcase */ + } ); + + $this.removeClass( 'wpforms-error' ); + }, + + /** + * Render HTML. + * + * @since 1.9.3 + * + * @param {Object} args Arguments. + */ + render( args ) { + const fields = app.tmpl.renderActionFields( args ), + $connection = app.connection.getById( args.connection_id ), + $connectionData = $( app.selectors.actionData, $connection ); + + $connectionData.html( fields ); + + app.$elements.$holder.trigger( 'connectionRendered', [ app.provider, args.connection_id ] ); + }, + + /** + * Get a list of constant-contact lists. + * + * @since 1.9.3 + * + * @param {string} accountId Account ID. + * + * @return {Array} List of constant-contact lists. + */ + getList( accountId ) { + const listsCache = app.Cache.get( app.provider, 'lists' ); + + return ! _.isEmpty( listsCache ) && ! _.isEmpty( listsCache[ accountId ] ) ? listsCache[ accountId ] : []; + }, + }, + }, + + /** + * All methods for JavaScript templates. + * + * @since 1.9.3 + */ + tmpl: { + /** + * Compile and retrieve an HTML for common elements. + * + * @since 1.9.3 + * @deprecated 1.9.5 + * + * @return {string} Compiled HTML. + */ + commonsHTML() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPForms.Admin.Builder.Providers.ConstantContactV3.tmpl.commonsHTML()" has been deprecated!' ); + + const tmplError = app.Templates.get( 'wpforms-' + app.provider + '-builder-content-connection-error' ); + + return tmplError(); + }, + + /** + * Compile and retrieve an HTML for "Custom Fields Table". + * + * @since 1.9.3 + * + * @param {Object} args Arguments + * + * @return {string} Compiled HTML. + */ + renderActionFields( args ) { + const fields = wpf.getFields(), + actionsFields = app.Cache.get( app.provider, 'actions_fields' ), + customFields = app.Cache.get( app.provider, 'custom_fields' ), + connection = app.Cache.getById( app.provider, 'connections', args.connection_id ); + + let fieldHTML = ''; + + $.each( actionsFields[ args.target.val() ], function( key, field ) { + if ( key === 'custom_fields' ) { + const tmplFields = app.Templates.get( 'wpforms-providers-builder-content-connection-fields' ); + + fieldHTML += tmplFields( { + connection, + fields, + provider: { + slug: app.provider, + fields: customFields[ args.account_id ], + }, + isSupportSubfields: true, + } ); + + return; + } + + const options = key === 'list' ? app.ui.actionField.getList( args.account_id ) : Object.values( fields ); + const templateName = 'wpforms-' + app.provider + '-builder-content-connection-' + field.type + '-field'; + const tmplField = app.Templates.get( templateName ); + + fieldHTML += tmplField( { + connection, + name: key, + field, + provider: { + slug: app.provider, + fields: actionsFields[ args.target.val() ], + }, + options, + } ); + } ); + + return fieldHTML; + }, + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPForms.Admin.Builder.Providers.ConstantContactV3.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.min.js new file mode 100755 index 00000000..f909b454 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/constant-contact-v3/builder.min.js @@ -0,0 +1 @@ +WPForms.Admin.Builder.Providers.ConstantContactV3=WPForms.Admin.Builder.Providers.ConstantContactV3||((n,l)=>{let p={selectors:{accountField:".js-wpforms-builder-constant-contact-v3-provider-connection-account",actionData:".wpforms-builder-constant-contact-v3-provider-actions-data",actionField:".js-wpforms-builder-constant-contact-v3-provider-connection-action",connection:".wpforms-panel-content-section-constant-contact-v3 .wpforms-builder-provider-connection"},$elements:{$connections:l(".wpforms-panel-content-section-constant-contact-v3 .wpforms-builder-provider-connections"),$holder:l("#wpforms-panel-providers"),$panel:l("#constant-contact-v3-provider")},provider:"constant-contact-v3",Providers:{},Templates:{},Cache:{},isReady:!1,init(){"providers"===wpf.getQueryString("view")&&p.$elements.$holder.on("WPForms.Admin.Builder.Providers.ready",p.ready),l(n).on("wpformsPanelSwitched",function(n,e){"providers"===e&&p.ready()})},ready(){p.isReady||(p.Providers=WPForms.Admin.Builder.Providers,p.Templates=WPForms.Admin.Builder.Templates,p.Cache=p.Providers.cache,p.Templates.add(["wpforms-constant-contact-v3-builder-content-connection","wpforms-constant-contact-v3-builder-content-connection-error","wpforms-constant-contact-v3-builder-content-connection-select-field","wpforms-constant-contact-v3-builder-content-connection-conditionals"]),p.bindUIActions(),p.bindTriggers(),p.processInitial(),p.isReady=!0)},bindUIActions(){p.$elements.$panel.on("connectionCreate",p.connection.create).on("connectionDelete",p.connection.delete).on("change",p.selectors.accountField,p.ui.accountField.change).on("change",p.selectors.actionField,p.ui.actionField.change)},bindTriggers(){p.$elements.$connections.on("connectionsDataLoaded",function(n,e){if(!_.isEmpty(e.connections))for(var t in e.connections)p.connection.generate({connection:e.connections[t],conditional:e.conditionals[t]})}),p.$elements.$connections.on("connectionGenerated",function(n,e){var t=p.connection.getById(e.connection.id);_.has(e.connection,"isNew")&&e.connection.isNew?p.connection.replaceIds(e.connection.id,t):l(p.selectors.actionField,t).trigger("change")})},processInitial(){p.connection.dataLoad()},connection:{getById(n){return p.$elements.$connections.find('.wpforms-builder-provider-connection[data-connection_id="'+n+'"]')},replaceIds(e,n){n.find("input, select, label").each(function(){var n=l(this);n.attr("name")&&n.attr("name",n.attr("name").replace(/%connection_id%/gi,e)),n.attr("id")&&n.attr("id",n.attr("id").replace(/%connection_id%/gi,e)),n.attr("for")&&n.attr("for",n.attr("for").replace(/%connection_id%/gi,e)),n.attr("data-name")&&n.attr("data-name",n.attr("data-name").replace(/%connection_id%/gi,e))})},create(n,e){var t=(new Date).getTime().toString(16),e={id:t,name:e,isNew:!0};p.Cache.addTo(p.provider,"connections",t,e),p.connection.generate({connection:e})},delete(n,e){var t=p.Providers.getProviderHolder(p.provider);e.closest(t).length&&(t=e.data("connection_id"),_.isString(t))&&p.Cache.deleteFrom(p.provider,"connections",t)},generate(n){var e,t,o=p.Cache.get(p.provider,"accounts");if(!_.isEmpty(o)&&p.account.isAccountExists(n.connection.account_id,o))return e=p.Cache.get(p.provider,"actions"),t=p.Cache.get(p.provider,"lists"),p.connection.renderConnections(o,t,e,n)},renderConnections(n,e,t,o){var c,i;p.account.isAccountExists(o.connection.account_id,n)&&(c=p.Templates.get("wpforms-"+p.provider+"-builder-content-connection"),i=p.Templates.get("wpforms-constant-contact-v3-builder-content-connection-conditionals"),i=_.has(o.connection,"isNew")&&o.connection.isNew?i():o.conditional,p.$elements.$connections.prepend(c({accounts:n,lists:e,actions:t,connection:o.connection,conditional:i,provider:p.provider})),p.$elements.$connections.trigger("connectionGenerated",[o]))},dataLoad(){p.Providers.ajax.request(p.provider,{data:{task:"connections_get"}}).done(function(e){e.success&&_.has(e.data,"connections")&&(["accounts","actions","actions_fields","conditionals","connections","custom_fields","lists"].forEach(n=>{p.Cache.set(p.provider,n,jQuery.extend({},e.data[n]))}),p.$elements.$connections.trigger("connectionsDataLoaded",[e.data]))})}},account:{isAccountExists(n,e){return!_.isEmpty(e)&&(!!_.isEmpty(n)||_.has(e,n))}},ui:{accountField:{change(){var n=l(this),e=n.closest(p.selectors.connection),t=l(p.selectors.actionField,e);t.prop("selectedIndex",0).trigger("change"),_.isEmpty(n.val())?(t.prop("disabled",!0),l(p.selectors.actionData,e).html("")):(t.prop("disabled",!1),n.removeClass("wpforms-error"))}},actionField:{change(){var n=l(this),e=n.closest(p.selectors.connection),t=l(p.selectors.accountField,e),o=l(p.selectors.actionField,e);p.ui.actionField.render({action:"action",target:n,account_id:t.val(),action_name:o.val(),connection_id:e.data("connection_id")}),n.removeClass("wpforms-error")},render(n){var e=p.tmpl.renderActionFields(n),t=p.connection.getById(n.connection_id);l(p.selectors.actionData,t).html(e),p.$elements.$holder.trigger("connectionRendered",[p.provider,n.connection_id])},getList(n){var e=p.Cache.get(p.provider,"lists");return _.isEmpty(e)||_.isEmpty(e[n])?[]:e[n]}}},tmpl:{commonsHTML(){return console.warn('WARNING! Function "WPForms.Admin.Builder.Providers.ConstantContactV3.tmpl.commonsHTML()" has been deprecated!'),p.Templates.get("wpforms-"+p.provider+"-builder-content-connection-error")()},renderActionFields(c){let i=wpf.getFields(),r=p.Cache.get(p.provider,"actions_fields"),a=p.Cache.get(p.provider,"custom_fields"),s=p.Cache.getById(p.provider,"connections",c.connection_id),d="";return l.each(r[c.target.val()],function(n,e){var t,o;"custom_fields"===n?(t=p.Templates.get("wpforms-providers-builder-content-connection-fields"),d+=t({connection:s,fields:i,provider:{slug:p.provider,fields:a[c.account_id]},isSupportSubfields:!0})):(t="list"===n?p.ui.actionField.getList(c.account_id):Object.values(i),o="wpforms-"+p.provider+"-builder-content-connection-"+e.type+"-field",o=p.Templates.get(o),d+=o({connection:s,name:n,field:e,provider:{slug:p.provider,fields:r[c.target.val()]},options:t}))}),d}}};return p})(document,(window,jQuery)),WPForms.Admin.Builder.Providers.ConstantContactV3.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.es5.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.es5.js new file mode 100755 index 00000000..e1d0a30d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.es5.js @@ -0,0 +1,4195 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { + var fn = queue.shift(); + fn(); + } + } + }, true); + + return function nextTick(fn) { + queue.push(fn); + window.postMessage('process-tick', '*'); + }; + } + + return function nextTick(fn) { + setTimeout(fn, 0); + }; +})(); + +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +} + +// TODO(shtylman) +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; + +},{}],2:[function(require,module,exports){ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +'use strict'; +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; + +},{}],3:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var printWarning = function() {}; + +if (process.env.NODE_ENV !== 'production') { + var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); + var loggedTypeFailures = {}; + var has = require('./lib/has'); + + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) { /**/ } + }; +} + +/** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ +function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + if (process.env.NODE_ENV !== 'production') { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error( + (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.' + ); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning( + (componentName || 'React class') + ': type specification of ' + + location + ' `' + typeSpecName + '` is invalid; the type checker ' + + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + + 'You may have forgotten to pass an argument to the type checker ' + + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + + 'shape all require an argument).' + ); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var stack = getStack ? getStack() : ''; + + printWarning( + 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') + ); + } + } + } + } +} + +/** + * Resets warning cache when testing. + * + * @private + */ +checkPropTypes.resetWarningCache = function() { + if (process.env.NODE_ENV !== 'production') { + loggedTypeFailures = {}; + } +} + +module.exports = checkPropTypes; + +}).call(this,require("hmr7eR")) +},{"./lib/ReactPropTypesSecret":7,"./lib/has":8,"hmr7eR":1}],4:[function(require,module,exports){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); + +function emptyFunction() {} +function emptyFunctionWithReset() {} +emptyFunctionWithReset.resetWarningCache = emptyFunction; + +module.exports = function() { + function shim(props, propName, componentName, location, propFullName, secret) { + if (secret === ReactPropTypesSecret) { + // It is still safe when called from React. + return; + } + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use PropTypes.checkPropTypes() to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + }; + shim.isRequired = shim; + function getShim() { + return shim; + }; + // Important! + // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`. + var ReactPropTypes = { + array: shim, + bigint: shim, + bool: shim, + func: shim, + number: shim, + object: shim, + string: shim, + symbol: shim, + + any: shim, + arrayOf: getShim, + element: shim, + elementType: shim, + instanceOf: getShim, + node: shim, + objectOf: getShim, + oneOf: getShim, + oneOfType: getShim, + shape: getShim, + exact: getShim, + + checkPropTypes: emptyFunctionWithReset, + resetWarningCache: emptyFunction + }; + + ReactPropTypes.PropTypes = ReactPropTypes; + + return ReactPropTypes; +}; + +},{"./lib/ReactPropTypesSecret":7}],5:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var ReactIs = require('react-is'); +var assign = require('object-assign'); + +var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); +var has = require('./lib/has'); +var checkPropTypes = require('./checkPropTypes'); + +var printWarning = function() {}; + +if (process.env.NODE_ENV !== 'production') { + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} + +function emptyFunctionThatReturnsNull() { + return null; +} + +module.exports = function(isValidElement, throwOnDirectAccess) { + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<>'; + + // Important! + // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bigint: createPrimitiveTypeChecker('bigint'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + symbol: createPrimitiveTypeChecker('symbol'), + + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + elementType: createElementTypeTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker, + exact: createStrictShapeTypeChecker, + }; + + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + /*eslint-disable no-self-compare*/ + function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return x !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } + } + /*eslint-enable no-self-compare*/ + + /** + * We use an Error-like object for backward compatibility as people may call + * PropTypes directly and inspect their output. However, we don't use real + * Errors anymore. We don't inspect their stack anyway, and creating them + * is prohibitively expensive if they are created too often, such as what + * happens in oneOfType() for any type before the one that matched. + */ + function PropTypeError(message, data) { + this.message = message; + this.data = data && typeof data === 'object' ? data: {}; + this.stack = ''; + } + // Make `instanceof Error` still work for returned errors. + PropTypeError.prototype = Error.prototype; + + function createChainableTypeChecker(validate) { + if (process.env.NODE_ENV !== 'production') { + var manualPropTypeCallCache = {}; + var manualPropTypeWarningCount = 0; + } + function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + + if (secret !== ReactPropTypesSecret) { + if (throwOnDirectAccess) { + // New behavior only for users of `prop-types` package + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use `PropTypes.checkPropTypes()` to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') { + // Old behavior for people using React.PropTypes + var cacheKey = componentName + ':' + propName; + if ( + !manualPropTypeCallCache[cacheKey] && + // Avoid spamming the console because they are often not actionable except for lib authors + manualPropTypeWarningCount < 3 + ) { + printWarning( + 'You are manually calling a React.PropTypes validation ' + + 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + + 'and will throw in the standalone `prop-types` package. ' + + 'You may be seeing this warning due to a third-party PropTypes ' + + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' + ); + manualPropTypeCallCache[cacheKey] = true; + manualPropTypeWarningCount++; + } + } + } + if (props[propName] == null) { + if (isRequired) { + if (props[propName] === null) { + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); + } + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + + return chainedCheckType; + } + + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName, secret) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'), + {expectedType: expectedType} + ); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunctionThatReturnsNull); + } + + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); + } + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!isValidElement(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!ReactIs.isValidElementType(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + if (process.env.NODE_ENV !== 'production') { + if (arguments.length > 1) { + printWarning( + 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + + 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' + ); + } else { + printWarning('Invalid argument supplied to oneOf, expected an array.'); + } + } + return emptyFunctionThatReturnsNull; + } + + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (is(propValue, expectedValues[i])) { + return null; + } + } + + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + var type = getPreciseType(value); + if (type === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); + } + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (has(propValue, key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0; + return emptyFunctionThatReturnsNull; + } + + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (typeof checker !== 'function') { + printWarning( + 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + + 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' + ); + return emptyFunctionThatReturnsNull; + } + } + + function validate(props, propName, componentName, location, propFullName) { + var expectedTypes = []; + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret); + if (checkerResult == null) { + return null; + } + if (checkerResult.data && has(checkerResult.data, 'expectedType')) { + expectedTypes.push(checkerResult.data.expectedType); + } + } + var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': ''; + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.')); + } + return createChainableTypeChecker(validate); + } + + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function invalidValidatorError(componentName, location, propFullName, key, type) { + return new PropTypeError( + (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.' + ); + } + + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createStrictShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + // We need to check all keys in case some are required but missing from props. + var allKeys = assign({}, props[propName], shapeTypes); + for (var key in allKeys) { + var checker = shapeTypes[key]; + if (has(shapeTypes, key) && typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + if (!checker) { + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + + '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + + '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') + ); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } + + return createChainableTypeChecker(validate); + } + + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || isValidElement(propValue)) { + return true; + } + + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + + return true; + default: + return false; + } + } + + function isSymbol(propType, propValue) { + // Native Symbol. + if (propType === 'symbol') { + return true; + } + + // falsy value can't be a Symbol + if (!propValue) { + return false; + } + + // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' + if (propValue['@@toStringTag'] === 'Symbol') { + return true; + } + + // Fallback for non-spec compliant Symbols which are polyfilled. + if (typeof Symbol === 'function' && propValue instanceof Symbol) { + return true; + } + + return false; + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + if (isSymbol(propType, propValue)) { + return 'symbol'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + if (typeof propValue === 'undefined' || propValue === null) { + return '' + propValue; + } + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns a string that is postfixed to a warning about an invalid type. + // For example, "undefined" or "of type array" + function getPostfixForTypeWarning(value) { + var type = getPreciseType(value); + switch (type) { + case 'array': + case 'object': + return 'an ' + type; + case 'boolean': + case 'date': + case 'regexp': + return 'a ' + type; + default: + return type; + } + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return ANONYMOUS; + } + return propValue.constructor.name; + } + + ReactPropTypes.checkPropTypes = checkPropTypes; + ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; + ReactPropTypes.PropTypes = ReactPropTypes; + + return ReactPropTypes; +}; + +}).call(this,require("hmr7eR")) +},{"./checkPropTypes":3,"./lib/ReactPropTypesSecret":7,"./lib/has":8,"hmr7eR":1,"object-assign":2,"react-is":11}],6:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +if (process.env.NODE_ENV !== 'production') { + var ReactIs = require('react-is'); + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess); +} else { + // By explicitly using `prop-types` you are opting into new production behavior. + // http://fb.me/prop-types-in-prod + module.exports = require('./factoryWithThrowingShims')(); +} + +}).call(this,require("hmr7eR")) +},{"./factoryWithThrowingShims":4,"./factoryWithTypeCheckers":5,"hmr7eR":1,"react-is":11}],7:[function(require,module,exports){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + +module.exports = ReactPropTypesSecret; + +},{}],8:[function(require,module,exports){ +module.exports = Function.call.bind(Object.prototype.hasOwnProperty); + +},{}],9:[function(require,module,exports){ +(function (process){ +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + + + +if (process.env.NODE_ENV !== "production") { + (function() { +'use strict'; + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary +// (unstable) APIs that have been removed. Can we remove the symbols? + +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; +var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; +var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; +var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; +var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} // AsyncMode is deprecated along with isAsyncMode + +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} + +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} + +}).call(this,require("hmr7eR")) +},{"hmr7eR":1}],10:[function(require,module,exports){ +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict';var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b? +Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119; +function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d; +exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t}; +exports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p}; +exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z; + +},{}],11:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (process.env.NODE_ENV === 'production') { + module.exports = require('./cjs/react-is.production.min.js'); +} else { + module.exports = require('./cjs/react-is.development.js'); +} + +}).call(this,require("hmr7eR")) +},{"./cjs/react-is.development.js":9,"./cjs/react-is.production.min.js":10,"hmr7eR":1}],12:[function(require,module,exports){ +(function (process){ +/** + * @license React + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +if (process.env.NODE_ENV !== "production") { + (function() { + + 'use strict'; + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); +} + var ReactVersion = '18.3.1'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. +var REACT_ELEMENT_TYPE = Symbol.for('react.element'); +var REACT_PORTAL_TYPE = Symbol.for('react.portal'); +var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); +var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); +var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); +var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); +var REACT_CONTEXT_TYPE = Symbol.for('react.context'); +var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); +var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); +var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); +var REACT_MEMO_TYPE = Symbol.for('react.memo'); +var REACT_LAZY_TYPE = Symbol.for('react.lazy'); +var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); +var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +/** + * Keeps track of the current dispatcher. + */ +var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +/** + * Keeps track of the current batch's configuration such as how long an update + * should suspend for if it needs to. + */ +var ReactCurrentBatchConfig = { + transition: null +}; + +var ReactCurrentActQueue = { + current: null, + // Used to reproduce behavior of `batchedUpdates` in legacy mode. + isBatchingLegacy: false, + didScheduleLegacyUpdate: false +}; + +/** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ +var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +var ReactDebugCurrentFrame = {}; +var currentExtraStackFrame = null; +function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } +} + +{ + ReactDebugCurrentFrame.setExtraStackFrame = function (stack) { + { + currentExtraStackFrame = stack; + } + }; // Stack implementation injected by the current renderer. + + + ReactDebugCurrentFrame.getCurrentStack = null; + + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ''; // Add an extra top frame while an element is being validated + + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } // Delegate to the injected renderer-specific implementation + + + var impl = ReactDebugCurrentFrame.getCurrentStack; + + if (impl) { + stack += impl() || ''; + } + + return stack; + }; +} + +// ----------------------------------------------------------------------------- + +var enableScopeAPI = false; // Experimental Create Event Handle API. +var enableCacheElement = false; +var enableTransitionTracing = false; // No known bugs, but needs performance testing + +var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber +// stuff. Intended to enable React core members to more easily debug scheduling +// issues in DEV builds. + +var enableDebugTracing = false; // Track which Fiber(s) schedule render work. + +var ReactSharedInternals = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentBatchConfig: ReactCurrentBatchConfig, + ReactCurrentOwner: ReactCurrentOwner +}; + +{ + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; + ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue; +} + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } + } +} +function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } // eslint-disable-next-line react-internal/safe-string-coercion + + + var argsWithFormat = args.map(function (item) { + return String(item); + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +var didWarnStateUpdateForUnmountedComponent = {}; + +function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; + + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); + + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } +} +/** + * This is the abstract API for an update queue. + */ + + +var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); + } +}; + +var assign = Object.assign; + +var emptyObject = {}; + +{ + Object.freeze(emptyObject); +} +/** + * Base class helpers for the updating state of a component. + */ + + +function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. + + this.updater = updater || ReactNoopUpdateQueue; +} + +Component.prototype.isReactComponent = {}; +/** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + +Component.prototype.setState = function (partialState, callback) { + if (typeof partialState !== 'object' && typeof partialState !== 'function' && partialState != null) { + throw new Error('setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.'); + } + + this.updater.enqueueSetState(this, partialState, callback, 'setState'); +}; +/** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + + +Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); +}; +/** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + + +{ + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; + + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); + + return undefined; + } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } +} + +function ComponentDummy() {} + +ComponentDummy.prototype = Component.prototype; +/** + * Convenience component with default shallow equality check for sCU. + */ + +function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; +} + +var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); +pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. + +assign(pureComponentPrototype, Component.prototype); +pureComponentPrototype.isPureReactComponent = true; + +// an immutable object with a single mutable value +function createRef() { + var refObject = { + current: null + }; + + { + Object.seal(refObject); + } + + return refObject; +} + +var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare + +function isArray(a) { + return isArrayImpl(a); +} + +/* + * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol + * and Temporal.* types. See https://github.com/facebook/react/pull/22064. + * + * The functions in this module will throw an easier-to-understand, + * easier-to-debug exception with a clear errors message message explaining the + * problem. (Instead of a confusing exception thrown inside the implementation + * of the `value` object). + */ +// $FlowFixMe only called in DEV, so void return is not possible. +function typeName(value) { + { + // toStringTag is needed for namespaced types like Temporal.Instant + var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; + return type; + } +} // $FlowFixMe only called in DEV, so void return is not possible. + + +function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } +} + +function testStringCoercion(value) { + // If you ended up here by following an exception call stack, here's what's + // happened: you supplied an object or symbol value to React (as a prop, key, + // DOM attribute, CSS property, string ref, etc.) and when React tried to + // coerce it to a string using `'' + value`, an exception was thrown. + // + // The most common types that will cause this exception are `Symbol` instances + // and Temporal objects like `Temporal.Instant`. But any object that has a + // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this + // exception. (Library authors do this to prevent users from using built-in + // numeric operators like `+` or comparison operators like `>=` because custom + // methods are needed to perform accurate arithmetic or comparison.) + // + // To fix the problem, coerce this object or symbol value to a string before + // passing it to React. The most reliable way is usually `String(value)`. + // + // To find which value is throwing, check the browser or debugger console. + // Before this exception was thrown, there should be `console.error` output + // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the + // problem and how that type was used: key, atrribute, input value prop, etc. + // In most cases, this console output also shows the component and its + // ancestor components where the exception happened. + // + // eslint-disable-next-line react-internal/safe-string-coercion + return '' + value; +} +function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value)); + + return testStringCoercion(value); // throw (to help callers find troubleshooting comments) + } + } +} + +function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + + if (displayName) { + return displayName; + } + + var functionName = innerType.displayName || innerType.name || ''; + return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName; +} // Keep in sync with react-reconciler/getComponentNameFromFiber + + +function getContextName(type) { + return type.displayName || 'Context'; +} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead. + + +function getComponentNameFromType(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + + if (outerName !== null) { + return outerName; + } + + return getComponentNameFromType(type.type) || 'Memo'; + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + + // eslint-disable-next-line no-fallthrough + } + } + + return null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); +} + +function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); +} + +function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ + +function createElement(type, config, children) { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + + key = '' + config.key; + } + + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + + props.children = childArray; + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); +} +function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; +} +/** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ + +function cloneElement(element, config, children) { + if (element === null || element === undefined) { + throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); + } + + var propName; // Original props are copied + + var props = assign({}, element.props); // Reserved names are extracted + + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. + + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + + var source = element._source; // Owner will be preserved, unless ref is overridden + + var owner = element._owner; + + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + + key = '' + config.key; + } // Remaining properties override existing props + + + var defaultProps; + + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} + +var SEPARATOR = '.'; +var SUBSEPARATOR = ':'; +/** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ + +function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; +} +/** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + +var didWarnAboutMaps = false; +var userProvidedKeyEscapeRegex = /\/+/g; + +function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, '$&/'); +} +/** + * Generate a key string that identifies a element within a set. + * + * @param {*} element A element that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + + +function getElementKey(element, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof element === 'object' && element !== null && element.key != null) { + // Explicit key + { + checkKeyStringCoercion(element.key); + } + + return escape('' + element.key); + } // Implicit key determined by the index in the set + + + return index.toString(36); +} + +function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + var invokeCallback = false; + + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; + + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + + } + } + + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows: + + var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + + if (isArray(mappedChild)) { + var escapedChildKey = ''; + + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + '/'; + } + + mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + { + // The `if` statement here prevents auto-disabling of the safe + // coercion ESLint rule, so we must manually disable it below. + // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { + checkKeyStringCoercion(mappedChild.key); + } + } + + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + // eslint-disable-next-line react-internal/safe-string-coercion + escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); + } + + array.push(mappedChild); + } + + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var iterableChildren = children; + + { + // Warn about using Maps as children + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } + + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === 'object') { + // eslint-disable-next-line react-internal/safe-string-coercion + var childrenString = String(children); + throw new Error("Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.'); + } + } + + return subtreeCount; +} + +/** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ +function mapChildren(children, func, context) { + if (children == null) { + return children; + } + + var result = []; + var count = 0; + mapIntoArray(children, result, '', '', function (child) { + return func.call(context, child, count++); + }); + return result; +} +/** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + + +function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; // Don't return anything + }); + return n; +} + +/** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ +function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function () { + forEachFunc.apply(this, arguments); // Don't return anything. + }, forEachContext); +} +/** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ + + +function toArray(children) { + return mapChildren(children, function (child) { + return child; + }) || []; +} +/** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ + + +function onlyChild(children) { + if (!isValidElement(children)) { + throw new Error('React.Children.only expected to receive a single React element child.'); + } + + return children; +} + +function createContext(defaultValue) { + // TODO: Second argument used to be an optional `calculateChangedBits` + // function. Warn to reserve for future use? + var context = { + $$typeof: REACT_CONTEXT_TYPE, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null, + // Add these to use same hidden class in VM as ServerContext + _defaultValue: null, + _globalName: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + + error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); + } + + return context.Consumer; + } + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); + + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + + context.Consumer = Consumer; + } + + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + + return context; +} + +var Uninitialized = -1; +var Pending = 0; +var Resolved = 1; +var Rejected = 2; + +function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); // Transition to the next state. + // This might throw either because it's missing or throws. If so, we treat it + // as still uninitialized and try again next time. Which is the same as what + // happens if the ctor or any wrappers processing the ctor throws. This might + // end up fixing it if the resolution was a concurrency bug. + + thenable.then(function (moduleObject) { + if (payload._status === Pending || payload._status === Uninitialized) { + // Transition to the next state. + var resolved = payload; + resolved._status = Resolved; + resolved._result = moduleObject; + } + }, function (error) { + if (payload._status === Pending || payload._status === Uninitialized) { + // Transition to the next state. + var rejected = payload; + rejected._status = Rejected; + rejected._result = error; + } + }); + + if (payload._status === Uninitialized) { + // In case, we're still uninitialized, then we're waiting for the thenable + // to resolve. Set it as pending in the meantime. + var pending = payload; + pending._status = Pending; + pending._result = thenable; + } + } + + if (payload._status === Resolved) { + var moduleObject = payload._result; + + { + if (moduleObject === undefined) { + error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))\n\n" + 'Did you accidentally put curly braces around the import?', moduleObject); + } + } + + { + if (!('default' in moduleObject)) { + error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); + } + } + + return moduleObject.default; + } else { + throw payload._result; + } +} + +function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: Uninitialized, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + + { + // In production, this would just set it on the object. + var defaultProps; + var propTypes; // $FlowFixMe + + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); + } + } + }); + } + + return lazyType; +} + +function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); + } + } + + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); + } + } + } + + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; // The inner component shouldn't inherit this display name in most cases, + // because the component may be used elsewhere. + // But it's nice for anonymous functions to inherit the name, + // so that our component-stack generation logic will display their frames. + // An anonymous function generally suggests a pattern like: + // React.forwardRef((props, ref) => {...}); + // This kind of inner function is not used elsewhere so the side effect is okay. + + if (!render.name && !render.displayName) { + render.displayName = name; + } + } + }); + } + + return elementType; +} + +var REACT_MODULE_REFERENCE; + +{ + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); +} + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; + } + } + + return false; +} + +function memo(type, compare) { + { + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } + } + + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; // The inner component shouldn't inherit this display name in most cases, + // because the component may be used elsewhere. + // But it's nice for anonymous functions to inherit the name, + // so that our component-stack generation logic will display their frames. + // An anonymous function generally suggests a pattern like: + // React.memo((props) => {...}); + // This kind of inner function is not used elsewhere so the side effect is okay. + + if (!type.name && !type.displayName) { + type.displayName = name; + } + } + }); + } + + return elementType; +} + +function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + + { + if (dispatcher === null) { + error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.'); + } + } // Will result in a null access error if accessed outside render phase. We + // intentionally don't throw our own error because this is in a hot path. + // Also helps ensure this is inlined. + + + return dispatcher; +} +function useContext(Context) { + var dispatcher = resolveDispatcher(); + + { + // TODO: add a more generic warning for invalid values. + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. + + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); + } + } + } + + return dispatcher.useContext(Context); +} +function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); +} +function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); +} +function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); +} +function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); +} +function useInsertionEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useInsertionEffect(create, deps); +} +function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); +} +function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); +} +function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); +} +function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); +} +function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } +} +function useTransition() { + var dispatcher = resolveDispatcher(); + return dispatcher.useTransition(); +} +function useDeferredValue(value) { + var dispatcher = resolveDispatcher(); + return dispatcher.useDeferredValue(value); +} +function useId() { + var dispatcher = resolveDispatcher(); + return dispatcher.useId(); +} +function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { + var dispatcher = resolveDispatcher(); + return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if ( !fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "" + // but we have a user-provided "displayName" + // splice it in to make the stack more readable. + + + if (fn.displayName && _frame.includes('')) { + _frame = _frame.replace('', fn.displayName); + } + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + // eslint-disable-next-line react-internal/prod-error-codes + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} + +function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentNameFromType(ReactCurrentOwner.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; +} + +function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; +} + +function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + + return ''; +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; + } + + { + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentNameFromType(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} +function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } + + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; +} +var didWarnAboutDeprecatedCreateFactory = false; +function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it + + + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); + + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + + return validatedFactory; +} +function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + + validatePropTypes(newElement); + return newElement; +} + +function startTransition(scope, options) { + var prevTransition = ReactCurrentBatchConfig.transition; + ReactCurrentBatchConfig.transition = {}; + var currentTransition = ReactCurrentBatchConfig.transition; + + { + ReactCurrentBatchConfig.transition._updatedFibers = new Set(); + } + + try { + scope(); + } finally { + ReactCurrentBatchConfig.transition = prevTransition; + + { + if (prevTransition === null && currentTransition._updatedFibers) { + var updatedFibersCount = currentTransition._updatedFibers.size; + + if (updatedFibersCount > 10) { + warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.'); + } + + currentTransition._updatedFibers.clear(); + } + } + } +} + +var didWarnAboutMessageChannel = false; +var enqueueTaskImpl = null; +function enqueueTask(task) { + if (enqueueTaskImpl === null) { + try { + // read require off the module object to get around the bundlers. + // we don't want them to detect a require and bundle a Node polyfill. + var requireString = ('require' + Math.random()).slice(0, 7); + var nodeRequire = module && module[requireString]; // assuming we're in node, let's try to get node's + // version of setImmediate, bypassing fake timers if any. + + enqueueTaskImpl = nodeRequire.call(module, 'timers').setImmediate; + } catch (_err) { + // we're in a browser + // we can't use regular timers because they may still be faked + // so we try MessageChannel+postMessage instead + enqueueTaskImpl = function (callback) { + { + if (didWarnAboutMessageChannel === false) { + didWarnAboutMessageChannel = true; + + if (typeof MessageChannel === 'undefined') { + error('This browser does not have a MessageChannel implementation, ' + 'so enqueuing tasks via await act(async () => ...) will fail. ' + 'Please file an issue at https://github.com/facebook/react/issues ' + 'if you encounter this warning.'); + } + } + } + + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(undefined); + }; + } + } + + return enqueueTaskImpl(task); +} + +var actScopeDepth = 0; +var didWarnNoAwaitAct = false; +function act(callback) { + { + // `act` calls can be nested, so we track the depth. This represents the + // number of `act` scopes on the stack. + var prevActScopeDepth = actScopeDepth; + actScopeDepth++; + + if (ReactCurrentActQueue.current === null) { + // This is the outermost `act` scope. Initialize the queue. The reconciler + // will detect the queue and use it instead of Scheduler. + ReactCurrentActQueue.current = []; + } + + var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; + var result; + + try { + // Used to reproduce behavior of `batchedUpdates` in legacy mode. Only + // set to `true` while the given callback is executed, not for updates + // triggered during an async event, because this is how the legacy + // implementation of `act` behaved. + ReactCurrentActQueue.isBatchingLegacy = true; + result = callback(); // Replicate behavior of original `act` implementation in legacy mode, + // which flushed updates immediately after the scope function exits, even + // if it's an async function. + + if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { + var queue = ReactCurrentActQueue.current; + + if (queue !== null) { + ReactCurrentActQueue.didScheduleLegacyUpdate = false; + flushActQueue(queue); + } + } + } catch (error) { + popActScope(prevActScopeDepth); + throw error; + } finally { + ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; + } + + if (result !== null && typeof result === 'object' && typeof result.then === 'function') { + var thenableResult = result; // The callback is an async function (i.e. returned a promise). Wait + // for it to resolve before exiting the current scope. + + var wasAwaited = false; + var thenable = { + then: function (resolve, reject) { + wasAwaited = true; + thenableResult.then(function (returnValue) { + popActScope(prevActScopeDepth); + + if (actScopeDepth === 0) { + // We've exited the outermost act scope. Recursively flush the + // queue until there's no remaining work. + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } else { + resolve(returnValue); + } + }, function (error) { + // The callback threw an error. + popActScope(prevActScopeDepth); + reject(error); + }); + } + }; + + { + if (!didWarnNoAwaitAct && typeof Promise !== 'undefined') { + // eslint-disable-next-line no-undef + Promise.resolve().then(function () {}).then(function () { + if (!wasAwaited) { + didWarnNoAwaitAct = true; + + error('You called act(async () => ...) without await. ' + 'This could lead to unexpected testing behaviour, ' + 'interleaving multiple act calls and mixing their ' + 'scopes. ' + 'You should - await act(async () => ...);'); + } + }); + } + } + + return thenable; + } else { + var returnValue = result; // The callback is not an async function. Exit the current scope + // immediately, without awaiting. + + popActScope(prevActScopeDepth); + + if (actScopeDepth === 0) { + // Exiting the outermost act scope. Flush the queue. + var _queue = ReactCurrentActQueue.current; + + if (_queue !== null) { + flushActQueue(_queue); + ReactCurrentActQueue.current = null; + } // Return a thenable. If the user awaits it, we'll flush again in + // case additional work was scheduled by a microtask. + + + var _thenable = { + then: function (resolve, reject) { + // Confirm we haven't re-entered another `act` scope, in case + // the user does something weird like await the thenable + // multiple times. + if (ReactCurrentActQueue.current === null) { + // Recursively flush the queue until there's no remaining work. + ReactCurrentActQueue.current = []; + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } else { + resolve(returnValue); + } + } + }; + return _thenable; + } else { + // Since we're inside a nested `act` scope, the returned thenable + // immediately resolves. The outer scope will flush the queue. + var _thenable2 = { + then: function (resolve, reject) { + resolve(returnValue); + } + }; + return _thenable2; + } + } + } +} + +function popActScope(prevActScopeDepth) { + { + if (prevActScopeDepth !== actScopeDepth - 1) { + error('You seem to have overlapping act() calls, this is not supported. ' + 'Be sure to await previous act() calls before making a new one. '); + } + + actScopeDepth = prevActScopeDepth; + } +} + +function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { + { + var queue = ReactCurrentActQueue.current; + + if (queue !== null) { + try { + flushActQueue(queue); + enqueueTask(function () { + if (queue.length === 0) { + // No additional work was scheduled. Finish. + ReactCurrentActQueue.current = null; + resolve(returnValue); + } else { + // Keep flushing work until there's none left. + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } + }); + } catch (error) { + reject(error); + } + } else { + resolve(returnValue); + } + } +} + +var isFlushing = false; + +function flushActQueue(queue) { + { + if (!isFlushing) { + // Prevent re-entrance. + isFlushing = true; + var i = 0; + + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + + do { + callback = callback(true); + } while (callback !== null); + } + + queue.length = 0; + } catch (error) { + // If something throws, leave the remaining callbacks on the queue. + queue = queue.slice(i + 1); + throw error; + } finally { + isFlushing = false; + } + } + } +} + +var createElement$1 = createElementWithValidation ; +var cloneElement$1 = cloneElementWithValidation ; +var createFactory = createFactoryWithValidation ; +var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray: toArray, + only: onlyChild +}; + +exports.Children = Children; +exports.Component = Component; +exports.Fragment = REACT_FRAGMENT_TYPE; +exports.Profiler = REACT_PROFILER_TYPE; +exports.PureComponent = PureComponent; +exports.StrictMode = REACT_STRICT_MODE_TYPE; +exports.Suspense = REACT_SUSPENSE_TYPE; +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; +exports.act = act; +exports.cloneElement = cloneElement$1; +exports.createContext = createContext; +exports.createElement = createElement$1; +exports.createFactory = createFactory; +exports.createRef = createRef; +exports.forwardRef = forwardRef; +exports.isValidElement = isValidElement; +exports.lazy = lazy; +exports.memo = memo; +exports.startTransition = startTransition; +exports.unstable_act = act; +exports.useCallback = useCallback; +exports.useContext = useContext; +exports.useDebugValue = useDebugValue; +exports.useDeferredValue = useDeferredValue; +exports.useEffect = useEffect; +exports.useId = useId; +exports.useImperativeHandle = useImperativeHandle; +exports.useInsertionEffect = useInsertionEffect; +exports.useLayoutEffect = useLayoutEffect; +exports.useMemo = useMemo; +exports.useReducer = useReducer; +exports.useRef = useRef; +exports.useState = useState; +exports.useSyncExternalStore = useSyncExternalStore; +exports.useTransition = useTransition; +exports.version = ReactVersion; + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + + })(); +} + +}).call(this,require("hmr7eR")) +},{"hmr7eR":1}],13:[function(require,module,exports){ +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict';var l=Symbol.for("react.element"),n=Symbol.for("react.portal"),p=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),t=Symbol.for("react.provider"),u=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),w=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),z=Symbol.iterator;function A(a){if(null===a||"object"!==typeof a)return null;a=z&&a[z]||a["@@iterator"];return"function"===typeof a?a:null} +var B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={}; +E.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F; +H.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0}; +function M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=""+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1{try{if(Object.assign){var e=new String("abc");if(e[5]="de","5"!==Object.getOwnPropertyNames(e)[0]){for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n,o=Object.getOwnPropertyNames(t).map(function(e){return t[e]});if("0123456789"===o.join(""))return n={},"abcdefghijklmnopqrst".split("").forEach(function(e){n[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")?1:void 0}}}catch(e){}})()?Object.assign:function(e,t){for(var r,n=(e=>{if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)})(e),o=1;oe===t?0!==e||1/e==1/t:e!=e&&t!=t)(a,u[i]))return null;e=JSON.stringify(u,function(e,t){return"symbol"===m(t)?String(t):t});return new p("Invalid "+n+" `"+o+"` of value `"+String(a)+"` supplied to `"+r+"`, expected one of "+e+".")});"production"!==h.env.NODE_ENV&&_(1{var t=m(e);switch(t){case"array":case"object":return"an "+t;case"boolean":case"date":case"regexp":return"a "+t;default:return t}})(t)+" at index "+e+"."),o}return r(function(e,t,r,n,o){for(var a=[],i=0;i{if("function"==typeof(e=e&&(i&&e[i]||e[u])))return e})(e);if(!t)return!1;var r,n=t.call(e);if(t!==e.entries){for(;!(r=n.next()).done;)if(!c(r.value))return!1}else for(;!(r=n.next()).done;){var o=r.value;if(o&&!c(o[1]))return!1}}return!0;default:return!1}}function y(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":(e=e,"symbol"===t||e&&("Symbol"===e["@@toStringTag"]||"function"==typeof Symbol&&e instanceof Symbol)?"symbol":t)}function m(e){if(null==e)return""+e;var t=y(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}return p.prototype=Error.prototype,e.checkPropTypes=n,e.resetWarningCache=n.resetWarningCache,e.PropTypes=e}}.call(this,e("hmr7eR"))},{"./checkPropTypes":3,"./lib/ReactPropTypesSecret":7,"./lib/has":8,hmr7eR:1,"object-assign":2,"react-is":11}],6:[function(t,r,e){!function(e){"production"!==e.env.NODE_ENV?(e=t("react-is"),r.exports=t("./factoryWithTypeCheckers")(e.isElement,!0)):r.exports=t("./factoryWithThrowingShims")()}.call(this,t("hmr7eR"))},{"./factoryWithThrowingShims":4,"./factoryWithTypeCheckers":5,hmr7eR:1,"react-is":11}],7:[function(e,t,r){t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},{}],8:[function(e,t,r){t.exports=Function.call.bind(Object.prototype.hasOwnProperty)},{}],9:[function(e,t,I){!function(e){function t(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case o:var r=e.type;switch(r){case f:case p:case i:case c:case u:case y:return r;default:var n=r&&r.$$typeof;switch(n){case l:case d:case h:case m:case s:return n;default:return t}}case a:return t}}}function r(e){return t(e)===p}var o,a,i,u,c,s,l,f,p,d,y,n,m,h,b,v,g,_,w,S,O,E,j,k,R,C,P,x,T,$;"production"!==e.env.NODE_ENV&&(e="function"==typeof Symbol&&Symbol.for,o=e?Symbol.for("react.element"):60103,a=e?Symbol.for("react.portal"):60106,i=e?Symbol.for("react.fragment"):60107,u=e?Symbol.for("react.strict_mode"):60108,c=e?Symbol.for("react.profiler"):60114,s=e?Symbol.for("react.provider"):60109,l=e?Symbol.for("react.context"):60110,f=e?Symbol.for("react.async_mode"):60111,p=e?Symbol.for("react.concurrent_mode"):60111,d=e?Symbol.for("react.forward_ref"):60112,y=e?Symbol.for("react.suspense"):60113,n=e?Symbol.for("react.suspense_list"):60120,m=e?Symbol.for("react.memo"):60115,h=e?Symbol.for("react.lazy"):60116,b=e?Symbol.for("react.block"):60121,v=e?Symbol.for("react.fundamental"):60117,g=e?Symbol.for("react.responder"):60118,_=e?Symbol.for("react.scope"):60119,e=p,w=l,S=s,O=o,E=d,j=i,k=h,R=m,C=a,P=c,x=u,T=y,$=!1,I.AsyncMode=f,I.ConcurrentMode=e,I.ContextConsumer=w,I.ContextProvider=S,I.Element=O,I.ForwardRef=E,I.Fragment=j,I.Lazy=k,I.Memo=R,I.Portal=C,I.Profiler=P,I.StrictMode=x,I.Suspense=T,I.isAsyncMode=function(e){return $||($=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.")),r(e)||t(e)===f},I.isConcurrentMode=r,I.isContextConsumer=function(e){return t(e)===l},I.isContextProvider=function(e){return t(e)===s},I.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===o},I.isForwardRef=function(e){return t(e)===d},I.isFragment=function(e){return t(e)===i},I.isLazy=function(e){return t(e)===h},I.isMemo=function(e){return t(e)===m},I.isPortal=function(e){return t(e)===a},I.isProfiler=function(e){return t(e)===c},I.isStrictMode=function(e){return t(e)===u},I.isSuspense=function(e){return t(e)===y},I.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===i||e===p||e===c||e===u||e===y||e===n||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===s||e.$$typeof===l||e.$$typeof===d||e.$$typeof===v||e.$$typeof===g||e.$$typeof===_||e.$$typeof===b)},I.typeOf=t)}.call(this,e("hmr7eR"))},{hmr7eR:1}],10:[function(e,t,r){var n="function"==typeof Symbol&&Symbol.for,o=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,i=n?Symbol.for("react.fragment"):60107,u=n?Symbol.for("react.strict_mode"):60108,c=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,l=n?Symbol.for("react.context"):60110,f=n?Symbol.for("react.async_mode"):60111,p=n?Symbol.for("react.concurrent_mode"):60111,d=n?Symbol.for("react.forward_ref"):60112,y=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,b=n?Symbol.for("react.lazy"):60116,v=n?Symbol.for("react.block"):60121,g=n?Symbol.for("react.fundamental"):60117,_=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function S(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case o:switch(e=e.type){case f:case p:case i:case c:case u:case y:return e;default:switch(e=e&&e.$$typeof){case l:case d:case b:case h:case s:return e;default:return t}}case a:return t}}}function O(e){return S(e)===p}r.AsyncMode=f,r.ConcurrentMode=p,r.ContextConsumer=l,r.ContextProvider=s,r.Element=o,r.ForwardRef=d,r.Fragment=i,r.Lazy=b,r.Memo=h,r.Portal=a,r.Profiler=c,r.StrictMode=u,r.Suspense=y,r.isAsyncMode=function(e){return O(e)||S(e)===f},r.isConcurrentMode=O,r.isContextConsumer=function(e){return S(e)===l},r.isContextProvider=function(e){return S(e)===s},r.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===o},r.isForwardRef=function(e){return S(e)===d},r.isFragment=function(e){return S(e)===i},r.isLazy=function(e){return S(e)===b},r.isMemo=function(e){return S(e)===h},r.isPortal=function(e){return S(e)===a},r.isProfiler=function(e){return S(e)===c},r.isStrictMode=function(e){return S(e)===u},r.isSuspense=function(e){return S(e)===y},r.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===i||e===p||e===c||e===u||e===y||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===b||e.$$typeof===h||e.$$typeof===s||e.$$typeof===l||e.$$typeof===d||e.$$typeof===g||e.$$typeof===_||e.$$typeof===w||e.$$typeof===v)},r.typeOf=S},{}],11:[function(t,r,e){!function(e){"production"===e.env.NODE_ENV?r.exports=t("./cjs/react-is.production.min.js"):r.exports=t("./cjs/react-is.development.js")}.call(this,t("hmr7eR"))},{"./cjs/react-is.development.js":9,"./cjs/react-is.production.min.js":10,hmr7eR:1}],12:[function(e,ot,at){!function(e){if("production"!==e.env.NODE_ENV){"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error);var v=Symbol.for("react.element"),M=Symbol.for("react.portal"),f=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),L=Symbol.for("react.profiler"),A=Symbol.for("react.provider"),a=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),i=Symbol.for("react.suspense"),F=Symbol.for("react.suspense_list"),y=Symbol.for("react.memo"),u=Symbol.for("react.lazy"),V=Symbol.for("react.offscreen"),U=Symbol.iterator,W="@@iterator";function q(e){return null!==e&&"object"==typeof e&&"function"==typeof(e=U&&e[U]||e[W])?e:null}var z={current:null},c={transition:null},s={current:null,isBatchingLegacy:!1,didScheduleLegacyUpdate:!1},g={current:null},r={},n=null;function B(e){n=e}r.setExtraStackFrame=function(e){n=e},r.getCurrentStack=null;var Y=!(r.getStackAddendum=function(){var e="",t=(n&&(e+=n),r.getCurrentStack);return t&&(e+=t()||""),e}),H=!1,G=!1,J=!1,K=!1,l={ReactCurrentDispatcher:z,ReactCurrentBatchConfig:c,ReactCurrentOwner:g};function _(e){for(var t=arguments.length,r=new Array(1{Object.defineProperty(p.prototype,e,{get:function(){_("%s(...) is deprecated in plain JavaScript React classes. %s",t[0],t[1])}})})(t,re[t]);function ne(){}function oe(e,t,r){this.props=e,this.context=t,this.refs=te,this.updater=r||ee}ne.prototype=p.prototype;var e=oe.prototype=new ne,ae=(e.constructor=oe,m(e,p.prototype),e.isPureReactComponent=!0,Array.isArray);function S(e){return ae(e)}function ie(e){return e.displayName||"Context"}function O(e){if(null!=e){if("number"==typeof e.tag&&w("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),"function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case f:return"Fragment";case M:return"Portal";case L:return"Profiler";case o:return"StrictMode";case i:return"Suspense";case F:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case a:return ie(e)+".Consumer";case A:return ie(e._context)+".Provider";case d:return r=(t=e).render,n="ForwardRef",(t=t.displayName)||(""!==(t=r.displayName||r.name||"")?n+"("+t+")":n);case y:r=e.displayName||null;return null!==r?r:O(e.type)||"Memo";case u:t=e._payload,n=e._init;try{return O(n(t))}catch(e){return null}}var t,r,n}return null}var ue,ce,E=Object.prototype.hasOwnProperty,se={key:!0,ref:!0,__self:!0,__source:!0};function le(e){if(E.call(e,"ref")){var t=Object.getOwnPropertyDescriptor(e,"ref").get;if(t&&t.isReactWarning)return}return void 0!==e.ref}function fe(e){if(E.call(e,"key")){var t=Object.getOwnPropertyDescriptor(e,"key").get;if(t&&t.isReactWarning)return}return void 0!==e.key}var pe={},de=function(e,t,r,n,o,a,i){e={$$typeof:v,type:e,key:t,ref:r,props:i,_owner:a,_store:{}};return Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(e,"_self",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(e,"_source",{configurable:!1,enumerable:!1,writable:!1,value:o}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e};function ye(e,t,r){var n,o={},a=null,i=null,u=null,c=null;if(null!=t)for(n in le(t)&&(i=t.ref,"string"==typeof(s=t).ref)&&g.current&&s.__self&&g.current.stateNode!==s.__self&&(f=O(g.current.type),pe[f]||(w('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',f,s.ref),pe[f]=!0)),fe(t)&&(t.key,a=""+t.key),u=void 0===t.__self?null:t.__self,c=void 0===t.__source?null:t.__source,t)E.call(t,n)&&!se.hasOwnProperty(n)&&(o[n]=t[n]);var s,l,f,p,d=arguments.length-2;if(1==d)o.children=r;else if(1 import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?",t),"default"in t||w("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))",t),t.default;throw r._result}function je(e){return"string"==typeof e||"function"==typeof e||!!(e===f||e===L||K||e===o||e===i||e===F||J||e===V||Y||H||G)||"object"==typeof e&&null!==e&&(e.$$typeof===u||e.$$typeof===y||e.$$typeof===A||e.$$typeof===a||e.$$typeof===d||e.$$typeof===Ie||void 0!==e.getModuleId)}function R(){var e=z.current;return null===e&&w("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem."),e}var ke,Re,Ce,Pe,xe,Te,$e,Ie=Symbol.for("react.module.reference"),C=0;function Ne(){}var De,Me=l.ReactCurrentDispatcher;function P(e){if(void 0===De)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);De=t&&t[1]||""}return"\n"+De+e}var Le=!(Ne.__reactDisabledLog=!0),Ae=new("function"==typeof WeakMap?WeakMap:Map);function Fe(t,e){if(!t||Le)return"";var r,n=Ae.get(t);if(void 0!==n)return n;Le=!0;var o,a,n=Error.prepareStackTrace;Error.prepareStackTrace=void 0,o=Me.current,Me.current=null,0===C&&(ke=console.log,Re=console.info,Ce=console.warn,Pe=console.error,xe=console.group,Te=console.groupCollapsed,$e=console.groupEnd,a={configurable:!0,enumerable:!0,value:Ne,writable:!0},Object.defineProperties(console,{info:a,log:a,warn:a,error:a,group:a,groupCollapsed:a,groupEnd:a})),C++;try{if(e){var i=function(){throw Error()};if(Object.defineProperty(i.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(i,[])}catch(e){r=e}Reflect.construct(t,[],i)}else{try{i.call()}catch(e){r=e}t.call(i.prototype)}}else{try{throw Error()}catch(e){r=e}t()}}catch(e){if(e&&r&&"string"==typeof e.stack){for(var u,c=e.stack.split("\n"),s=r.stack.split("\n"),l=c.length-1,f=s.length-1;1<=l&&0<=f&&c[l]!==s[f];)f--;for(;1<=l&&0<=f;l--,f--)if(c[l]!==s[f]){if(1!==l||1!==f)do{if(l--,--f<0||c[l]!==s[f])return u="\n"+c[l].replace(" at new "," at "),t.displayName&&u.includes("")&&(u=u.replace("",t.displayName)),"function"==typeof t&&Ae.set(t,u),u}while(1<=l&&0<=f);break}}}finally{Le=!1,Me.current=o,0===--C&&(a={configurable:!0,enumerable:!0,writable:!0},Object.defineProperties(console,{log:m({},a,{value:ke}),info:m({},a,{value:Re}),warn:m({},a,{value:Ce}),error:m({},a,{value:Pe}),group:m({},a,{value:xe}),groupCollapsed:m({},a,{value:Te}),groupEnd:m({},a,{value:$e})})),C<0&&w("disabledDepth fell below zero. This is a bug in React. Please file an issue."),Error.prepareStackTrace=n}e=t?t.displayName||t.name:"",i=e?P(e):"";return"function"==typeof t&&Ae.set(t,i),i}function x(e,t,r){if(null!=e){if("function"==typeof e)return Fe(e,!(!(n=(n=e).prototype)||!n.isReactComponent));var n;if("string"==typeof e)return P(e);switch(e){case i:return P("Suspense");case F:return P("SuspenseList")}if("object"==typeof e)switch(e.$$typeof){case d:return Fe(e.render,!1);case y:return x(e.type,t,r);case u:var o=e._payload,a=e._init;try{return x(a(o),t,r)}catch(e){}}}return""}var Ve={},Ue=l.ReactDebugCurrentFrame;function T(e){var t;e?(t=e._owner,e=x(e.type,e._source,t?t.type:null),Ue.setExtraStackFrame(e)):Ue.setExtraStackFrame(null)}function $(e){var t;e?(t=e._owner,B(x(e.type,e._source,t?t.type:null))):B(null)}function We(){if(g.current){var e=O(g.current.type);if(e)return"\n\nCheck the render method of `"+e+"`."}return""}var qe=!1,ze={};function Be(e,t){var r;!e._store||e._store.validated||null!=e.key||(e._store.validated=!0,t=t,(r=We())||(t="string"==typeof t?t:t.displayName||t.name)&&(r="\n\nCheck the top-level render call using <"+t+">."),ze[t=r])||(ze[t]=!0,r="",e&&e._owner&&e._owner!==g.current&&(r=" It was passed a child from "+O(e._owner.type)+"."),$(e),w('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,r),$(null))}function Ye(e,t){if("object"==typeof e)if(S(e))for(var r=0;r",n=" Did you accidentally export a JSX literal instead of a component?"):o=typeof e,w("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",o,n)),ye.apply(this,arguments));if(null!=t){if(a)for(var i=2;i ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),e):(r=t,D(i),0===N?(null!==(a=s.current)&&(tt(a),s.current=null),{then:function(e,t){null===s.current?(s.current=[],Ze(r,e,t)):e(r)}}):{then:function(e,t){e(r)}})}function D(e){e!==N-1&&w("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "),N=e}function Ze(e,t,r){var n=s.current;if(null!==n)try{tt(n);var o=function(){0===n.length?(s.current=null,t(e)):Ze(e,t,r)};if(null===I)try{var a=("require"+Math.random()).slice(0,7),i=ot&&ot[a];I=i.call(ot,"timers").setImmediate}catch(e){I=function(e){!1===Ke&&(Ke=!0,"undefined"==typeof MessageChannel)&&w("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning.");var t=new MessageChannel;t.port1.onmessage=e,t.port2.postMessage(void 0)}}I(o)}catch(e){r(e)}else t(e)}var et=!1;function tt(t){if(!et){et=!0;var r=0;try{for(;r is not supported and will be removed in a future major release. Did you mean to render instead?")),t.Provider},set:function(e){t.Provider=e}},_currentValue:{get:function(){return t._currentValue},set:function(e){t._currentValue=e}},_currentValue2:{get:function(){return t._currentValue2},set:function(e){t._currentValue2=e}},_threadCount:{get:function(){return t._threadCount},set:function(e){t._threadCount=e}},Consumer:{get:function(){return r||(r=!0,w("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?")),t.Consumer}},displayName:{get:function(){return t.displayName},set:function(e){o||(_("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.",e),o=!0)}}}),t.Consumer=e,t._currentRenderer=null,t._currentRenderer2=null,t},at.createElement=e,at.createFactory=nt,at.createRef=function(){var e={current:null};return Object.seal(e),e},at.forwardRef=function(t){null!=t&&t.$$typeof===y?w("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):"function"!=typeof t?w("forwardRef requires a render function but was given %s.",null===t?"null":typeof t):0!==t.length&&2!==t.length&&w("forwardRef render functions accept exactly two parameters: props and ref. %s",1===t.length?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),null==t||null==t.defaultProps&&null==t.propTypes||w("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?");var r,e={$$typeof:d,render:t};return Object.defineProperty(e,"displayName",{enumerable:!1,configurable:!0,get:function(){return r},set:function(e){r=e,t.name||t.displayName||(t.displayName=e)}}),e},at.isValidElement=j,at.lazy=function(e){var t,r,n={$$typeof:u,_payload:{_status:b,_result:e},_init:Ee};return Object.defineProperties(n,{defaultProps:{configurable:!0,get:function(){return t},set:function(e){w("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),t=e,Object.defineProperty(n,"defaultProps",{enumerable:!0})}},propTypes:{configurable:!0,get:function(){return r},set:function(e){w("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),r=e,Object.defineProperty(n,"propTypes",{enumerable:!0})}}}),n},at.memo=function(t,e){je(t)||w("memo: The first argument must be a component. Instead received: %s",null===t?"null":typeof t);var r,e={$$typeof:y,type:t,compare:void 0===e?null:e};return Object.defineProperty(e,"displayName",{enumerable:!1,configurable:!0,get:function(){return r},set:function(e){r=e,t.name||t.displayName||(t.displayName=e)}}),e},at.startTransition=function(e,t){var r=c.transition,n=(c.transition={},c.transition);c.transition._updatedFibers=new Set;try{e()}finally{null===(c.transition=r)&&n._updatedFibers&&(10{if("object"!=c(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0===r)return("string"===t?String:Number)(e);if("object"!=c(r=r.call(e,t||"default")))return r;throw new TypeError("@@toPrimitive must return a primitive value.")})(e,"string");return"symbol"==c(e)?e:e+""}var d,y,m=(e=>{function t(e){if(this instanceof t)return(e=u(this,t,[e])).state={error:null,isLoading:!0,form:null},e;throw new TypeError("Cannot call a class as a function")}var r,n=t;if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),Object.defineProperty(n,"prototype",{writable:!1}),e&&f(n,e),n=t,e=[{key:"propTypes",get:function(){return{form_id:a.default.number,show_title:a.default.string,show_desc:a.default.string}}}],(r=[{key:"componentDidUpdate",value:function(e){e.form_id===this.props.form_id&&e.show_title===this.props.show_title&&e.show_desc===this.props.show_desc||this.componentDidMount()}},{key:"componentDidMount",value:function(){var t=this,e=new FormData;e.append("nonce",wpforms_divi_builder.nonce),e.append("action","wpforms_divi_preview"),e.append("form_id",this.props.form_id),e.append("show_title",this.props.show_title),e.append("show_desc",this.props.show_desc),fetch(wpforms_divi_builder.ajax_url,{method:"POST",cache:"no-cache",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded","Cache-Control":"no-cache"},body:new URLSearchParams(e)}).then(function(e){return e.json()}).then(function(e){t.setState({isLoading:!1,form:e.data})},function(e){t.setState({isLoading:!1,error:e})})}},{key:"render",value:function(){var e=this.state,t=e.error,r=e.form;return void 0===this.props.form_id||""===this.props.form_id?o.default.createElement("div",{className:"wpforms-divi-empty-block"},o.default.createElement("img",{src:wpforms_divi_builder.block_empty_url,alt:""}),o.default.createElement("p",{dangerouslySetInnerHTML:{__html:wpforms_divi_builder.block_empty_text}}),o.default.createElement("button",{type:"button",onClick:function(){window.open(wpforms_divi_builder.get_started_url,"_blank")}},wpforms_divi_builder.get_started_text),o.default.createElement("p",{className:"wpforms-admin-no-forms-footer"},wpforms_divi_builder.help_text," ",o.default.createElement("a",{href:wpforms_divi_builder.guide_url,onClick:function(){window.open(wpforms_divi_builder.guide_url,"_blank")}},wpforms_divi_builder.guide_text,"."))):t||!r?o.default.createElement("div",{className:"wpforms-divi-form-placeholder"},o.default.createElement("img",{src:wpforms_divi_builder.placeholder,alt:""})):o.default.createElement("div",{className:e.isLoaded?"wpforms-divi-form-preview loading":"wpforms-divi-form-preview"},o.default.createElement("div",{dangerouslySetInnerHTML:{__html:r}}))}}])&&i(n.prototype,r),e&&i(n,e),Object.defineProperty(n,"prototype",{writable:!1}),n})(o.Component);e=m,y="wpforms_selector",(d=p(d="slug"))in e?Object.defineProperty(e,d,{value:y,enumerable:!0,configurable:!0,writable:!0}):e[d]=y,jQuery(window).on("et_builder_api_ready",function(e,t){t.registerModules([m])}).on("wpformsDiviModuleDisplay",function(){window.wpforms.init()}),jQuery(document).on("wpformsReady",function(){var t=jQuery;t(".choicesjs-select").each(function(){var e=t(this).data("choicesjs");e&&"function"==typeof e.disable&&e.disable()}),"undefined"!=typeof WPFormsRepeaterField&&WPFormsRepeaterField.ready()})},{"prop-types":6,react:14}]},{},[15]); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.js new file mode 100755 index 00000000..6c9238af --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/divi/formselector.js @@ -0,0 +1,202 @@ +/* global wpforms_divi_builder, WPFormsRepeaterField, ETBuilderBackendDynamic */ + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + + +/** + * WPFormsSelector component. + * + * @since 1.6.3 + */ +class WPFormsSelector extends Component { + + /** + * Module slug. + * + * @since 1.6.3 + * + * @type {string} + */ + static slug = 'wpforms_selector'; + + /** + * Constructor. + * + * @since 1.6.3 + * + * @param {string} props List of properties. + */ + constructor( props ) { + + super( props ); + + this.state = { + error: null, + isLoading: true, + form: null, + }; + } + + /** + * Set types for properties. + * + * @since 1.6.3 + * + * @returns {object} Properties type. + */ + static get propTypes() { + + return { + form_id: PropTypes.number, // eslint-disable-line camelcase + show_title: PropTypes.string, // eslint-disable-line camelcase + show_desc: PropTypes.string, // eslint-disable-line camelcase + }; + } + + /** + * Check if form settings was updated. + * + * @since 1.6.3 + * + * @param {object} prevProps List of previous properties. + */ + componentDidUpdate( prevProps ) { + + if ( prevProps.form_id !== this.props.form_id || prevProps.show_title !== this.props.show_title || prevProps.show_desc !== this.props.show_desc ) { + this.componentDidMount(); + } + } + + /** + * Ajax request for form HTML. + * + * @since 1.6.3 + */ + componentDidMount() { + const formData = new FormData(); + + formData.append( 'nonce', wpforms_divi_builder.nonce ); + formData.append( 'action', 'wpforms_divi_preview' ); + formData.append( 'form_id', this.props.form_id ); + formData.append( 'show_title', this.props.show_title ); + formData.append( 'show_desc', this.props.show_desc ); + + fetch( + wpforms_divi_builder.ajax_url, + { + method: 'POST', + cache: 'no-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Cache-Control': 'no-cache', + }, + body: new URLSearchParams( formData ), + }, + ) + .then( ( res ) => res.json() ) + .then( + ( result ) => { + this.setState( { + isLoading: false, + form: result.data, + } ); + }, + ( error ) => { + this.setState( { + isLoading: false, + error, + } ); + }, + ); + } + + /** + * Render module view. + * + * @since 1.6.3 + * + * @returns {JSX.Element} View for module. + */ + render() { + const { error, isLoaded, form } = this.state, + wrapperClasses = isLoaded ? 'wpforms-divi-form-preview loading' : 'wpforms-divi-form-preview'; + + if ( typeof this.props.form_id === 'undefined' || this.props.form_id === '' ) { + return ( +
            + + + {

            } + + + +

            + { wpforms_divi_builder.help_text }  + { + window.open( wpforms_divi_builder.guide_url, '_blank' ); + } + } + > + { wpforms_divi_builder.guide_text }. + +

            +
            + ); + } + + if ( error || ! form ) { + return ( +
            + +
            + ); + } + + return ( +
            + {
            } +
            + ); + } +} + +jQuery( window ) + + // Register custom modules. + .on( 'et_builder_api_ready', ( event, API ) => { + API.registerModules( [ WPFormsSelector ] ); + } ) + + // Re-initialize WPForms frontend. + .on( 'wpformsDiviModuleDisplay', () => { + window.wpforms.init(); + } ); + +jQuery( document ) + .on( 'wpformsReady', function() { + const $ = jQuery; + + // Make all the modern dropdowns disabled. + $( '.choicesjs-select' ).each( function() { + const $instance = $( this ).data( 'choicesjs' ); + + if ( $instance && typeof $instance.disable === 'function' ) { + $instance.disable(); + } + } ); + + // Init Repeater fields. + if ( 'undefined' !== typeof WPFormsRepeaterField ) { + WPFormsRepeaterField.ready(); + } + } ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.js new file mode 100755 index 00000000..d973012c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.js @@ -0,0 +1,70 @@ +/* global $e, elementor */ + +// noinspection ES6ConvertVarToLetConst +/** + * WPForms script for editor context. + * + * @since 1.9.6 + */ +var WPFormsElementorEditorContext = window.WPFormsElementorEditorContext || ( function( document, window, $ ) { // eslint-disable-line no-var + // noinspection JSUnusedGlobalSymbols + /** + * Public functions and properties. + * + * @since 1.9.6 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.9.6 + */ + init() { + app.events(); + }, + + /** + * Register JS events. + * + * @since 1.9.6 + */ + events() { + $( window ).on( 'elementor/init', function() { + // To add action on save event, we should use hookUI.After. + $e.hooks.registerUIAfter( new class extends $e.modules.hookUI.After { + // noinspection JSUnusedGlobalSymbols + getCommand() { + return 'document/save/save'; + } + + // noinspection JSUnusedGlobalSymbols + getId() { + return 'wpforms-elementor-editor-context-after-save'; + } + + // noinspection JSUnusedGlobalSymbols + getConditions() { + return true; + } + + apply() { + // Save custom themes in a preview window. + const previewWindow = elementor.$preview[ 0 ]?.contentWindow; + + if ( previewWindow ) { + previewWindow.WPFormsElementorThemes.saveCustomThemes(); + } + } + } ); + } ); + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsElementorEditorContext.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.min.js new file mode 100755 index 00000000..f5092d62 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-context.min.js @@ -0,0 +1 @@ +var WPFormsElementorEditorContext=window.WPFormsElementorEditorContext||((e,t)=>{let o={init(){o.events()},events(){t(e).on("elementor/init",function(){$e.hooks.registerUIAfter(new class extends $e.modules.hookUI.After{getCommand(){return"document/save/save"}getId(){return"wpforms-elementor-editor-context-after-save"}getConditions(){return!0}apply(){var e=elementor.$preview[0]?.contentWindow;e&&e.WPFormsElementorThemes.saveCustomThemes()}})})}};return o})((document,window),jQuery);WPFormsElementorEditorContext.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-modern.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-modern.js new file mode 100755 index 00000000..2aad35f1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor-modern.js @@ -0,0 +1,1256 @@ +/* global elementor, elementorCommon, wpformsElementorVars, elementorFrontend, Choices */ + +/** + * @param elementorCommon.dialogsManager.createWidget + * @param wpformsElementorVars.isPro + */ + +// noinspection ES6ConvertVarToLetConst +/** + * WPForms integration with Elementor (modern widget). + * + * @since 1.8.3 + */ +var WPFormsElementorModern = window.WPFormsElementorModern || ( function( document, window, $ ) { // eslint-disable-line no-var + /** + * Localized data aliases. + * + * @since 1.9.6 + */ + + /** + * @type {Object} + * @property {string} license_button License button. + * @property {string} license_message License message. + * @property {string} license_url License URL. + * @property {string} pro_sections Pro sections. + * @property {string} upgrade_button Upgrade button. + */ + const strings = wpformsElementorVars.strings; + const routeNamespace = wpformsElementorVars.route_namespace; + const pictureUrlPath = wpformsElementorVars.stockPhotos?.urlPath; + const { isPro, isLicenseActive } = wpformsElementorVars; + + /** + * Stock photos pictures' list. + * + * @since 1.9.6 + * + * @type {Array} + */ + let pictures = wpformsElementorVars.stockPhotos?.pictures ?? []; + + /** + * Stock photos picture selector markup. + * + * @since 1.9.6 + * + * @type {string} + */ + let picturesMarkup = ''; + + /** + * Runtime state. + * + * @since 1.9.6 + * + * @type {Object} + */ + const state = {}; + + /** + * Widget sections list. + * + * @since 1.9.6 + * + * @type {Array} + */ + const widgetSections = [ 'themes', 'field_styles', 'label_styles', 'button_styles', 'container_styles', 'background_styles', 'other_styles' ]; + + /** + * Spinner markup. + * + * @since 1.9.6 + * + * @type {string} + */ + const spinner = ''; + + /** + * Public functions and properties. + * + * @since 1.8.3 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.8.3 + */ + init() { + app.events(); + }, + + /** + * Register JS events. + * + * @since 1.8.3 + */ + events() { + // Widget events. + // noinspection JSUnusedLocalSymbols + $( window ) + // eslint-disable-next-line no-unused-vars + .on( 'elementor/frontend/init', function( event, id, instance ) { + elementor.channels.editor.on( 'section:activated', app.onSectionActivated ); + elementor.hooks.addAction( 'panel/open_editor/widget/wpforms', app.widgetPanelOpen ); + elementorFrontend.hooks.addAction( 'frontend/element_ready/wpforms.default', app.widgetReady ); + } ); + }, + + /** + * Handle section activation events. + * + * @since 1.9.6 + * + * @param {string} sectionName The current section name. + * @param {Object} editor Editor instance. + */ + onSectionActivated( sectionName, editor ) { + app.checkForLeadForms( sectionName, editor ); + app.stockPhotos.backgroundUrlEvents( sectionName, editor ); + app.blockProControls( sectionName, editor ); + }, + + /** + * Disable PRO sections and controls. + * + * @since 1.9.6 + * + * @param {string} sectionName The current section name. + * @param {Object} editor Editor instance. + */ + // eslint-disable-next-line complexity + blockProControls( sectionName, editor ) { + if ( ( wpformsElementorVars.isPro && wpformsElementorVars.isLicenseActive ) || editor.activeTab !== 'style' ) { + return; + } + + // Disable all PRO sections. + editor.$el.find( '.elementor-control-background_styles' ).addClass( 'wpforms-elementor-section-disabled' ).attr( 'data-wpforms-section', 'background' ); + editor.$el.find( '.elementor-control-container_styles' ).addClass( 'wpforms-elementor-section-disabled' ).attr( 'data-wpforms-section', 'container' ); + + // Disable all PRO controls and add overlay. + if ( sectionName === 'background_styles' || sectionName === 'container_styles' ) { + editor.$el + .find( '.elementor-control:not(.elementor-control-type-section)' ) + .addClass( 'wpforms-elementor-control-disabled' ) + .each( function() { + if ( $( this ).find( '.wpforms-disabled-control-overlay' ).length === 0 ) { + $( this ) + .css( 'position', 'relative' ) + .append( '
            ' ); + } + } ); + } + + // Add overlay handler. + if ( ! editor.$el.data( 'wpforms-overlay-handler-bound' ) ) { + editor.$el.on( 'click', '.wpforms-disabled-control-overlay', function( event ) { + event.preventDefault(); + event.stopImmediatePropagation(); + + const section = $( this ).closest( '.elementor-control' ).prevAll( '.elementor-control-type-section' ).first().attr( 'data-wpforms-section' ); + + if ( ! isPro ) { + app.showProModal( section, strings.pro_sections[ section ] ); + return; + } + + if ( ! isLicenseActive ) { + app.showLicenseModal( strings.pro_sections[ section ] ); + } + } ); + + editor.$el.data( 'wpforms-overlay-handler-bound', true ); + } + }, + + /** + * On section change event handler. + * + * @since 1.8.3 + * + * @param {string} sectionName The current section name. + * @param {Object} editor Editor instance. + */ + checkForLeadForms( sectionName, editor ) { + /** + * @param editor.$childViewContainer + * @param editor.model.attributes.widgetType + * @param editor.options.editedElementView + */ + if ( ! widgetSections.includes( sectionName ) || editor.model.attributes.widgetType !== 'wpforms' ) { + return; + } + + const $panelContent = editor.$childViewContainer[ 0 ]; + const widgetView = editor.options.editedElementView.$el[ 0 ]; + const formId = editor.model.attributes.settings.attributes.form_id; + const $form = $( widgetView ).find( `#wpforms-${ formId }` ); + + if ( $form.length === 0 ) { + return; + } + + if ( $form.hasClass( 'wpforms-lead-forms-container' ) ) { + $( $panelContent ).addClass( 'wpforms-elementor-disabled' ); + $( $panelContent ).find( '.wpforms-elementor-lead-forms-notice' ).css( 'display', 'block' ); + } + }, + + /** + * Initialize widget controls when widget is activated. + * + * @since 1.8.3 + * + * @param {Object} panel Panel object. + * @param {Object} model Model object. + * @param {Object} view View object. + */ + widgetPanelOpen( panel, model, view ) { + const settingsModel = model.get( 'settings' ); + + // Apply settings from the textarea. + settingsModel.on( 'change:copyPasteJsonValue', ( changedModel ) => { + app.pasteSettings( changedModel, view ); + } ); + + // Change style settings. + settingsModel.on( 'change', ( changedModel ) => { + app.changeStyleSettings( changedModel, view ); + + if ( ! changedModel.changed.copyPasteJsonValue && ! changedModel.changed.form_id ) { + app.updateCopyPasteContent( changedModel ); + } + } ); + + // Update copy/paste content when form_id is changed and copyPasteJsonValue is not set. + settingsModel.on( 'change:form_id', ( changedModel ) => { + if ( ! changedModel.attributes.copyPasteJsonValue ) { + setTimeout( function() { + app.updateCopyPasteContent( changedModel ); + }, 0 ); + } + } ); + }, + + /** + * Widget ready events. + * + * @since 1.8.3 + * + * @param {jQuery} $scope The current element wrapped with jQuery. + */ + widgetReady( $scope ) { + const formId = $scope.find( '.wpforms-form' ).data( 'formid' ); + + app.updateAccentColors( $scope, formId ); + app.loadChoicesJS( $scope, formId ); + app.initRichTextField( formId ); + app.initRepeaterField( formId ); + }, + + /** + * Change style setting handler. + * + * @since 1.8.3 + * + * @param {Object} changedModel Changed model. + * @param {Object} view View. + */ + // eslint-disable-next-line complexity + changeStyleSettings( changedModel, view ) { + const wpformsContainer = view.$el.find( '.wpforms-container' )[ 0 ]; + + if ( ! wpformsContainer ) { + return; + } + + const parsedAtts = changedModel.parseGlobalSettings( changedModel ); + + for ( const element in changedModel.changed ) { + if ( ! app.getStyleAttributesKeys().includes( element ) ) { + view.allowRender = element !== 'copyPasteJsonValue'; + continue; + } + + view.allowRender = false; + + const serviceAtts = [ 'customThemeName', 'isCustomTheme', 'wpformsTheme' ]; + + if ( serviceAtts.includes( element ) ) { + continue; + } + + /** + * @type {Object} + */ + let attrValue = app.getParsedValue( element, parsedAtts ); + const property = element.replace( /[A-Z]/g, ( letter ) => `-${ letter.toLowerCase() }` ); + attrValue = app.prepareComplexAttrValues( attrValue, element ); + + // Check for custom handlers. + if ( typeof app.getStyleHandlers()[ property ] === 'function' ) { + app.getStyleHandlers()[ property ]( wpformsContainer, attrValue, parsedAtts ); + continue; + } + + switch ( property ) { + case 'field-size': + case 'label-size': + case 'button-size': + case 'container-shadow-size': + for ( const key in wpformsElementorVars.sizes[ property ][ attrValue ] ) { + wpformsContainer.style.setProperty( + `--wpforms-${ property }-${ key }`, + wpformsElementorVars.sizes[ property ][ attrValue ][ key ], + ); + } + + break; + + default: + wpformsContainer.style.setProperty( `--wpforms-${ property }`, attrValue ); + + if ( parsedAtts.backgroundSize === 'cover' ) { + wpformsContainer.style.setProperty( `--wpforms-background-size`, 'cover' ); + } + } + } + }, + + /** + * Get style handlers. + * + * @since 1.9.6 + * + * @return {Object} Style handlers. + */ + getStyleHandlers() { + return { + 'background-image': app.background.setContainerBackgroundImage, + 'background-position': app.background.setContainerBackgroundPosition, + 'background-repeat': app.background.setContainerBackgroundRepeat, + 'background-color': app.background.setBackgroundColor, + 'background-url': app.background.setBackgroundUrl, + 'background-size': app.background.handleSizeFromDimensions, + 'background-width': app.background.handleSizeFromWidth, + 'background-height': app.background.handleSizeFromHeight, + }; + }, + + /** + * Prepare complex attribute values. + * + * @since 1.9.6 + * + * @param {string|Object} attrValue Attribute value. + * @param {string} element Attribute key. + * + * @return {string|Object} Prepared attribute value. + */ + prepareComplexAttrValues( attrValue, element ) { // eslint-disable-line complexity + const pxItems = [ + 'fieldBorderRadius', + 'fieldBorderSize', + 'buttonBorderRadius', + 'buttonBorderSize', + 'containerPadding', + 'containerBorderWidth', + 'containerBorderRadius', + 'backgroundWidth', + 'backgroundHeight', + ]; + + if ( pxItems.includes( element ) ) { + if ( typeof attrValue === 'number' || ( typeof attrValue === 'string' && ! attrValue.trim().endsWith( 'px' ) ) ) { + attrValue = `${ attrValue }px`; + } + } + + if ( element === 'backgroundUrl' ) { + // noinspection JSUnresolvedReference + let url = typeof attrValue === 'object' ? attrValue?.url : attrValue; + + if ( typeof url === 'string' && ! url.trim().startsWith( 'url(' ) ) { + url = url ? `url( ${ url } )` : 'url()'; + } + + attrValue = url; + } + + return attrValue; + }, + + /** + * Copy/paste widget settings. + * + * @since 1.8.3 + * + * @param {Object} model Settings model. + */ + updateCopyPasteContent( model ) { + const styleSettings = app.getStyleAttributesKeys(); + const content = {}; + + /** + * @param model.parseGlobalSettings + * @param model.setExternalChange + */ + const atts = model.parseGlobalSettings( model ); + + styleSettings.forEach( function( element ) { + content[ element ] = app.getParsedValue( element, atts ); + } ); + + model.setExternalChange( 'copyPasteJsonValue', JSON.stringify( content ) ); + }, + + /** + * Reset global style settings. + * + * @since 1.8.7 + * + * @param {Object} model Settings model. + * @param {Object} container Container. + */ + resetGlobalStyleSettings( model, container ) { + const globals = model.get( '__globals__' ); + + /** + * @param model.changed.__globals__ + */ + if ( globals && ! model.changed.__globals__ ) { + elementorCommon.api.run( 'document/globals/settings', { + container, + settings: {}, + options: { + external: true, + render: false, + }, + } ); + } + }, + + /** + * Paste settings. + * + * @since 1.8.3 + * + * @param {Object} model Settings model. + * @param {Object} view View. + */ + pasteSettings( model, view ) { + const copyPasteJsonValue = model.changed.copyPasteJsonValue; + const pasteAttributes = app.parseValidateJson( copyPasteJsonValue ); + const container = view.container; + + if ( ! pasteAttributes ) { + if ( copyPasteJsonValue ) { + elementorCommon.dialogsManager.createWidget( 'alert', { + message: strings.copy_paste_error, + headerMessage: strings.heads_up, + } ).show(); + } + + this.updateCopyPasteContent( model ); + + return; + } + + app.resetGlobalStyleSettings( model, container ); + + model.set( pasteAttributes ); + }, + + /** + * Parse and validate JSON string. + * + * @since 1.8.3 + * + * @param {string} value JSON string. + * + * @return {boolean|object} Parsed JSON object OR false on error. + */ + parseValidateJson( value ) { + if ( typeof value !== 'string' ) { + return false; + } + + let atts; + + try { + atts = JSON.parse( value ); + } catch ( error ) { + atts = false; + } + + return atts; + }, + + /** + * Get a list of the style attributes keys. + * + * @since 1.8.3 + * + * @return {Array} Style attributes keys. + */ + getStyleAttributesKeys() { + return [ + 'containerPadding', + 'containerBorderStyle', + 'containerBorderWidth', + 'containerBorderRadius', + 'containerShadowSize', + 'containerBorderColor', + 'fieldSize', + 'fieldBorderStyle', + 'fieldBorderRadius', + 'fieldBorderSize', + 'fieldBackgroundColor', + 'fieldBorderColor', + 'fieldTextColor', + 'fieldMenuColor', + 'pageBreakColor', + 'labelSize', + 'labelColor', + 'labelSublabelColor', + 'labelErrorColor', + 'buttonSize', + 'buttonBorderStyle', + 'buttonBorderSize', + 'buttonBorderRadius', + 'buttonBackgroundColor', + 'buttonBorderColor', + 'buttonTextColor', + 'backgroundColor', + 'backgroundPosition', + 'backgroundUrl', + 'backgroundRepeat', + 'backgroundSize', + 'backgroundSizeMode', + 'backgroundWidth', + 'backgroundHeight', + 'backgroundImage', + 'customThemeName', + 'isCustomTheme', + ]; + }, + + /** + * Get parsed attribute value. + * + * @since 1.8.3 + * + * @param {string} attrName Attribute name. + * @param {Object} parsedAtts Parsed attributes. + * + * @return {string} Attribute value. + */ + getParsedValue( attrName, parsedAtts ) { + const rawValue = parsedAtts[ attrName ]; + let value; + + if ( typeof rawValue === 'undefined' ) { + value = false; + } else if ( typeof rawValue === 'object' && Object.prototype.hasOwnProperty.call( rawValue, 'value' ) ) { + value = rawValue.value; + } else { + value = rawValue; + } + + return value; + }, + + /** + * Initialize the RichText field. + * + * @since 1.8.3 + * + * @param {number} formId Form ID. + */ + initRichTextField( formId ) { + // Set default tab to `Visual`. + $( `#wpforms-${ formId } .wp-editor-wrap` ).removeClass( 'html-active' ).addClass( 'tmce-active' ); + }, + + /** + * Update accent colors of some fields in Elementor widget. + * + * @since 1.8.3 + * + * @param {jQuery} widgetContainer Widget container. + * @param {number} formId Event details object. + */ + updateAccentColors( widgetContainer, formId ) { + const $form = widgetContainer.find( `#wpforms-${ formId }` ), + FrontendModern = window.WPForms.FrontendModern; + + FrontendModern.updateGBBlockPageIndicatorColor( $form ); + FrontendModern.updateGBBlockIconChoicesColor( $form ); + FrontendModern.updateGBBlockRatingColor( $form ); + }, + + /** + * Init Modern style Dropdown fields () with choiceJS. + * + * @since 1.9.0 + * + * @param {Object} $scope Elementor scope object. + */ + loadChoicesJS( $scope ) { + // Loads if function exists. + if ( typeof parent.Choices !== 'function' ) { + return; + } + + const $elements = $scope.find( '.wpforms-field .choicesjs-select' ); + const config = window.wpforms_choicesjs_config || {}; + + // Initialize ChoicesJS. + $elements.each( function( index, el ) { + if ( ! ( el instanceof parent.HTMLSelectElement ) ) { + return; + } + + const $el = $( el ); + + if ( $el.data( 'choicesjs' ) ) { + return; + } + + const $field = $el.closest( '.wpforms-field' ); + + config.callbackOnInit = function() { + const self = this, + $element = $( self.passedElement.element ), + $input = $( self.input.element ), + sizeClass = $element.data( 'size-class' ); + + // Add CSS-class for size. + if ( sizeClass ) { + $( self.containerOuter.element ).addClass( sizeClass ); + } + + /** + * If a multiple select has selected choices - hide a placeholder text. + * In case if select is empty - we return placeholder text. + */ + if ( $element.prop( 'multiple' ) ) { + // On init event. + $input.data( 'placeholder', $input.attr( 'placeholder' ) ); + + if ( self.getValue( true ).length ) { + $input.hide(); + } + } + + this.disable(); + $field.find( '.is-disabled' ).removeClass( 'is-disabled' ); + }; + $el.data( 'choicesjs', new parent.Choices( el, config ) ); + } ); + }, + + /** + * Widget events. + * + * @since 1.6.2 + * + * @param {jQuery} $scope The current element wrapped with jQuery. + */ + widgetPreviewEvents: function( $scope ) { + + $scope + .on( 'click', '.wpforms-btn', app.addFormBtnClick ) + .on( 'click', '.wpforms-admin-no-forms-container a', app.clickLinkInPreview ) + .on( 'change', '.wpforms-elementor-form-selector select', app.selectFormInPreview ) + .on( 'click mousedown focus keydown submit', '.wpforms-container *', app.disableEvents ) + .on( 'click', '.wpforms-comprehensive-link', app.openComprehensiveLink ); + + app.updateSameForms( $scope ); + }, + + /** + * Update all the same forms on the preview. + * + * @since 1.6.3 + * + * @param {jQuery} $scope The current element wrapped with jQuery. + */ + updateSameForms: function( $scope ) { + + var elementId = $scope.data( 'id' ), + $formContainer = $scope.find( '.wpforms-container' ), + formContainerHtml = $formContainer.html(), + formContainerId = $formContainer.attr( 'id' ); + + $scope + .closest( '.elementor-editor-active' ) + .find( '.elementor-widget-wpforms:not(.elementor-element-' + elementId + ')' ) + .each( function() { + + var $anotherFormContainer = $( this ).find( '.wpforms-container' ); + + if ( $anotherFormContainer.attr( 'id' ) === formContainerId ) { + $anotherFormContainer.html( formContainerHtml ); + } + } ); + }, + + /** + * Initialize widget controls when widget is activated. + * + * @since 1.6.2 + * + * @param {object} panel Panel object. + * @param {object} model Model object. + */ + widgetPanelOpen: function( panel, model ) { + + vars.widgetId = model.attributes.id; + vars.formId = model.attributes.settings.attributes.form_id; + + app.widgetPanelInit( panel ); + + app.widgetPanelObserver.init( panel ); + }, + + /** + * Initialize widget controls when widget is activated. + * + * @since 1.6.2 + * + * @param {object} panel Panel object. + */ + widgetPanelInit: function( panel ) { + + var $formSelectControl = panel.$el.find( '.elementor-control.elementor-control-form_id' ), + $formSelect = $formSelectControl.find( 'select' ), + $addFormNoticeControl = panel.$el.find( '.elementor-control.elementor-control-add_form_notice' ), + $testFormNoticeControl = panel.$el.find( '.elementor-control.elementor-control-test_form_notice' ); + + // Update form select options if it is available after adding the form. + if ( vars.formSelectOptions ) { + $formSelect.html( vars.formSelectOptions ); + } + + // Update form select value. + if ( vars.formId && vars.formId !== '' ) { + $formSelect.val( vars.formId ); + } + + // Hide not needed controls. + if ( $formSelect.find( 'option' ).length > 0 ) { + $addFormNoticeControl.hide(); + } else { + $formSelectControl.hide(); + $testFormNoticeControl.hide(); + } + + // Show needed controls. + if ( parseInt( $formSelect.val(), 10 ) > 0 ) { + $testFormNoticeControl.show(); + } + + // Select form. + panel.$el.find( '.elementor-control.elementor-control-form_id' ).on( 'change', 'select', function() { + + // Update `vars.formId` to be able to restore selected value after options update. + vars.formId = $( this ).val(); + } ); + + // Click on the `Edit the selected form` link. + panel.$el.find( '.elementor-control.elementor-control-edit_form' ).on( 'click', 'a', app.editFormLinkClick ); + }, + + /** + * The observer needed to re-init controls when the widget panel section and tabs switches. + * + * @since 1.6.3 + * + * @member {object} + */ + widgetPanelObserver: { + + /** + * Initialize observer. + * + * @since 1.6.3 + * + * @param {object} panel Panel object. + */ + init: function( panel ) { + + // Skip if observer for current widget already initialized. + if ( vars.observerWidgetId === vars.widgetId ) { + return; + } + + // Disconnect previous widget observer. + if ( typeof vars.observer !== 'undefined' && typeof vars.observer.disconnect === 'function' ) { + vars.observer.disconnect(); + } + + var obs = { + targetNode : panel.$el.find( '#elementor-panel-content-wrapper' )[0], + config : { + childList: true, + subtree: true, + attributes: true, + }, + }; + + app.widgetPanelObserver.panel = panel; + + obs.observer = new MutationObserver( app.widgetPanelObserver.callback ); + obs.observer.observe( obs.targetNode, obs.config ); + + vars.observerWidgetId = vars.widgetId; + vars.observer = obs.observer; + }, + + /** + * Observer callback. + * + * @since 1.6.3 + * + * @param {Array} mutationsList Mutation list. + */ + callback: function( mutationsList ) { + + var mutation, + quit = false; + + for ( var i in mutationsList ) { + mutation = mutationsList[ i ]; + + if ( mutation.type === 'childList' && mutation.addedNodes.length > 0 ) { + quit = app.widgetPanelObserver.callbackMutationChildList( mutation ); + } + + if ( mutation.type === 'attributes' ) { + quit = app.widgetPanelObserver.callbackMutationAttributes( mutation ); + } + + if ( quit ) { + return; + } + } + }, + + /** + * Process 'childList' mutation. + * + * @since 1.6.3 + * + * @param {MutationRecord} mutation Mutation record. + * + * @returns {boolean} True if detect needed node. + */ + callbackMutationChildList: function( mutation ) { + + var addedNodes = mutation.addedNodes || [], + node; + + for ( var n in addedNodes ) { + node = addedNodes[ n ]; + + if ( node && node.classList && node.classList.contains( 'elementor-control-section_form' ) ) { + app.widgetPanelInit( app.widgetPanelObserver.panel ); + return true; + } + } + + return false; + }, + + /** + * Process 'attributes' mutation. + * + * @since 1.6.3 + * + * @param {MutationRecord} mutation Mutation record. + * + * @returns {boolean} True if detect needed target. + */ + callbackMutationAttributes: function( mutation ) { + + if ( + mutation.target && + mutation.target.classList && + mutation.target.classList.contains( 'elementor-tab-control-content' ) + ) { + app.widgetPanelInit( app.widgetPanelObserver.panel ); + + return true; + } + + return false; + }, + }, + + /** + * Edit selected form button click event handler. + * + * @since 1.6.2 + * + * @param {object} event Event object. + */ + editFormLinkClick: function( event ) { + + app.findFormSelector( event ); + app.openBuilderPopup( vars.$select.val() ); + }, + + /** + * Add a new form button click event handler. + * + * @since 1.6.2 + * + * @param {object} event Event object. + */ + addFormBtnClick: function( event ) { + + app.findFormSelector( event ); + app.openBuilderPopup( 0 ); + }, + + /** + * Find and store the form selector control wrapped in jQuery object. + * + * @since 1.6.2 + * + * @param {object} event Event object. + */ + findFormSelector: function( event ) { + + let view = elementor.getPanelView().getCurrentPageView(); + + // We need to be sure that we are on the widget Content section. + if ( view.activeSection && view.activeSection !== 'section_form' ) { + $( view.ui.tabs[0] ).trigger( 'click' ); + } + + vars.$select = event && event.$el ? + event.$el.closest( '#elementor-controls' ).find( 'select[data-setting="form_id"]' ) : + window.parent.jQuery( '#elementor-controls select[data-setting="form_id"]' ); + }, + + /** + * Preview: Form selector event handler. + * + * @since 1.6.2 + */ + selectFormInPreview: function() { + + vars.formId = $( this ).val(); + + app.findFormSelector(); + + // To be sure, that both form selector selects are in sync. + app.refreshFormsList( null, vars.formId ); + }, + + /** + * Preview: Click on the link event handler. + * + * @since 1.6.2 + * + * @param {object} event Event object. + */ + clickLinkInPreview: function( event ) { + + if ( event.target && event.target.href ) { + window.open( event.target.href, '_blank', 'noopener,noreferrer' ); + } + }, + + /** + * Disable events. + * + * @since 1.6.2 + * + * @param {object} event Event object. + * + * @returns {boolean} Always false. + */ + disableEvents: function( event ) { + + event.preventDefault(); + event.stopImmediatePropagation(); + + return false; + }, + + /** + * Open the compreshenvie guide link, + * as elementor disables all links in the preview. + * + * @since 1.8.3 + * + * @param {object} event Event object. + */ + openComprehensiveLink: function( event ) { + + const url = $( this ).attr( 'href' ); + + // Open the url in a new tab with JS bc elementor doesn't allow links in the preview. + window.open( url, '_blank' ).focus(); + }, + + /** + * Open builder popup. + * + * @since 1.6.2 + * + * @param {number} formId Form id. 0 for create new form. + */ + openBuilderPopup: function( formId ) { + + formId = parseInt( formId || '0', 10 ); + + if ( ! vars.$popup ) { + + // We need to add popup markup to the editor top document. + var $elementor = window.parent.jQuery( '#elementor-editor-wrapper' ), + popupTpl = wp.template( 'wpforms-builder-elementor-popup' ); + + $elementor.after( popupTpl() ); + vars.$popup = $elementor.siblings( '#wpforms-builder-elementor-popup' ); + } + + var url = formId > 0 ? wpformsElementorVars.edit_form_url + formId : wpformsElementorVars.add_form_url, + $iframe = vars.$popup.find( 'iframe' ); + + app.builderCloseButtonEvent(); + $iframe.attr( 'src', url ); + vars.$popup.fadeIn(); + }, + + /** + * Close button (inside the form builder) click event. + * + * @since 1.6.2 + */ + builderCloseButtonEvent: function() { + + vars.$popup + .off( 'wpformsBuilderInPopupClose' ) + .on( 'wpformsBuilderInPopupClose', function( e, action, formId ) { + + if ( action !== 'saved' || ! formId ) { + return; + } + + app.refreshFormsList( null, formId ); + } ); + }, + + /** + * Refresh forms list event handler. + * + * @since 1.6.2 + * + * @param {object} event Event object. + * @param {number} setFormId Set selected form to. + */ + refreshFormsList: function( event, setFormId ) { + + if ( event ) { + event.preventDefault(); + } + + app.findFormSelector(); + + var data = { + action: 'wpforms_admin_get_form_selector_options', + nonce : wpformsElementorVars.nonce, + }; + + vars.$select.prop( 'disabled', true ); + + $.post( wpformsElementorVars.ajax_url, data ) + .done( function( response ) { + + if ( ! response.success ) { + app.debug( response ); + return; + } + + vars.formSelectOptions = response.data; + vars.$select.html( response.data ); + + if ( setFormId ) { + vars.formId = setFormId; + } + + if ( vars.formId && vars.formId !== '' ) { + vars.$select.val( vars.formId ).trigger( 'change' ); + } + } ) + .fail( function( xhr, textStatus ) { + + app.debug( { + xhr: xhr, + textStatus: textStatus, + } ); + } ) + .always( function() { + + if ( ! vars.$select || vars.$select.length < 1 ) { + return; + } + + vars.$select.prop( 'disabled', false ); + + var $formSelectOptions = vars.$select.find( 'option' ), + $formSelectControl = vars.$select.closest( '.elementor-control' ); + + if ( $formSelectOptions.length > 0 ) { + $formSelectControl.show(); + $formSelectControl.siblings( '.elementor-control-add_form_notice' ).hide(); + } + if ( parseInt( vars.$select.val(), 10 ) > 0 ) { + $formSelectControl.siblings( '.elementor-control-test_form_notice' ).show(); + } + } ); + }, + + /** + * Debug output helper. + * + * @since 1.6.2 + * + * @param {mixed} msg Debug message. + */ + debug: function( msg ) { + + if ( app.isDebug() ) { + console.log( 'WPForms Debug:', msg ); + } + }, + + /** + * Is debug mode. + * + * @since 1.6.2 + * + * @returns {boolean} True if the debug enabled. + */ + isDebug: function() { + + return ( ( window.top.location.hash && '#wpformsdebug' === window.top.location.hash ) || wpformsElementorVars.debug ); + }, + }; + + return app; + +}( document, window, jQuery ) ); + +// Initialize. +WPFormsElementor.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor.min.js new file mode 100755 index 00000000..9b35c20b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/editor.min.js @@ -0,0 +1 @@ +var WPFormsElementor=window.WPFormsElementor||((r,i)=>{var l={},s={init:function(){s.events()},events:function(){i(r).on("elementor/frontend/init",function(e,t,o){elementor.channels.editor.on("elementorWPFormsAddFormBtnClick",s.addFormBtnClick),elementorFrontend.hooks.addAction("frontend/element_ready/wpforms.default",s.widgetPreviewEvents),elementor.hooks.addAction("panel/open_editor/widget/wpforms",s.widgetPanelOpen),elementorFrontend.hooks.addAction("frontend/element_ready/wpforms.default",s.loadChoicesJS)})},loadChoicesJS(e){if("function"==typeof parent.Choices){e=e.find(".wpforms-field .choicesjs-select");let n=r.wpforms_choicesjs_config||{};e.each(function(e,t){if(t instanceof parent.HTMLSelectElement){var o=i(t);if(!o.data("choicesjs")){let r=o.closest(".wpforms-field");n.callbackOnInit=function(){var e=this,t=i(e.passedElement.element),o=i(e.input.element),n=t.data("size-class");n&&i(e.containerOuter.element).addClass(n),t.prop("multiple")&&(o.data("placeholder",o.attr("placeholder")),e.getValue(!0).length)&&o.hide(),this.disable(),r.find(".is-disabled").removeClass("is-disabled")},o.data("choicesjs",new parent.Choices(t,n))}}})}},widgetPreviewEvents:function(e){e.on("click",".wpforms-btn",s.addFormBtnClick).on("click",".wpforms-admin-no-forms-container a",s.clickLinkInPreview).on("change",".wpforms-elementor-form-selector select",s.selectFormInPreview).on("click mousedown focus keydown submit",".wpforms-container *",s.disableEvents).on("click",".wpforms-comprehensive-link",s.openComprehensiveLink),s.updateSameForms(e)},updateSameForms:function(e){var t=e.data("id"),o=e.find(".wpforms-container"),n=o.html(),r=o.attr("id");e.closest(".elementor-editor-active").find(".elementor-widget-wpforms:not(.elementor-element-"+t+")").each(function(){var e=i(this).find(".wpforms-container");e.attr("id")===r&&e.html(n)})},widgetPanelOpen:function(e,t){l.widgetId=t.attributes.id,l.formId=t.attributes.settings.attributes.form_id,s.widgetPanelInit(e),s.widgetPanelObserver.init(e)},widgetPanelInit:function(e){var t=e.$el.find(".elementor-control.elementor-control-form_id"),o=t.find("select"),n=e.$el.find(".elementor-control.elementor-control-add_form_notice"),r=e.$el.find(".elementor-control.elementor-control-test_form_notice");l.formSelectOptions&&o.html(l.formSelectOptions),l.formId&&""!==l.formId&&o.val(l.formId),(0 { + app.forceLoadChoices = true; + + wpforms.loadChoicesJS(); + } ); + + $( document ).on( 'wpformsBeforeLoadElementChoices', ( event, el ) => { + // Do not initialize on elementor popup. + if ( ! app.isFormInElementorPopup( el ) || app.forceLoadChoices ) { + return; + } + + event.preventDefault(); + } ); + + $( document ).on( 'wpformsBeforeStripePaymentElementSetup', ( event, el ) => { + // Do not initialize on elementor popup. + if ( ! app.isFormInElementorPopup( el ) || app.forceSetStripe ) { + return; + } + + event.preventDefault(); + } ); + }, + + /** + * Check if the form is in Elementor popup. + * + * @since 1.9.3 + * + * @param {Object} form Form element. + * + * @return {boolean} True if the form is in Elementor popup, false otherwise. + */ + isFormInElementorPopup( form ) { + return $( form ).parents( 'div[data-elementor-type="popup"]' ).length; + }, + + /** + * Init all things for WPForms. + * + * @since 1.6.2 + * + * @param {Object} $form jQuery selector. + */ + initFields( $form ) { // eslint-disable-line complexity + // Init WPForms things. + wpforms.ready(); + + // Init `Modern File Upload` field. + if ( 'undefined' !== typeof wpformsModernFileUpload ) { + wpformsModernFileUpload.init(); + } + + // Init CAPTCHA. + if ( 'undefined' !== typeof wpformsRecaptchaLoad ) { + if ( 'recaptcha' === wpformsElementorVars.captcha_provider && 'v3' === wpformsElementorVars.recaptcha_type ) { + if ( 'undefined' !== typeof grecaptcha ) { + grecaptcha.ready( wpformsRecaptchaLoad ); + } + } else { + wpformsRecaptchaLoad(); + } + } + + // Init Repeater fields. + if ( 'undefined' !== typeof WPFormsRepeaterField ) { + WPFormsRepeaterField.ready(); + } + + // Init Stripe payment. + if ( 'undefined' !== typeof WPFormsStripePaymentElement ) { + WPFormsStripePaymentElement.setupStripeForm( $form ); + } + + // Register a custom event. + $( document ).trigger( 'wpforms_elementor_form_fields_initialized', [ $form ] ); + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsElementorFrontend.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/frontend.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/frontend.min.js new file mode 100755 index 00000000..f59a9250 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/frontend.min.js @@ -0,0 +1 @@ +var WPFormsElementorFrontend=window.WPFormsElementorFrontend||((o,e,r)=>{var t={forceLoadChoices:!1,forceSetStripe:!1,init(){t.events()},events(){e.addEventListener("elementor/popup/show",function(e){e=r("#elementor-popup-modal-"+e.detail.id).find(".wpforms-form");e.length&&(t.forceSetStripe=!0,t.initFields(e))}),e.addEventListener("elementor/popup/show",function(){e.WPFormsTextLimit?.initHint(".elementor-popup-modal")}),r(o).on("elementor/popup/show",()=>{t.forceLoadChoices=!0,wpforms.loadChoicesJS()}),r(o).on("wpformsBeforeLoadElementChoices",(e,o)=>{t.isFormInElementorPopup(o)&&!t.forceLoadChoices&&e.preventDefault()}),r(o).on("wpformsBeforeStripePaymentElementSetup",(e,o)=>{t.isFormInElementorPopup(o)&&!t.forceSetStripe&&e.preventDefault()})},isFormInElementorPopup(e){return r(e).parents('div[data-elementor-type="popup"]').length},initFields(e){wpforms.ready(),"undefined"!=typeof wpformsModernFileUpload&&wpformsModernFileUpload.init(),"undefined"!=typeof wpformsRecaptchaLoad&&("recaptcha"===wpformsElementorVars.captcha_provider&&"v3"===wpformsElementorVars.recaptcha_type?"undefined"!=typeof grecaptcha&&grecaptcha.ready(wpformsRecaptchaLoad):wpformsRecaptchaLoad()),"undefined"!=typeof WPFormsRepeaterField&&WPFormsRepeaterField.ready(),"undefined"!=typeof WPFormsStripePaymentElement&&WPFormsStripePaymentElement.setupStripeForm(e),r(o).trigger("wpforms_elementor_form_fields_initialized",[e])}};return t})(document,window,jQuery);WPFormsElementorFrontend.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.js new file mode 100755 index 00000000..900d001c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.js @@ -0,0 +1,965 @@ +/* global elementor, elementorCommon, wpformsElementorVars, WPFormsElementorModern */ +// noinspection TypeScriptUMDGlobal + +/** + * @param wpformsElementorVars.route_namespace + * @param strings.form_themes + * @param strings.theme_name + * @param strings.theme_delete + * @param strings.theme_delete_title + * @param strings.theme_delete_confirm + * @param strings.theme_delete_cant_undone + * @param strings.theme_delete_yes + * @param strings.theme_copy + * @param strings.theme_custom + * @param strings.theme_noname + * @param strings.themes_error + * @param strings.button_background + * @param strings.button_text + * @param strings.field_label + * @param strings.field_sublabel + * @param strings.field_border + */ + +// noinspection ES6ConvertVarToLetConst +/** + * WPForms integration with Elementor (modern widget). + * + * @since 1.9.6 + */ +var WPFormsElementorThemes = window.WPFormsElementorThemes || ( function( document, window, $ ) { // eslint-disable-line no-var + /** + * Localized data aliases. + * + * @since 1.9.6 + */ + const { isAdmin, isPro, isLicenseActive, strings, route_namespace: routeNamespace } = wpformsElementorVars; + + /** + * Runtime state. + * + * @since 1.9.6 + * + * @type {Object} + */ + const state = {}; + + /** + * Themes data. + * + * @since 1.9.6 + * + * @type {Object} + */ + const themesData = { + wpforms: null, + custom: null, + }; + + /** + * Enabled themes. + * + * @since 1.9.6 + * + * @type {Object} + */ + let enabledThemes = null; + + /** + * Elements holder. + * + * @since 1.9.6 + * + * @type {Object} + */ + const el = {}; + + // noinspection JSUnusedGlobalSymbols + /** + * Public functions and properties. + * + * @since 1.9.6 + * + * @type {Object} + */ + const app = { + /** + * Start the engine. + * + * @since 1.9.6 + */ + init() { + el.$window = $( window ); + + app.fetchThemesData(); + + app.events(); + }, + + /** + * Register JS events. + * + * @since 1.9.6 + */ + events() { + // noinspection JSUnusedLocalSymbols + $( window ) + .on( 'elementor/frontend/init', function() { + elementor.channels.editor.on( 'section:activated', app.themesControlSetup ); + } ); + }, + + /** + * Get all themes data. + * + * @since 1.9.6 + * + * @return {Object} Themes data. + */ + getAllThemes() { + return { ...( themesData.custom || {} ), ...( themesData.wpforms || {} ) }; + }, + + /** + * On section change event handler. + * + * @since 1.9.6 + * + * @param {string} sectionName The current section name. + * @param {Object} editor Editor instance. + */ + themesControlSetup( sectionName, editor ) { + if ( sectionName !== 'themes' || editor.model.attributes.widgetType !== 'wpforms' ) { + return; + } + + const $panelContent = editor.$childViewContainer[ 0 ]; + const $themesControl = $( $panelContent ).find( '.wpforms-elementor-themes-control' ); + + // Scrollbar fix for Mac. + if ( app.isMac() ) { + $themesControl.addClass( 'wpforms-is-mac' ); + } + + app.updateThemesList( editor, $themesControl ); + }, + + /** + * Update themes list. + * + * @since 1.9.6 + * @param {Object} editor Editor instance. + * @param {Object} $themesControl Themes control object. + */ + updateThemesList( editor, $themesControl ) { + const selectedTheme = editor.model.attributes.settings.attributes.wpformsTheme ?? 'default'; + + // Get all themes. + const html = app.getThemesListMarkup( selectedTheme ); + + $themesControl.html( html ); + + app.addThemesEvents( $themesControl, editor ); + }, + + /** + * On settings change event handler. + * + * @since 1.9.6 + * + * @param {Object} $themesControl Themes control element. + * @param {Object} editor Editor instance. + */ + addThemesEvents( $themesControl, editor ) { + const debouncedMaybeCreate = _.debounce( ( settings ) => { + app.maybeCreateCustomTheme( settings ); + }, 300 ); + + const settingsModel = editor.model.get( 'settings' ); + + if ( settingsModel.attributes.isMigrated !== 'true' ) { + app.maybeMigrateToCustomTheme( settingsModel, $themesControl, editor ); + } + + settingsModel.on( 'change', ( one ) => { + debouncedMaybeCreate( one.attributes ); + app.maybeUpdateCustomTheme( one ); + } ); + + const $radioButtons = $themesControl.find( '[role="radio"]' ); + + // Add event listeners to the radio buttons. + $radioButtons.off( 'click' ).on( 'click', function() { + $radioButtons.removeClass( 'is-active' ); + + $( this ).addClass( 'is-active' ); + + const selectedValue = $( this ).val(); + + app.selectTheme( selectedValue ); + } ); + + // Add event listeners to the theme delete button. + elementor.channels.editor + .off( 'WPFormsDeleteThemeButtonClick' ) + .on( 'WPFormsDeleteThemeButtonClick', () => { + app.deleteThemeModal( editor.model.attributes.settings.attributes, editor ); + } ); + + // Listen for the theme name change. + editor.model.get( 'settings' ) + .off( 'change:customThemeName' ) + .on( 'change:customThemeName', function( model ) { + const newName = model.get( 'customThemeName' ); + + app.changeThemeName( newName, model ); + app.updateThemesList( editor, $themesControl ); + } ); + }, + + /** + * Maybe migrate to the custom theme. + * + * @since 1.9.6 + * + * @param {Object} settingsModel Settings model. + * @param {Object} $themesControl Themes Control object. + * @param {Object} editor Editor object. + */ + maybeMigrateToCustomTheme( settingsModel, $themesControl, editor ) { + const previousSettings = settingsModel._previousAttributes; + const atts = settingsModel.attributes; + + if ( 'copyPasteJsonValue' in previousSettings && ! previousSettings.wpformsTheme && ! atts.isCustomTheme ) { + const currentStyles = app.getCurrentStyleAttributes( settingsModel.attributes ); + app.createCustomTheme( settingsModel.attributes, currentStyles, true ); + app.updateThemesList( editor, $themesControl ); + } + + settingsModel.setExternalChange( { + isMigrated: 'true', + } ); + }, + + /** + * Maybe update the custom theme settings. + * + * @since 1.9.6 + * + * @param {Object} model Settings model. + */ + maybeUpdateCustomTheme( model ) { + const atts = model.attributes; + const isCustomTheme = atts.isCustomTheme === 'true'; + + if ( ! isCustomTheme ) { + return; + } + + const changedAtts = model.changed; + const allowedKeys = WPFormsElementorModern.getStyleAttributesKeys(); + + // Update only allowed attributes. + for ( const element in changedAtts ) { + if ( ! allowedKeys.includes( element ) ) { + continue; + } + + const attrValue = WPFormsElementorModern.prepareComplexAttrValues( changedAtts[ element ], element ); + + app.updateCustomThemeAttribute( element, attrValue, atts ); + } + }, + + /** + * Get the Themes control markup. + * + * @since 1.9.6 + * + * @param {string} selectedTheme Selected theme slug. + * + * @return {string} Themes items HTML. + */ + // eslint-disable-next-line complexity + getThemesListMarkup( selectedTheme ) { + if ( ! themesData.wpforms ) { + app.fetchThemesData(); + + // Return markup with an error message if themes are not available. + return `
            ${ strings.themes_error }
            `; + } + + const allThemes = app.getAllThemes(); + + if ( ! allThemes ) { + return ''; + } + + const themes = Object.keys( allThemes ); + let theme, firstThemeSlug; + let html = ''; + let itemsHtml = ''; + + if ( ! app.isWPFormsTheme( selectedTheme ) ) { + firstThemeSlug = selectedTheme; + + itemsHtml += app.getThemesItemMarkup( app.getTheme( firstThemeSlug ), firstThemeSlug, firstThemeSlug ); + } + + for ( const key in themes ) { + const slug = themes[ key ]; + + // Skip the first theme. + if ( firstThemeSlug && firstThemeSlug === slug ) { + continue; + } + + // Ensure that all the theme settings are present. + theme = { ...allThemes.default, ...( allThemes[ slug ] || {} ) }; + theme.settings = { ...allThemes.default.settings, ...( theme.settings || {} ) }; + + itemsHtml += app.getThemesItemMarkup( theme, slug, selectedTheme ); + } + + html = `
            + ${ itemsHtml } +
            `; + + return html; + }, + + /** + * Get the Themes list item markup. + * + * @since 1.9.6 + * + * @param {Object} theme Theme properties. + * @param {string} slug Theme slug. + * @param {string} selectedTheme Selected theme slug. + * + * @return {string} Themes items HTML. + */ + getThemesItemMarkup( theme, slug, selectedTheme ) { + if ( ! theme ) { + return ''; + } + + const title = theme.name?.length > 0 ? theme.name : strings.theme_noname; + let radioClasses = 'wpforms-elementor-themes-radio '; + const buttonClass = slug === selectedTheme ? 'is-active' : ''; + + radioClasses += app.isDisabledTheme( slug ) ? 'wpforms-elementor-themes-radio-disabled' : ' wpforms-elementor-themes-radio-enabled'; + + return ``; + }, + + /** + * Get theme data. + * + * @since 1.9.6 + * + * @param {string} slug Theme slug. + * + * @return {Object|null} Theme settings. + */ + getTheme( slug ) { + return app.getAllThemes()[ slug ] || null; + }, + + /** + * Get enabled themes data. + * + * @since 1.9.6 + * + * @return {Object} Themes data. + */ + getEnabledThemes() { + if ( enabledThemes ) { + return enabledThemes; + } + + const allThemes = app.getAllThemes(); + + if ( isPro && isLicenseActive ) { + return allThemes; + } + + enabledThemes = Object.keys( allThemes ).reduce( ( acc, key ) => { + if ( allThemes[ key ].settings?.fieldSize && ! allThemes[ key ].disabled ) { + acc[ key ] = allThemes[ key ]; + } + return acc; + }, {} ); + + return enabledThemes; + }, + + /** + * Update enabled themes. + * + * @since 1.9.6 + * + * @param {string} slug Theme slug. + * @param {Object} theme Theme settings. + */ + updateEnabledThemes( slug, theme ) { + if ( ! enabledThemes ) { + return; + } + + enabledThemes = { + ...enabledThemes, + [ slug ]: theme, + }; + }, + + /** + * Whether the theme is disabled. + * + * @since 1.9.6 + * + * @param {string} slug Theme slug. + * + * @return {boolean} True if the theme is disabled. + */ + isDisabledTheme( slug ) { + return ! app.getEnabledThemes()?.[ slug ]; + }, + + /** + * Whether the theme is one of the WPForms themes. + * + * @since 1.9.6 + * + * @param {string} slug Theme slug. + * + * @return {boolean} True if the theme is one of the WPForms themes. + */ + isWPFormsTheme( slug ) { + return Boolean( themesData.wpforms[ slug ]?.settings ); + }, + + /** + * Fetch themes data from API. + * + * @since 1.9.6 + */ + fetchThemesData() { + // If a fetch is already in progress, exit the function. + if ( state.isFetchingThemes || themesData.wpforms ) { + return; + } + + // Set the flag to true indicating a fetch is in progress. + state.isFetchingThemes = true; + + try { + // Fetch themes data. + wp.apiFetch( { + path: routeNamespace + 'elementor/themes/', + method: 'GET', + cache: 'no-cache', + } ) + .then( ( response ) => { + themesData.wpforms = response.wpforms || {}; + themesData.custom = response.custom || {}; + } ) + .catch( ( error ) => { + // eslint-disable-next-line no-console + console.error( error?.message ); + } ) + .finally( () => { + state.isFetchingThemes = false; + } ); + } catch ( error ) { + // eslint-disable-next-line no-console + console.error( error ); + } + }, + + /** + * Save the custom themes. + * + * @since 1.9.6 + */ + saveCustomThemes() { + if ( ! isAdmin ) { + return; + } + + // Custom themes do not exist. + if ( state.isSavingThemes || ! themesData.custom ) { + return; + } + + // Set the flag to true indicating a saving is in progress. + state.isSavingThemes = true; + + try { + // Save themes. + wp.apiFetch( { + path: routeNamespace + 'elementor/themes/custom/', + method: 'POST', + data: { customThemes: themesData.custom }, + } ) + .then( ( response ) => { + if ( ! response?.result ) { + // eslint-disable-next-line no-console + console.log( response?.error ); + } + } ) + .catch( ( error ) => { + // eslint-disable-next-line no-console + console.error( error?.message ); + } ) + .finally( () => { + state.isSavingThemes = false; + } ); + } catch ( error ) { + // eslint-disable-next-line no-console + console.error( error ); + } + }, + + /** + * Get the current style attributes state. + * + * @since 1.9.6 + * + * @param {Object} atts Widget attributes. + * + * @return {Object} Whether the custom theme is created. + */ + getCurrentStyleAttributes( atts ) { + const defaultAttributes = Object.keys( themesData.wpforms.default?.settings ); + + const currentStyleAttributes = {}; + + for ( const key in defaultAttributes ) { + const attr = defaultAttributes[ key ]; + currentStyleAttributes[ attr ] = WPFormsElementorModern.prepareComplexAttrValues( atts[ attr ], defaultAttributes[ key ] ) ?? ''; + } + + return currentStyleAttributes; + }, + + /** + * Maybe create a custom theme. + * + * @since 1.9.6 + * + * @param {Object} atts Widget attributes. + * + * @return {boolean} Whether the custom theme is created. + */ + // eslint-disable-next-line complexity + maybeCreateCustomTheme( atts ) { + const currentStyles = app.getCurrentStyleAttributes( atts ); + const isWPFormsTheme = !! themesData.wpforms[ atts.wpformsTheme ]; + const isCustomTheme = !! themesData.custom[ atts.wpformsTheme ]; + + // It is one of the default themes without any changes. + if ( + isWPFormsTheme && + JSON.stringify( themesData.wpforms[ atts.wpformsTheme ]?.settings ) === JSON.stringify( currentStyles ) + ) { + return false; + } + + // It is a modified default theme OR unknown custom theme. + if ( isWPFormsTheme || ! isCustomTheme ) { + app.createCustomTheme( atts, currentStyles ); + } + + return true; + }, + + /** + * Create a custom theme. + * + * @since 1.9.6 + * + * @param {Object} atts Widget properties. + * @param {Object} currentStyles Current style settings. + * @param {boolean} migrateToCustomTheme Whether it is necessary to migrate to custom theme. + * + * @return {boolean} Whether the custom theme is created. + */ + createCustomTheme( atts, currentStyles = null, migrateToCustomTheme = false ) { // eslint-disable-line complexity + let counter = 0; + let themeSlug = atts.wpformsTheme; + + const baseTheme = app.getTheme( atts.wpformsTheme ) || themesData.wpforms.default; + let themeName = baseTheme.name; + + themesData.custom = themesData.custom || {}; + + if ( migrateToCustomTheme ) { + themeSlug = 'custom'; + themeName = strings.theme_custom; + } + + // Determine the theme slug and the number of copies. + do { + counter++; + themeSlug = themeSlug + '-copy-' + counter; + } while ( themesData.custom[ themeSlug ] && counter < 10000 ); + + const copyStr = counter < 2 ? strings.theme_copy : strings.theme_copy + ' ' + counter; + + themeName += ' (' + copyStr + ')'; + + // The first migrated Custom Theme should be without a ` (Copy)` suffix. + themeName = migrateToCustomTheme && counter < 2 ? strings.theme_custom : themeName; + + // Add the new custom theme. + themesData.custom[ themeSlug ] = { + name: themeName, + settings: currentStyles || app.getCurrentStyleAttributes( atts ), + }; + + app.updateEnabledThemes( themeSlug, themesData.custom[ themeSlug ] ); + + const widget = elementor.getPanelView().getCurrentPageView().getOption( 'editedElementView' ); + const settingsModel = widget.model.get( 'settings' ); + + settingsModel.setExternalChange( { + wpformsTheme: themeSlug, + isCustomTheme: 'true', + customThemeName: themeName, + } ); + + return true; + }, + + /** + * Maybe create a custom theme by given attributes. + * + * @since 1.9.6 + * + * @param {Object} attributes Widget attributes. + * + * @return {string} New theme's slug. + */ + maybeCreateCustomThemeFromAttributes( attributes ) { // eslint-disable-line complexity + const newThemeSlug = attributes.theme; + /** + * @type {Object|null} + * @property {Object} settings Theme settings. + */ + const existingTheme = app.getTheme( attributes.theme ); + const keys = Object.keys( attributes ); + + let isExistingTheme = Boolean( existingTheme?.settings ); + + // Check if the theme already exists and has the same settings. + if ( isExistingTheme ) { + for ( const i in keys ) { + const key = keys[ i ]; + + if ( ! existingTheme.settings[ key ] || existingTheme.settings[ key ] !== attributes[ key ] ) { + isExistingTheme = false; + + break; + } + } + } + + // The theme exists and has the same settings. + if ( isExistingTheme ) { + return newThemeSlug; + } + + // The theme doesn't exist. + // Normalize the attributes to the default theme settings. + const defaultAttributes = Object.keys( themesData.wpforms.default.settings ); + const newSettings = {}; + + for ( const i in defaultAttributes ) { + const attr = defaultAttributes[ i ]; + + newSettings[ attr ] = attributes[ attr ] ?? ''; + } + + // Create a new custom theme. + themesData.custom[ newThemeSlug ] = { + name: attributes.themeName ?? strings.theme_custom, + settings: newSettings, + }; + + app.updateEnabledThemes( newThemeSlug, themesData.custom[ newThemeSlug ] ); + + return newThemeSlug; + }, + + /** + * Update custom theme. + * + * @since 1.9.6 + * + * @param {string} attribute Attribute name. + * @param {string} value New attribute value. + * @param {Object} atts Widget properties. + */ + updateCustomThemeAttribute( attribute, value, atts ) { // eslint-disable-line complexity + const themeSlug = atts.wpformsTheme; + + // Skip if it is one of the WPForms themes OR the attribute is not in the theme settings. + if ( + themesData.wpforms[ themeSlug ] || + ( + attribute !== 'themeName' && + ! themesData.wpforms.default.settings[ attribute ] + ) + ) { + return; + } + + // Skip if the custom theme doesn't exist in some rare cases. + if ( ! themesData.custom[ themeSlug ] ) { + return; + } + + // Update the theme data. + if ( attribute === 'themeName' ) { + themesData.custom[ themeSlug ].name = value; + } else { + themesData.custom[ themeSlug ].settings = themesData.custom[ themeSlug ].settings || themesData.wpforms.default.settings; + themesData.custom[ themeSlug ].settings[ attribute ] = value; + } + }, + + /** + * Set the widget theme. + * + * @since 1.9.6 + * + * @param {string} themeSlug The theme slug. + * + * @return {boolean} True on success. + */ + setWidgetTheme( themeSlug ) { // eslint-disable-line complexity + if ( app.maybeDisplayUpgradeModal( themeSlug ) ) { + return false; + } + + const theme = app.getTheme( themeSlug ); + + if ( ! theme?.settings ) { + return false; + } + + const attributes = Object.keys( theme.settings ); + const widget = elementor.getPanelView().getCurrentPageView().getOption( 'editedElementView' ); + const settingsModel = widget.model.get( 'settings' ); + const isCustomTheme = !! themesData.custom[ themeSlug ]; + + // Set the theme attribute. + settingsModel.setExternalChange( { + wpformsTheme: themeSlug, + isCustomTheme: isCustomTheme ? 'true' : '', + customThemeName: isCustomTheme ? themesData.custom[ themeSlug ].name : '', + } ); + + // Clean up the attributes. + const cleanSettings = {}; + + for ( const key in attributes ) { + const attr = attributes[ key ]; + const value = theme.settings[ attr ]; + + cleanSettings[ attr ] = typeof value === 'string' + ? value.replace( /px$/, '' ) + : value; + } + + // Update the theme settings. + app.updateStylesAtts( cleanSettings, settingsModel ); + + // Activate the Publish button. + const $pageView = elementor.getPanelView().getCurrentPageView().$el; + $pageView.find( '.elementor-control-isCustomTheme input' ).trigger( 'input' ); + + return true; + }, + + /** + * Update styles atts. + * + * @since 1.9.6 + * + * @param {Object} themeSettings Theme settings. + * @param {Object} settingsModel Settings model. + */ + // eslint-disable-next-line complexity + updateStylesAtts( themeSettings, settingsModel ) { + const allowedKeys = WPFormsElementorModern.getStyleAttributesKeys(); + const validSettings = {}; + + for ( const key in themeSettings ) { + if ( ! allowedKeys.includes( key ) ) { + continue; + } + + let value = themeSettings[ key ]; + + if ( key === 'backgroundUrl' && typeof value === 'string' ) { + const match = value.match( /^url\(\s*['"]?(.*?)['"]?\s*\)$/i ); + if ( match && match[ 1 ] ) { + value = { id: '', url: match[ 1 ] }; + } else { + value = ''; + } + } + + validSettings[ key ] = value; + } + + // Update the widget settings. + if ( Object.keys( validSettings ).length ) { + settingsModel.setExternalChange( validSettings ); + } + }, + + /** + * Maybe display upgrades modal in Lite. + * + * @since 1.9.6 + * + * @param {string} themeSlug The theme slug. + * + * @return {boolean} True if modal was displayed. + */ + maybeDisplayUpgradeModal( themeSlug ) { + if ( ! app.isDisabledTheme( themeSlug ) ) { + return false; + } + + if ( ! isPro ) { + WPFormsElementorModern.showProModal( 'themes', strings.form_themes ); + + return true; + } + + if ( ! isLicenseActive ) { + WPFormsElementorModern.showLicenseModal( strings.form_themes ); + + return true; + } + + return false; + }, + + /** + * Select widget theme event handler. + * + * @since 1.9.6 + * + * @param {string} value New attribute value. + */ + selectTheme( value ) { + if ( ! app.setWidgetTheme( value ) ) { + return; + } + + app.onSelectThemeWithBG( value ); + }, + + /** + * Change theme name event handler. + * + * @since 1.9.6 + * + * @param {string} value New attribute value. + * @param {Object} model Model object. + */ + changeThemeName( value, model ) { + app.updateCustomThemeAttribute( 'themeName', value, model.attributes ); + }, + + /** + * Open the theme delete confirmation window. + * + * @since 1.9.6 + * + * @param {Object} atts Widget properties. + * @param {Object} editor Editor object. + */ + deleteThemeModal( atts, editor ) { + const themeName = app.getTheme( atts.wpformsTheme )?.name; + const confirm = strings.theme_delete_confirm.replace( '%1$s', `${ themeName }` ); + const content = `

            ${ confirm } ${ strings.theme_delete_cant_undone }

            `; + const $panelContent = editor.$childViewContainer[ 0 ]; + const $themesControl = $( $panelContent ).find( '.wpforms-elementor-themes-control' ); + + const dialog = elementorCommon.dialogsManager.createWidget( 'confirm', { + message: content, + headerMessage: strings.theme_delete_title, + + onConfirm: () => { + // Remove theme from the theme storage. + delete themesData.custom[ atts.wpformsTheme ]; + app.selectTheme( 'default' ); + app.updateThemesList( editor, $themesControl ); + }, + } ); + + dialog.show(); + }, + + /** + * Open stock photos install modal on the select theme. + * + * @since 1.9.6 + * + * @param {string} themeSlug The theme slug. + */ + onSelectThemeWithBG( themeSlug ) { + if ( WPFormsElementorModern.stockPhotos.isPicturesAvailable() ) { + return; + } + + // Check only WPForms themes. + if ( ! app.isWPFormsTheme( themeSlug ) ) { + return; + } + + /** + * @type {Object|null} + * @property {Object|null} settings Settings. + */ + const theme = app.getTheme( themeSlug ); + const bgUrl = theme.settings?.backgroundUrl; + + if ( bgUrl?.length && bgUrl !== 'url()' ) { + WPFormsElementorModern.stockPhotos.installModal( 'themes' ); + } + }, + + /** + * Determine if the user is on a Mac. + * + * @return {boolean} True if the user is on a Mac. + */ + isMac() { + return navigator.userAgent.includes( 'Macintosh' ); + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsElementorThemes.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.min.js new file mode 100755 index 00000000..c514e947 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/elementor/themes.min.js @@ -0,0 +1,15 @@ +var WPFormsElementorThemes=window.WPFormsElementorThemes||((e,m)=>{let{isAdmin:t,isPro:r,isLicenseActive:o,strings:u,route_namespace:s}=wpformsElementorVars,n={},h={wpforms:null,custom:null},a=null,i={},c={init(){i.$window=m(e),c.fetchThemesData(),c.events()},events(){m(e).on("elementor/frontend/init",function(){elementor.channels.editor.on("section:activated",c.themesControlSetup)})},getAllThemes(){return{...h.custom||{},...h.wpforms||{}}},themesControlSetup(e,t){"themes"===e&&"wpforms"===t.model.attributes.widgetType&&(e=t.$childViewContainer[0],e=m(e).find(".wpforms-elementor-themes-control"),c.isMac()&&e.addClass("wpforms-is-mac"),c.updateThemesList(t,e))},updateThemesList(e,t){var s=e.model.attributes.settings.attributes.wpformsTheme??"default",s=c.getThemesListMarkup(s);t.html(s),c.addThemesEvents(t,e)},addThemesEvents(s,r){let t=_.debounce(e=>{c.maybeCreateCustomTheme(e)},300);var e=r.model.get("settings");"true"!==e.attributes.isMigrated&&c.maybeMigrateToCustomTheme(e,s,r),e.on("change",e=>{t(e.attributes),c.maybeUpdateCustomTheme(e)});let o=s.find('[role="radio"]');o.off("click").on("click",function(){o.removeClass("is-active"),m(this).addClass("is-active");var e=m(this).val();c.selectTheme(e)}),elementor.channels.editor.off("WPFormsDeleteThemeButtonClick").on("WPFormsDeleteThemeButtonClick",()=>{c.deleteThemeModal(r.model.attributes.settings.attributes,r)}),r.model.get("settings").off("change:customThemeName").on("change:customThemeName",function(e){var t=e.get("customThemeName");c.changeThemeName(t,e),c.updateThemesList(r,s)})},maybeMigrateToCustomTheme(e,t,s){var r=e._previousAttributes,o=e.attributes;"copyPasteJsonValue"in r&&!r.wpformsTheme&&!o.isCustomTheme&&(r=c.getCurrentStyleAttributes(e.attributes),c.createCustomTheme(e.attributes,r,!0),c.updateThemesList(s,t)),e.setExternalChange({isMigrated:"true"})},maybeUpdateCustomTheme(e){var t=e.attributes;if("true"===t.isCustomTheme){var s,r,o=e.changed,m=WPFormsElementorModern.getStyleAttributesKeys();for(s in o)m.includes(s)&&(r=WPFormsElementorModern.prepareComplexAttrValues(o[s],s),c.updateCustomThemeAttribute(s,r,t))}},getThemesListMarkup(e){if(!h.wpforms)return c.fetchThemesData(),`
            ${u.themes_error}
            `;var t=c.getAllThemes();if(!t)return"";var s=Object.keys(t);let r,o;let m="";for(var n in c.isWPFormsTheme(e)||(o=e,m+=c.getThemesItemMarkup(c.getTheme(o),o,o)),s){n=s[n];o&&o===n||((r={...t.default,...t[n]||{}}).settings={...t.default.settings,...r.settings||{}},m+=c.getThemesItemMarkup(r,n,e))}return`
            + ${m} +
            `},getThemesItemMarkup(e,t,s){var r,o;return e?(r=0 +
            +
            ${r}
            +
            + +
            + + + + + +
            + `):""},getTheme(e){return c.getAllThemes()[e]||null},getEnabledThemes(){if(!a){let s=c.getAllThemes();if(r&&o)return s;a=Object.keys(s).reduce((e,t)=>(s[t].settings?.fieldSize&&!s[t].disabled&&(e[t]=s[t]),e),{})}return a},updateEnabledThemes(e,t){a=a&&{...a,[e]:t}},isDisabledTheme(e){return!c.getEnabledThemes()?.[e]},isWPFormsTheme(e){return Boolean(h.wpforms[e]?.settings)},fetchThemesData(){if(!n.isFetchingThemes&&!h.wpforms){n.isFetchingThemes=!0;try{wp.apiFetch({path:s+"elementor/themes/",method:"GET",cache:"no-cache"}).then(e=>{h.wpforms=e.wpforms||{},h.custom=e.custom||{}}).catch(e=>{console.error(e?.message)}).finally(()=>{n.isFetchingThemes=!1})}catch(e){console.error(e)}}},saveCustomThemes(){if(t&&!n.isSavingThemes&&h.custom){n.isSavingThemes=!0;try{wp.apiFetch({path:s+"elementor/themes/custom/",method:"POST",data:{customThemes:h.custom}}).then(e=>{e?.result||console.log(e?.error)}).catch(e=>{console.error(e?.message)}).finally(()=>{n.isSavingThemes=!1})}catch(e){console.error(e)}}},getCurrentStyleAttributes(e){var t,s=Object.keys(h.wpforms.default?.settings),r={};for(t in s){var o=s[t];r[o]=WPFormsElementorModern.prepareComplexAttrValues(e[o],s[t])??""}return r},maybeCreateCustomTheme(e){var t=c.getCurrentStyleAttributes(e),s=!!h.wpforms[e.wpformsTheme],r=!!h.custom[e.wpformsTheme];return!(s&&JSON.stringify(h.wpforms[e.wpformsTheme]?.settings)===JSON.stringify(t)||(!s&&r||c.createCustomTheme(e,t),0))},createCustomTheme(e,t=null,s=!1){let r=0,o=e.wpformsTheme;let m=(c.getTheme(e.wpformsTheme)||h.wpforms.default).name;for(h.custom=h.custom||{},s&&(o="custom",m=u.theme_custom);r++,o=o+"-copy-"+r,h.custom[o]&&r<1e4;);var n=r<2?u.theme_copy:u.theme_copy+" "+r;return m+=" ("+n+")",m=s&&r<2?u.theme_custom:m,h.custom[o]={name:m,settings:t||c.getCurrentStyleAttributes(e)},c.updateEnabledThemes(o,h.custom[o]),elementor.getPanelView().getCurrentPageView().getOption("editedElementView").model.get("settings").setExternalChange({wpformsTheme:o,isCustomTheme:"true",customThemeName:m}),!0},maybeCreateCustomThemeFromAttributes(e){var t=e.theme,s=c.getTheme(e.theme),r=Object.keys(e);let o=Boolean(s?.settings);if(o)for(var m in r){m=r[m];if(!s.settings[m]||s.settings[m]!==e[m]){o=!1;break}}if(!o){var n,a=Object.keys(h.wpforms.default.settings),i={};for(n in a){var l=a[n];i[l]=e[l]??""}h.custom[t]={name:e.themeName??u.theme_custom,settings:i},c.updateEnabledThemes(t,h.custom[t])}return t},updateCustomThemeAttribute(e,t,s){s=s.wpformsTheme;h.wpforms[s]||"themeName"!==e&&!h.wpforms.default.settings[e]||h.custom[s]&&("themeName"===e?h.custom[s].name=t:(h.custom[s].settings=h.custom[s].settings||h.wpforms.default.settings,h.custom[s].settings[e]=t))},setWidgetTheme(e){if(c.maybeDisplayUpgradeModal(e))return!1;var t=c.getTheme(e);if(!t?.settings)return!1;var s,r=Object.keys(t.settings),o=elementor.getPanelView().getCurrentPageView().getOption("editedElementView").model.get("settings"),m=!!h.custom[e],n=(o.setExternalChange({wpformsTheme:e,isCustomTheme:m?"true":"",customThemeName:m?h.custom[e].name:""}),{});for(s in r){var a=r[s],i=t.settings[a];n[a]="string"==typeof i?i.replace(/px$/,""):i}return c.updateStylesAtts(n,o),elementor.getPanelView().getCurrentPageView().$el.find(".elementor-control-isCustomTheme input").trigger("input"),!0},updateStylesAtts(t,e){var s,r,o=WPFormsElementorModern.getStyleAttributesKeys(),m={};for(s in t)if(o.includes(s)){let e=t[s];"backgroundUrl"===s&&"string"==typeof e&&(r=e.match(/^url\(\s*['"]?(.*?)['"]?\s*\)$/i),e=r&&r[1]?{id:"",url:r[1]}:""),m[s]=e}Object.keys(m).length&&e.setExternalChange(m)},maybeDisplayUpgradeModal(e){return!(!c.isDisabledTheme(e)||(r?o||(WPFormsElementorModern.showLicenseModal(u.form_themes),0):(WPFormsElementorModern.showProModal("themes",u.form_themes),0)))},selectTheme(e){c.setWidgetTheme(e)&&c.onSelectThemeWithBG(e)},changeThemeName(e,t){c.updateCustomThemeAttribute("themeName",e,t.attributes)},deleteThemeModal(e,t){var s=c.getTheme(e.wpformsTheme)?.name,s=`

            ${u.theme_delete_confirm.replace("%1$s",`${s}`)} ${u.theme_delete_cant_undone}

            `,r=t.$childViewContainer[0];let o=m(r).find(".wpforms-elementor-themes-control");elementorCommon.dialogsManager.createWidget("confirm",{message:s,headerMessage:u.theme_delete_title,onConfirm:()=>{delete h.custom[e.wpformsTheme],c.selectTheme("default"),c.updateThemesList(t,o)}}).show()},onSelectThemeWithBG(e){WPFormsElementorModern.stockPhotos.isPicturesAvailable()||c.isWPFormsTheme(e)&&(e=c.getTheme(e).settings?.backgroundUrl)?.length&&"url()"!==e&&WPFormsElementorModern.stockPhotos.installModal("themes")},isMac(){return navigator.userAgent.includes("Macintosh")}};return c})((document,window),jQuery);WPFormsElementorThemes.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.js new file mode 100755 index 00000000..17f15686 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.js @@ -0,0 +1,413 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o) with choiceJS. + * + * @since 1.9.0 + * + * @param {Object} e Block Details. + */ +var loadChoiceJS = function loadChoiceJS(e) { + if (typeof window.Choices !== 'function') { + return; + } + var $form = jQuery(e.detail.block.querySelector("#wpforms-".concat(e.detail.formId))); + var config = window.wpforms_choicesjs_config || {}; + $form.find('.choicesjs-select').each(function (index, element) { + if (!(element instanceof HTMLSelectElement)) { + return; + } + var $el = jQuery(element); + if ($el.data('choicesjs')) { + return; + } + var $field = $el.closest('.wpforms-field'); + config.callbackOnInit = function () { + var self = this, + $element = jQuery(self.passedElement.element), + $input = jQuery(self.input.element), + sizeClass = $element.data('size-class'); + + // Add CSS-class for size. + if (sizeClass) { + jQuery(self.containerOuter.element).addClass(sizeClass); + } + + /** + * If a multiple select has selected choices - hide a placeholder text. + * In case if select is empty - we return placeholder text. + */ + if ($element.prop('multiple')) { + // On init event. + $input.data('placeholder', $input.attr('placeholder')); + if (self.getValue(true).length) { + $input.removeAttr('placeholder'); + } + } + this.disable(); + $field.find('.is-disabled').removeClass('is-disabled'); + }; + $el.data('choicesjs', new window.Choices(element, config)); + + // Placeholder fix on iframes. + if ($el.val()) { + $el.parent().find('.choices__input').attr('style', 'display: none !important'); + } + }); +}; + +// on document ready +jQuery(function () { + jQuery(window).on('wpformsFormSelectorFormLoaded', loadChoiceJS); +}); +/** + * Open builder popup. + * + * @since 1.6.2 + * + * @param {string} clientID Block Client ID. + */ +var openBuilderPopup = function openBuilderPopup(clientID) { + if (jQuery.isEmptyObject($popup)) { + var tmpl = jQuery('#wpforms-gutenberg-popup'); + var parent = jQuery('#wpwrap'); + parent.after(tmpl); + $popup = parent.siblings('#wpforms-gutenberg-popup'); + } + var url = wpforms_gutenberg_form_selector.get_started_url, + $iframe = $popup.find('iframe'); + builderCloseButtonEvent(clientID); + $iframe.attr('src', url); + $popup.fadeIn(); +}; +var hasForms = function hasForms() { + return wpforms_gutenberg_form_selector.forms.length > 0; +}; +registerBlockType('wpforms/form-selector', { + title: wpforms_gutenberg_form_selector.strings.title, + description: wpforms_gutenberg_form_selector.strings.description, + icon: wpformsIcon, + keywords: wpforms_gutenberg_form_selector.strings.form_keywords, + category: 'widgets', + attributes: { + formId: { + type: 'string' + }, + displayTitle: { + type: 'boolean' + }, + displayDesc: { + type: 'boolean' + }, + preview: { + type: 'boolean' + } + }, + example: { + attributes: { + preview: true + } + }, + supports: { + customClassName: hasForms() + }, + edit: function edit(props) { + // eslint-disable-line max-lines-per-function + var _props$attributes = props.attributes, + _props$attributes$for = _props$attributes.formId, + formId = _props$attributes$for === void 0 ? '' : _props$attributes$for, + _props$attributes$dis = _props$attributes.displayTitle, + displayTitle = _props$attributes$dis === void 0 ? false : _props$attributes$dis, + _props$attributes$dis2 = _props$attributes.displayDesc, + displayDesc = _props$attributes$dis2 === void 0 ? false : _props$attributes$dis2, + _props$attributes$pre = _props$attributes.preview, + preview = _props$attributes$pre === void 0 ? false : _props$attributes$pre, + setAttributes = props.setAttributes; + var formOptions = wpforms_gutenberg_form_selector.forms.map(function (value) { + return { + value: value.ID, + label: value.post_title + }; + }); + var strings = wpforms_gutenberg_form_selector.strings; + var jsx; + formOptions.unshift({ + value: '', + label: wpforms_gutenberg_form_selector.strings.form_select + }); + function selectForm(value) { + // eslint-disable-line jsdoc/require-jsdoc + setAttributes({ + formId: value + }); + } + function toggleDisplayTitle(value) { + // eslint-disable-line jsdoc/require-jsdoc + setAttributes({ + displayTitle: value + }); + } + function toggleDisplayDesc(value) { + // eslint-disable-line jsdoc/require-jsdoc + setAttributes({ + displayDesc: value + }); + } + + /** + * Get block empty JSX code. + * + * @since 1.8.3 + * + * @param {Object} blockProps Block properties. + * + * @return {JSX.Element} Block empty JSX code. + */ + function getEmptyFormsPreview(blockProps) { + var clientId = blockProps.clientId; + return /*#__PURE__*/React.createElement(Fragment, { + key: "wpforms-gutenberg-form-selector-fragment-block-empty" + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-no-form-preview" + }, /*#__PURE__*/React.createElement("img", { + src: wpforms_gutenberg_form_selector.block_empty_url, + alt: "" + }), /*#__PURE__*/React.createElement("p", { + dangerouslySetInnerHTML: { + __html: strings.wpforms_empty_info + } + }), /*#__PURE__*/React.createElement("button", { + type: "button", + className: "get-started-button components-button is-button is-primary", + onClick: function onClick() { + openBuilderPopup(clientId); + } + }, __('Get Started', 'wpforms-lite')), /*#__PURE__*/React.createElement("p", { + className: "empty-desc", + dangerouslySetInnerHTML: { + __html: strings.wpforms_empty_help + } + }), /*#__PURE__*/React.createElement("div", { + id: "wpforms-gutenberg-popup", + className: "wpforms-builder-popup" + }, /*#__PURE__*/React.createElement("iframe", { + src: "about:blank", + width: "100%", + height: "100%", + id: "wpforms-builder-iframe", + title: "wpforms-gutenberg-popup" + })))); + } + + /** + * Print empty forms notice. + * + * @since 1.8.3 + * + * @param {string} clientId Block client ID. + * + * @return {JSX.Element} Field styles JSX code. + */ + function printEmptyFormsNotice(clientId) { + return /*#__PURE__*/React.createElement(InspectorControls, { + key: "wpforms-gutenberg-form-selector-inspector-main-settings" + }, /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel", + title: strings.form_settings + }, /*#__PURE__*/React.createElement("p", { + className: "wpforms-gutenberg-panel-notice wpforms-warning wpforms-empty-form-notice", + style: { + display: 'block' + } + }, /*#__PURE__*/React.createElement("strong", null, __('You haven’t created a form, yet!', 'wpforms-lite')), __('What are you waiting for?', 'wpforms-lite')), /*#__PURE__*/React.createElement("button", { + type: "button", + className: "get-started-button components-button is-button is-secondary", + onClick: function onClick() { + openBuilderPopup(clientId); + } + }, __('Get Started', 'wpforms-lite')))); + } + + /** + * Get styling panels preview. + * + * @since 1.8.8 + * + * @return {JSX.Element} JSX code. + */ + function getStylingPanelsPreview() { + return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel disabled_panel", + title: strings.themes + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-panel-preview wpforms-panel-preview-themes" + })), /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel disabled_panel", + title: strings.field_styles + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-panel-preview wpforms-panel-preview-field" + })), /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel disabled_panel", + title: strings.label_styles + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-panel-preview wpforms-panel-preview-label" + })), /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel disabled_panel", + title: strings.button_styles + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-panel-preview wpforms-panel-preview-button" + })), /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel disabled_panel", + title: strings.container_styles + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-panel-preview wpforms-panel-preview-container" + })), /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel disabled_panel", + title: strings.background_styles + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-panel-preview wpforms-panel-preview-background" + }))); + } + if (!hasForms()) { + jsx = [printEmptyFormsNotice(props.clientId)]; + jsx.push(getEmptyFormsPreview(props)); + return jsx; + } + jsx = [/*#__PURE__*/React.createElement(InspectorControls, { + key: "wpforms-gutenberg-form-selector-inspector-controls" + }, /*#__PURE__*/React.createElement(PanelBody, { + title: wpforms_gutenberg_form_selector.strings.form_settings + }, /*#__PURE__*/React.createElement(SelectControl, { + label: wpforms_gutenberg_form_selector.strings.form_selected, + value: formId, + options: formOptions, + onChange: selectForm + }), /*#__PURE__*/React.createElement(ToggleControl, { + label: wpforms_gutenberg_form_selector.strings.show_title, + checked: displayTitle, + onChange: toggleDisplayTitle + }), /*#__PURE__*/React.createElement(ToggleControl, { + label: wpforms_gutenberg_form_selector.strings.show_description, + checked: displayDesc, + onChange: toggleDisplayDesc + }), /*#__PURE__*/React.createElement("p", { + className: "wpforms-gutenberg-panel-notice wpforms-warning" + }, /*#__PURE__*/React.createElement("strong", null, strings.update_wp_notice_head), strings.update_wp_notice_text, " ", /*#__PURE__*/React.createElement("a", { + href: strings.update_wp_notice_link, + rel: "noreferrer", + target: "_blank" + }, strings.learn_more))), getStylingPanelsPreview())]; + if (formId) { + jsx.push(/*#__PURE__*/React.createElement(ServerSideRender, { + key: "wpforms-gutenberg-form-selector-server-side-renderer", + block: "wpforms/form-selector", + attributes: props.attributes + })); + } else if (preview) { + jsx.push(/*#__PURE__*/React.createElement(Fragment, { + key: "wpforms-gutenberg-form-selector-fragment-block-preview" + }, /*#__PURE__*/React.createElement("img", { + src: wpforms_gutenberg_form_selector.block_preview_url, + style: { + width: '100%' + }, + alt: "" + }))); + } else { + jsx.push(/*#__PURE__*/React.createElement(Placeholder, { + key: "wpforms-gutenberg-form-selector-wrap", + className: "wpforms-gutenberg-form-selector-wrap" + }, /*#__PURE__*/React.createElement("img", { + src: wpforms_gutenberg_form_selector.logo_url, + alt: "" + }), /*#__PURE__*/React.createElement(SelectControl, { + key: "wpforms-gutenberg-form-selector-select-control", + value: formId, + options: formOptions, + onChange: selectForm + }))); + } + return jsx; + }, + save: function save() { + return null; + } +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3AiLCJ3cCIsIl93cCRzZXJ2ZXJTaWRlUmVuZGVyIiwic2VydmVyU2lkZVJlbmRlciIsIlNlcnZlclNpZGVSZW5kZXIiLCJjb21wb25lbnRzIiwiX3dwJGVsZW1lbnQiLCJlbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkZyYWdtZW50IiwicmVnaXN0ZXJCbG9ja1R5cGUiLCJibG9ja3MiLCJfcmVmIiwiYmxvY2tFZGl0b3IiLCJlZGl0b3IiLCJJbnNwZWN0b3JDb250cm9scyIsIl93cCRjb21wb25lbnRzIiwiU2VsZWN0Q29udHJvbCIsIlRvZ2dsZUNvbnRyb2wiLCJQYW5lbEJvZHkiLCJQbGFjZWhvbGRlciIsIl9fIiwiaTE4biIsIndwZm9ybXNJY29uIiwid2lkdGgiLCJoZWlnaHQiLCJ2aWV3Qm94IiwiY2xhc3NOYW1lIiwiZmlsbCIsImQiLCIkcG9wdXAiLCJidWlsZGVyQ2xvc2VCdXR0b25FdmVudCIsImNsaWVudElEIiwib2ZmIiwib24iLCJlIiwiYWN0aW9uIiwiZm9ybUlkIiwiZm9ybVRpdGxlIiwibmV3QmxvY2siLCJjcmVhdGVCbG9jayIsInRvU3RyaW5nIiwid3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3RvciIsImZvcm1zIiwiSUQiLCJwb3N0X3RpdGxlIiwiZGF0YSIsImRpc3BhdGNoIiwicmVtb3ZlQmxvY2siLCJpbnNlcnRCbG9ja3MiLCJsb2FkQ2hvaWNlSlMiLCJ3aW5kb3ciLCJDaG9pY2VzIiwiJGZvcm0iLCJqUXVlcnkiLCJkZXRhaWwiLCJibG9jayIsInF1ZXJ5U2VsZWN0b3IiLCJjb25jYXQiLCJjb25maWciLCJ3cGZvcm1zX2Nob2ljZXNqc19jb25maWciLCJmaW5kIiwiZWFjaCIsImluZGV4IiwiSFRNTFNlbGVjdEVsZW1lbnQiLCIkZWwiLCIkZmllbGQiLCJjbG9zZXN0IiwiY2FsbGJhY2tPbkluaXQiLCJzZWxmIiwiJGVsZW1lbnQiLCJwYXNzZWRFbGVtZW50IiwiJGlucHV0IiwiaW5wdXQiLCJzaXplQ2xhc3MiLCJjb250YWluZXJPdXRlciIsImFkZENsYXNzIiwicHJvcCIsImF0dHIiLCJnZXRWYWx1ZSIsImxlbmd0aCIsInJlbW92ZUF0dHIiLCJkaXNhYmxlIiwicmVtb3ZlQ2xhc3MiLCJ2YWwiLCJwYXJlbnQiLCJvcGVuQnVpbGRlclBvcHVwIiwiaXNFbXB0eU9iamVjdCIsInRtcGwiLCJhZnRlciIsInNpYmxpbmdzIiwidXJsIiwiZ2V0X3N0YXJ0ZWRfdXJsIiwiJGlmcmFtZSIsImZhZGVJbiIsImhhc0Zvcm1zIiwidGl0bGUiLCJzdHJpbmdzIiwiZGVzY3JpcHRpb24iLCJpY29uIiwia2V5d29yZHMiLCJmb3JtX2tleXdvcmRzIiwiY2F0ZWdvcnkiLCJhdHRyaWJ1dGVzIiwidHlwZSIsImRpc3BsYXlUaXRsZSIsImRpc3BsYXlEZXNjIiwicHJldmlldyIsImV4YW1wbGUiLCJzdXBwb3J0cyIsImN1c3RvbUNsYXNzTmFtZSIsImVkaXQiLCJwcm9wcyIsIl9wcm9wcyRhdHRyaWJ1dGVzIiwiX3Byb3BzJGF0dHJpYnV0ZXMkZm9yIiwiX3Byb3BzJGF0dHJpYnV0ZXMkZGlzIiwiX3Byb3BzJGF0dHJpYnV0ZXMkZGlzMiIsIl9wcm9wcyRhdHRyaWJ1dGVzJHByZSIsInNldEF0dHJpYnV0ZXMiLCJmb3JtT3B0aW9ucyIsIm1hcCIsInZhbHVlIiwibGFiZWwiLCJqc3giLCJ1bnNoaWZ0IiwiZm9ybV9zZWxlY3QiLCJzZWxlY3RGb3JtIiwidG9nZ2xlRGlzcGxheVRpdGxlIiwidG9nZ2xlRGlzcGxheURlc2MiLCJnZXRFbXB0eUZvcm1zUHJldmlldyIsImJsb2NrUHJvcHMiLCJjbGllbnRJZCIsIlJlYWN0Iiwia2V5Iiwic3JjIiwiYmxvY2tfZW1wdHlfdXJsIiwiYWx0IiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfX2h0bWwiLCJ3cGZvcm1zX2VtcHR5X2luZm8iLCJvbkNsaWNrIiwid3Bmb3Jtc19lbXB0eV9oZWxwIiwiaWQiLCJwcmludEVtcHR5Rm9ybXNOb3RpY2UiLCJmb3JtX3NldHRpbmdzIiwic3R5bGUiLCJkaXNwbGF5IiwiZ2V0U3R5bGluZ1BhbmVsc1ByZXZpZXciLCJ0aGVtZXMiLCJmaWVsZF9zdHlsZXMiLCJsYWJlbF9zdHlsZXMiLCJidXR0b25fc3R5bGVzIiwiY29udGFpbmVyX3N0eWxlcyIsImJhY2tncm91bmRfc3R5bGVzIiwicHVzaCIsImZvcm1fc2VsZWN0ZWQiLCJvcHRpb25zIiwib25DaGFuZ2UiLCJzaG93X3RpdGxlIiwiY2hlY2tlZCIsInNob3dfZGVzY3JpcHRpb24iLCJ1cGRhdGVfd3Bfbm90aWNlX2hlYWQiLCJ1cGRhdGVfd3Bfbm90aWNlX3RleHQiLCJocmVmIiwidXBkYXRlX3dwX25vdGljZV9saW5rIiwicmVsIiwidGFyZ2V0IiwibGVhcm5fbW9yZSIsImJsb2NrX3ByZXZpZXdfdXJsIiwibG9nb191cmwiLCJzYXZlIl0sInNvdXJjZXMiOlsiZmFrZV8zODE5YzNmOS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgd3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3RvciwgSlNYICovXG4vKiBqc2hpbnQgZXMzOiBmYWxzZSwgZXN2ZXJzaW9uOiA2ICovXG5cbi8qKlxuICogQHBhcmFtIHN0cmluZ3MudXBkYXRlX3dwX25vdGljZV9oZWFkXG4gKiBAcGFyYW0gc3RyaW5ncy51cGRhdGVfd3Bfbm90aWNlX3RleHRcbiAqIEBwYXJhbSBzdHJpbmdzLnVwZGF0ZV93cF9ub3RpY2VfbGlua1xuICogQHBhcmFtIHN0cmluZ3Mud3Bmb3Jtc19lbXB0eV9oZWxwXG4gKiBAcGFyYW0gc3RyaW5ncy53cGZvcm1zX2VtcHR5X2luZm9cbiAqL1xuXG5jb25zdCB7IHNlcnZlclNpZGVSZW5kZXI6IFNlcnZlclNpZGVSZW5kZXIgPSB3cC5jb21wb25lbnRzLlNlcnZlclNpZGVSZW5kZXIgfSA9IHdwO1xuY29uc3QgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCB9ID0gd3AuZWxlbWVudDtcbmNvbnN0IHsgcmVnaXN0ZXJCbG9ja1R5cGUgfSA9IHdwLmJsb2NrcztcbmNvbnN0IHsgSW5zcGVjdG9yQ29udHJvbHMgfSA9IHdwLmJsb2NrRWRpdG9yIHx8IHdwLmVkaXRvcjtcbmNvbnN0IHsgU2VsZWN0Q29udHJvbCwgVG9nZ2xlQ29udHJvbCwgUGFuZWxCb2R5LCBQbGFjZWhvbGRlciB9ID0gd3AuY29tcG9uZW50cztcbmNvbnN0IHsgX18gfSA9IHdwLmkxOG47XG5cbmNvbnN0IHdwZm9ybXNJY29uID0gY3JlYXRlRWxlbWVudCggJ3N2ZycsIHsgd2lkdGg6IDIwLCBoZWlnaHQ6IDIwLCB2aWV3Qm94OiAnMCAwIDYxMiA2MTInLCBjbGFzc05hbWU6ICdkYXNoaWNvbicgfSxcblx0Y3JlYXRlRWxlbWVudCggJ3BhdGgnLCB7XG5cdFx0ZmlsbDogJ2N1cnJlbnRDb2xvcicsXG5cdFx0ZDogJ001NDQsMEg2OEMzMC40NDUsMCwwLDMwLjQ0NSwwLDY4djQ3NmMwLDM3LjU1NiwzMC40NDUsNjgsNjgsNjhoNDc2YzM3LjU1NiwwLDY4LTMwLjQ0NCw2OC02OFY2OCBDNjEyLDMwLjQ0NSw1ODEuNTU2LDAsNTQ0LDB6IE00NjQuNDQsNjhMMzg3LjYsMTIwLjAyTDMyMy4zNCw2OEg0NjQuNDR6IE0yODguNjYsNjhsLTY0LjI2LDUyLjAyTDE0Ny41Niw2OEgyODguNjZ6IE01NDQsNTQ0SDY4IFY2OGgyMi4xbDEzNiw5Mi4xNGw3OS45LTY0LjZsNzkuNTYsNjQuNmwxMzYtOTIuMTRINTQ0VjU0NHogTTExNC4yNCwyNjMuMTZoOTUuODh2LTQ4LjI4aC05NS44OFYyNjMuMTZ6IE0xMTQuMjQsMzYwLjRoOTUuODggdi00OC42MmgtOTUuODhWMzYwLjR6IE0yNDIuNzYsMzYwLjRoMjU1di00OC42MmgtMjU1VjM2MC40TDI0Mi43NiwzNjAuNHogTTI0Mi43NiwyNjMuMTZoMjU1di00OC4yOGgtMjU1VjI2My4xNkwyNDIuNzYsMjYzLjE2eiBNMzY4LjIyLDQ1Ny4zaDEyOS41NFY0MDhIMzY4LjIyVjQ1Ny4zeicsXG5cdH0gKVxuKTtcblxuLyoqXG4gKiBQb3B1cCBjb250YWluZXIuXG4gKlxuICogQHNpbmNlIDEuOC4zXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xubGV0ICRwb3B1cCA9IHt9O1xuXG4vKipcbiAqIENsb3NlIGJ1dHRvbiAoaW5zaWRlIHRoZSBmb3JtIGJ1aWxkZXIpIGNsaWNrIGV2ZW50LlxuICpcbiAqIEBzaW5jZSAxLjguM1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGllbnRJRCBCbG9jayBDbGllbnQgSUQuXG4gKi9cbmNvbnN0IGJ1aWxkZXJDbG9zZUJ1dHRvbkV2ZW50ID0gZnVuY3Rpb24oIGNsaWVudElEICkge1xuXHQkcG9wdXBcblx0XHQub2ZmKCAnd3Bmb3Jtc0J1aWxkZXJJblBvcHVwQ2xvc2UnIClcblx0XHQub24oICd3cGZvcm1zQnVpbGRlckluUG9wdXBDbG9zZScsIGZ1bmN0aW9uKCBlLCBhY3Rpb24sIGZvcm1JZCwgZm9ybVRpdGxlICkge1xuXHRcdFx0aWYgKCBhY3Rpb24gIT09ICdzYXZlZCcgfHwgISBmb3JtSWQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5zZXJ0IGEgbmV3IGJsb2NrIHdoZW4gYSBuZXcgZm9ybSBpcyBjcmVhdGVkIGZyb20gdGhlIHBvcHVwIHRvIHVwZGF0ZSB0aGUgZm9ybSBsaXN0IGFuZCBhdHRyaWJ1dGVzLlxuXHRcdFx0Y29uc3QgbmV3QmxvY2sgPSB3cC5ibG9ja3MuY3JlYXRlQmxvY2soICd3cGZvcm1zL2Zvcm0tc2VsZWN0b3InLCB7XG5cdFx0XHRcdGZvcm1JZDogZm9ybUlkLnRvU3RyaW5nKCksIC8vIEV4cGVjdHMgc3RyaW5nIHZhbHVlLCBtYWtlIHN1cmUgd2UgaW5zZXJ0IHN0cmluZy5cblx0XHRcdH0gKTtcblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuXHRcdFx0d3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3Rvci5mb3JtcyA9IFsgeyBJRDogZm9ybUlkLCBwb3N0X3RpdGxlOiBmb3JtVGl0bGUgfSBdO1xuXG5cdFx0XHQvLyBJbnNlcnQgYSBuZXcgYmxvY2suXG5cdFx0XHR3cC5kYXRhLmRpc3BhdGNoKCAnY29yZS9ibG9jay1lZGl0b3InICkucmVtb3ZlQmxvY2soIGNsaWVudElEICk7XG5cdFx0XHR3cC5kYXRhLmRpc3BhdGNoKCAnY29yZS9ibG9jay1lZGl0b3InICkuaW5zZXJ0QmxvY2tzKCBuZXdCbG9jayApO1xuXHRcdH0gKTtcbn07XG5cbi8qKlxuICogSW5pdCBNb2Rlcm4gc3R5bGUgRHJvcGRvd24gZmllbGRzICg8c2VsZWN0Pikgd2l0aCBjaG9pY2VKUy5cbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZSBCbG9jayBEZXRhaWxzLlxuICovXG5jb25zdCBsb2FkQ2hvaWNlSlMgPSBmdW5jdGlvbiggZSApIHtcblx0aWYgKCB0eXBlb2Ygd2luZG93LkNob2ljZXMgIT09ICdmdW5jdGlvbicgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgJGZvcm0gPSBqUXVlcnkoIGUuZGV0YWlsLmJsb2NrLnF1ZXJ5U2VsZWN0b3IoIGAjd3Bmb3Jtcy0keyBlLmRldGFpbC5mb3JtSWQgfWAgKSApO1xuXHRjb25zdCBjb25maWcgPSB3aW5kb3cud3Bmb3Jtc19jaG9pY2VzanNfY29uZmlnIHx8IHt9O1xuXG5cdCRmb3JtLmZpbmQoICcuY2hvaWNlc2pzLXNlbGVjdCcgKS5lYWNoKCBmdW5jdGlvbiggaW5kZXgsIGVsZW1lbnQgKSB7XG5cdFx0aWYgKCAhICggZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgJGVsID0galF1ZXJ5KCBlbGVtZW50ICk7XG5cblx0XHRpZiAoICRlbC5kYXRhKCAnY2hvaWNlc2pzJyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0ICRmaWVsZCA9ICRlbC5jbG9zZXN0KCAnLndwZm9ybXMtZmllbGQnICk7XG5cblx0XHRjb25maWcuY2FsbGJhY2tPbkluaXQgPSBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzLFxuXHRcdFx0XHQkZWxlbWVudCA9IGpRdWVyeSggc2VsZi5wYXNzZWRFbGVtZW50LmVsZW1lbnQgKSxcblx0XHRcdFx0JGlucHV0ID0galF1ZXJ5KCBzZWxmLmlucHV0LmVsZW1lbnQgKSxcblx0XHRcdFx0c2l6ZUNsYXNzID0gJGVsZW1lbnQuZGF0YSggJ3NpemUtY2xhc3MnICk7XG5cblx0XHRcdC8vIEFkZCBDU1MtY2xhc3MgZm9yIHNpemUuXG5cdFx0XHRpZiAoIHNpemVDbGFzcyApIHtcblx0XHRcdFx0alF1ZXJ5KCBzZWxmLmNvbnRhaW5lck91dGVyLmVsZW1lbnQgKS5hZGRDbGFzcyggc2l6ZUNsYXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgYSBtdWx0aXBsZSBzZWxlY3QgaGFzIHNlbGVjdGVkIGNob2ljZXMgLSBoaWRlIGEgcGxhY2Vob2xkZXIgdGV4dC5cblx0XHRcdCAqIEluIGNhc2UgaWYgc2VsZWN0IGlzIGVtcHR5IC0gd2UgcmV0dXJuIHBsYWNlaG9sZGVyIHRleHQuXG5cdFx0XHQgKi9cblx0XHRcdGlmICggJGVsZW1lbnQucHJvcCggJ211bHRpcGxlJyApICkge1xuXHRcdFx0XHQvLyBPbiBpbml0IGV2ZW50LlxuXHRcdFx0XHQkaW5wdXQuZGF0YSggJ3BsYWNlaG9sZGVyJywgJGlucHV0LmF0dHIoICdwbGFjZWhvbGRlcicgKSApO1xuXG5cdFx0XHRcdGlmICggc2VsZi5nZXRWYWx1ZSggdHJ1ZSApLmxlbmd0aCApIHtcblx0XHRcdFx0XHQkaW5wdXQucmVtb3ZlQXR0ciggJ3BsYWNlaG9sZGVyJyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZGlzYWJsZSgpO1xuXHRcdFx0JGZpZWxkLmZpbmQoICcuaXMtZGlzYWJsZWQnICkucmVtb3ZlQ2xhc3MoICdpcy1kaXNhYmxlZCcgKTtcblx0XHR9O1xuXG5cdFx0JGVsLmRhdGEoICdjaG9pY2VzanMnLCBuZXcgd2luZG93LkNob2ljZXMoIGVsZW1lbnQsIGNvbmZpZyApICk7XG5cblx0XHQvLyBQbGFjZWhvbGRlciBmaXggb24gaWZyYW1lcy5cblx0XHRpZiAoICRlbC52YWwoKSApIHtcblx0XHRcdCRlbC5wYXJlbnQoKS5maW5kKCAnLmNob2ljZXNfX2lucHV0JyApLmF0dHIoICdzdHlsZScsICdkaXNwbGF5OiBub25lICFpbXBvcnRhbnQnICk7XG5cdFx0fVxuXHR9ICk7XG59O1xuXG4vLyBvbiBkb2N1bWVudCByZWFkeVxualF1ZXJ5KCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5KCB3aW5kb3cgKS5vbiggJ3dwZm9ybXNGb3JtU2VsZWN0b3JGb3JtTG9hZGVkJywgbG9hZENob2ljZUpTICk7XG59ICk7XG4vKipcbiAqIE9wZW4gYnVpbGRlciBwb3B1cC5cbiAqXG4gKiBAc2luY2UgMS42LjJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xpZW50SUQgQmxvY2sgQ2xpZW50IElELlxuICovXG5jb25zdCBvcGVuQnVpbGRlclBvcHVwID0gZnVuY3Rpb24oIGNsaWVudElEICkge1xuXHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCAkcG9wdXAgKSApIHtcblx0XHRjb25zdCB0bXBsID0galF1ZXJ5KCAnI3dwZm9ybXMtZ3V0ZW5iZXJnLXBvcHVwJyApO1xuXHRcdGNvbnN0IHBhcmVudCA9IGpRdWVyeSggJyN3cHdyYXAnICk7XG5cblx0XHRwYXJlbnQuYWZ0ZXIoIHRtcGwgKTtcblxuXHRcdCRwb3B1cCA9IHBhcmVudC5zaWJsaW5ncyggJyN3cGZvcm1zLWd1dGVuYmVyZy1wb3B1cCcgKTtcblx0fVxuXG5cdGNvbnN0IHVybCA9IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3IuZ2V0X3N0YXJ0ZWRfdXJsLFxuXHRcdCRpZnJhbWUgPSAkcG9wdXAuZmluZCggJ2lmcmFtZScgKTtcblxuXHRidWlsZGVyQ2xvc2VCdXR0b25FdmVudCggY2xpZW50SUQgKTtcblx0JGlmcmFtZS5hdHRyKCAnc3JjJywgdXJsICk7XG5cdCRwb3B1cC5mYWRlSW4oKTtcbn07XG5cbmNvbnN0IGhhc0Zvcm1zID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLmZvcm1zLmxlbmd0aCA+IDA7XG59O1xuXG5yZWdpc3RlckJsb2NrVHlwZSggJ3dwZm9ybXMvZm9ybS1zZWxlY3RvcicsIHtcblx0dGl0bGU6IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3Iuc3RyaW5ncy50aXRsZSxcblx0ZGVzY3JpcHRpb246IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3Iuc3RyaW5ncy5kZXNjcmlwdGlvbixcblx0aWNvbjogd3Bmb3Jtc0ljb24sXG5cdGtleXdvcmRzOiB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLnN0cmluZ3MuZm9ybV9rZXl3b3Jkcyxcblx0Y2F0ZWdvcnk6ICd3aWRnZXRzJyxcblx0YXR0cmlidXRlczoge1xuXHRcdGZvcm1JZDoge1xuXHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0fSxcblx0XHRkaXNwbGF5VGl0bGU6IHtcblx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHR9LFxuXHRcdGRpc3BsYXlEZXNjOiB7XG5cdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0fSxcblx0XHRwcmV2aWV3OiB7XG5cdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0fSxcblx0fSxcblx0ZXhhbXBsZToge1xuXHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdHByZXZpZXc6IHRydWUsXG5cdFx0fSxcblx0fSxcblx0c3VwcG9ydHM6IHtcblx0XHRjdXN0b21DbGFzc05hbWU6IGhhc0Zvcm1zKCksXG5cdH0sXG5cdGVkaXQoIHByb3BzICkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb25cblx0XHRjb25zdCB7IGF0dHJpYnV0ZXM6IHsgZm9ybUlkID0gJycsIGRpc3BsYXlUaXRsZSA9IGZhbHNlLCBkaXNwbGF5RGVzYyA9IGZhbHNlLCBwcmV2aWV3ID0gZmFsc2UgfSwgc2V0QXR0cmlidXRlcyB9ID0gcHJvcHM7XG5cdFx0Y29uc3QgZm9ybU9wdGlvbnMgPSB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLmZvcm1zLm1hcCggKCB2YWx1ZSApID0+IChcblx0XHRcdHsgdmFsdWU6IHZhbHVlLklELCBsYWJlbDogdmFsdWUucG9zdF90aXRsZSB9XG5cdFx0KSApO1xuXG5cdFx0Y29uc3Qgc3RyaW5ncyA9IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3Iuc3RyaW5ncztcblx0XHRsZXQganN4O1xuXG5cdFx0Zm9ybU9wdGlvbnMudW5zaGlmdCggeyB2YWx1ZTogJycsIGxhYmVsOiB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLnN0cmluZ3MuZm9ybV9zZWxlY3QgfSApO1xuXG5cdFx0ZnVuY3Rpb24gc2VsZWN0Rm9ybSggdmFsdWUgKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuXHRcdFx0c2V0QXR0cmlidXRlcyggeyBmb3JtSWQ6IHZhbHVlIH0gKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0b2dnbGVEaXNwbGF5VGl0bGUoIHZhbHVlICkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2Ncblx0XHRcdHNldEF0dHJpYnV0ZXMoIHsgZGlzcGxheVRpdGxlOiB2YWx1ZSB9ICk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdG9nZ2xlRGlzcGxheURlc2MoIHZhbHVlICkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2Ncblx0XHRcdHNldEF0dHJpYnV0ZXMoIHsgZGlzcGxheURlc2M6IHZhbHVlIH0gKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBHZXQgYmxvY2sgZW1wdHkgSlNYIGNvZGUuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44LjNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBibG9ja1Byb3BzIEJsb2NrIHByb3BlcnRpZXMuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtKU1guRWxlbWVudH0gQmxvY2sgZW1wdHkgSlNYIGNvZGUuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZ2V0RW1wdHlGb3Jtc1ByZXZpZXcoIGJsb2NrUHJvcHMgKSB7XG5cdFx0XHRjb25zdCBjbGllbnRJZCA9IGJsb2NrUHJvcHMuY2xpZW50SWQ7XG5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdDxGcmFnbWVudFxuXHRcdFx0XHRcdGtleT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZnJhZ21lbnQtYmxvY2stZW1wdHlcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtbm8tZm9ybS1wcmV2aWV3XCI+XG5cdFx0XHRcdFx0XHQ8aW1nIHNyYz17IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3IuYmxvY2tfZW1wdHlfdXJsIH0gYWx0PVwiXCIgLz5cblx0XHRcdFx0XHRcdDxwIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXsgeyBfX2h0bWw6IHN0cmluZ3Mud3Bmb3Jtc19lbXB0eV9pbmZvIH0gfT48L3A+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJnZXQtc3RhcnRlZC1idXR0b24gY29tcG9uZW50cy1idXR0b24gaXMtYnV0dG9uIGlzLXByaW1hcnlcIlxuXHRcdFx0XHRcdFx0XHRvbkNsaWNrPXtcblx0XHRcdFx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvcGVuQnVpbGRlclBvcHVwKCBjbGllbnRJZCApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHR7IF9fKCAnR2V0IFN0YXJ0ZWQnLCAnd3Bmb3Jtcy1saXRlJyApIH1cblx0XHRcdFx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0PHAgY2xhc3NOYW1lPVwiZW1wdHktZGVzY1wiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXsgeyBfX2h0bWw6IHN0cmluZ3Mud3Bmb3Jtc19lbXB0eV9oZWxwIH0gfT48L3A+XG5cblx0XHRcdFx0XHRcdHsgLyogVGVtcGxhdGUgZm9yIHBvcHVwIHdpdGggYnVpbGRlciBpZnJhbWUgKi8gfVxuXHRcdFx0XHRcdFx0PGRpdiBpZD1cIndwZm9ybXMtZ3V0ZW5iZXJnLXBvcHVwXCIgY2xhc3NOYW1lPVwid3Bmb3Jtcy1idWlsZGVyLXBvcHVwXCI+XG5cdFx0XHRcdFx0XHRcdDxpZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCIgaWQ9XCJ3cGZvcm1zLWJ1aWxkZXItaWZyYW1lXCIgdGl0bGU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wb3B1cFwiPjwvaWZyYW1lPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvRnJhZ21lbnQ+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFByaW50IGVtcHR5IGZvcm1zIG5vdGljZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguM1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGNsaWVudElkIEJsb2NrIGNsaWVudCBJRC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge0pTWC5FbGVtZW50fSBGaWVsZCBzdHlsZXMgSlNYIGNvZGUuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcHJpbnRFbXB0eUZvcm1zTm90aWNlKCBjbGllbnRJZCApIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdDxJbnNwZWN0b3JDb250cm9scyBrZXk9XCJ3cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLWluc3BlY3Rvci1tYWluLXNldHRpbmdzXCI+XG5cdFx0XHRcdFx0PFBhbmVsQm9keSBjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wYW5lbFwiIHRpdGxlPXsgc3RyaW5ncy5mb3JtX3NldHRpbmdzIH0+XG5cdFx0XHRcdFx0XHQ8cCBjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wYW5lbC1ub3RpY2Ugd3Bmb3Jtcy13YXJuaW5nIHdwZm9ybXMtZW1wdHktZm9ybS1ub3RpY2VcIiBzdHlsZT17IHsgZGlzcGxheTogJ2Jsb2NrJyB9IH0+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmc+eyBfXyggJ1lvdSBoYXZlbuKAmXQgY3JlYXRlZCBhIGZvcm0sIHlldCEnLCAnd3Bmb3Jtcy1saXRlJyApIH08L3N0cm9uZz5cblx0XHRcdFx0XHRcdFx0eyBfXyggJ1doYXQgYXJlIHlvdSB3YWl0aW5nIGZvcj8nLCAnd3Bmb3Jtcy1saXRlJyApIH1cblx0XHRcdFx0XHRcdDwvcD5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImdldC1zdGFydGVkLWJ1dHRvbiBjb21wb25lbnRzLWJ1dHRvbiBpcy1idXR0b24gaXMtc2Vjb25kYXJ5XCJcblx0XHRcdFx0XHRcdFx0b25DbGljaz17XG5cdFx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0b3BlbkJ1aWxkZXJQb3B1cCggY2xpZW50SWQgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0eyBfXyggJ0dldCBTdGFydGVkJywgJ3dwZm9ybXMtbGl0ZScgKSB9XG5cdFx0XHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdFx0XHQ8L1BhbmVsQm9keT5cblx0XHRcdFx0PC9JbnNwZWN0b3JDb250cm9scz5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogR2V0IHN0eWxpbmcgcGFuZWxzIHByZXZpZXcuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge0pTWC5FbGVtZW50fSBKU1ggY29kZS5cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBnZXRTdHlsaW5nUGFuZWxzUHJldmlldygpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdDxGcmFnbWVudD5cblx0XHRcdFx0XHQ8UGFuZWxCb2R5IGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLXBhbmVsIGRpc2FibGVkX3BhbmVsXCIgdGl0bGU9eyBzdHJpbmdzLnRoZW1lcyB9PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJ3cGZvcm1zLXBhbmVsLXByZXZpZXcgd3Bmb3Jtcy1wYW5lbC1wcmV2aWV3LXRoZW1lc1wiPjwvZGl2PlxuXHRcdFx0XHRcdDwvUGFuZWxCb2R5PlxuXHRcdFx0XHRcdDxQYW5lbEJvZHkgY2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctcGFuZWwgZGlzYWJsZWRfcGFuZWxcIiB0aXRsZT17IHN0cmluZ3MuZmllbGRfc3R5bGVzIH0+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtcGFuZWwtcHJldmlldyB3cGZvcm1zLXBhbmVsLXByZXZpZXctZmllbGRcIj48L2Rpdj5cblx0XHRcdFx0XHQ8L1BhbmVsQm9keT5cblx0XHRcdFx0XHQ8UGFuZWxCb2R5IGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLXBhbmVsIGRpc2FibGVkX3BhbmVsXCIgdGl0bGU9eyBzdHJpbmdzLmxhYmVsX3N0eWxlcyB9PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJ3cGZvcm1zLXBhbmVsLXByZXZpZXcgd3Bmb3Jtcy1wYW5lbC1wcmV2aWV3LWxhYmVsXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9QYW5lbEJvZHk+XG5cdFx0XHRcdFx0PFBhbmVsQm9keSBjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wYW5lbCBkaXNhYmxlZF9wYW5lbFwiIHRpdGxlPXsgc3RyaW5ncy5idXR0b25fc3R5bGVzIH0+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtcGFuZWwtcHJldmlldyB3cGZvcm1zLXBhbmVsLXByZXZpZXctYnV0dG9uXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9QYW5lbEJvZHk+XG5cdFx0XHRcdFx0PFBhbmVsQm9keSBjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wYW5lbCBkaXNhYmxlZF9wYW5lbFwiIHRpdGxlPXsgc3RyaW5ncy5jb250YWluZXJfc3R5bGVzIH0+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtcGFuZWwtcHJldmlldyB3cGZvcm1zLXBhbmVsLXByZXZpZXctY29udGFpbmVyXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9QYW5lbEJvZHk+XG5cdFx0XHRcdFx0PFBhbmVsQm9keSBjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wYW5lbCBkaXNhYmxlZF9wYW5lbFwiIHRpdGxlPXsgc3RyaW5ncy5iYWNrZ3JvdW5kX3N0eWxlcyB9PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJ3cGZvcm1zLXBhbmVsLXByZXZpZXcgd3Bmb3Jtcy1wYW5lbC1wcmV2aWV3LWJhY2tncm91bmRcIj48L2Rpdj5cblx0XHRcdFx0XHQ8L1BhbmVsQm9keT5cblx0XHRcdFx0PC9GcmFnbWVudD5cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIGhhc0Zvcm1zKCkgKSB7XG5cdFx0XHRqc3ggPSBbIHByaW50RW1wdHlGb3Jtc05vdGljZSggcHJvcHMuY2xpZW50SWQgKSBdO1xuXG5cdFx0XHRqc3gucHVzaCggZ2V0RW1wdHlGb3Jtc1ByZXZpZXcoIHByb3BzICkgKTtcblx0XHRcdHJldHVybiBqc3g7XG5cdFx0fVxuXG5cdFx0anN4ID0gW1xuXHRcdFx0PEluc3BlY3RvckNvbnRyb2xzIGtleT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItaW5zcGVjdG9yLWNvbnRyb2xzXCI+XG5cdFx0XHRcdDxQYW5lbEJvZHkgdGl0bGU9eyB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLnN0cmluZ3MuZm9ybV9zZXR0aW5ncyB9PlxuXHRcdFx0XHRcdDxTZWxlY3RDb250cm9sXG5cdFx0XHRcdFx0XHRsYWJlbD17IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3Iuc3RyaW5ncy5mb3JtX3NlbGVjdGVkIH1cblx0XHRcdFx0XHRcdHZhbHVlPXsgZm9ybUlkIH1cblx0XHRcdFx0XHRcdG9wdGlvbnM9eyBmb3JtT3B0aW9ucyB9XG5cdFx0XHRcdFx0XHRvbkNoYW5nZT17IHNlbGVjdEZvcm0gfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0PFRvZ2dsZUNvbnRyb2xcblx0XHRcdFx0XHRcdGxhYmVsPXsgd3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3Rvci5zdHJpbmdzLnNob3dfdGl0bGUgfVxuXHRcdFx0XHRcdFx0Y2hlY2tlZD17IGRpc3BsYXlUaXRsZSB9XG5cdFx0XHRcdFx0XHRvbkNoYW5nZT17IHRvZ2dsZURpc3BsYXlUaXRsZSB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8VG9nZ2xlQ29udHJvbFxuXHRcdFx0XHRcdFx0bGFiZWw9eyB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLnN0cmluZ3Muc2hvd19kZXNjcmlwdGlvbiB9XG5cdFx0XHRcdFx0XHRjaGVja2VkPXsgZGlzcGxheURlc2MgfVxuXHRcdFx0XHRcdFx0b25DaGFuZ2U9eyB0b2dnbGVEaXNwbGF5RGVzYyB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8cCBjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1wYW5lbC1ub3RpY2Ugd3Bmb3Jtcy13YXJuaW5nXCI+XG5cdFx0XHRcdFx0XHQ8c3Ryb25nPnsgc3RyaW5ncy51cGRhdGVfd3Bfbm90aWNlX2hlYWQgfTwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0eyBzdHJpbmdzLnVwZGF0ZV93cF9ub3RpY2VfdGV4dCB9IDxhIGhyZWY9eyBzdHJpbmdzLnVwZGF0ZV93cF9ub3RpY2VfbGluayB9IHJlbD1cIm5vcmVmZXJyZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIj57IHN0cmluZ3MubGVhcm5fbW9yZSB9PC9hPlxuXHRcdFx0XHRcdDwvcD5cblx0XHRcdFx0PC9QYW5lbEJvZHk+XG5cdFx0XHRcdHsgZ2V0U3R5bGluZ1BhbmVsc1ByZXZpZXcoKSB9XG5cdFx0XHQ8L0luc3BlY3RvckNvbnRyb2xzPixcblx0XHRdO1xuXG5cdFx0aWYgKCBmb3JtSWQgKSB7XG5cdFx0XHRqc3gucHVzaChcblx0XHRcdFx0PFNlcnZlclNpZGVSZW5kZXJcblx0XHRcdFx0XHRrZXk9XCJ3cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLXNlcnZlci1zaWRlLXJlbmRlcmVyXCJcblx0XHRcdFx0XHRibG9jaz1cIndwZm9ybXMvZm9ybS1zZWxlY3RvclwiXG5cdFx0XHRcdFx0YXR0cmlidXRlcz17IHByb3BzLmF0dHJpYnV0ZXMgfVxuXHRcdFx0XHQvPlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCBwcmV2aWV3ICkge1xuXHRcdFx0anN4LnB1c2goXG5cdFx0XHRcdDxGcmFnbWVudFxuXHRcdFx0XHRcdGtleT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZnJhZ21lbnQtYmxvY2stcHJldmlld1wiPlxuXHRcdFx0XHRcdDxpbWcgc3JjPXsgd3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3Rvci5ibG9ja19wcmV2aWV3X3VybCB9IHN0eWxlPXsgeyB3aWR0aDogJzEwMCUnIH0gfSBhbHQ9XCJcIiAvPlxuXHRcdFx0XHQ8L0ZyYWdtZW50PlxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anN4LnB1c2goXG5cdFx0XHRcdDxQbGFjZWhvbGRlclxuXHRcdFx0XHRcdGtleT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3Itd3JhcFwiXG5cdFx0XHRcdFx0Y2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci13cmFwXCI+XG5cdFx0XHRcdFx0PGltZyBzcmM9eyB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yLmxvZ29fdXJsIH0gYWx0PVwiXCIgLz5cblx0XHRcdFx0XHQ8U2VsZWN0Q29udHJvbFxuXHRcdFx0XHRcdFx0a2V5PVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci1zZWxlY3QtY29udHJvbFwiXG5cdFx0XHRcdFx0XHR2YWx1ZT17IGZvcm1JZCB9XG5cdFx0XHRcdFx0XHRvcHRpb25zPXsgZm9ybU9wdGlvbnMgfVxuXHRcdFx0XHRcdFx0b25DaGFuZ2U9eyBzZWxlY3RGb3JtIH1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L1BsYWNlaG9sZGVyPlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4ganN4O1xuXHR9LFxuXHRzYXZlKCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9LFxufSApO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBQUEsR0FBQSxHQUFnRkMsRUFBRTtFQUFBQyxvQkFBQSxHQUFBRixHQUFBLENBQTFFRyxnQkFBZ0I7RUFBRUMsZ0JBQWdCLEdBQUFGLG9CQUFBLGNBQUdELEVBQUUsQ0FBQ0ksVUFBVSxDQUFDRCxnQkFBZ0IsR0FBQUYsb0JBQUE7QUFDM0UsSUFBQUksV0FBQSxHQUFvQ0wsRUFBRSxDQUFDTSxPQUFPO0VBQXRDQyxhQUFhLEdBQUFGLFdBQUEsQ0FBYkUsYUFBYTtFQUFFQyxRQUFRLEdBQUFILFdBQUEsQ0FBUkcsUUFBUTtBQUMvQixJQUFRQyxpQkFBaUIsR0FBS1QsRUFBRSxDQUFDVSxNQUFNLENBQS9CRCxpQkFBaUI7QUFDekIsSUFBQUUsSUFBQSxHQUE4QlgsRUFBRSxDQUFDWSxXQUFXLElBQUlaLEVBQUUsQ0FBQ2EsTUFBTTtFQUFqREMsaUJBQWlCLEdBQUFILElBQUEsQ0FBakJHLGlCQUFpQjtBQUN6QixJQUFBQyxjQUFBLEdBQWlFZixFQUFFLENBQUNJLFVBQVU7RUFBdEVZLGFBQWEsR0FBQUQsY0FBQSxDQUFiQyxhQUFhO0VBQUVDLGFBQWEsR0FBQUYsY0FBQSxDQUFiRSxhQUFhO0VBQUVDLFNBQVMsR0FBQUgsY0FB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 +},{}]},{},[1]) \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.min.js new file mode 100755 index 00000000..4f3b1402 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/formselector-legacy.es5.min.js @@ -0,0 +1 @@ +!function o(n,s,a){function l(r,e){if(!s[r]){if(!n[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(c)return c(r,!0);throw new Error("Cannot find module '"+r+"'")}e=s[r]={exports:{}};n[r][0].call(e.exports,function(e){var t=n[r][1][e];return l(t||e)},e,e.exports,o,n,s,a)}return s[r].exports}for(var c="function"==typeof require&&require,e=0;e) with choiceJS. + * + * @since 1.9.0 + * + * @param {Object} e Block Details. + */ +const loadChoiceJS = function( e ) { + if ( typeof window.Choices !== 'function' ) { + return; + } + + const $form = jQuery( e.detail.block.querySelector( `#wpforms-${ e.detail.formId }` ) ); + const config = window.wpforms_choicesjs_config || {}; + + $form.find( '.choicesjs-select' ).each( function( index, element ) { + if ( ! ( element instanceof HTMLSelectElement ) ) { + return; + } + + const $el = jQuery( element ); + + if ( $el.data( 'choicesjs' ) ) { + return; + } + + const $field = $el.closest( '.wpforms-field' ); + + config.callbackOnInit = function() { + const self = this, + $element = jQuery( self.passedElement.element ), + $input = jQuery( self.input.element ), + sizeClass = $element.data( 'size-class' ); + + // Add CSS-class for size. + if ( sizeClass ) { + jQuery( self.containerOuter.element ).addClass( sizeClass ); + } + + /** + * If a multiple select has selected choices - hide a placeholder text. + * In case if select is empty - we return placeholder text. + */ + if ( $element.prop( 'multiple' ) ) { + // On init event. + $input.data( 'placeholder', $input.attr( 'placeholder' ) ); + + if ( self.getValue( true ).length ) { + $input.removeAttr( 'placeholder' ); + } + } + + this.disable(); + $field.find( '.is-disabled' ).removeClass( 'is-disabled' ); + }; + + $el.data( 'choicesjs', new window.Choices( element, config ) ); + + // Placeholder fix on iframes. + if ( $el.val() ) { + $el.parent().find( '.choices__input' ).attr( 'style', 'display: none !important' ); + } + } ); +}; + +// on document ready +jQuery( function() { + jQuery( window ).on( 'wpformsFormSelectorFormLoaded', loadChoiceJS ); +} ); +/** + * Open builder popup. + * + * @since 1.6.2 + * + * @param {string} clientID Block Client ID. + */ +const openBuilderPopup = function( clientID ) { + if ( jQuery.isEmptyObject( $popup ) ) { + const tmpl = jQuery( '#wpforms-gutenberg-popup' ); + const parent = jQuery( '#wpwrap' ); + + parent.after( tmpl ); + + $popup = parent.siblings( '#wpforms-gutenberg-popup' ); + } + + const url = wpforms_gutenberg_form_selector.get_started_url, + $iframe = $popup.find( 'iframe' ); + + builderCloseButtonEvent( clientID ); + $iframe.attr( 'src', url ); + $popup.fadeIn(); +}; + +const hasForms = function() { + return wpforms_gutenberg_form_selector.forms.length > 0; +}; + +registerBlockType( 'wpforms/form-selector', { + title: wpforms_gutenberg_form_selector.strings.title, + description: wpforms_gutenberg_form_selector.strings.description, + icon: wpformsIcon, + keywords: wpforms_gutenberg_form_selector.strings.form_keywords, + category: 'widgets', + attributes: { + formId: { + type: 'string', + }, + displayTitle: { + type: 'boolean', + }, + displayDesc: { + type: 'boolean', + }, + preview: { + type: 'boolean', + }, + }, + example: { + attributes: { + preview: true, + }, + }, + supports: { + customClassName: hasForms(), + }, + edit( props ) { // eslint-disable-line max-lines-per-function + const { attributes: { formId = '', displayTitle = false, displayDesc = false, preview = false }, setAttributes } = props; + const formOptions = wpforms_gutenberg_form_selector.forms.map( ( value ) => ( + { value: value.ID, label: value.post_title } + ) ); + + const strings = wpforms_gutenberg_form_selector.strings; + let jsx; + + formOptions.unshift( { value: '', label: wpforms_gutenberg_form_selector.strings.form_select } ); + + function selectForm( value ) { // eslint-disable-line jsdoc/require-jsdoc + setAttributes( { formId: value } ); + } + + function toggleDisplayTitle( value ) { // eslint-disable-line jsdoc/require-jsdoc + setAttributes( { displayTitle: value } ); + } + + function toggleDisplayDesc( value ) { // eslint-disable-line jsdoc/require-jsdoc + setAttributes( { displayDesc: value } ); + } + + /** + * Get block empty JSX code. + * + * @since 1.8.3 + * + * @param {Object} blockProps Block properties. + * + * @return {JSX.Element} Block empty JSX code. + */ + function getEmptyFormsPreview( blockProps ) { + const clientId = blockProps.clientId; + + return ( + +
            + +

            + +

            + + { /* Template for popup with builder iframe */ } +
            + +
            +
            +
            + ); + } + + /** + * Print empty forms notice. + * + * @since 1.8.3 + * + * @param {string} clientId Block client ID. + * + * @return {JSX.Element} Field styles JSX code. + */ + function printEmptyFormsNotice( clientId ) { + return ( + + +

            + { __( 'You haven’t created a form, yet!', 'wpforms-lite' ) } + { __( 'What are you waiting for?', 'wpforms-lite' ) } +

            + +
            +
            + ); + } + + /** + * Get styling panels preview. + * + * @since 1.8.8 + * + * @return {JSX.Element} JSX code. + */ + function getStylingPanelsPreview() { + return ( + + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + ); + } + + if ( ! hasForms() ) { + jsx = [ printEmptyFormsNotice( props.clientId ) ]; + + jsx.push( getEmptyFormsPreview( props ) ); + return jsx; + } + + jsx = [ + + + + + +

            + { strings.update_wp_notice_head } + { strings.update_wp_notice_text } { strings.learn_more } +

            +
            + { getStylingPanelsPreview() } +
            , + ]; + + if ( formId ) { + jsx.push( + + ); + } else if ( preview ) { + jsx.push( + + + + ); + } else { + jsx.push( + + + + + ); + } + + return jsx; + }, + save() { + return null; + }, +} ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/advanced-settings.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/advanced-settings.js new file mode 100755 index 00000000..191a5d8d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/advanced-settings.js @@ -0,0 +1,164 @@ +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ + +/** + * @param strings.custom_css + * @param strings.custom_css_notice + * @param strings.copy_paste_settings + * @param strings.copy_paste_notice + */ + +/** + * Gutenberg editor block. + * + * Advanced Settings module. + * + * @since 1.8.8 + */ +export default ( function( $ ) { + /** + * WP core components. + * + * @since 1.8.8 + */ + const { addFilter } = wp.hooks; + const { createHigherOrderComponent } = wp.compose; + const { Fragment } = wp.element; + const { InspectorAdvancedControls } = wp.blockEditor || wp.editor; + const { TextareaControl } = wp.components; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + const { strings } = wpforms_gutenberg_form_selector; + + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + const app = { + /** + * Initialize module. + * + * @since 1.8.8 + * + * @param {Object} commonModule Common module. + */ + init( commonModule ) { + app.common = commonModule; + + app.hooks(); + app.events(); + }, + + /** + * Hooks. + * + * @since 1.8.8 + */ + hooks() { + addFilter( + 'editor.BlockEdit', + 'editorskit/custom-advanced-control', + app.withAdvancedControls + ); + }, + + /** + * Events. + * + * @since 1.8.8 + */ + events() { + $( document ) + .on( 'focus click', 'textarea', app.copyPasteFocus ); + }, + + /** + * Copy / Paste Style Settings textarea focus event. + * + * @since 1.8.8 + */ + copyPasteFocus() { + const $input = $( this ); + + if ( $input.siblings( 'label' ).text() === strings.copy_paste_settings ) { + // Select all text, so it's easier to copy and paste value. + $input.select(); + } + }, + + /** + * Get fields. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * + * @return {Object} Inspector advanced controls JSX code. + */ + getFields( props ) { + // Proceed only for WPForms block and when form ID is set. + if ( props?.name !== 'wpforms/form-selector' || ! props?.attributes?.formId ) { + return null; + } + + // Common event handlers. + const handlers = app.common.getSettingsFieldsHandlers( props ); + + return ( + +
            + handlers.attrChange( 'customCss', value ) } + /> +
            + handlers.pasteSettings( value ) } + /> +
            +
            +
            + ); + }, + + /** + * Add controls on Advanced Settings Panel. + * + * @param {Function} BlockEdit Block edit component. + * + * @return {Function} BlockEdit Modified block edit component. + */ + withAdvancedControls: createHigherOrderComponent( + ( BlockEdit ) => { + return ( props ) => { + return ( + + + { app.getFields( props ) } + + ); + }; + }, + 'withAdvancedControls' + ), + }; + + // Provide access to public functions/properties. + return app; +}( jQuery ) ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-preview.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-preview.js new file mode 100755 index 00000000..daa206ae --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-preview.js @@ -0,0 +1,66 @@ +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ + +import PropTypes from 'prop-types'; + +/** + * @param strings.remove_image + */ + +/** + * React component for the background preview. + * + * @since 1.8.8 + * + * @param {Object} props Component props. + * @param {Object} props.attributes Block attributes. + * @param {Function} props.onRemoveBackground Function to remove the background. + * @param {Function} props.onPreviewClicked Function to handle the preview click. + * + * @return {Object} React component. + */ +const BackgroundPreview = ( { attributes, onRemoveBackground, onPreviewClicked } ) => { + const { Button } = wp.components; + const { strings } = wpforms_gutenberg_form_selector; + + return ( +
            + + { + if ( event.key === 'Enter' || event.key === ' ' ) { + onPreviewClicked(); + } + } + } + > + + +
            + ); +}; + +BackgroundPreview.propTypes = { + attributes: PropTypes.object.isRequired, + onRemoveBackground: PropTypes.func.isRequired, + onPreviewClicked: PropTypes.func.isRequired, +}; + +export default BackgroundPreview; diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-styles.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-styles.js new file mode 100755 index 00000000..fd7dd377 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/background-styles.js @@ -0,0 +1,607 @@ +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ + +import BackgroundPreview from './background-preview.js'; + +/** + * @param strings.background_styles + * @param strings.bottom_center + * @param strings.bottom_left + * @param strings.bottom_right + * @param strings.center_center + * @param strings.center_left + * @param strings.center_right + * @param strings.choose_image + * @param strings.image_url + * @param strings.media_library + * @param strings.no_repeat + * @param strings.repeat_x + * @param strings.repeat_y + * @param strings.select_background_image + * @param strings.select_image + * @param strings.stock_photo + * @param strings.tile + * @param strings.top_center + * @param strings.top_left + * @param strings.top_right + */ + +/** + * Gutenberg editor block. + * + * Background styles panel module. + * + * @since 1.8.8 + */ +export default ( function() { + /** + * WP core components. + * + * @since 1.8.8 + */ + const { PanelColorSettings } = wp.blockEditor || wp.editor; + const { SelectControl, PanelBody, Flex, FlexBlock, __experimentalUnitControl, TextControl, Button } = wp.components; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + const { strings, defaults } = wpforms_gutenberg_form_selector; + + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + const app = { + + /** + * Get block attributes. + * + * @since 1.8.8 + * + * @return {Object} Block attributes. + */ + getBlockAttributes() { + return { + backgroundImage: { + type: 'string', + default: defaults.backgroundImage, + }, + backgroundPosition: { + type: 'string', + default: defaults.backgroundPosition, + }, + backgroundRepeat: { + type: 'string', + default: defaults.backgroundRepeat, + }, + backgroundSizeMode: { + type: 'string', + default: defaults.backgroundSizeMode, + }, + backgroundSize: { + type: 'string', + default: defaults.backgroundSize, + }, + backgroundWidth: { + type: 'string', + default: defaults.backgroundWidth, + }, + backgroundHeight: { + type: 'string', + default: defaults.backgroundHeight, + }, + backgroundColor: { + type: 'string', + default: defaults.backgroundColor, + }, + backgroundUrl: { + type: 'string', + default: defaults.backgroundUrl, + }, + }; + }, + + /** + * Get Background Styles panel JSX code. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {Object} formSelectorCommon Block properties. + * @param {Object} stockPhotos Stock Photos module. + * @param {Object} uiState UI state. + * + * @return {Object} Field styles JSX code. + */ + getBackgroundStyles( props, handlers, formSelectorCommon, stockPhotos, uiState ) { // eslint-disable-line max-lines-per-function, complexity + const isNotDisabled = uiState.isNotDisabled; + const isProEnabled = uiState.isProEnabled; + const showBackgroundPreview = uiState.showBackgroundPreview; + const setShowBackgroundPreview = uiState.setShowBackgroundPreview; + const lastBgImage = uiState.lastBgImage; + const setLastBgImage = uiState.setLastBgImage; + const tabIndex = isNotDisabled ? 0 : -1; + const cssClass = formSelectorCommon.getPanelClass( props ) + ( isNotDisabled ? '' : ' wpforms-gutenberg-panel-disabled' ); + + return ( + +
            { + if ( isNotDisabled ) { + return; + } + + event.stopPropagation(); + + if ( ! isProEnabled ) { + return formSelectorCommon.education.showProModal( 'background', strings.background_styles ); + } + + formSelectorCommon.education.showLicenseModal( 'background', strings.background_styles, 'background-styles' ); + } } + onKeyDown={ ( event ) => { + if ( isNotDisabled ) { + return; + } + + event.stopPropagation(); + + if ( ! isProEnabled ) { + return formSelectorCommon.education.showProModal( 'background', strings.background_styles ); + } + + formSelectorCommon.education.showLicenseModal( 'background', strings.background_styles, 'background-styles' ); + } } + > + + + app.setContainerBackgroundImageWrapper( props, handlers, value, lastBgImage, setLastBgImage ) } + /> + + + { ( props.attributes.backgroundImage !== 'none' || ! isNotDisabled ) && ( + handlers.styleAttrChange( 'backgroundPosition', value ) } + /> + ) } + + + { ( props.attributes.backgroundImage !== 'none' || ! isNotDisabled ) && ( + + + handlers.styleAttrChange( 'backgroundRepeat', value ) } + /> + + + app.handleSizeFromDimensions( props, handlers, value ) } + /> + + + ) } + { ( ( props.attributes.backgroundSizeMode === 'dimensions' && props.attributes.backgroundImage !== 'none' ) || ! isNotDisabled ) && ( + + + <__experimentalUnitControl + label={ strings.width } + tabIndex={ tabIndex } + value={ props.attributes.backgroundWidth } + isUnitSelectTabbable={ isNotDisabled } + onChange={ ( value ) => app.handleSizeFromWidth( props, handlers, value ) } + /> + + + <__experimentalUnitControl + label={ strings.height } + tabIndex={ tabIndex } + value={ props.attributes.backgroundHeight } + isUnitSelectTabbable={ isNotDisabled } + onChange={ ( value ) => app.handleSizeFromHeight( props, handlers, value ) } + /> + + + ) } + { ( ! showBackgroundPreview || props.attributes.backgroundUrl === 'url()' ) && ( + ( props.attributes.backgroundImage === 'library' && ( + + + + + + ) ) || ( props.attributes.backgroundImage === 'stock' && ( + + + + + + ) ) + ) } + { ( ( showBackgroundPreview && props.attributes.backgroundImage !== 'none' ) || props.attributes.backgroundUrl !== 'url()' ) && ( + + +
            + { + app.onRemoveBackground( setShowBackgroundPreview, handlers, setLastBgImage ); + } + } + onPreviewClicked={ () => { + if ( props.attributes.backgroundImage === 'library' ) { + return app.openMediaLibrary( props, handlers, setShowBackgroundPreview ); + } + + return stockPhotos?.openModal( props, handlers, 'bg-styles', setShowBackgroundPreview ); + } } + /> +
            + handlers.styleAttrChange( 'backgroundUrl', value ) } + onLoad={ ( value ) => props.attributes.backgroundImage !== 'none' && handlers.styleAttrChange( 'backgroundUrl', value ) } + /> +
            +
            + ) } + + +
            { strings.colors }
            + { + if ( ! isNotDisabled ) { + return; + } + + handlers.styleAttrChange( 'backgroundColor', value ); + }, + label: strings.background, + }, + ] } + /> +
            +
            +
            +
            + ); + }, + + /** + * Open media library modal and handle image selection. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {Function} setShowBackgroundPreview Set show background preview. + */ + openMediaLibrary( props, handlers, setShowBackgroundPreview ) { + const frame = wp.media( { + title: strings.select_background_image, + multiple: false, + library: { + type: 'image', + }, + button: { + text: strings.select_image, + }, + } ); + + frame.on( 'select', () => { + const attachment = frame.state().get( 'selection' ).first().toJSON(); + const setAttr = {}; + const attribute = 'backgroundUrl'; + + if ( attachment.url ) { + const value = `url(${ attachment.url })`; + + setAttr[ attribute ] = value; + + props.setAttributes( setAttr ); + + handlers.styleAttrChange( 'backgroundUrl', value ); + + setShowBackgroundPreview( true ); + } + } ); + + frame.open(); + }, + + /** + * Set container background image. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundImage( container, value ) { + if ( value === 'none' ) { + container.style.setProperty( `--wpforms-background-url`, 'url()' ); + } + + return true; + }, + + /** + * Set container background image. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {string} value Value. + * @param {string} lastBgImage Last background image. + * @param {Function} setLastBgImage Set last background image. + */ + setContainerBackgroundImageWrapper( props, handlers, value, lastBgImage, setLastBgImage ) { + if ( value === 'none' ) { + setLastBgImage( props.attributes.backgroundUrl ); + props.attributes.backgroundUrl = 'url()'; + + handlers.styleAttrChange( 'backgroundUrl', 'url()' ); + } else if ( lastBgImage ) { + props.attributes.backgroundUrl = lastBgImage; + handlers.styleAttrChange( 'backgroundUrl', lastBgImage ); + } + + handlers.styleAttrChange( 'backgroundImage', value ); + }, + + /** + * Set container background position. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundPosition( container, value ) { + container.style.setProperty( `--wpforms-background-position`, value ); + + return true; + }, + + /** + * Set container background repeat. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundRepeat( container, value ) { + container.style.setProperty( `--wpforms-background-repeat`, value ); + + return true; + }, + + /** + * Handle real size from dimensions. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {string} value Value. + */ + handleSizeFromDimensions( props, handlers, value ) { + if ( value === 'cover' ) { + props.attributes.backgroundSize = 'cover'; + + handlers.styleAttrChange( 'backgroundWidth', props.attributes.backgroundWidth ); + handlers.styleAttrChange( 'backgroundHeight', props.attributes.backgroundHeight ); + handlers.styleAttrChange( 'backgroundSizeMode', 'cover' ); + handlers.styleAttrChange( 'backgroundSize', 'cover' ); + } else { + props.attributes.backgroundSize = 'dimensions'; + + handlers.styleAttrChange( 'backgroundSizeMode', 'dimensions' ); + handlers.styleAttrChange( 'backgroundSize', props.attributes.backgroundWidth + ' ' + props.attributes.backgroundHeight ); + } + }, + + /** + * Handle real size from width. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {string} value Value. + */ + handleSizeFromWidth( props, handlers, value ) { + props.attributes.backgroundSize = value + ' ' + props.attributes.backgroundHeight; + props.attributes.backgroundWidth = value; + + handlers.styleAttrChange( 'backgroundSize', value + ' ' + props.attributes.backgroundHeight ); + handlers.styleAttrChange( 'backgroundWidth', value ); + }, + + /** + * Handle real size from height. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {string} value Value. + */ + handleSizeFromHeight( props, handlers, value ) { + props.attributes.backgroundSize = props.attributes.backgroundWidth + ' ' + value; + props.attributes.backgroundHeight = value; + + handlers.styleAttrChange( 'backgroundSize', props.attributes.backgroundWidth + ' ' + value ); + handlers.styleAttrChange( 'backgroundHeight', value ); + }, + + /** + * Set container background width. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundWidth( container, value ) { + container.style.setProperty( `--wpforms-background-width`, value ); + + return true; + }, + + /** + * Set container background height. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundHeight( container, value ) { + container.style.setProperty( `--wpforms-background-height`, value ); + + return true; + }, + + /** + * Set container background url. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setBackgroundUrl( container, value ) { + container.style.setProperty( `--wpforms-background-url`, value ); + + return true; + }, + + /** + * Set container background color. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setBackgroundColor( container, value ) { + container.style.setProperty( `--wpforms-background-color`, value ); + + return true; + }, + + _showBackgroundPreview( props ) { + return props.attributes.backgroundImage !== 'none' && + props.attributes.backgroundUrl && + props.attributes.backgroundUrl !== 'url()'; + }, + + /** + * Remove background image. + * + * @since 1.8.8 + * + * @param {Function} setShowBackgroundPreview Set show background preview. + * @param {Object} handlers Block handlers. + * @param {Function} setLastBgImage Set last background image. + */ + onRemoveBackground( setShowBackgroundPreview, handlers, setLastBgImage ) { + setShowBackgroundPreview( false ); + handlers.styleAttrChange( 'backgroundUrl', 'url()' ); + setLastBgImage( '' ); + }, + }; + + return app; +}() ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/button-styles.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/button-styles.js new file mode 100755 index 00000000..72cce77c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/button-styles.js @@ -0,0 +1,181 @@ +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ + +/** + * @param strings.border_radius + * @param strings.border_size + * @param strings.button_color_notice + * @param strings.button_styles + * @param strings.dashed + * @param strings.solid + */ + +/** + * Gutenberg editor block. + * + * Button styles panel module. + * + * @since 1.8.8 + */ +export default ( ( function() { + /** + * WP core components. + * + * @since 1.8.8 + */ + const { PanelColorSettings } = wp.blockEditor || wp.editor; + const { SelectControl, PanelBody, Flex, FlexBlock, __experimentalUnitControl } = wp.components; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + const { strings, defaults } = wpforms_gutenberg_form_selector; + + // noinspection UnnecessaryLocalVariableJS + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + const app = { + + /** + * Get block attributes. + * + * @since 1.8.8 + * + * @return {Object} Block attributes. + */ + getBlockAttributes() { + return { + buttonSize: { + type: 'string', + default: defaults.buttonSize, + }, + buttonBorderStyle: { + type: 'string', + default: defaults.buttonBorderStyle, + }, + buttonBorderSize: { + type: 'string', + default: defaults.buttonBorderSize, + }, + buttonBorderRadius: { + type: 'string', + default: defaults.buttonBorderRadius, + }, + buttonBackgroundColor: { + type: 'string', + default: defaults.buttonBackgroundColor, + }, + buttonTextColor: { + type: 'string', + default: defaults.buttonTextColor, + }, + buttonBorderColor: { + type: 'string', + default: defaults.buttonBorderColor, + }, + }; + }, + + /** + * Get Button styles JSX code. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {Object} sizeOptions Size selector options. + * @param {Object} formSelectorCommon Form selector common object. + * + * @return {Object} Button styles JSX code. + */ + getButtonStyles( props, handlers, sizeOptions, formSelectorCommon ) { // eslint-disable-line max-lines-per-function + return ( + + + + handlers.styleAttrChange( 'buttonSize', value ) } + /> + + + handlers.styleAttrChange( 'buttonBorderStyle', value ) } + /> + + + + + <__experimentalUnitControl + label={ strings.border_size } + value={ props.attributes.buttonBorderStyle === 'none' ? '' : props.attributes.buttonBorderSize } + min={ 0 } + disabled={ props.attributes.buttonBorderStyle === 'none' } + onChange={ ( value ) => handlers.styleAttrChange( 'buttonBorderSize', value ) } + isUnitSelectTabbable + /> + + + <__experimentalUnitControl + onChange={ ( value ) => handlers.styleAttrChange( 'buttonBorderRadius', value ) } + label={ strings.border_radius } + min={ 0 } + isUnitSelectTabbable + value={ props.attributes.buttonBorderRadius } /> + + + +
            +
            { strings.colors }
            + handlers.styleAttrChange( 'buttonBackgroundColor', value ), + label: strings.background, + }, + { + value: props.attributes.buttonBorderColor, + onChange: ( value ) => handlers.styleAttrChange( 'buttonBorderColor', value ), + label: strings.border, + }, + { + value: props.attributes.buttonTextColor, + onChange: ( value ) => handlers.styleAttrChange( 'buttonTextColor', value ), + label: strings.text, + }, + ] } /> +
            + { strings.button_color_notice } +
            +
            +
            + ); + }, + }; + + return app; +} )() ); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/common.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/common.js new file mode 100755 index 00000000..745e7db8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/gutenberg/modules/common.js @@ -0,0 +1,2041 @@ +/* global jconfirm, wpforms_gutenberg_form_selector, Choices, JSX, DOM, WPFormsUtils */ +/* jshint es3: false, esversion: 6 */ + +/** + * @param strings.copy_paste_error + * @param strings.error_message + * @param strings.form_edit + * @param strings.form_entries + * @param strings.form_keywords + * @param strings.form_select + * @param strings.form_selected + * @param strings.form_settings + * @param strings.label_styles + * @param strings.other_styles + * @param strings.page_break + * @param strings.panel_notice_head + * @param strings.panel_notice_link + * @param strings.panel_notice_link_text + * @param strings.panel_notice_text + * @param strings.show_description + * @param strings.show_title + * @param strings.sublabel_hints + * @param strings.form_not_available_message + * @param urls.entries_url + * @param urls.form_url + * @param window.wpforms_choicesjs_config + * @param wpforms_education.upgrade_bonus + * @param wpforms_gutenberg_form_selector.block_empty_url + * @param wpforms_gutenberg_form_selector.block_preview_url + * @param wpforms_gutenberg_form_selector.get_started_url + * @param wpforms_gutenberg_form_selector.is_full_styling + * @param wpforms_gutenberg_form_selector.is_modern_markup + * @param wpforms_gutenberg_form_selector.logo_url + * @param wpforms_gutenberg_form_selector.wpforms_guide + */ + +/** + * Gutenberg editor block. + * + * Common module. + * + * @since 1.8.8 + */ +export default ( function( document, window, $ ) { + /** + * WP core components. + * + * @since 1.8.8 + */ + const { serverSideRender: ServerSideRender = wp.components.ServerSideRender } = wp; + const { createElement, Fragment, createInterpolateElement } = wp.element; + const { registerBlockType } = wp.blocks; + const { InspectorControls, PanelColorSettings, useBlockProps } = wp.blockEditor || wp.editor; + const { SelectControl, ToggleControl, PanelBody, Placeholder } = wp.components; + const { __ } = wp.i18n; + const { useState, useEffect } = wp.element; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + const { strings, defaults, sizes, urls, isPro, isLicenseActive, isAdmin } = wpforms_gutenberg_form_selector; + const defaultStyleSettings = defaults; + + // noinspection JSUnusedLocalSymbols + /** + * WPForms Education script. + * + * @since 1.8.8 + */ + const WPFormsEducation = window.WPFormsEducation || {}; // eslint-disable-line no-unused-vars + + /** + * List of forms. + * + * The default value is localized in FormSelector.php. + * + * @since 1.8.4 + * + * @type {Object} + */ + let formList = wpforms_gutenberg_form_selector.forms; + + /** + * Blocks runtime data. + * + * @since 1.8.1 + * + * @type {Object} + */ + const blocks = {}; + + /** + * Whether it is needed to trigger server rendering. + * + * @since 1.8.1 + * + * @type {boolean} + */ + let triggerServerRender = true; + + /** + * Popup container. + * + * @since 1.8.3 + * + * @type {Object} + */ + let $popup = {}; + + /** + * Track fetch status. + * + * @since 1.8.4 + * + * @type {boolean} + */ + let isFetching = false; + + /** + * Elements holder. + * + * @since 1.8.8 + * + * @type {Object} + */ + const el = {}; + + /** + * Common block attributes. + * + * @since 1.8.8 + * + * @type {Object} + */ + let commonAttributes = { + clientId: { + type: 'string', + default: '', + }, + formId: { + type: 'string', + default: defaultStyleSettings.formId, + }, + displayTitle: { + type: 'boolean', + default: defaultStyleSettings.displayTitle, + }, + displayDesc: { + type: 'boolean', + default: defaultStyleSettings.displayDesc, + }, + preview: { + type: 'boolean', + }, + theme: { + type: 'string', + default: defaultStyleSettings.theme, + }, + themeName: { + type: 'string', + default: defaultStyleSettings.themeName, + }, + labelSize: { + type: 'string', + default: defaultStyleSettings.labelSize, + }, + labelColor: { + type: 'string', + default: defaultStyleSettings.labelColor, + }, + labelSublabelColor: { + type: 'string', + default: defaultStyleSettings.labelSublabelColor, + }, + labelErrorColor: { + type: 'string', + default: defaultStyleSettings.labelErrorColor, + }, + pageBreakColor: { + type: 'string', + default: defaultStyleSettings.pageBreakColor, + }, + customCss: { + type: 'string', + default: defaultStyleSettings.customCss, + }, + copyPasteJsonValue: { + type: 'string', + default: defaultStyleSettings.copyPasteJsonValue, + }, + }; + + /** + * Handlers for custom styles settings, defined outside this module. + * + * @since 1.8.8 + * + * @type {Object} + */ + let customStylesHandlers = {}; + + /** + * Dropdown timeout. + * + * @since 1.8.8 + * + * @type {number} + */ + let dropdownTimeout; + + /** + * Whether copy-paste content was generated on edit. + * + * @since 1.9.1 + * + * @type {boolean} + */ + let isCopyPasteGeneratedOnEdit = false; + + /** + * Whether the background is selected. + * + * @since 1.9.3 + * + * @type {boolean} + */ + let backgroundSelected = false; + + /** + * Public functions and properties. + * + * @since 1.8.1 + * + * @type {Object} + */ + const app = { + + /** + * Panel modules. + * + * @since 1.8.8 + * + * @type {Object} + */ + panels: {}, + + /** + * Start the engine. + * + * @since 1.8.1 + * + * @param {Object} blockOptions Block options. + */ + init( blockOptions ) { + el.$window = $( window ); + app.panels = blockOptions.panels; + app.education = blockOptions.education; + + app.initDefaults( blockOptions ); + app.registerBlock( blockOptions ); + + app.initJConfirm(); + + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 1.8.1 + */ + ready() { + app.events(); + }, + + /** + * Events. + * + * @since 1.8.1 + */ + events() { + el.$window + .on( 'wpformsFormSelectorEdit', _.debounce( app.blockEdit, 250 ) ) + .on( 'wpformsFormSelectorFormLoaded', app.formLoaded ); + }, + + /** + * Init jConfirm. + * + * @since 1.8.8 + */ + initJConfirm() { + // jquery-confirm defaults. + jconfirm.defaults = { + closeIcon: false, + backgroundDismiss: false, + escapeKey: true, + animationBounce: 1, + useBootstrap: false, + theme: 'modern', + boxWidth: '400px', + animateFromElement: false, + }; + }, + + /** + * Get a fresh list of forms via REST-API. + * + * @since 1.8.4 + * + * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-api-fetch/ + */ + async getForms() { + // If a fetch is already in progress, exit the function. + if ( isFetching ) { + return; + } + + // Set the flag to true indicating a fetch is in progress. + isFetching = true; + + try { + // Fetch forms. + formList = await wp.apiFetch( { + path: wpforms_gutenberg_form_selector.route_namespace + 'forms/', + method: 'GET', + cache: 'no-cache', + } ); + } catch ( error ) { + // eslint-disable-next-line no-console + console.error( error ); + } finally { + isFetching = false; + } + }, + + /** + * Open builder popup. + * + * @since 1.6.2 + * + * @param {string} clientID Block Client ID. + */ + openBuilderPopup( clientID ) { + if ( $.isEmptyObject( $popup ) ) { + const parent = $( '#wpwrap' ); + const canvasIframe = $( 'iframe[name="editor-canvas"]' ); + const isFseMode = Boolean( canvasIframe.length ); + const tmpl = isFseMode ? canvasIframe.contents().find( '#wpforms-gutenberg-popup' ) : $( '#wpforms-gutenberg-popup' ); + + parent.after( tmpl ); + + $popup = parent.siblings( '#wpforms-gutenberg-popup' ); + } + + const url = wpforms_gutenberg_form_selector.get_started_url, + $iframe = $popup.find( 'iframe' ); + + app.builderCloseButtonEvent( clientID ); + $iframe.attr( 'src', url ); + $popup.fadeIn(); + }, + + /** + * Close button (inside the form builder) click event. + * + * @since 1.8.3 + * + * @param {string} clientID Block Client ID. + */ + builderCloseButtonEvent( clientID ) { + $popup + .off( 'wpformsBuilderInPopupClose' ) + .on( 'wpformsBuilderInPopupClose', function( e, action, formId, formTitle ) { + if ( action !== 'saved' || ! formId ) { + return; + } + + // Insert a new block when a new form is created from the popup to update the form list and attributes. + const newBlock = wp.blocks.createBlock( 'wpforms/form-selector', { + formId: formId.toString(), // Expects string value, make sure we insert string. + } ); + + // eslint-disable-next-line camelcase + formList = [ { ID: formId, post_title: formTitle } ]; + + // Insert a new block. + wp.data.dispatch( 'core/block-editor' ).removeBlock( clientID ); + wp.data.dispatch( 'core/block-editor' ).insertBlocks( newBlock ); + } ); + }, + + /** + * Register block. + * + * @since 1.8.1 + * + * @param {Object} blockOptions Additional block options. + */ + // eslint-disable-next-line max-lines-per-function + registerBlock( blockOptions ) { + registerBlockType( 'wpforms/form-selector', { + title: strings.title, + description: strings.description, + icon: app.getIcon(), + keywords: strings.form_keywords, + category: 'widgets', + attributes: app.getBlockAttributes(), + supports: { + customClassName: app.hasForms(), + }, + example: { + attributes: { + preview: true, + }, + }, + // eslint-disable-next-line max-lines-per-function,complexity + edit( props ) { + const { attributes } = props; + const formOptions = app.getFormOptions(); + const handlers = app.getSettingsFieldsHandlers( props ); + + const [ isNotDisabled ] = useState( isPro && isLicenseActive ); // eslint-disable-line react-hooks/rules-of-hooks + const [ isProEnabled ] = useState( isPro ); // eslint-disable-line react-hooks/rules-of-hooks, no-unused-vars + const [ showBackgroundPreview, setShowBackgroundPreview ] = useState( blockOptions.panels.background._showBackgroundPreview( props ) ); // eslint-disable-line react-hooks/rules-of-hooks + const [ lastBgImage, setLastBgImage ] = useState( '' ); // eslint-disable-line react-hooks/rules-of-hooks + + const uiState = { + isNotDisabled, + isProEnabled, + showBackgroundPreview, + setShowBackgroundPreview, + lastBgImage, + setLastBgImage, + }; + + useEffect( () => { // eslint-disable-line react-hooks/rules-of-hooks + if ( attributes.formId ) { + setShowBackgroundPreview( + props.attributes.backgroundImage !== 'none' && + props.attributes.backgroundUrl && + props.attributes.backgroundUrl !== 'url()' + ); + } + }, [ backgroundSelected, props.attributes.backgroundImage, props.attributes.backgroundUrl ] ); // eslint-disable-line react-hooks/exhaustive-deps + + // Get block properties. + const blockProps = useBlockProps(); // eslint-disable-line react-hooks/rules-of-hooks, no-unused-vars + + // Store block clientId in attributes. + if ( ! attributes.clientId || ! app.isClientIdAttrUnique( props ) ) { + // We just want the client ID to update once. + // The block editor doesn't have a fixed block ID, so we need to get it on the initial load, but only once. + props.setAttributes( { clientId: props.clientId } ); + } + + // Main block settings. + const jsx = [ + app.jsxParts.getMainSettings( attributes, handlers, formOptions ), + ]; + + // Block preview picture. + if ( ! app.hasForms() ) { + jsx.push( + app.jsxParts.getEmptyFormsPreview( props ), + ); + + return
            { jsx }
            ; + } + + const sizeOptions = app.getSizeOptions(); + + // Show placeholder when form is not available (trashed, deleted etc.). + if ( attributes && attributes.formId && app.isFormAvailable( attributes.formId ) === false ) { + // Block placeholder (form selector). + jsx.push( + app.jsxParts.getBlockPlaceholder( props.attributes, handlers, formOptions ), + ); + + return
            { jsx }
            ; + } + + // Form style settings & block content. + if ( attributes.formId ) { + // Subscribe to block events. + app.maybeSubscribeToBlockEvents( props, handlers, blockOptions ); + + jsx.push( + app.jsxParts.getStyleSettings( props, handlers, sizeOptions, blockOptions, uiState ), + app.jsxParts.getBlockFormContent( props ) + ); + + if ( ! isCopyPasteGeneratedOnEdit ) { + handlers.updateCopyPasteContent(); + + isCopyPasteGeneratedOnEdit = true; + } + + el.$window.trigger( 'wpformsFormSelectorEdit', [ props ] ); + + return
            { jsx }
            ; + } + + // Block preview picture. + if ( attributes.preview ) { + jsx.push( + app.jsxParts.getBlockPreview(), + ); + + return
            { jsx }
            ; + } + + // Block placeholder (form selector). + jsx.push( + app.jsxParts.getBlockPlaceholder( props.attributes, handlers, formOptions ), + ); + + return
            { jsx }
            ; + }, + save: () => null, + } ); + }, + + /** + * Init default style settings. + * + * @since 1.8.1 + * @since 1.8.8 Added blockOptions parameter. + * + * @param {Object} blockOptions Additional block options. + */ + initDefaults( blockOptions = {} ) { + commonAttributes = { + ...commonAttributes, + ...blockOptions.getCommonAttributes(), + }; + customStylesHandlers = blockOptions.setStylesHandlers; + + [ 'formId', 'copyPasteJsonValue' ].forEach( ( key ) => delete defaultStyleSettings[ key ] ); + }, + + /** + * Check if the site has forms. + * + * @since 1.8.3 + * + * @return {boolean} Whether site has at least one form. + */ + hasForms() { + return formList.length > 0; + }, + + /** + * Check if form is available to be previewed. + * + * @since 1.8.9 + * + * @param {number} formId Form ID. + * + * @return {boolean} Whether form is available. + */ + isFormAvailable( formId ) { + return formList.find( ( { ID } ) => ID === Number( formId ) ) !== undefined; + }, + + /** + * Set triggerServerRender flag. + * + * @since 1.8.8 + * + * @param {boolean} $flag The value of the triggerServerRender flag. + */ + setTriggerServerRender( $flag ) { + triggerServerRender = Boolean( $flag ); + }, + + /** + * Maybe subscribe to block events. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties. + * @param {Object} subscriberHandlers Subscriber block event handlers. + * @param {Object} subscriberBlockOptions Subscriber block options. + */ + maybeSubscribeToBlockEvents( subscriberProps, subscriberHandlers, subscriberBlockOptions ) { + const id = subscriberProps.clientId; + + // Unsubscribe from block events. + // This is needed to avoid multiple subscriptions when the block is re-rendered. + el.$window + .off( 'wpformsFormSelectorDeleteTheme.' + id ) + .off( 'wpformsFormSelectorUpdateTheme.' + id ) + .off( 'wpformsFormSelectorSetTheme.' + id ); + + // Subscribe to block events. + el.$window + .on( 'wpformsFormSelectorDeleteTheme.' + id, app.subscriberDeleteTheme( subscriberProps, subscriberBlockOptions ) ) + .on( 'wpformsFormSelectorUpdateTheme.' + id, app.subscriberUpdateTheme( subscriberProps, subscriberBlockOptions ) ) + .on( 'wpformsFormSelectorSetTheme.' + id, app.subscriberSetTheme( subscriberProps, subscriberBlockOptions ) ); + }, + + /** + * Block event `wpformsFormSelectorDeleteTheme` handler. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties + * @param {Object} subscriberBlockOptions Subscriber block options. + * + * @return {Function} Event handler. + */ + subscriberDeleteTheme( subscriberProps, subscriberBlockOptions ) { + return function( e, themeSlug, triggerProps ) { + if ( subscriberProps.clientId === triggerProps.clientId ) { + return; + } + + if ( subscriberProps?.attributes?.theme !== themeSlug ) { + return; + } + + if ( ! subscriberBlockOptions?.panels?.themes ) { + return; + } + + // Reset theme to default one. + subscriberBlockOptions.panels.themes.setBlockTheme( subscriberProps, 'default' ); + }; + }, + + /** + * Block event `wpformsFormSelectorDeleteTheme` handler. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties + * @param {Object} subscriberBlockOptions Subscriber block options. + * + * @return {Function} Event handler. + */ + subscriberUpdateTheme( subscriberProps, subscriberBlockOptions ) { + return function( e, themeSlug, themeData, triggerProps ) { + if ( subscriberProps.clientId === triggerProps.clientId ) { + return; + } + + if ( subscriberProps?.attributes?.theme !== themeSlug ) { + return; + } + + if ( ! subscriberBlockOptions?.panels?.themes ) { + return; + } + + // Reset theme to default one. + subscriberBlockOptions.panels.themes.setBlockTheme( subscriberProps, themeSlug ); + }; + }, + + /** + * Block event `wpformsFormSelectorSetTheme` handler. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties + * @param {Object} subscriberBlockOptions Subscriber block options. + * + * @return {Function} Event handler. + */ + subscriberSetTheme( subscriberProps, subscriberBlockOptions ) { + // noinspection JSUnusedLocalSymbols + return function( e, block, themeSlug, triggerProps ) { // eslint-disable-line no-unused-vars + if ( subscriberProps.clientId === triggerProps.clientId ) { + return; + } + + if ( ! subscriberBlockOptions?.panels?.themes ) { + return; + } + + // Set theme. + app.onSetTheme( subscriberProps ); + }; + }, + + /** + * Block JSX parts. + * + * @since 1.8.1 + * + * @type {Object} + */ + jsxParts: { + + /** + * Get main settings JSX code. + * + * @since 1.8.1 + * + * @param {Object} attributes Block attributes. + * @param {Object} handlers Block event handlers. + * @param {Object} formOptions Form selector options. + * + * @return {JSX.Element} Main setting JSX code. + */ + getMainSettings( attributes, handlers, formOptions ) { // eslint-disable-line max-lines-per-function + if ( ! app.hasForms() ) { + return app.jsxParts.printEmptyFormsNotice( attributes.clientId ); + } + + return ( + + + handlers.attrChange( 'formId', value ) } + /> + { attributes.formId ? ( + <> +

            + + { strings.form_edit } + + { isPro && isLicenseActive && ( + <> +   |   + { strings.form_entries } + + ) } +

            + handlers.attrChange( 'displayTitle', value ) } + /> + handlers.attrChange( 'displayDesc', value ) } + /> + + ) : null } +

            + { strings.panel_notice_head } + { strings.panel_notice_text } + { strings.panel_notice_link_text } +

            +
            +
            + ); + }, + + /** + * Print empty forms notice. + * + * @since 1.8.3 + * + * @param {string} clientId Block client ID. + * + * @return {JSX.Element} Field styles JSX code. + */ + printEmptyFormsNotice( clientId ) { + return ( + + +

            + { __( 'You haven’t created a form, yet!', 'wpforms-lite' ) } + { __( 'What are you waiting for?', 'wpforms-lite' ) } +

            + +
            +
            + ); + }, + + /** + * Get Label styles JSX code. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {Object} sizeOptions Size selector options. + * + * @return {Object} Label styles JSX code. + */ + getLabelStyles( props, handlers, sizeOptions ) { + return ( + + handlers.styleAttrChange( 'labelSize', value ) } + /> + +
            +
            { strings.colors }
            + handlers.styleAttrChange( 'labelColor', value ), + label: strings.label, + }, + { + value: props.attributes.labelSublabelColor, + onChange: ( value ) => handlers.styleAttrChange( 'labelSublabelColor', value ), + label: strings.sublabel_hints.replace( '&', '&' ), + }, + { + value: props.attributes.labelErrorColor, + onChange: ( value ) => handlers.styleAttrChange( 'labelErrorColor', value ), + label: strings.error_message, + }, + ] } + /> +
            +
            + ); + }, + + /** + * Get Page Indicator styles JSX code. + * + * @since 1.8.7 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * + * @return {Object} Page Indicator styles JSX code. + */ + getPageIndicatorStyles( props, handlers ) { // eslint-disable-line complexity + const hasPageBreak = app.hasPageBreak( formList, props.attributes.formId ); + const hasRating = app.hasRating( formList, props.attributes.formId ); + + if ( ! hasPageBreak && ! hasRating ) { + return null; + } + + let label = ''; + if ( hasPageBreak && hasRating ) { + label = `${ strings.page_break } / ${ strings.rating }`; + } else if ( hasPageBreak ) { + label = strings.page_break; + } else if ( hasRating ) { + label = strings.rating; + } + + return ( + +
            +
            { strings.colors }
            + handlers.styleAttrChange( 'pageBreakColor', value ), + label, + }, + ] } /> +
            +
            + ); + }, + + /** + * Get style settings JSX code. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {Object} sizeOptions Size selector options. + * @param {Object} blockOptions Block options loaded from external modules. + * @param {Object} uiState UI state. + * + * @return {Object} Inspector controls JSX code. + */ + getStyleSettings( props, handlers, sizeOptions, blockOptions, uiState ) { + return ( + + { blockOptions.getThemesPanel( props, app, blockOptions.stockPhotos ) } + { blockOptions.getFieldStyles( props, handlers, sizeOptions, app ) } + { app.jsxParts.getLabelStyles( props, handlers, sizeOptions ) } + { blockOptions.getButtonStyles( props, handlers, sizeOptions, app ) } + { blockOptions.getContainerStyles( props, handlers, app, uiState ) } + { blockOptions.getBackgroundStyles( props, handlers, app, blockOptions.stockPhotos, uiState ) } + { app.jsxParts.getPageIndicatorStyles( props, handlers ) } + + ); + }, + + /** + * Get block content JSX code. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * + * @return {JSX.Element} Block content JSX code. + */ + getBlockFormContent( props ) { + if ( triggerServerRender ) { + return ( + + ); + } + + const clientId = props.clientId; + const block = app.getBlockContainer( props ); + + // In the case of empty content, use server side renderer. + // This happens when the block is duplicated or converted to a reusable block. + if ( ! block?.innerHTML ) { + triggerServerRender = true; + + return app.jsxParts.getBlockFormContent( props ); + } + + blocks[ clientId ] = blocks[ clientId ] || {}; + blocks[ clientId ].blockHTML = block.innerHTML; + blocks[ clientId ].loadedFormId = props.attributes.formId; + + return ( + +
            + + ); + }, + + /** + * Get block preview JSX code. + * + * @since 1.8.1 + * + * @return {JSX.Element} Block preview JSX code. + */ + getBlockPreview() { + return ( + + + + ); + }, + + /** + * Get block empty JSX code. + * + * @since 1.8.3 + * + * @param {Object} props Block properties. + * @return {JSX.Element} Block empty JSX code. + */ + getEmptyFormsPreview( props ) { + const clientId = props.clientId; + + return ( + +
            + +

            + { + createInterpolateElement( + __( + 'You can use WPForms to build contact forms, surveys, payment forms, and more with just a few clicks.', + 'wpforms-lite' + ), + { + b: , + } + ) + } +

            + +

            + { + createInterpolateElement( + __( + 'Need some help? Check out our comprehensive guide.', + 'wpforms-lite' + ), + { + // eslint-disable-next-line jsx-a11y/anchor-has-content + a: , + } + ) + } +

            + + { /* Template for popup with builder iframe */ } +
            + +
            +
            +
            + ); + }, + + /** + * Get block placeholder (form selector) JSX code. + * + * @since 1.8.1 + * + * @param {Object} attributes Block attributes. + * @param {Object} handlers Block event handlers. + * @param {Object} formOptions Form selector options. + * + * @return {JSX.Element} Block placeholder JSX code. + */ + getBlockPlaceholder( attributes, handlers, formOptions ) { + const isFormNotAvailable = attributes.formId && ! app.isFormAvailable( attributes.formId ); + + return ( + + + { isFormNotAvailable && ( +

            + { strings.form_not_available_message } +

            + ) } + handlers.attrChange( 'formId', value ) } + /> +
            + ); + }, + }, + + /** + * Determine if the form has a Page Break field. + * + * @since 1.8.7 + * + * @param {Object} forms The forms' data object. + * @param {number|string} formId Form ID. + * + * @return {boolean} True when the form has a Page Break field, false otherwise. + */ + hasPageBreak( forms, formId ) { + const currentForm = forms.find( ( form ) => parseInt( form.ID, 10 ) === parseInt( formId, 10 ) ); + + if ( ! currentForm.post_content ) { + return false; + } + + const fields = JSON.parse( currentForm.post_content )?.fields; + + return Object.values( fields ).some( ( field ) => field.type === 'pagebreak' ); + }, + + hasRating( forms, formId ) { + const currentForm = forms.find( ( form ) => parseInt( form.ID, 10 ) === parseInt( formId, 10 ) ); + + if ( ! currentForm.post_content || ! isPro || ! isLicenseActive ) { + return false; + } + + const fields = JSON.parse( currentForm.post_content )?.fields; + + return Object.values( fields ).some( ( field ) => field.type === 'rating' ); + }, + + /** + * Get Style Settings panel class. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * @param {string} panel Panel name. + * + * @return {string} Style Settings panel class. + */ + getPanelClass( props, panel = '' ) { + let cssClass = 'wpforms-gutenberg-panel wpforms-block-settings-' + props.clientId; + + if ( ! app.isFullStylingEnabled() ) { + cssClass += ' disabled_panel'; + } + + // Restrict styling panel for non-admins. + if ( ! ( isAdmin || panel === 'themes' ) ) { + cssClass += ' wpforms-gutenberg-panel-restricted'; + } + + return cssClass; + }, + + /** + * Get color panel settings CSS class. + * + * @since 1.8.8 + * + * @param {string} borderStyle Border style value. + * + * @return {string} Style Settings panel class. + */ + getColorPanelClass( borderStyle ) { + let cssClass = 'wpforms-gutenberg-form-selector-color-panel'; + + if ( borderStyle === 'none' ) { + cssClass += ' wpforms-gutenberg-form-selector-border-color-disabled'; + } + + return cssClass; + }, + + /** + * Determine whether the full styling is enabled. + * + * @since 1.8.1 + * + * @return {boolean} Whether the full styling is enabled. + */ + isFullStylingEnabled() { + return wpforms_gutenberg_form_selector.is_modern_markup && wpforms_gutenberg_form_selector.is_full_styling; + }, + + /** + * Determine whether the block has lead forms enabled. + * + * @since 1.9.0 + * + * @param {Object} block Gutenberg block + * + * @return {boolean} Whether the block has lead forms enabled + */ + isLeadFormsEnabled( block ) { + if ( ! block ) { + return false; + } + + const $form = $( block.querySelector( '.wpforms-container' ) ); + + return $form.hasClass( 'wpforms-lead-forms-container' ); + }, + + /** + * Get block container DOM element. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * + * @return {Element} Block container. + */ + getBlockContainer( props ) { + const blockSelector = `#block-${ props.clientId } > div`; + let block = document.querySelector( blockSelector ); + + // For FSE / Gutenberg plugin, we need to take a look inside the iframe. + if ( ! block ) { + const editorCanvas = document.querySelector( 'iframe[name="editor-canvas"]' ); + + block = editorCanvas?.contentWindow.document.querySelector( blockSelector ); + } + + return block; + }, + + /** + * Get form container in Block Editor. + * + * @since 1.9.3 + * + * @param {number} formId Form ID. + * + * @return {Element|null} Form container. + */ + getFormBlock( formId ) { + // First, try to find the iframe for blocks version 3. + const editorCanvas = document.querySelector( 'iframe[name="editor-canvas"]' ); + + // If the iframe is found, try to find the form. + return editorCanvas?.contentWindow.document.querySelector( `#wpforms-${ formId }` ) || $( `#wpforms-${ formId }` ); + }, + + /** + * Update CSS variable(s) value(s) of the given attribute for given container on the preview. + * + * @since 1.8.8 + * + * @param {string} attribute Style attribute: field-size, label-size, button-size, etc. + * @param {string} value Property new value. + * @param {Element} container Form container. + * @param {Object} props Block properties. + */ + updatePreviewCSSVarValue( attribute, value, container, props ) { // eslint-disable-line complexity, max-lines-per-function + if ( ! container || ! attribute ) { + return; + } + + const property = attribute.replace( + /[A-Z]/g, + ( letter ) => `-${ letter.toLowerCase() }` + ); + + if ( typeof customStylesHandlers[ property ] === 'function' ) { + customStylesHandlers[ property ]( container, value ); + + return; + } + + switch ( property ) { + case 'field-size': + case 'label-size': + case 'button-size': + case 'container-shadow-size': + for ( const key in sizes[ property ][ value ] ) { + container.style.setProperty( + `--wpforms-${ property }-${ key }`, + sizes[ property ][ value ][ key ], + ); + } + + break; + case 'field-border-style': + if ( value === 'none' ) { + app.toggleFieldBorderNoneCSSVarValue( container, true ); + } else { + app.toggleFieldBorderNoneCSSVarValue( container, false ); + container.style.setProperty( `--wpforms-${ property }`, value ); + } + + break; + case 'button-background-color': + app.maybeUpdateAccentColor( props.attributes.buttonBorderColor, value, container ); + value = app.maybeSetButtonAltBackgroundColor( value, props.attributes.buttonBorderColor, container ); + app.maybeSetButtonAltTextColor( props.attributes.buttonTextColor, value, props.attributes.buttonBorderColor, container ); + container.style.setProperty( `--wpforms-${ property }`, value ); + + break; + case 'button-border-color': + app.maybeUpdateAccentColor( value, props.attributes.buttonBackgroundColor, container ); + app.maybeSetButtonAltTextColor( props.attributes.buttonTextColor, props.attributes.buttonBackgroundColor, value, container ); + container.style.setProperty( `--wpforms-${ property }`, value ); + + break; + case 'button-text-color': + app.maybeSetButtonAltTextColor( value, props.attributes.buttonBackgroundColor, props.attributes.buttonBorderColor, container ); + container.style.setProperty( `--wpforms-${ property }`, value ); + + break; + default: + container.style.setProperty( `--wpforms-${ property }`, value ); + container.style.setProperty( `--wpforms-${ property }-spare`, value ); + } + }, + + /** + * Set/unset field border vars in case of border-style is none. + * + * @since 1.8.8 + * + * @param {Object} container Form container. + * @param {boolean} set True when set, false when unset. + */ + toggleFieldBorderNoneCSSVarValue( container, set ) { + const cont = container.querySelector( 'form' ); + + if ( set ) { + cont.style.setProperty( '--wpforms-field-border-style', 'solid' ); + cont.style.setProperty( '--wpforms-field-border-size', '1px' ); + cont.style.setProperty( '--wpforms-field-border-color', 'transparent' ); + + return; + } + + cont.style.setProperty( '--wpforms-field-border-style', null ); + cont.style.setProperty( '--wpforms-field-border-size', null ); + cont.style.setProperty( '--wpforms-field-border-color', null ); + }, + + /** + * Maybe set the button's alternative background color. + * + * @since 1.8.8 + * + * @param {string} value Attribute value. + * @param {string} buttonBorderColor Button border color. + * @param {Object} container Form container. + * + * @return {string|*} New background color. + */ + maybeSetButtonAltBackgroundColor( value, buttonBorderColor, container ) { + // Setting css property value to child `form` element overrides the parent property value. + const form = container.querySelector( 'form' ); + + form.style.setProperty( '--wpforms-button-background-color-alt', value ); + + if ( WPFormsUtils.cssColorsUtils.isTransparentColor( value ) ) { + return WPFormsUtils.cssColorsUtils.isTransparentColor( buttonBorderColor ) ? defaultStyleSettings.buttonBackgroundColor : buttonBorderColor; + } + + return value; + }, + + /** + * Maybe set the button's alternative text color. + * + * @since 1.8.8 + * + * @param {string} value Attribute value. + * @param {string} buttonBackgroundColor Button background color. + * @param {string} buttonBorderColor Button border color. + * @param {Object} container Form container. + */ + maybeSetButtonAltTextColor( value, buttonBackgroundColor, buttonBorderColor, container ) { + const form = container.querySelector( 'form' ); + + let altColor = null; + + value = value.toLowerCase(); + + if ( + WPFormsUtils.cssColorsUtils.isTransparentColor( value ) || + value === buttonBackgroundColor || + ( + WPFormsUtils.cssColorsUtils.isTransparentColor( buttonBackgroundColor ) && + value === buttonBorderColor + ) + ) { + altColor = WPFormsUtils.cssColorsUtils.getContrastColor( buttonBackgroundColor ); + } + + container.style.setProperty( `--wpforms-button-text-color-alt`, value ); + form.style.setProperty( `--wpforms-button-text-color-alt`, altColor ); + }, + + /** + * Maybe update accent color. + * + * @since 1.8.8 + * + * @param {string} color Color value. + * @param {string} buttonBackgroundColor Button background color. + * @param {Object} container Form container. + */ + maybeUpdateAccentColor( color, buttonBackgroundColor, container ) { + // Setting css property value to child `form` element overrides the parent property value. + const form = container.querySelector( 'form' ); + + // Fallback to default color if the border color is transparent. + color = WPFormsUtils.cssColorsUtils.isTransparentColor( color ) ? defaultStyleSettings.buttonBackgroundColor : color; + + if ( WPFormsUtils.cssColorsUtils.isTransparentColor( buttonBackgroundColor ) ) { + form.style.setProperty( '--wpforms-button-background-color-alt', 'rgba( 0, 0, 0, 0 )' ); + form.style.setProperty( '--wpforms-button-background-color', color ); + } else { + container.style.setProperty( '--wpforms-button-background-color-alt', buttonBackgroundColor ); + form.style.setProperty( '--wpforms-button-background-color-alt', null ); + form.style.setProperty( '--wpforms-button-background-color', null ); + } + }, + + /** + * Get settings fields event handlers. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * + * @return {Object} Object that contains event handlers for the settings fields. + */ + getSettingsFieldsHandlers( props ) { // eslint-disable-line max-lines-per-function + return { + /** + * Field style attribute change event handler. + * + * @since 1.8.1 + * + * @param {string} attribute Attribute name. + * @param {string} value New attribute value. + */ + styleAttrChange( attribute, value ) { + const block = app.getBlockContainer( props ), + container = block.querySelector( `#wpforms-${ props.attributes.formId }` ), + setAttr = {}; + + // Unset the color means setting the transparent color. + if ( attribute.includes( 'Color' ) ) { + value = value ?? 'rgba( 0, 0, 0, 0 )'; + } + + app.updatePreviewCSSVarValue( attribute, value, container, props ); + + setAttr[ attribute ] = value; + + app.setBlockRuntimeStateVar( props.clientId, 'prevAttributesState', props.attributes ); + props.setAttributes( setAttr ); + + triggerServerRender = false; + + this.updateCopyPasteContent(); + + app.panels.themes.updateCustomThemeAttribute( attribute, value, props ); + + this.maybeToggleDropdown( props, attribute ); + + // Trigger event for developers. + el.$window.trigger( 'wpformsFormSelectorStyleAttrChange', [ block, props, attribute, value ] ); + }, + + /** + * Handles the toggling of the dropdown menu's visibility. + * + * @since 1.8.8 + * + * @param {Object} props The block properties. + * @param {string} attribute The name of the attribute being changed. + */ + maybeToggleDropdown( props, attribute ) { // eslint-disable-line no-shadow + const formId = props.attributes.formId; + const menu = document.querySelector( `#wpforms-form-${ formId } .choices__list.choices__list--dropdown` ); + const classicMenu = document.querySelector( `#wpforms-form-${ formId } .wpforms-field-select-style-classic select` ); + + if ( attribute === 'fieldMenuColor' ) { + if ( menu ) { + menu.classList.add( 'is-active' ); + menu.parentElement.classList.add( 'is-open' ); + } else { + this.showClassicMenu( classicMenu ); + } + + clearTimeout( dropdownTimeout ); + + dropdownTimeout = setTimeout( () => { + const toClose = document.querySelector( `#wpforms-form-${ formId } .choices__list.choices__list--dropdown` ); + + if ( toClose ) { + toClose.classList.remove( 'is-active' ); + toClose.parentElement.classList.remove( 'is-open' ); + } else { + this.hideClassicMenu( document.querySelector( `#wpforms-form-${ formId } .wpforms-field-select-style-classic select` ) ); + } + }, 5000 ); + } else if ( menu ) { + menu.classList.remove( 'is-active' ); + } else { + this.hideClassicMenu( classicMenu ); + } + }, + + /** + * Shows the classic menu. + * + * @since 1.8.8 + * + * @param {Object} classicMenu The classic menu. + */ + showClassicMenu( classicMenu ) { + if ( ! classicMenu ) { + return; + } + + classicMenu.size = 2; + classicMenu.style.cssText = 'padding-top: 40px; padding-inline-end: 0; padding-inline-start: 0; position: relative;'; + classicMenu.querySelectorAll( 'option' ).forEach( ( option ) => { + option.style.cssText = 'border-left: 1px solid #8c8f94; border-right: 1px solid #8c8f94; padding: 0 10px; z-index: 999999; position: relative;'; + } ); + classicMenu.querySelector( 'option:last-child' ).style.cssText = 'border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; padding: 0 10px; border-left: 1px solid #8c8f94; border-right: 1px solid #8c8f94; border-bottom: 1px solid #8c8f94; z-index: 999999; position: relative;'; + }, + + /** + * Hides the classic menu. + * + * @since 1.8.8 + * + * @param {Object} classicMenu The classic menu. + */ + hideClassicMenu( classicMenu ) { + if ( ! classicMenu ) { + return; + } + + classicMenu.size = 0; + classicMenu.style.cssText = 'padding-top: 0; padding-inline-end: 24px; padding-inline-start: 12px; position: relative;'; + classicMenu.querySelectorAll( 'option' ).forEach( ( option ) => { + option.style.cssText = 'border: none;'; + } ); + }, + + /** + * Field regular attribute change event handler. + * + * @since 1.8.1 + * + * @param {string} attribute Attribute name. + * @param {string} value New attribute value. + */ + attrChange( attribute, value ) { + const setAttr = {}; + + setAttr[ attribute ] = value; + + app.setBlockRuntimeStateVar( props.clientId, 'prevAttributesState', props.attributes ); + props.setAttributes( setAttr ); + + triggerServerRender = true; + + this.updateCopyPasteContent(); + }, + + /** + * Update content of the "Copy/Paste" fields. + * + * @since 1.8.1 + */ + updateCopyPasteContent() { + const content = {}; + const atts = wp.data.select( 'core/block-editor' ).getBlockAttributes( props.clientId ); + + for ( const key in defaultStyleSettings ) { + content[ key ] = atts[ key ]; + } + + props.setAttributes( { copyPasteJsonValue: JSON.stringify( content ) } ); + }, + + /** + * Paste settings handler. + * + * @since 1.8.1 + * + * @param {string} value New attribute value. + */ + pasteSettings( value ) { + value = value.trim(); + + const pasteAttributes = app.parseValidateJson( value ); + + if ( ! pasteAttributes ) { + if ( value ) { + wp.data.dispatch( 'core/notices' ).createErrorNotice( + strings.copy_paste_error, + { id: 'wpforms-json-parse-error' } + ); + } + + this.updateCopyPasteContent(); + + return; + } + + pasteAttributes.copyPasteJsonValue = value; + + const themeSlug = app.panels.themes.maybeCreateCustomThemeFromAttributes( pasteAttributes ); + + app.setBlockRuntimeStateVar( props.clientId, 'prevAttributesState', props.attributes ); + props.setAttributes( pasteAttributes ); + app.panels.themes.setBlockTheme( props, themeSlug ); + + triggerServerRender = false; + }, + }; + }, + + /** + * Parse and validate JSON string. + * + * @since 1.8.1 + * + * @param {string} value JSON string. + * + * @return {boolean|object} Parsed JSON object OR false on error. + */ + parseValidateJson( value ) { + if ( typeof value !== 'string' ) { + return false; + } + + let atts; + + try { + atts = JSON.parse( value.trim() ); + } catch ( error ) { + atts = false; + } + + return atts; + }, + + /** + * Get WPForms icon DOM element. + * + * @since 1.8.1 + * + * @return {DOM.element} WPForms icon DOM element. + */ + getIcon() { + return createElement( + 'svg', + { width: 20, height: 20, viewBox: '0 0 612 612', className: 'dashicon' }, + createElement( + 'path', + { + fill: 'currentColor', + d: 'M544,0H68C30.445,0,0,30.445,0,68v476c0,37.556,30.445,68,68,68h476c37.556,0,68-30.444,68-68V68 C612,30.445,581.556,0,544,0z M464.44,68L387.6,120.02L323.34,68H464.44z M288.66,68l-64.26,52.02L147.56,68H288.66z M544,544H68 V68h22.1l136,92.14l79.9-64.6l79.56,64.6l136-92.14H544V544z M114.24,263.16h95.88v-48.28h-95.88V263.16z M114.24,360.4h95.88 v-48.62h-95.88V360.4z M242.76,360.4h255v-48.62h-255V360.4L242.76,360.4z M242.76,263.16h255v-48.28h-255V263.16L242.76,263.16z M368.22,457.3h129.54V408H368.22V457.3z', + }, + ), + ); + }, + + /** + * Get WPForms blocks. + * + * @since 1.8.8 + * + * @return {Array} Blocks array. + */ + getWPFormsBlocks() { + const wpformsBlocks = wp.data.select( 'core/block-editor' ).getBlocks(); + + return wpformsBlocks.filter( ( props ) => { + return props.name === 'wpforms/form-selector'; + } ); + }, + + /** + * Get WPForms blocks. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * + * @return {Object} Block attributes. + */ + isClientIdAttrUnique( props ) { + const wpformsBlocks = app.getWPFormsBlocks(); + + for ( const key in wpformsBlocks ) { + // Skip the current block. + if ( wpformsBlocks[ key ].clientId === props.clientId ) { + continue; + } + + if ( wpformsBlocks[ key ].attributes.clientId === props.attributes.clientId ) { + return false; + } + } + + return true; + }, + + /** + * Get block attributes. + * + * @since 1.8.1 + * + * @return {Object} Block attributes. + */ + getBlockAttributes() { + return commonAttributes; + }, + + /** + * Get block runtime state variable. + * + * @since 1.8.8 + * + * @param {string} clientId Block client ID. + * @param {string} varName Block runtime variable name. + * + * @return {*} Block runtime state variable value. + */ + getBlockRuntimeStateVar( clientId, varName ) { + return blocks[ clientId ]?.[ varName ]; + }, + + /** + * Set block runtime state variable value. + * + * @since 1.8.8 + * + * @param {string} clientId Block client ID. + * @param {string} varName Block runtime state key. + * @param {*} value State variable value. + * + * @return {boolean} True on success. + */ + setBlockRuntimeStateVar( clientId, varName, value ) { // eslint-disable-line complexity + if ( ! clientId || ! varName ) { + return false; + } + + blocks[ clientId ] = blocks[ clientId ] || {}; + blocks[ clientId ][ varName ] = value; + + // Prevent referencing to object. + if ( typeof value === 'object' && ! Array.isArray( value ) && value !== null ) { + blocks[ clientId ][ varName ] = { ...value }; + } + + return true; + }, + + /** + * Get form selector options. + * + * @since 1.8.1 + * + * @return {Array} Form options. + */ + getFormOptions() { + const formOptions = formList.map( ( value ) => ( + { value: value.ID, label: value.post_title } + ) ); + + formOptions.unshift( { value: '', label: strings.form_select } ); + + return formOptions; + }, + + /** + * Get size selector options. + * + * @since 1.8.1 + * + * @return {Array} Size options. + */ + getSizeOptions() { + return [ + { + label: strings.small, + value: 'small', + }, + { + label: strings.medium, + value: 'medium', + }, + { + label: strings.large, + value: 'large', + }, + ]; + }, + + /** + * Event `wpformsFormSelectorEdit` handler. + * + * @since 1.8.1 + * + * @param {Object} e Event object. + * @param {Object} props Block properties. + */ + blockEdit( e, props ) { + const block = app.getBlockContainer( props ); + + if ( ! block?.dataset ) { + return; + } + + app.initLeadFormSettings( block ); + }, + + /** + * Init Lead Form Settings panels. + * + * @since 1.8.1 + * + * @param {Element} block Block element. + * @param {Object} block.dataset Block element. + */ + initLeadFormSettings( block ) { + if ( ! app.isFullStylingEnabled() ) { + return; + } + + if ( ! block?.dataset?.block ) { + return; + } + + const clientId = block.dataset.block; + const $panel = $( `.wpforms-block-settings-${ clientId }` ); + const isLeadFormsEnabled = app.isLeadFormsEnabled( block ); + + if ( isLeadFormsEnabled ) { + $panel + .addClass( 'disabled_panel' ) + .find( '.wpforms-gutenberg-panel-notice.wpforms-lead-form-notice' ) + .css( 'display', 'block' ); + + $panel + .find( '.wpforms-gutenberg-panel-notice.wpforms-use-modern-notice' ) + .css( 'display', 'none' ); + + return; + } + + $panel + .removeClass( 'disabled_panel' ) + .removeClass( 'wpforms-lead-forms-enabled' ) + .find( '.wpforms-gutenberg-panel-notice.wpforms-lead-form-notice' ) + .css( 'display', 'none' ); + + $panel + .find( '.wpforms-gutenberg-panel-notice.wpforms-use-modern-notice' ) + .css( 'display', null ); + }, + + /** + * Event `wpformsFormSelectorFormLoaded` handler. + * + * @since 1.8.1 + * + * @param {Object} e Event object. + */ + formLoaded( e ) { + app.initLeadFormSettings( e.detail.block ); + app.updateAccentColors( e.detail ); + app.loadChoicesJS( e.detail ); + app.initRichTextField( e.detail.formId ); + app.initRepeaterField( e.detail.formId ); + + $( e.detail.block ) + .off( 'click' ) + .on( 'click', app.blockClick ); + }, + + /** + * Click on the block event handler. + * + * @since 1.8.1 + * + * @param {Object} e Event object. + */ + blockClick( e ) { + app.initLeadFormSettings( e.currentTarget ); + }, + + /** + * Update accent colors of some fields in GB block in Modern Markup mode. + * + * @since 1.8.1 + * + * @param {Object} detail Event details object. + */ + updateAccentColors( detail ) { + if ( + ! wpforms_gutenberg_form_selector.is_modern_markup || + ! window.WPForms?.FrontendModern || + ! detail?.block + ) { + return; + } + + const $form = $( detail.block.querySelector( `#wpforms-${ detail.formId }` ) ), + FrontendModern = window.WPForms.FrontendModern; + + FrontendModern.updateGBBlockPageIndicatorColor( $form ); + FrontendModern.updateGBBlockIconChoicesColor( $form ); + FrontendModern.updateGBBlockRatingColor( $form ); + }, + + /** + * Init Modern style Dropdown fields (' + + '', + icon: 'fa fa-info-circle', + type: 'blue', + buttons: { + confirm: { + text: wpforms_admin.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + const modal = this; + const tokenField = modal.$content.find( '#wpforms-square-personal-access-token' ); + const errorMsg = modal.$content.find( '.error' ); + const token = tokenField.val().trim(); + const title = modal.$title; + + // Disable the button to prevent multiple clicks. + $el.webhookConnectBtn.addClass( 'inactive' ); + + // Reset error message before validation + errorMsg.hide().text( '' ); + + if ( token === '' ) { + errorMsg.text( wpforms_admin.square.token_is_required ).show(); + return false; // Prevent modal from closing. + } + + // Show loading indicator. + modal.buttons.confirm.setText( wpforms_admin.loading ); + modal.buttons.confirm.disable(); + + // Call API. + app.createWebhook( token ) + .then( ( response ) => { + modal.setContent( '

            ' + response.data.message + '

            ' ); + // Hide OK button and rename Cancel to Close. + modal.buttons.confirm.hide(); + title.text( '' ).hide(); + modal.buttons.cancel.setText( wpforms_admin.close ); + + // Ensure user can manually close the modal. + modal.buttons.cancel.action = function() { + window.location.reload(); + }; + } ) + .catch( ( responseError ) => { + errorMsg.text( responseError.data.message ).show(); + + // Re-enable confirm button for retrying. + modal.buttons.confirm.setText( wpforms_admin.ok ); + modal.buttons.confirm.enable(); + } ); + + return false; // Prevent modal from closing immediately. + }, + }, + cancel: { + text: wpforms_admin.cancel, + action() { + // Re-enable the button. + $el.webhookConnectBtn.removeClass( 'inactive' ); + + this.close(); + }, + }, + }, + } ); + }, + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsSettingsSquare.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/settings-square.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/settings-square.min.js new file mode 100755 index 00000000..ec11bdd4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/square/admin/settings-square.min.js @@ -0,0 +1 @@ +let WPFormsSettingsSquare=window.WPFormsSettingsSquare||((a,r)=>{let s={sandboxModeCheckbox:r("#wpforms-setting-square-sandbox-mode"),sandboxConnectionStatusBlock:r("#wpforms-setting-row-square-connection-status-sandbox"),productionConnectionStatusBlock:r("#wpforms-setting-row-square-connection-status-production"),sandboxLocationBlock:r("#wpforms-setting-row-square-location-id-sandbox"),sandboxLocationStatusBlock:r("#wpforms-setting-row-square-location-status-sandbox"),productionLocationBlock:r("#wpforms-setting-row-square-location-id-production"),productionLocationStatusBlock:r("#wpforms-setting-row-square-location-status-production"),refreshBtn:r(".wpforms-square-refresh-btn"),copyButton:r("#wpforms-setting-row-square-webhooks-endpoint-set .wpforms-copy-to-clipboard"),webhooksEnableCheckbox:r("#wpforms-setting-square-webhooks-enabled"),webhookEndpointUrl:r("input#wpforms-square-webhook-endpoint-url"),webhookMethod:r('input[name="square-webhooks-communication"]'),webhookCommunicationStatusNotice:r("#wpforms-setting-row-square-webhooks-communication-status"),webhookConnectBtn:r("#wpforms-setting-square-webhooks-connect"),webhookConnectRow:r("#wpforms-setting-row-square-webhooks-connect"),webhookConnectStatusRow:r("#wpforms-setting-row-square-webhooks-connect-status-production, #wpforms-setting-row-square-webhooks-connect-status-sandbox")},c={init(){r(c.ready)},ready(){c.events()},events(){s.sandboxModeCheckbox.on("change",c.credentialsFieldsDisplay),s.refreshBtn.on("click",c.refreshTokensCallback),s.webhooksEnableCheckbox.on("change",c.webhooksEnableCallback),s.webhookConnectBtn.on("click",c.modals.displayWebhookConfigPopup),s.webhookMethod.on("change",c.updateWebhookEndpointUrl),s.copyButton.on("click",function(o){wpf.copyValueToClipboard(o,r(this),s.webhookEndpointUrl)})},updateWebhookEndpointUrl(){var o=s.webhookMethod.filter(":checked").val(),o=wpforms_admin.square.webhook_urls[o];s.webhookEndpointUrl.val(o),s.webhookCommunicationStatusNotice.removeClass("wpforms-hide")},webhooksEnableCallback(){s.webhookConnectRow.toggleClass("wpforms-hide",!r(this).is(":checked")),s.webhookConnectStatusRow.toggleClass("wpforms-hide",!r(this).is(":checked"))},createWebhook(o){return new Promise((e,t)=>{r.ajax({url:wpforms_admin.ajax_url,type:"post",dataType:"json",data:{action:"wpforms_square_create_webhook",nonce:wpforms_admin.nonce,token:o},success(o){(o.success?e:t)(o)},error(){t({success:!1,message:"An error occurred."})}})})},refreshTokensCallback(){let e=r(this),o=e.outerWidth(),t=e.text();var n={url:wpforms_admin.ajax_url,type:"post",dataType:"json",data:{action:"wpforms_square_refresh_connection",nonce:wpforms_admin.nonce,mode:e.data("mode")},beforeSend(){e.css("width",o).html(WPFormsAdmin.settings.iconSpinner).prop("disabled",!0)}};let s=wpforms_admin.square.refresh_error;r.ajax(n).done(function(o){o.success?(e.css("pointerEvents","none").removeClass("wpforms-btn-light-grey").addClass("wpforms-btn-grey").html("Refreshed!"),e.closest("form").css("cursor","wait"),a.location=e.data("url")):(Object.prototype.hasOwnProperty.call(o,"data")&&""!==o.data&&(s=o.data),e.css("width","auto").html(t).prop("disabled",!1),c.modals.refreshTokensError(s))}).fail(function(){e.css("width","auto").html(t).prop("disabled",!1),c.modals.refreshTokensError(s)})},credentialsFieldsDisplay(){var o=s.sandboxModeCheckbox.is(":checked");o?(s.sandboxConnectionStatusBlock.show(),s.sandboxLocationBlock.show(),s.sandboxLocationStatusBlock.show(),s.productionConnectionStatusBlock.hide(),s.productionLocationBlock.hide(),s.productionLocationStatusBlock.hide()):(s.sandboxConnectionStatusBlock.hide(),s.sandboxLocationBlock.hide(),s.sandboxLocationStatusBlock.hide(),s.productionConnectionStatusBlock.show(),s.productionLocationBlock.show(),s.productionLocationStatusBlock.show()),o&&s.sandboxConnectionStatusBlock.find(".wpforms-square-connected").length||!o&&s.productionConnectionStatusBlock.find(".wpforms-square-connected").length||c.modals.modeChangedWarning()},modals:{modeChangedWarning(){r.alert({title:wpforms_admin.heads_up,content:wpforms_admin.square.mode_update,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})},refreshTokensError(o){r.alert({title:!1,content:o,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})},displayWebhookConfigPopup(){r.confirm({title:wpforms_admin.square.webhook_create_title,content:wpforms_admin.square.webhook_create_description+'",icon:"fa fa-info-circle",type:"blue",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){let e=this;var o=e.$content.find("#wpforms-square-personal-access-token");let t=e.$content.find(".error");o=o.val().trim();let n=e.$title;return s.webhookConnectBtn.addClass("inactive"),t.hide().text(""),""===o?t.text(wpforms_admin.square.token_is_required).show():(e.buttons.confirm.setText(wpforms_admin.loading),e.buttons.confirm.disable(),c.createWebhook(o).then(o=>{e.setContent("

            "+o.data.message+"

            "),e.buttons.confirm.hide(),n.text("").hide(),e.buttons.cancel.setText(wpforms_admin.close),e.buttons.cancel.action=function(){a.location.reload()}}).catch(o=>{t.text(o.data.message).show(),e.buttons.confirm.setText(wpforms_admin.ok),e.buttons.confirm.enable()})),!1}},cancel:{text:wpforms_admin.cancel,action(){s.webhookConnectBtn.removeClass("inactive"),this.close()}}}})}}};return c})((document,window),jQuery);WPFormsSettingsSquare.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.js new file mode 100755 index 00000000..5894c4c5 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.js @@ -0,0 +1,807 @@ +/* global Square, wpforms, wpforms_settings, wpforms_square, WPForms, WPFormsUtils */ + +/** + * WPForms Square function. + * + * @since 1.9.5 + */ +const WPFormsSquare = window.WPFormsSquare || ( function( document, window, $ ) { + /** + * Holder for original form submit handler. + * + * @since 1.9.5 + * + * @type {Function} + */ + let originalSubmitHandler; + + /** + * Credit card data. + * + * @since 1.9.5 + * + * @type {Object} + */ + const cardData = { + cardNumber: { + empty: true, + valid: false, + }, + expirationDate: { + empty: true, + valid: false, + }, + cvv: { + empty: true, + valid: false, + }, + postalCode: { + empty: true, + valid: false, + }, + }; + + /** + * Public functions and properties. + * + * @since 1.9.5 + * + * @type {Object} + */ + const app = { + + /** + * Square payments object. + * + * @since 1.9.5 + * + * @type {Object} + */ + payments: null, + + /** + * Number of page locked to switch. + * + * @since 1.9.5 + * + * @type {number} + */ + lockedPageToSwitch: 0, + + /** + * Start the engine. + * + * @since 1.9.5 + */ + init() { + app.payments = app.getPaymentsInstance(); + + // Bail if a Square payments object isn't initialized. + if ( app.payments === null ) { + return; + } + + $( document ) + .on( 'wpformsReady', app.setupForms ) + .on( 'wpformsBeforePageChange', app.pageChange ) + .on( 'wpformsPageChange', app.afterPageChange ) + .on( 'wpformsProcessConditionalsField', app.conditionalLogicHandler ); + }, + + /** + * Setup and configure Square forms. + * + * @since 1.9.5 + */ + setupForms() { + if ( typeof $.fn.validate === 'undefined' ) { + return; + } + + $( '.wpforms-square form' ) + .filter( ( _, form ) => typeof $( form ).data( 'formid' ) === 'number' ) // filter out forms which are locked (formid changed to 'locked-...'). + .each( app.updateSubmitHandler ); + }, + + /** + * Update submitHandler for the forms containing Square. + * + * @since 1.9.5 + */ + async updateSubmitHandler() { + const $form = $( this ); + const validator = $form.data( 'validator' ); + + if ( ! validator || $form.hasClass( 'wpforms-square-initialization' ) || $form.hasClass( 'wpforms-square-initialized' ) ) { + return; + } + + // if the form is inside the "raw" elementor popup, we should not initialize the Square and wait for the popup to be opened. + if ( $form.closest( '.elementor-location-popup' ).length && ! $form.closest( '.elementor-popup-modal' ).length ) { + return; + } + + $form.addClass( 'wpforms-square-initialization' ); + + // Store the original submitHandler. + originalSubmitHandler = validator.settings.submitHandler; + + // Replace the default submit handler. + validator.settings.submitHandler = app.submitHandler; + + // Get a new Card object. + await app.getCardInstance( $form ); + }, + + /** + * Trigger resize event if Square field has been conditionally unhidden. + * + * Allows Square Card field to resize itself (fixes the issue with doubled field height on some screen resolutions). + * + * @since 1.9.5 + * + * @param {Event} e Event. + * @param {number} formID Form ID. + * @param {number} fieldID Field ID. + * @param {boolean} pass Pass condition logic. + * @param {string} action Action name. + */ + conditionalLogicHandler( e, formID, fieldID, pass, action ) { + if ( ! app.isVisibleField( pass, action ) ) { + return; + } + + const el = document.getElementById( 'wpforms-' + formID + '-field_' + fieldID ); + + if ( ! el || ! el.classList.contains( 'wpforms-field-square-cardnumber' ) ) { + return; + } + + window.dispatchEvent( new Event( 'resize' ) ); + }, + + /** + * Determine if the field is visible after being triggered by Conditional Logic. + * + * @since 1.9.5 + * + * @param {boolean} pass Pass condition logic. + * @param {string} action Action name. + * + * @return {boolean} The field is visible. + */ + isVisibleField( pass, action ) { + return ( action === 'show' && pass ) || ( action === 'hide' && ! pass ); + }, + + /** + * Update submitHandler for forms containing Square. + * + * @since 1.9.5 + * + * @param {Object} form JS form element. + */ + submitHandler( form ) { + const $form = $( form ); + const validator = $form.data( 'validator' ); + const validForm = validator.form(); + const card = $form.find( '.wpforms-square-credit-card-hidden-input' ).data( 'square-card' ); + + if ( ! validForm || typeof card === 'undefined' || ! app.isProcessedCard( $form ) ) { + originalSubmitHandler( $form ); + return; + } + + app.tokenize( $form, card ); + }, + + /** + * Tokenize a card payment. + * + * @param {jQuery} $form Form element. + * @param {Object} card Square Card object. + */ + async tokenize( $form, card ) { + app.disableSubmitBtn( $form ); + + const sourceId = await app.getSourceId( $form, card ); + + if ( sourceId === null ) { + app.enableSubmitBtn( $form ); + return; + } + + app.submitForm( $form ); + }, + + /** + * Initialize a Square payments object and retrieve it. + * + * @since 1.9.5 + * + * @return {Object|null} Square payments object or null. + */ + getPaymentsInstance() { + if ( ! window.Square ) { + app.displaySdkError( $( '.wpforms-square form' ), wpforms_square.i18n.missing_sdk_script ); + + return null; + } + + try { + + return Square.payments( wpforms_square.client_id, wpforms_square.location_id ); + } catch ( e ) { + const message = ( typeof e === 'object' && Object.prototype.hasOwnProperty.call( e, 'message' ) ) ? e.message : wpforms_square.i18n.missing_creds; + + app.displaySdkError( $( '.wpforms-square form' ), message ); + + return null; + } + }, + + /** + * Try to retrieve a Square Card object. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + * + * @return {Object|null} Square Card object or null. + */ + async getCardInstance( $form ) { + // Applying the modern styles to the card config if needed. + // eslint-disable-next-line prefer-const + let cardConfig = {}; + + cardConfig.style = wpforms_square.card_config.style ? wpforms_square.card_config.style : app.getModernMarkupCardStyles( $form ); + + try { + const card = await app.payments.card( cardConfig ); + + // Attach the Card form to the page. + await card.attach( $form.find( '.wpforms-field-square-cardnumber' ).get( 0 ) ); + + const eventsList = [ 'focusClassAdded', 'focusClassRemoved' ]; + const eventsLength = eventsList.length; + let counter = 0; + + // Bind the Card events. + for ( ; counter < eventsLength; counter++ ) { + card.addEventListener( eventsList[ counter ], function( e ) { + // Card field is filled. + cardData[ e.detail.field ].empty = e.detail.currentState.isEmpty; + cardData[ e.detail.field ].valid = e.detail.currentState.isCompletelyValid; + + if ( cardData[ e.detail.field ].valid ) { + app.removeFieldError( $form ); + } + } ); + } + + $form.find( '.wpforms-square-credit-card-hidden-input' ).data( 'square-card', card ); + + $form.removeClass( 'wpforms-square-initialization' ); + $form.addClass( 'wpforms-square-initialized' ); + + return card; + } catch ( e ) { + app.displaySdkError( $form, wpforms_square.i18n.card_init_error ); + + $form.removeClass( 'wpforms-square-initialization' ); + + console.log( 'Error:', e ); // eslint-disable-line no-console + console.log( 'Config', cardConfig ); // eslint-disable-line no-console + + return null; + } + }, + + /** + * Retrieve a source ID (card nonce). + * + * @param {jQuery} $form Form element. + * @param {Object} card Square Card object. + * + * @return {string|null} The source ID or null. + */ + async getSourceId( $form, card ) { + try { + const response = await card.tokenize( app.getChargeVerifyBuyerDetails( $form ) ); + + $form.find( '.wpforms-square-payment-source-id' ).remove(); + + if ( response.status !== 'OK' || ! response.token ) { + app.displayFormError( app.getCreditCardInput( $form ), app.getResponseError( response ) ); + + return null; + } + + $form.append( '' ); + + return response.token; + } catch ( e ) { + app.displayFormError( app.getCreditCardInput( $form ), wpforms_square.i18n.token_process_fail ); + } + + return null; + }, + + /** + * Retrieve a response error message. + * + * @param {Object} response The response received from a tokenization call. + * + * @return {string} The response error message. + */ + getResponseError( response ) { + const hasErrors = response.errors && Array.isArray( response.errors ) && response.errors.length; + + return hasErrors ? response.errors[ 0 ].message : wpforms_square.i18n.token_status_error + ' ' + response.status; + }, + + /** + * Retrieve details about the buyer for a charge. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + * + * @return {Object} Buyer details. + */ + getChargeVerifyBuyerDetails( $form ) { + return { + amount: app.getTotalInMinorUnits( wpforms.amountTotalCalc( $form ) ), + billingContact: app.getBillingContactDetails( $form ), + currencyCode: wpforms_settings.currency_code, + intent: 'CHARGE', + customerInitiated: true, + sellerKeyedIn: false, + }; + }, + + /** + * Retrieve the total amount in minor units. + * + * @since 1.9.5 + * + * @param {number} total Total amount. + * + * @return {string} Total amount in minor units. + */ + getTotalInMinorUnits( total ) { + return parseInt( wpforms.numberFormat( total, wpforms_settings.currency_decimal, '', '' ), 10 ).toString(); + }, + + /** + * Retrieve billing contact details. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + * + * @return {Object} Billing contact details. + */ + getBillingContactDetails( $form ) { // eslint-disable-line complexity + // Get the form ID and billing mapping for this form, if available. + const formId = $form.data( 'formid' ); + const mapping = ( wpforms_square.billing_details && wpforms_square.billing_details[ formId ] ) || {}; + const result = {}; + + // Use mapped selectors if provided. + const $emailField = mapping.buyer_email ? $( `.wpforms-field-email[data-field-id="${ mapping.buyer_email }"]` ) : ''; + const $nameField = mapping.billing_name ? $( `.wpforms-field-name[data-field-id="${ mapping.billing_name }"]` ) : ''; + const $addressField = mapping.billing_address ? $( `.wpforms-field-address[data-field-id="${ mapping.billing_address }"]` ) : ''; + + if ( $emailField.length ) { + const emailValue = $emailField.find( 'input' ).first().val(); // Use the first input field knowing there could be confirmation email input as well. + if ( emailValue && emailValue.trim() !== '' ) { + result.email = emailValue; + } + } + + if ( $nameField.length ) { + jQuery.extend( result, app.getBillingNameDetails( $nameField ) ); + } + + if ( $addressField.length ) { + jQuery.extend( result, app.getBillingAddressDetails( $addressField ) ); + } + + return result; + }, + + /** + * Retrieve billing name details. + * + * @since 1.9.5 + * + * @param {jQuery} $field Field element. + * + * @return {Object} Billing name details. + */ + getBillingNameDetails( $field ) { // eslint-disable-line complexity + const result = {}; + + let givenName = ''; + let familyName = ''; + + // Try to find separate first and last name fields. + const $firstNameField = $field.find( '.wpforms-field-name-first' ); + const $lastNameField = $field.find( '.wpforms-field-name-last' ); + + if ( $firstNameField.length && $lastNameField.length ) { + // Use separate fields if both are present. + givenName = $firstNameField.val() || ''; + familyName = $lastNameField.val() || ''; + + if ( givenName && givenName.trim() !== '' ) { + result.givenName = givenName; + } + + if ( familyName && familyName.trim() !== '' ) { + result.familyName = familyName; + } + + return result; + } + + // Otherwise, fall back to a single name input field. + const $nameField = $field.find( 'input' ); + + if ( ! $nameField.length ) { + return result; + } + const fullName = $nameField.val().trim(); + + if ( ! fullName.length ) { + return result; + } + + // Split full name by space; the first part is givenName, + // the rest (if any) are combined as familyName. + const nameParts = fullName.split( ' ' ); + givenName = nameParts.shift() || ''; + familyName = nameParts.join( ' ' ) || ''; + + if ( givenName && givenName.trim() !== '' ) { + result.givenName = givenName; + } + + if ( familyName && familyName.trim() !== '' ) { + result.familyName = familyName; + } + + return result; + }, + + /** + * Retrieve billing address details. + * + * @since 1.9.5 + * + * @param {jQuery} $addressField Field element. + * + * @return {Object} Billing address details. + */ + getBillingAddressDetails( $addressField ) { // eslint-disable-line complexity + const result = {}; + + // For address fields, use the closest wrapper. + const $addressWrapper = $addressField.closest( '.wpforms-field' ); + + // Retrieve address components, defaulting to empty strings if not found. + const addressLine1 = $addressWrapper.find( '.wpforms-field-address-address1' ).val() || ''; + const addressLine2 = $addressWrapper.find( '.wpforms-field-address-address2' ).val() || ''; + const city = $addressWrapper.find( '.wpforms-field-address-city' ).val() || ''; + const state = $addressWrapper.find( '.wpforms-field-address-state' ).val() || ''; + const country = $addressWrapper.find( '.wpforms-field-address-country' ).val() || 'US'; + const addressLines = [ addressLine1, addressLine2 ].filter( ( line ) => line && line.trim() !== '' ); + + if ( addressLines.length ) { + result.addressLines = addressLines; + } + + if ( city && city.trim() !== '' ) { + result.city = city; + } + if ( state && state.trim() !== '' ) { + result.state = state; + } + if ( country && country.trim() !== '' ) { + result.countryCode = country; + } + + return result; + }, + + /** + * Retrieve a jQuery selector for Credit Card hidden input. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + * + * @return {jQuery} Credit Card hidden input. + */ + getCreditCardInput( $form ) { + return $form.find( '.wpforms-square-credit-card-hidden-input' ); + }, + + /** + * Submit the form using the original submitHandler. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + */ + submitForm( $form ) { + const validator = $form.data( 'validator' ); + + if ( validator ) { + originalSubmitHandler( $form ); + } + }, + + /** + * Determine if a credit card should be processed. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + * + * @return {boolean} True if a credit card should be processed. + */ + isProcessedCard( $form ) { + const $squareDiv = $form.find( '.wpforms-field-square-cardnumber' ); + const condHidden = $squareDiv.closest( '.wpforms-field-square' ).hasClass( 'wpforms-conditional-hide' ); + const ccRequired = !! $squareDiv.data( 'required' ); + + if ( condHidden ) { + return false; + } + + return ccRequired || app.isCardDataNotEmpty(); + }, + + /** + * Determine if card data not empty. + * + * @since 1.9.5 + * + * @return {boolean} True if at least one credit card sub-field is filled. + */ + isCardDataNotEmpty() { + return ! cardData.cardNumber.empty || ! cardData.expirationDate.empty || ! cardData.cvv.empty || ! cardData.postalCode.empty; + }, + + /** + * Determine if card data is completely valid. + * + * @since 1.9.5 + * + * @return {boolean} True if at least one credit card sub-field is filled. + */ + isCardDataValid() { + return cardData.cardNumber.valid && cardData.expirationDate.valid && cardData.cvv.valid && cardData.postalCode.valid; + }, + + /** + * Display a SDK error. + * + * @param {jQuery} $form Form element. + * @param {string} message Error messages. + * + * @since 1.9.5 + */ + displaySdkError( $form, message ) { + $form + .find( '.wpforms-square-credit-card-hidden-input' ) + .closest( '.wpforms-field-square-number' ) + .append( $( '', { + text: message, + class: 'wpforms-error', + } ) ); + }, + + /** + * Remove field error. + * + * @param {jQuery} $form Form element. + * + * @since 1.9.7 + */ + removeFieldError( $form ) { + $form.find( '.wpforms-field-square-number .wpforms-error' ).remove(); + }, + + /** + * Display a field error using jQuery Validate library. + * + * @param {jQuery} $field Form element. + * @param {string} message Error messages. + * + * @since 1.9.5 + */ + displayFormError( $field, message ) { + const fieldName = $field.attr( 'name' ); + const $form = $field.closest( 'form' ); + const error = {}; + + error[ fieldName ] = message; + + wpforms.displayFormAjaxFieldErrors( $form, error ); + wpforms.scrollToError( $field ); + }, + + /** + * Disable submit button for the form. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + */ + disableSubmitBtn( $form ) { + $form.find( '.wpforms-submit' ).prop( 'disabled', true ); + }, + + /** + * Enable submit button for the form. + * + * @since 1.9.5 + * + * @param {jQuery} $form Form element. + */ + enableSubmitBtn( $form ) { + $form.find( '.wpforms-submit' ).prop( 'disabled', false ); + }, + + /** + * Replaces &, <, >, ", `, and ' with their escaped counterparts. + * + * @since 1.9.5 + * + * @param {string} string String to escape. + * + * @return {string} Escaped string. + */ + escapeTextString( string ) { + return $( '' ).text( string ).html(); + }, + + /** + * Callback for a page changing. + * + * @since 1.9.5 + * + * @param {Event} event Event. + * @param {number} currentPage Current page. + * @param {jQuery} $form Current form. + * @param {string} action The navigation action. + */ + pageChange( event, currentPage, $form, action ) { // eslint-disable-line complexity + const $squareDiv = $form.find( '.wpforms-field-square-cardnumber' ); + + // Stop navigation through page break pages. + if ( + ! $squareDiv.is( ':visible' ) || + ( ! $squareDiv.data( 'required' ) && ! app.isCardDataNotEmpty() ) || + ( app.lockedPageToSwitch && app.lockedPageToSwitch !== currentPage ) || + action === 'prev' + ) { + return; + } + + if ( app.isCardDataValid() ) { + app.removeFieldError( $form ); + + return; + } + + app.lockedPageToSwitch = currentPage; + + app.displayFormError( app.getCreditCardInput( $form ), wpforms_square.i18n.empty_details ); + event.preventDefault(); + }, + + /** + * Callback for a after page changing. + * + * @since 1.9.5 + */ + afterPageChange() { + window.dispatchEvent( new Event( 'resize' ) ); + }, + + /** + * Get CSS property value. + * In case of exception return empty string. + * + * @since 1.9.5 + * + * @param {jQuery} $element Element. + * @param {string} property Property. + * + * @return {string} Property value. + */ + getCssPropertyValue( $element, property ) { + try { + return $element.css( property ); + } catch ( e ) { + return ''; + } + }, + + /** + * Determine whether modern style are needed. + * + * Force run on the classic markup if it is conversational or lead form. + * + * @since 1.9.5 + * + * @return {boolean} True if the form needs styles. + */ + needsStyles() { + // Styles are not needed if the classic markup is used + // and it's neither conversational nor lead form. + if ( + ( ! window.WPForms || ! WPForms.FrontendModern ) && + ! $( '#wpforms-conversational-form-page' ).length && + ! $( '.wpforms-lead-forms-container' ).length + ) { + return false; + } + + return true; + }, + + /** + * Get modern card styles. + * + * @since 1.9.5 + * + * @param {jQuery} $form Current form. + * + * @return {Object} Card styles object. + */ + getModernMarkupCardStyles( $form ) { + if ( ! app.needsStyles() ) { + return {}; + } + + const $hiddenInput = app.getCreditCardInput( $form ), + hiddenInputColor = app.getCssPropertyValue( $hiddenInput, 'color' ), + inputStyle = { + fontSize: app.getCssPropertyValue( $hiddenInput, 'font-size' ), + colorText: hiddenInputColor, + colorTextPlaceholder: hiddenInputColor, + }; + + // Check if WPFormsUtils.cssColorsUtils object is available. + if ( WPFormsUtils.hasOwnProperty( 'cssColorsUtils' ) && + typeof WPFormsUtils.cssColorsUtils.getColorWithOpacity === 'function' ) { + inputStyle.colorText = WPFormsUtils.cssColorsUtils.getColorWithOpacity( hiddenInputColor ); + inputStyle.colorTextPlaceholder = WPFormsUtils.cssColorsUtils.getColorWithOpacity( hiddenInputColor, '0.5' ); + } + + return { + input: { + color: inputStyle.colorText, + fontSize: inputStyle.fontSize, + }, + 'input::placeholder': { + color: inputStyle.colorTextPlaceholder, + }, + 'input.is-error': { + color: inputStyle.colorText, + }, + }; + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsSquare.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.min.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.min.js new file mode 100755 index 00000000..c72061ab --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/square/wpforms-square.min.js @@ -0,0 +1 @@ +let WPFormsSquare=window.WPFormsSquare||((i,o,s)=>{let a,n={cardNumber:{empty:!0,valid:!1},expirationDate:{empty:!0,valid:!1},cvv:{empty:!0,valid:!1},postalCode:{empty:!0,valid:!1}},l={payments:null,lockedPageToSwitch:0,init(){l.payments=l.getPaymentsInstance(),null!==l.payments&&s(i).on("wpformsReady",l.setupForms).on("wpformsBeforePageChange",l.pageChange).on("wpformsPageChange",l.afterPageChange).on("wpformsProcessConditionalsField",l.conditionalLogicHandler)},setupForms(){void 0!==s.fn.validate&&s(".wpforms-square form").filter((e,r)=>"number"==typeof s(r).data("formid")).each(l.updateSubmitHandler)},async updateSubmitHandler(){var e=s(this),r=e.data("validator");!r||e.hasClass("wpforms-square-initialization")||e.hasClass("wpforms-square-initialized")||e.closest(".elementor-location-popup").length&&!e.closest(".elementor-popup-modal").length||(e.addClass("wpforms-square-initialization"),a=r.settings.submitHandler,r.settings.submitHandler=l.submitHandler,await l.getCardInstance(e))},conditionalLogicHandler(e,r,t,a,s){l.isVisibleField(a,s)&&(a=i.getElementById("wpforms-"+r+"-field_"+t))&&a.classList.contains("wpforms-field-square-cardnumber")&&o.dispatchEvent(new Event("resize"))},isVisibleField(e,r){return"show"===r&&e||"hide"===r&&!e},submitHandler(e){var e=s(e),r=e.data("validator").form(),t=e.find(".wpforms-square-credit-card-hidden-input").data("square-card");r&&void 0!==t&&l.isProcessedCard(e)?l.tokenize(e,t):a(e)},async tokenize(e,r){l.disableSubmitBtn(e),null===await l.getSourceId(e,r)?l.enableSubmitBtn(e):l.submitForm(e)},getPaymentsInstance(){if(!o.Square)return l.displaySdkError(s(".wpforms-square form"),wpforms_square.i18n.missing_sdk_script),null;try{return Square.payments(wpforms_square.client_id,wpforms_square.location_id)}catch(e){var r="object"==typeof e&&Object.prototype.hasOwnProperty.call(e,"message")?e.message:wpforms_square.i18n.missing_creds;return l.displaySdkError(s(".wpforms-square form"),r),null}},async getCardInstance(r){var t={};t.style=wpforms_square.card_config.style||l.getModernMarkupCardStyles(r);try{var a=await l.payments.card(t),s=(await a.attach(r.find(".wpforms-field-square-cardnumber").get(0)),["focusClassAdded","focusClassRemoved"]),i=s.length;let e=0;for(;e'),t.token):(l.displayFormError(l.getCreditCardInput(r),l.getResponseError(t)),null)}catch(e){l.displayFormError(l.getCreditCardInput(r),wpforms_square.i18n.token_process_fail)}return null},getResponseError(e){return e.errors&&Array.isArray(e.errors)&&e.errors.length?e.errors[0].message:wpforms_square.i18n.token_status_error+" "+e.status},getChargeVerifyBuyerDetails(e){return{amount:l.getTotalInMinorUnits(wpforms.amountTotalCalc(e)),billingContact:l.getBillingContactDetails(e),currencyCode:wpforms_settings.currency_code,intent:"CHARGE",customerInitiated:!0,sellerKeyedIn:!1}},getTotalInMinorUnits(e){return parseInt(wpforms.numberFormat(e,wpforms_settings.currency_decimal,"",""),10).toString()},getBillingContactDetails(e){var e=e.data("formid"),e=wpforms_square.billing_details&&wpforms_square.billing_details[e]||{},r={},t=e.buyer_email?s(`.wpforms-field-email[data-field-id="${e.buyer_email}"]`):"",a=e.billing_name?s(`.wpforms-field-name[data-field-id="${e.billing_name}"]`):"",e=e.billing_address?s(`.wpforms-field-address[data-field-id="${e.billing_address}"]`):"";return t.length&&(t=t.find("input").first().val())&&""!==t.trim()&&(r.email=t),a.length&&jQuery.extend(r,l.getBillingNameDetails(a)),e.length&&jQuery.extend(r,l.getBillingAddressDetails(e)),r},getBillingNameDetails(e){var r={};let t="",a="";var s=e.find(".wpforms-field-name-first"),i=e.find(".wpforms-field-name-last");return s.length&&i.length?(t=s.val()||"",a=i.val()||"",t&&""!==t.trim()&&(r.givenName=t),a&&""!==a.trim()&&(r.familyName=a)):(s=e.find("input")).length&&(i=s.val().trim()).length&&(e=i.split(" "),t=e.shift()||"",a=e.join(" ")||"",t&&""!==t.trim()&&(r.givenName=t),a)&&""!==a.trim()&&(r.familyName=a),r},getBillingAddressDetails(e){var r={},e=e.closest(".wpforms-field"),t=e.find(".wpforms-field-address-address1").val()||"",a=e.find(".wpforms-field-address-address2").val()||"",s=e.find(".wpforms-field-address-city").val()||"",i=e.find(".wpforms-field-address-state").val()||"",e=e.find(".wpforms-field-address-country").val()||"US",t=[t,a].filter(e=>e&&""!==e.trim());return t.length&&(r.addressLines=t),s&&""!==s.trim()&&(r.city=s),i&&""!==i.trim()&&(r.state=i),e&&""!==e.trim()&&(r.countryCode=e),r},getCreditCardInput(e){return e.find(".wpforms-square-credit-card-hidden-input")},submitForm(e){e.data("validator")&&a(e)},isProcessedCard(e){var e=e.find(".wpforms-field-square-cardnumber"),r=e.closest(".wpforms-field-square").hasClass("wpforms-conditional-hide"),e=!!e.data("required");return!r&&(e||l.isCardDataNotEmpty())},isCardDataNotEmpty(){return!(n.cardNumber.empty&&n.expirationDate.empty&&n.cvv.empty&&n.postalCode.empty)},isCardDataValid(){return n.cardNumber.valid&&n.expirationDate.valid&&n.cvv.valid&&n.postalCode.valid},displaySdkError(e,r){e.find(".wpforms-square-credit-card-hidden-input").closest(".wpforms-field-square-number").append(s("",{text:r,class:"wpforms-error"}))},removeFieldError(e){e.find(".wpforms-field-square-number .wpforms-error").remove()},displayFormError(e,r){var t=e.attr("name"),a=e.closest("form"),s={};s[t]=r,wpforms.displayFormAjaxFieldErrors(a,s),wpforms.scrollToError(e)},disableSubmitBtn(e){e.find(".wpforms-submit").prop("disabled",!0)},enableSubmitBtn(e){e.find(".wpforms-submit").prop("disabled",!1)},escapeTextString(e){return s("").text(e).html()},pageChange(e,r,t,a){var s=t.find(".wpforms-field-square-cardnumber");!s.is(":visible")||!s.data("required")&&!l.isCardDataNotEmpty()||l.lockedPageToSwitch&&l.lockedPageToSwitch!==r||"prev"===a||(l.isCardDataValid()?l.removeFieldError(t):(l.lockedPageToSwitch=r,l.displayFormError(l.getCreditCardInput(t),wpforms_square.i18n.empty_details),e.preventDefault()))},afterPageChange(){o.dispatchEvent(new Event("resize"))},getCssPropertyValue(e,r){try{return e.css(r)}catch(e){return""}},needsStyles(){return!!(o.WPForms&&WPForms.FrontendModern||s("#wpforms-conversational-form-page").length||s(".wpforms-lead-forms-container").length)},getModernMarkupCardStyles(e){var r;return l.needsStyles()?(e=l.getCreditCardInput(e),r=l.getCssPropertyValue(e,"color"),e={fontSize:l.getCssPropertyValue(e,"font-size"),colorText:r,colorTextPlaceholder:r},WPFormsUtils.hasOwnProperty("cssColorsUtils")&&"function"==typeof WPFormsUtils.cssColorsUtils.getColorWithOpacity&&(e.colorText=WPFormsUtils.cssColorsUtils.getColorWithOpacity(r),e.colorTextPlaceholder=WPFormsUtils.cssColorsUtils.getColorWithOpacity(r,"0.5")),{input:{color:e.colorText,fontSize:e.fontSize},"input::placeholder":{color:e.colorTextPlaceholder},"input.is-error":{color:e.colorText}}):{}}};return l})(document,window,jQuery);WPFormsSquare.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-modern-stripe.js b/wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-modern-stripe.js new file mode 100755 index 00000000..43e56be0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/js/integrations/stripe/admin-builder-modern-stripe.js @@ -0,0 +1,669 @@ +/* global wpforms_builder, wpforms_builder_stripe, WPFormsBuilderPaymentsUtils */ + +// noinspection ES6ConvertVarToLetConst +/** + * Stripe builder function. + * + * @since 1.8.4 + */ +// eslint-disable-next-line no-var +var WPFormsStripeModernBuilder = window.WPFormsStripeModernBuilder || ( function( document, window, $ ) { + /** + * Elements holder. + * + * @since 1.8.4 + * + * @type {Object} + */ + let el = {}; + + /** + * Public functions and properties. + * + * @since 1.8.4 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.8.4 + */ + init() { + $( app.ready ); + }, + + /** + * Initialized once the DOM is fully loaded. + * + * @since 1.8.4 + */ + ready() { + app.customMetadataActions(); + + if ( app.isLegacySettings() ) { + return; + } + + // Cache DOM elements. + el = { + $alert: $( '#wpforms-stripe-credit-card-alert' ), + $panelContent: $( '#wpforms-panel-content-section-payment-stripe' ), + $feeNotice: $( '.wpforms-stripe-notice-info' ), + }; + + app.bindUIActions(); + app.bindPlanUIActions(); + + if ( ! wpforms_builder_stripe.is_pro ) { + const baseSelector = '.wpforms-panel-content-section-stripe', + toggleInput = `${ baseSelector } .wpforms-panel-content-section-payment-toggle input`, + planNameInput = `${ baseSelector } .wpforms-panel-content-section-payment-plan-name input`; + + $( toggleInput ).each( WPFormsBuilderPaymentsUtils.toggleContent ); + $( planNameInput ).each( WPFormsBuilderPaymentsUtils.checkPlanName ); + + $( '#wpforms-panel-payments' ) + .on( 'click', toggleInput, WPFormsBuilderPaymentsUtils.toggleContent ) + .on( 'click', `${ baseSelector } .wpforms-panel-content-section-payment-plan-head-buttons-toggle`, WPFormsBuilderPaymentsUtils.togglePlan ) + .on( 'click', `${ baseSelector } .wpforms-panel-content-section-payment-plan-head-buttons-delete`, WPFormsBuilderPaymentsUtils.deletePlan ) + .on( 'input', planNameInput, WPFormsBuilderPaymentsUtils.renamePlan ) + .on( 'focusout', planNameInput, WPFormsBuilderPaymentsUtils.checkPlanName ); + } + }, + + /** + * Process custom metadata actions. + * + * @since 1.9.6 + */ + customMetadataActions() { + $( '#wpforms-panel-payments' ) + .on( 'focusout', '.wpforms-panel-field-stripe-custom-metadata-meta-key', function() { + // Remove invalid characters for meta key. + $( this ).val( $( this ).val().replace( /[^\p{L}\p{N}_-]/gu, '' ) ); + } ) + // Add metadata row. + .on( 'click', '.wpforms-panel-content-section-stripe-custom-metadata-add', function( e ) { + e.preventDefault(); + + const $table = $( this ).parents( '.wpforms-panel-content-section-stripe-custom-metadata-table' ), + $lastRow = $table.find( 'tr' ).last(), + $clone = $lastRow.clone( true ), + lastID = $lastRow.data( 'key' ), + nextID = lastID + 1; + + // Update row key ID. + $clone.attr( 'data-key', nextID ); + + // Increment the counter. + $clone.html( $clone.html().replaceAll( '[' + lastID + ']', '[' + nextID + ']' ).replaceAll( '-' + lastID + '-', '-' + nextID + '-' ) ); + + // Clear values. + $clone.find( 'select, input' ).val( '' ); + + // Re-enable "delete" button. + $clone.find( '.wpforms-panel-content-section-stripe-custom-metadata-delete' ).removeClass( 'hidden' ); + + // Remove error classes. + $clone.find( '.wpforms-required-field-error' ).removeClass( 'wpforms-required-field-error' ); + + // Put it back to the table. + $table.find( 'tbody' ).append( $clone.get( 0 ) ); + } ) + // Delete metadata row. + .on( 'click', '.wpforms-panel-content-section-stripe-custom-metadata-delete', function( e ) { + e.preventDefault(); + + $( this ).parents( '.wpforms-panel-content-section-stripe-custom-metadata-table tr' ).remove(); + } ); + }, + + /** + * Process various events as a response to UI interactions. + * + * @since 1.8.4 + */ + bindUIActions() { + const $builder = $( '#wpforms-builder' ); + + $builder.on( 'wpformsFieldDelete', app.disableNotifications ) + .on( 'wpformsSaved', app.requiredFieldsCheck ) + .on( 'wpformsFieldAdd', app.fieldAdded ) + .on( 'wpformsFieldDelete', app.fieldDeleted ) + .on( 'wpformsPaymentsPlanCreated', app.toggleMultiplePlansWarning ) + .on( 'wpformsPaymentsPlanCreated', app.bindPlanUIActions ) + .on( 'wpformsPaymentsPlanDeleted', app.toggleMultiplePlansWarning ); + + el.$panelContent + .find( '.wpforms-panel-content-section-payment-one-time' ) + .on( 'change', '.wpforms-panel-field-stripe-custom-metadata-meta-key', app.resetCustomMetaKeyErrorClass ); + }, + + /** + * Bind plan UI actions. + * + * @since 1.9.5 + */ + bindPlanUIActions() { + el.$panelContent.find( '.wpforms-panel-content-section-payment-plan-body .wpforms-panel-field-select select[name*="email"]' ).on( 'change', app.resetEmailAlertErrorClass ); + el.$panelContent.find( '.wpforms-panel-content-section-payment-plan-body .wpforms-panel-field-stripe-custom-metadata-meta-key' ).on( 'change', app.resetCustomMetaKeyErrorClass ); + el.$panelContent.find( '.wpforms-panel-content-section-payment-plan-period select' ).on( 'change', app.resetCyclesValues ); + }, + + /** + * On form save notify users about required fields. + * + * @since 1.8.4 + */ + requiredFieldsCheck() { + const validationState = app.validateFields(); + + if ( ! validationState?.invalid ) { + return; + } + + app.openAlert( + app.getAlertMessage( validationState.type ), + () => validationState.invalid.$element.focus() + ); + }, + + /** + * Validates form fields based on their visibility and specific conditions. + * + * @since 1.9.8.3 + * + * @return {Object|boolean} Returns an object representing the validation state or `true` if the panel content is hidden. + */ + validateFields() { + if ( el.$panelContent.hasClass( 'wpforms-hidden' ) ) { + return true; + } + + // We want to determine which fields are not filled to display an appropriate error message. + // Also, it contains the type of the payment: one-time or recurring. + const validationState = {}; + + if ( $( '#wpforms-panel-field-stripe-enable_one_time' ).is( ':checked' ) ) { + app.validateOneTimeFields( validationState ); + } + + if ( $( '#wpforms-panel-field-stripe-enable_recurring' ).is( ':checked' ) ) { + app.validateRecurringFields( validationState ); + } + + return validationState; + }, + + /** + * Validates the one-time payment fields within the form's panel content. + * + * @since 1.9.8.3 + * + * @param {Object} validationState The current validation state object. + */ + validateOneTimeFields( validationState ) { + const $oneTimeScope = el.$panelContent.find( '.wpforms-panel-content-section-payment-one-time' ); + + validationState.type = 'one-time'; + app.validateCustomMetaTable( $oneTimeScope, validationState ); + }, + + /** + * Validates recurring fields within the payment plan section of the panel content. + * + * @since 1.9.8.3 + * + * @param {Object} validationState An object representing the current state of validation. + */ + validateRecurringFields( validationState ) { + validationState.type = validationState.type ? 'both' : 'recurring'; + + el.$panelContent.find( '.wpforms-panel-content-section-payment-plan' ).each( function() { + const $plan = $( this ); + + app.validateEmailField( $plan, validationState ); + app.validateCustomMetaTable( $plan, validationState ); + } ); + }, + + /** + * Validates the email field for a given plan and updates the validation state if the field is empty. + * + * @since 1.9.8.3 + * + * @param {Object} $plan jQuery object representing the plan element. + * @param {Object} validationState Object representing the validation state that will be updated. + */ + validateEmailField( $plan, validationState ) { + const planId = $plan.data( 'plan-id' ); + const $emailField = $( `#wpforms-panel-field-stripe-recurring-${ planId }-email` ); + + if ( $emailField.val() ) { + return; + } + + $emailField.addClass( 'wpforms-required-field-error' ); + validationState.invalid = validationState.invalid ?? {}; + validationState.invalid.email = true; + + if ( ! validationState.invalid.$element ) { + validationState.invalid.$element = $emailField; + } + }, + + /** + * Validates the custom metadata table rows within the specified scope. + * + * @since 1.9.8.3 + * + * @param {Object} $scope The jQuery object representing the current scope containing the custom metadata table. + * @param {Object} validationState The object used to store the validation state for the custom metadata rows. + * + * @return {boolean|void} Returns `true` if no rows are present for validation, otherwise no return value. + */ + validateCustomMetaTable( $scope, validationState ) { + const $customMetaRows = $scope.find( '.wpforms-panel-content-section-stripe-custom-metadata-table tr[data-key]' ); + + if ( ! $customMetaRows.length ) { + return true; + } + + $customMetaRows.each( function() { + const $row = $( this ); + + if ( app.isValidCustomMetaRow( $row ) ) { + return; + } + + validationState.invalid = validationState.invalid ?? {}; + validationState.invalid.customMeta = true; + + if ( ! validationState.invalid.$element ) { + validationState.invalid.$element = $row.find( '.wpforms-panel-field-stripe-custom-metadata-meta-key' ); + } + } ); + }, + + /** + * Validates if a custom metadata row in the form is properly filled. + * + * @since 1.9.8.3 + * + * @param {Object} $row jQuery object representing the custom metadata row to validate. + * + * @return {boolean} True if the custom metadata row is valid, otherwise false. + */ + isValidCustomMetaRow( $row ) { + const $metaKey = $row.find( '.wpforms-panel-field-stripe-custom-metadata-meta-key' ); + const isValid = ( + ! $row.find( '.wpforms-panel-field-stripe-custom-metadata-object-type' ).val() || + ! $row.find( '.wpforms-panel-field-stripe-custom-metadata-meta-value' ).val() || + $metaKey.val() + ); + + $metaKey.toggleClass( 'wpforms-required-field-error', ! isValid ); + + return isValid; + }, + + /** + * Maybe reset required email field error class. + * + * @since 1.9.5 + */ + resetEmailAlertErrorClass() { + $( this ).toggleClass( 'wpforms-required-field-error', ! $( this ).val() ); + }, + + /** + * Resets the error class for a custom meta key row. + * + * @since 1.9.8.3 + */ + resetCustomMetaKeyErrorClass() { + const $row = $( this ).closest( 'tr[data-key]' ); + + app.isValidCustomMetaRow( $row ); + }, + + /** + * Show alert for required recurring email field. + * + * @since 1.8.4 + * @deprecated 1.9.8.3 + */ + recurringEmailAlert() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsStripeModernBuilder.recurringEmailAlert()" has been deprecated, please use the "WPFormsStripeModernBuilder.openAlert()" function instead!' ); + + app.openAlert( wpforms_builder.stripe_recurring_email ); + }, + + /** + * Opens an alert dialog with a customized message and optional callback action. + * + * @since 1.9.8.3 + * + * @param {string} alertMessage The message to be displayed in the alert dialog. + * @param {Function} onClose Optional callback function to execute when the alert is closed. + */ + openAlert( alertMessage, onClose = () => {} ) { + $.alert( { + title: wpforms_builder.stripe_recurring_heading, + content: alertMessage, + icon: 'fa fa-exclamation-circle', + type: 'red', + buttons: { + confirm: { + text: wpforms_builder.ok, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: onClose, + }, + }, + onOpen() { + $( '.wpforms-stripe-settings-redirect' ).on( 'click', app.settingsRedirect ); + }, + } ); + }, + + /** + * Returns an alert message based on the specified payment type and Stripe visibility settings. + * + * @since 1.9.8.3 + * + * @param {string} paymentType The payment type (e.g., 'one-time', 'recurring', or 'both') used to determine the alert message. + * + * @return {string} The appropriate alert message for the specified payment type. + */ + getAlertMessage( paymentType ) { + if ( ! $( '.wpforms-panel-content-section-stripe' ).is( ':visible' ) ) { + return wpforms_builder.stripe_recurring_settings; + } + + const typesMap = { + 'one-time': 'stripe_required_one_time_fields', + recurring: 'stripe_required_recurring_fields', + both: 'stripe_required_both_fields', + }; + + return wpforms_builder[ typesMap[ paymentType ] ?? typesMap.recurring ]; + }, + + /** + * Redirect to the settings tab. + * + * @since 1.9.5 + */ + settingsRedirect() { + // Open the Stripe settings tab. + $( '.wpforms-panel-payments-button' ).trigger( 'click' ); + $( '.wpforms-panel-sidebar-section-stripe' ).trigger( 'click' ); + + // Scroll to the Stripe settings. + window.location.href = window.location.pathname + window.location.search + '#wpforms-panel-field-stripe-enable_recurring-wrap'; + + // Close the alert. + $( this ).closest( '.jconfirm-box' ).find( '.btn-confirm' ).trigger( 'click' ); + }, + + /** + * Disable notifications. + * + * @since 1.8.4 + * + * @param {Object} e Event object. + * @param {number} id Field ID. + * @param {string} type Field type. + */ + disableNotifications( e, id, type ) { + if ( ! app.isStripeField( type ) ) { + return; + } + + if ( app.hasStripeCreditCardFieldInBuilder() ) { + return; + } + + const $notificationWrap = $( '.wpforms-panel-content-section-notifications [id*="-stripe-wrap"]' ); + + $notificationWrap.find( 'input[id*="-stripe"]' ).prop( 'checked', false ); + $notificationWrap.addClass( 'wpforms-hidden' ); + }, + + /** + * Determine is legacy settings is loaded. + * + * @since 1.8.4 + * + * @return {boolean} True is legacy settings loaded. + */ + isLegacySettings() { + return $( '#wpforms-panel-field-stripe-enable' ).length; + }, + + /** + * We have to do several actions when the "Stripe" field is added. + * + * @since 1.8.4 + * + * @param {Object} e Event object. + * @param {number} id Field ID. + * @param {string} type Field type. + */ + fieldAdded( e, id, type ) { + if ( ! app.isStripeField( type ) ) { + return; + } + + if ( ! app.hasStripeCreditCardFieldInBuilder() ) { + return; + } + + app.settingsToggle( true ); + el.$feeNotice.toggleClass( 'wpforms-hidden' ); + }, + + /** + * We have to do several actions when the "Stripe" field is deleted. + * + * @since 1.8.4 + * + * @param {Object} e Event object. + * @param {number} id Field ID. + * @param {string} type Field type. + */ + fieldDeleted( e, id, type ) { + if ( ! app.isStripeField( type ) ) { + return; + } + + if ( app.hasStripeCreditCardFieldInBuilder() ) { + return; + } + + app.settingsToggle( false ); + app.disablePayments(); + el.$feeNotice.toggleClass( 'wpforms-hidden' ); + }, + + /** + * Determine if a field type is Stripe credit card. + * + * @since 1.8.4 + * + * @param {string} type Field type. + * + * @return {boolean} True if Stripe field. + */ + isStripeField( type ) { + return type === wpforms_builder_stripe.field_slug; + }, + + /** + * Checks if the Stripe Credit Card field is in the form builder. + * + * @since 1.9.5 + * + * @return {boolean} True if the Stripe Credit Card field is in the builder. + */ + hasStripeCreditCardFieldInBuilder() { + return $( `.wpforms-field.wpforms-field-${ wpforms_builder_stripe.field_slug }` ).length > 0; + }, + + /** + * Toggles visibility of multiple plans warning. + * + * @since 1.8.4 + */ + toggleMultiplePlansWarning() { + el.$panelContent.find( '.wpforms-stripe-multiple-plans-warning' ).toggleClass( 'wpforms-hidden', el.$panelContent.find( '.wpforms-panel-content-section-payment-plan' ).length === 1 ); + }, + + /** + * Toggles visibility of the Stripe addon settings. + * + * @since 1.8.4 + * + * @param {boolean} display Show or hide settings. + */ + settingsToggle( display ) { + if ( + ! el.$alert.length && + ! el.$panelContent.length + ) { + return; + } + + el.$alert.toggleClass( 'wpforms-hidden', display ); + el.$panelContent.toggleClass( 'wpforms-hidden', ! display ); + }, + + /** + * Toggle payments content. + * + * @since 1.8.4 + */ + toggleContent() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsStripeModernBuilder.toggleContent()" has been deprecated, please use the new "WPFormsPaymentsUtils.toggleContent()" function instead!' ); + + WPFormsBuilderPaymentsUtils.toggleContent(); + }, + + /** + * Toggle a plan content. + * + * @since 1.8.4 + */ + togglePlan() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsStripeModernBuilder.togglePlan()" has been deprecated, please use the new "WPFormsPaymentsUtils.togglePlan()" function instead!' ); + + WPFormsBuilderPaymentsUtils.togglePlan(); + }, + + /** + * Delete a plan. + * + * @since 1.8.4 + */ + deletePlan() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsStripeModernBuilder.checkPlanName()" has been deprecated, please use the new "WPFormsPaymentsUtils.deletePlan()" function instead!' ); + + WPFormsBuilderPaymentsUtils.deletePlan(); + }, + + /** + * Check a plan name on empty value. + * + * @since 1.8.4 + */ + checkPlanName() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsStripeModernBuilder.checkPlanName()" has been deprecated, please use the new "WPFormsPaymentsUtils.checkPlanName()" function instead!' ); + + WPFormsBuilderPaymentsUtils.checkPlanName(); + }, + + /** + * Rename a plan. + * + * @since 1.8.4 + */ + renamePlan() { + // eslint-disable-next-line no-console + console.warn( 'WARNING! Function "WPFormsStripeModernBuilder.renamePlan()" has been deprecated, please use the new "WPFormsPaymentsUtils.renamePlan()" function instead!' ); + + WPFormsBuilderPaymentsUtils.renamePlan(); + }, + + /** + * Make sure that "One-Time Payments" and "Recurring Payments" toggles are turned off. + * + * @since 1.9.5 + */ + disablePayments() { + const toggleInput = $( '#wpforms-panel-field-stripe-enable_one_time, #wpforms-panel-field-stripe-enable_recurring' ); + + toggleInput.prop( 'checked', false ).trigger( 'change' ).each( WPFormsBuilderPaymentsUtils.toggleContent ); + }, + + /** + * Reset cycles dropdown values based on the period selection. + * + * @since 1.9.8 + */ + resetCyclesValues() { + const $el = $( this ), + $select = $el.closest( '.wpforms-panel-content-section-payment-plan-body' ).find( '.wpforms-panel-content-section-payment-plan-cycles select' ), + selectedValue = $select.val(); // Save current selected value + + let max; + + // Determine the maximum number of cycles based on the selected period. + // It has intentionally not been passed from PHP to avoid unnecessary complexity or unexpected behavior. + switch ( $el.val() ) { + case 'yearly': + max = 20; + break; + case 'semiyearly': + max = 40; + break; + case 'quarterly': + max = 80; + break; + + default: + max = wpforms_builder_stripe.cycles_max; + } + + const options = [ + $( '
            download it from wpforms.com and install it manually, or contact support for assistance." +msgstr "" + +#: includes/admin/admin.php:216 +msgid "Could not install the plugin automatically. Please download and install it manually." +msgstr "" + +#: includes/admin/admin.php:217 +msgid "Searching Addons" +msgstr "" + +#: includes/admin/admin.php:219 +#: includes/admin/builder/class-builder.php:784 +#: includes/admin/class-editor.php:162 +#: src/Admin/Builder/Templates.php:183 +#: src/Admin/Education/StringsTrait.php:25 +#: src/Admin/Forms/Tags.php:452 +#: src/Admin/Payments/Views/Single.php:411 +#: src/Integrations/AI/Admin/Builder/Enqueues.php:135 +#: src/Integrations/Elementor/Elementor.php:242 +#: src/Lite/Admin/Education/LiteConnect.php:245 +#: templates/admin/components/datepicker.php:72 +#: templates/admin/forms/bulk-edit-tags.php:30 +msgid "Cancel" +msgstr "" + +#: includes/admin/admin.php:220 +#: src/Forms/IconChoices.php:488 +#: templates/admin/challenge/modal.php:74 +#: templates/builder/fullscreen/mobile-notice.php:25 +msgid "Continue" +msgstr "" + +#: includes/admin/admin.php:221 +#: includes/admin/builder/class-builder.php:786 +#: includes/admin/class-editor.php:108 +#: src/Admin/Education/StringsTrait.php:26 +#: src/Forms/Locator.php:350 +#: src/Integrations/AI/Admin/Builder/Enqueues.php:157 +#: src/Lite/Admin/Education/LiteConnect.php:254 +#: templates/builder/fullscreen/mobile-notice.php:28 +#: templates/builder/help.php:35 +msgid "Close" +msgstr "" + +#: includes/admin/admin.php:222 +msgid "Close and Refresh" +msgstr "" + +#: includes/admin/admin.php:223 +msgid "Change columns to display" +msgstr "" + +#: includes/admin/admin.php:224 +msgid "Sorry, there are no form fields that match your criteria." +msgstr "" + +#: includes/admin/admin.php:225 +msgid "Sorry, there is no entry meta that match your criteria." +msgstr "" + +#: includes/admin/admin.php:226 +msgid "Are you sure you want to delete this entry? This will also remove all associated files, notes, and logs." +msgstr "" + +#: includes/admin/admin.php:227 +msgid "Are you sure you want to delete ALL entries? This will also remove all associated files, notes, and logs." +msgstr "" + +#. translators: %s - entry count. +#: includes/admin/admin.php:229 +#, php-format +msgid "Are you sure you want to delete %s entries? This will also remove all associated files, notes, and logs." +msgstr "" + +#: includes/admin/admin.php:232 +msgid "Are you sure you want to trash this entry? This will also remove all associated files, notes, and logs." +msgstr "" + +#: includes/admin/admin.php:233 +msgid "Are you sure you want to trash ALL entries? This will also remove all associated files, notes, and logs." +msgstr "" + +#. translators: %s - entry count. +#: includes/admin/admin.php:235 +#, php-format +msgid "Are you sure you want to trash %s entries? This will also remove all associated files, notes, and logs." +msgstr "" + +#: includes/admin/admin.php:238 +msgid "Hide Empty Fields" +msgstr "" + +#: includes/admin/admin.php:239 +msgid "Show Empty Fields" +msgstr "" + +#: includes/admin/admin.php:240 +msgid "Are you sure you want to delete this note?" +msgstr "" + +#: includes/admin/admin.php:241 +msgid "Unstar entry" +msgstr "" + +#: includes/admin/admin.php:242 +msgid "Star entry" +msgstr "" + +#: includes/admin/admin.php:243 +msgid "Mark entry read" +msgstr "" + +#: includes/admin/admin.php:244 +msgid "Mark entry unread" +msgstr "" + +#: includes/admin/admin.php:245 +msgid "Are you sure you want to delete this form and all its entries?" +msgstr "" + +#: includes/admin/admin.php:246 +msgid "Are you sure you want to delete this template and all its entries?" +msgstr "" + +#: includes/admin/admin.php:247 +msgid "Are you sure you want to delete the selected forms and all their entries?" +msgstr "" + +#: includes/admin/admin.php:248 +msgid "Are you sure you want to delete ALL the forms in the trash and all their entries?" +msgstr "" + +#: includes/admin/admin.php:249 +msgid "Are you sure you want to duplicate this form?" +msgstr "" + +#: includes/admin/admin.php:250 +msgid "Are you sure you want to duplicate this template?" +msgstr "" + +#: includes/admin/admin.php:251 +#: includes/admin/builder/class-builder.php:796 +#: src/Admin/Education/Builder/Captcha.php:161 +#: src/Admin/Tools/Views/Importer.php:223 +#: src/Forms/Preview.php:338 +#: src/Integrations/Elementor/Elementor.php:241 +#: src/Integrations/Gutenberg/FormSelector.php:486 +#: wpforms.php:188 +msgid "Heads up!" +msgstr "" + +#: includes/admin/admin.php:252 +msgid "Please select at least one form to import." +msgstr "" + +#: includes/admin/admin.php:255 +msgid "Almost Done" +msgstr "" + +#: includes/admin/admin.php:256 +#: src/Admin/Education/StringsTrait.php:111 +msgid "Thanks for your interest in WPForms Pro!" +msgstr "" + +#: includes/admin/admin.php:257 +msgid "Oops!" +msgstr "" + +#: includes/admin/admin.php:258 +#: src/Forms/IconChoices.php:490 +msgid "Uh oh!" +msgstr "" + +#: includes/admin/admin.php:259 +#: includes/admin/builder/class-builder.php:785 +#: src/Admin/Builder/Settings/Themes.php:256 +#: src/Forms/Fields/Camera/Field.php:100 +msgid "OK" +msgstr "" + +#: includes/admin/admin.php:260 +msgid "Install and Activate" +msgstr "" + +#: includes/admin/admin.php:261 +msgid "needs to be installed and activated to import its forms. Would you like us to install and activate it for you?" +msgstr "" + +#: includes/admin/admin.php:263 +msgid "needs to be activated to import its forms. Would you like us to activate it for you?" +msgstr "" + +#: includes/admin/admin.php:264 +msgid "Are you sure you want to disconnect this account? Any form connections you have set up will be lost." +msgstr "" + +#: includes/admin/admin.php:265 +msgid "Could not disconnect this account." +msgstr "" + +#: includes/admin/admin.php:266 +msgid "Could not authenticate with the provider." +msgstr "" + +#: includes/admin/admin.php:267 +msgid "Connecting..." +msgstr "" + +#: includes/admin/admin.php:268 +msgid "Save and Refresh" +msgstr "" + +#: includes/admin/admin.php:269 +#: templates/admin/dashboard/widget/settings.php:57 +msgid "Save Changes" +msgstr "" + +#: includes/admin/admin.php:270 +msgid "Unfortunately there was a server connection error." +msgstr "" + +#: includes/admin/admin.php:271 +msgid "Unknown error." +msgstr "" + +#. translators: %s - WPForms.com docs page URL. +#: includes/admin/admin.php:274 +#, php-format +msgid "You've selected Base Styling Only, which may result in styling issues. Please check out our tutorial for common issues and recommendations." +msgstr "" + +#. translators: %s - WPForms.com docs page URL. +#: includes/admin/admin.php:288 +#, php-format +msgid "You've selected No Styling, which will likely result in significant styling issues and is recommended only for developers. Please check out our tutorial for more details and recommendations." +msgstr "" + +#: includes/admin/admin.php:300 +msgid "Testing" +msgstr "" + +#: includes/admin/admin.php:301 +msgid "Recreating" +msgstr "" + +#: includes/admin/admin.php:302 +msgid "Upgrade was successfully completed!" +msgstr "" + +#: includes/admin/admin.php:303 +#: includes/admin/builder/class-builder.php:871 +msgid "Upload or Choose Your Image" +msgstr "" + +#: includes/admin/admin.php:304 +#: includes/admin/builder/class-builder.php:872 +msgid "Use Image" +msgstr "" + +#: includes/admin/admin.php:306 +#: includes/admin/builder/class-builder.php:875 +msgid "You tried uploading a file type that is not allowed. Please try again." +msgstr "" + +#: includes/admin/admin.php:312 +msgid "To edit the License Key, please first click the Remove Key button. Please note that removing this key will remove access to updates, addons, and support." +msgstr "" + +#: includes/admin/admin.php:313 +#: includes/admin/builder/class-builder.php:895 +msgid "Something went wrong" +msgstr "" + +#: includes/admin/admin.php:314 +msgid "Success" +msgstr "" + +#: includes/admin/admin.php:316 +#: includes/admin/builder/class-builder.php:829 +msgid "Use Default Template" +msgstr "" + +#: includes/admin/admin.php:317 +#: includes/admin/builder/class-builder.php:892 +msgid "Something went wrong while applying the form template. Please try again. If the error persists, contact our support team." +msgstr "" + +#. translators: %s - link to WPForms.com docs page. +#: includes/admin/admin.php:320 +#, php-format +msgid "Something went wrong. Please try again, and if the problem persists, contact our support team." +msgstr "" + +#. translators: %1$s - WPForms plugin name; %2$s - WPForms.com URL to a related doc. +#: includes/admin/admin.php:615 +#, php-format +msgid "Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. Read more for additional information." +msgstr "" + +#: includes/admin/admin.php:629 +msgid "Please Note: Support for PHP 7.3 and below will be discontinued soon. After this, if no further action is taken, WPForms functionality will be disabled." +msgstr "" + +#. translators: %s - WPForms.com contact page URL. +#: includes/admin/admin.php:666 +#, php-format +msgid "Thank you for considering upgrading. If you have any questions, please let us know." +msgstr "" + +#: includes/admin/admin.php:686 +msgid "After upgrading, your license key will remain the same.
            You may need to do a quick refresh to unlock your new addons. In your WordPress admin, go to WPForms » Settings. If you don't see your updated plan, click refresh." +msgstr "" + +#. translators: %s - WPForms.com upgrade from Lite to paid docs page URL. +#: includes/admin/admin.php:697 +#: includes/admin/admin.php:747 +#, php-format +msgid "Check out our documentation for step-by-step instructions." +msgstr "" + +#. translators: %s - WPForms.com contact page URL. +#: includes/admin/admin.php:714 +#, php-format +msgid "If you have any questions or issues just let us know." +msgstr "" + +#. translators: %s - license level, WPForms Pro or WPForms Elite. +#: includes/admin/admin.php:735 +#, php-format +msgid "After purchasing a license, just enter your license key on the WPForms Settings page. This will let your site automatically upgrade to %s! (Don't worry, all your forms and settings will be preserved.)" +msgstr "" + +#: includes/admin/ajax-actions.php:23 +#: includes/admin/ajax-actions.php:925 +#: includes/fields/class-base.php:3321 +#: src/Admin/FormEmbedWizard.php:448 +#: src/Integrations/AI/Admin/Ajax/Choices.php:57 +#: src/Integrations/AI/Admin/Ajax/Forms.php:84 +#: src/Integrations/AI/Admin/Ajax/Forms.php:123 +#: src/Integrations/AI/Admin/Ajax/Forms.php:269 +#: src/Integrations/AI/Admin/Ajax/Forms.php:403 +msgid "Your session expired. Please reload the builder." +msgstr "" + +#: includes/admin/ajax-actions.php:28 +#: includes/admin/ajax-actions.php:286 +#: includes/fields/class-base.php:3326 +#: src/Admin/Builder/Ajax/PanelLoader.php:134 +#: src/Admin/FormEmbedWizard.php:279 +#: src/Admin/FormEmbedWizard.php:455 +#: src/Admin/Forms/Ajax/Tags.php:200 +#: src/Admin/Forms/Ajax/Tags.php:240 +#: src/Admin/Payments/Views/Overview/Ajax.php:64 +#: src/Admin/Payments/Views/Overview/Ajax.php:129 +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:151 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:99 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:159 +msgid "You are not allowed to perform this action." +msgstr "" + +#: includes/admin/ajax-actions.php:33 +msgid "Something went wrong while performing this action." +msgstr "" + +#: includes/admin/ajax-actions.php:68 +msgid "Something went wrong while saving the form." +msgstr "" + +#: includes/admin/ajax-actions.php:180 +msgid "No Form Name Provided" +msgstr "" + +#: includes/admin/ajax-actions.php:194 +#: includes/admin/ajax-actions.php:312 +msgid "The template you selected is currently not available, but you can try again later. If you continue to have trouble, please reach out to support." +msgstr "" + +#: includes/admin/ajax-actions.php:241 +msgid "Error Creating Form" +msgstr "" + +#: includes/admin/ajax-actions.php:296 +msgid "No Form ID Provided" +msgstr "" + +#: includes/admin/ajax-actions.php:409 +msgid "Error Updating Template" +msgstr "" + +#: includes/admin/ajax-actions.php:525 +#: includes/fields/class-base.php:1657 +msgid "post type" +msgstr "" + +#: includes/admin/ajax-actions.php:556 +#: includes/fields/class-base.php:1664 +msgid "taxonomy" +msgstr "" + +#: includes/admin/ajax-actions.php:616 +#: includes/admin/ajax-actions.php:655 +msgid "You do not have permission to perform this operation." +msgstr "" + +#: includes/admin/ajax-actions.php:626 +msgid "Success! Your server can make SSL connections." +msgstr "" + +#: includes/admin/ajax-actions.php:633 +msgid "There was an error and the connection failed. Please contact your web host with the technical details below." +msgstr "" + +#: includes/admin/ajax-actions.php:665 +msgid "WPForms custom database tables are recreated." +msgstr "" + +#: includes/admin/ajax-actions.php:672 +msgid "Error recreating WPForms custom database tables." +msgstr "" + +#: includes/admin/ajax-actions.php:692 +msgid "Plugin deactivation is disabled for you on this site." +msgstr "" + +#: includes/admin/ajax-actions.php:712 +msgid "Plugin deactivated." +msgstr "" + +#: includes/admin/ajax-actions.php:714 +msgid "Addon deactivated." +msgstr "" + +#: includes/admin/ajax-actions.php:718 +msgid "Could not deactivate the addon. Please deactivate from the Plugins page." +msgstr "" + +#: includes/admin/ajax-actions.php:735 +msgid "Plugin activation is disabled for you on this site." +msgstr "" + +#: includes/admin/ajax-actions.php:739 +msgid "Plugin activated." +msgstr "" + +#: includes/admin/ajax-actions.php:740 +msgid "Addon activated." +msgstr "" + +#: includes/admin/ajax-actions.php:743 +msgid "Could not activate the plugin. Please activate it on the Plugins page." +msgstr "" + +#: includes/admin/ajax-actions.php:744 +msgid "Could not activate the addon. Please activate it on the Plugins page." +msgstr "" + +#: includes/admin/ajax-actions.php:789 +msgid "There was an error while performing your request." +msgstr "" + +#: includes/admin/ajax-actions.php:798 +msgid "Could not install the plugin. Please download and install it manually." +msgstr "" + +#: includes/admin/ajax-actions.php:886 +msgid "Plugin installed." +msgstr "" + +#: includes/admin/ajax-actions.php:886 +msgid "Addon installed." +msgstr "" + +#: includes/admin/ajax-actions.php:906 +#: src/Lite/Admin/Connect.php:203 +#: src/Lite/Admin/Connect.php:217 +#: src/Lite/Admin/Connect.php:278 +msgid "Plugin installed & activated." +msgstr "" + +#: includes/admin/ajax-actions.php:906 +msgid "Addon installed & activated." +msgstr "" + +#: includes/admin/ajax-actions.php:929 +#: src/Admin/FormEmbedWizard.php:461 +msgid "Incorrect usage of this operation." +msgstr "" + +#: includes/admin/ajax-actions.php:934 +#: includes/admin/builder/functions.php:752 +msgid "Back to Previous Page (Referrer) " +msgstr "" + +#: includes/admin/builder/class-builder.php:134 +#: includes/admin/builder/class-builder.php:159 +#: src/Integrations/AI/Admin/Ajax/Forms.php:303 +msgid "It looks like the form you are trying to access is no longer available." +msgstr "" + +#: includes/admin/builder/class-builder.php:148 +msgid "Sorry, you are not allowed to create new forms." +msgstr "" + +#: includes/admin/builder/class-builder.php:152 +#: src/Integrations/AI/Admin/Ajax/Forms.php:284 +msgid "Sorry, you are not allowed to edit this form." +msgstr "" + +#: includes/admin/builder/class-builder.php:164 +msgid "You can't edit this form because it's in the trash." +msgstr "" + +#: includes/admin/builder/class-builder.php:752 +msgid "And" +msgstr "" + +#: includes/admin/builder/class-builder.php:754 +msgid "Add New Choices" +msgstr "" + +#: includes/admin/builder/class-builder.php:755 +#: includes/fields/class-base.php:1522 +msgid "Bulk Add" +msgstr "" + +#: includes/admin/builder/class-builder.php:756 +msgid "Are you sure you want to leave? You have unsaved changes" +msgstr "" + +#: includes/admin/builder/class-builder.php:757 +msgid "Hide Bulk Add" +msgstr "" + +#: includes/admin/builder/class-builder.php:758 +msgid "Add Choices (one per line)" +msgstr "" + +#: includes/admin/builder/class-builder.php:759 +msgid "" +"Blue\n" +"Red\n" +"Green" +msgstr "" + +#: includes/admin/builder/class-builder.php:760 +msgid "Show presets" +msgstr "" + +#: includes/admin/builder/class-builder.php:761 +msgid "Hide presets" +msgstr "" + +#. translators: %1$s - data source name (e.g. Categories, Posts), %2$s - data source type (e.g. post type, taxonomy), %3$s - display limit, %4$s - total number of items. +#: includes/admin/builder/class-builder.php:768 +#, php-format +msgid "The %1$s %2$s contains over %3$s items (%4$s). This may make the field difficult for your visitors to use and/or cause the form to be slow." +msgstr "" + +#. translators: %1$s - data source name (e.g. Categories, Posts), %2$s - data source type (e.g. post type, taxonomy). +#. translators: %1$s - data source name (e.g., Categories, Posts), %2$s - data source type (e.g., post type, taxonomy). +#: includes/admin/builder/class-builder.php:775 +#: includes/fields/class-base.php:4146 +#, php-format +msgid "This field will not be displayed in your form since there are no %2$s belonging to %1$s." +msgstr "" + +#: includes/admin/builder/class-builder.php:780 +#: includes/fields/class-base.php:4132 +msgid "posts" +msgstr "" + +#: includes/admin/builder/class-builder.php:781 +#: includes/fields/class-base.php:4137 +msgid "terms" +msgstr "" + +#: includes/admin/builder/class-builder.php:787 +msgid "Due to form changes, conditional logic rules will be removed or updated:" +msgstr "" + +#: includes/admin/builder/class-builder.php:788 +msgid "Are you sure you want to disable conditional logic? This will remove the rules for this field or setting." +msgstr "" + +#: includes/admin/builder/class-builder.php:789 +msgid "Field" +msgstr "" + +#: includes/admin/builder/class-builder.php:790 +msgid "Field Locked" +msgstr "" + +#: includes/admin/builder/class-builder.php:791 +msgid "This field cannot be deleted or duplicated." +msgstr "" + +#: includes/admin/builder/class-builder.php:792 +msgid "This field cannot be deleted." +msgstr "" + +#: includes/admin/builder/class-builder.php:793 +msgid "This field cannot be duplicated." +msgstr "" + +#: includes/admin/builder/class-builder.php:794 +msgid "Available Fields" +msgstr "" + +#: includes/admin/builder/class-builder.php:795 +msgid "No fields available" +msgstr "" + +#: includes/admin/builder/class-builder.php:800 +msgid "No email fields" +msgstr "" + +#: includes/admin/builder/class-builder.php:801 +msgid "Are you sure you want to delete this notification?" +msgstr "" + +#: includes/admin/builder/class-builder.php:802 +msgid "Enter a notification name" +msgstr "" + +#: includes/admin/builder/class-builder.php:803 +msgid "Eg: User Confirmation" +msgstr "" + +#: includes/admin/builder/class-builder.php:804 +msgid "You must provide a notification name" +msgstr "" + +#: includes/admin/builder/class-builder.php:805 +#: lite/wpforms-lite.php:197 +#: src/Admin/Tools/Importers/PirateForms.php:464 +msgid "Default Notification" +msgstr "" + +#: includes/admin/builder/class-builder.php:806 +msgid "Are you sure you want to delete this confirmation?" +msgstr "" + +#: includes/admin/builder/class-builder.php:807 +msgid "Enter a confirmation name" +msgstr "" + +#: includes/admin/builder/class-builder.php:808 +msgid "Eg: Alternative Confirmation" +msgstr "" + +#: includes/admin/builder/class-builder.php:809 +msgid "You must provide a confirmation name" +msgstr "" + +#: includes/admin/builder/class-builder.php:810 +#: lite/wpforms-lite.php:505 +msgid "Default Confirmation" +msgstr "" + +#: includes/admin/builder/class-builder.php:811 +#: includes/admin/builder/class-builder.php:1294 +msgid "Save" +msgstr "" + +#: includes/admin/builder/class-builder.php:812 +msgid "Saving" +msgstr "" + +#: includes/admin/builder/class-builder.php:813 +msgid "Saved!" +msgstr "" + +#: includes/admin/builder/class-builder.php:814 +msgid "Save and Exit" +msgstr "" + +#: includes/admin/builder/class-builder.php:815 +msgid "Save and Embed" +msgstr "" + +#: includes/admin/builder/class-builder.php:817 +#: includes/fields/class-base.php:2367 +msgid "Show Layouts" +msgstr "" + +#: includes/admin/builder/class-builder.php:818 +msgid "Hide Layouts" +msgstr "" + +#: includes/admin/builder/class-builder.php:819 +msgid "Select your layout" +msgstr "" + +#: includes/admin/builder/class-builder.php:820 +msgid "Select your column" +msgstr "" + +#: includes/admin/builder/class-builder.php:821 +#: src/Frontend/Classic.php:389 +msgid "Loading" +msgstr "" + +#: includes/admin/builder/class-builder.php:827 +#: src/Admin/Forms/UserTemplates.php:333 +#: src/Admin/Traits/FormTemplates.php:458 +msgid "Use Template" +msgstr "" + +#: includes/admin/builder/class-builder.php:828 +msgid "Changing the template on this form will delete existing fields, reset external connections, and unsaved changes will be lost. Are you sure you want to apply the new template?" +msgstr "" + +#: includes/admin/builder/class-builder.php:830 +#: includes/admin/builder/class-builder.php:1280 +#: includes/admin/builder/class-builder.php:1286 +msgid "Embed" +msgstr "" + +#: includes/admin/builder/class-builder.php:831 +msgid "Exit" +msgstr "" + +#: includes/admin/builder/class-builder.php:833 +msgid "Your form contains unsaved changes. Would you like to save your changes first." +msgstr "" + +#: includes/admin/builder/class-builder.php:834 +msgid "Are you sure you want to delete this field?" +msgstr "" + +#: includes/admin/builder/class-builder.php:835 +msgid "Are you sure you want to delete this choice?" +msgstr "" + +#: includes/admin/builder/class-builder.php:836 +msgid "Are you sure you want to duplicate this field?" +msgstr "" + +#: includes/admin/builder/class-builder.php:837 +#: includes/class-form.php:900 +#: includes/class-form.php:928 +#: includes/class-form.php:1020 +msgid "(copy)" +msgstr "" + +#: includes/admin/builder/class-builder.php:838 +msgid "Please enter a form name." +msgstr "" + +#: includes/admin/builder/class-builder.php:839 +msgid "This item must contain at least one choice." +msgstr "" + +#: includes/admin/builder/class-builder.php:840 +#: includes/admin/builder/functions.php:520 +#: includes/fields/class-base.php:2521 +#: src/Admin/Tools/Views/Logs.php:110 +#: src/Integrations/Divi/WPFormsSelector.php:78 +#: src/Integrations/Divi/WPFormsSelector.php:88 +msgid "Off" +msgstr "" + +#: includes/admin/builder/class-builder.php:841 +#: includes/admin/builder/functions.php:519 +#: src/Admin/Tools/Views/Logs.php:110 +#: src/Integrations/Divi/WPFormsSelector.php:79 +#: src/Integrations/Divi/WPFormsSelector.php:89 +msgid "On" +msgstr "" + +#: includes/admin/builder/class-builder.php:842 +#: includes/functions/utilities.php:376 +msgid "or" +msgstr "" + +#: includes/admin/builder/class-builder.php:843 +msgid "Other" +msgstr "" + +#: includes/admin/builder/class-builder.php:844 +msgid "is" +msgstr "" + +#: includes/admin/builder/class-builder.php:845 +msgid "is not" +msgstr "" + +#: includes/admin/builder/class-builder.php:846 +msgid "empty" +msgstr "" + +#: includes/admin/builder/class-builder.php:847 +msgid "not empty" +msgstr "" + +#: includes/admin/builder/class-builder.php:848 +#: src/Admin/Payments/Views/Overview/Table.php:699 +msgid "contains" +msgstr "" + +#: includes/admin/builder/class-builder.php:849 +msgid "does not contain" +msgstr "" + +#: includes/admin/builder/class-builder.php:850 +#: src/Admin/Payments/Views/Overview/Table.php:701 +msgid "starts with" +msgstr "" + +#: includes/admin/builder/class-builder.php:851 +msgid "ends with" +msgstr "" + +#: includes/admin/builder/class-builder.php:852 +msgid "greater than" +msgstr "" + +#: includes/admin/builder/class-builder.php:853 +msgid "less than" +msgstr "" + +#: includes/admin/builder/class-builder.php:854 +msgid "Entry storage is currently disabled, but is required to accept payments. Please enable in your form settings." +msgstr "" + +#. translators: %s - marketing or gateway integration name. +#: includes/admin/builder/class-builder.php:856 +#, php-format +msgid "Some third-party integrations require entry storage. If you’d like to continue, you’ll first need to disable %s." +msgstr "" + +#: includes/admin/builder/class-builder.php:859 +msgid "Entry Storage Required" +msgstr "" + +#: includes/admin/builder/class-builder.php:860 +#: src/Forms/Fields/Pagebreak/Field.php:513 +msgid "Previous" +msgstr "" + +#. translators: %s - marketing integration name. +#: includes/admin/builder/class-builder.php:862 +#, php-format +msgid "In order to complete your form's %s integration, please check that all required (*) fields have been filled out." +msgstr "" + +#: includes/admin/builder/class-builder.php:865 +msgid "Create new rule" +msgstr "" + +#: includes/admin/builder/class-builder.php:866 +msgid "Add New Group" +msgstr "" + +#: includes/admin/builder/class-builder.php:867 +msgid "Delete rule" +msgstr "" + +#: includes/admin/builder/class-builder.php:868 +msgid "Smart Tags" +msgstr "" + +#: includes/admin/builder/class-builder.php:869 +#: src/Providers/Provider/Settings/FormBuilder.php:141 +#: src/Providers/Provider/Settings/FormBuilder.php:202 +msgid "--- Select Field ---" +msgstr "" + +#: includes/admin/builder/class-builder.php:870 +msgid "--- Select Choice ---" +msgstr "" + +#: includes/admin/builder/class-builder.php:873 +#: includes/admin/builder/functions.php:919 +#: includes/admin/settings-api.php:532 +#: includes/fields/class-base.php:1611 +#: includes/fields/class-base.php:1777 +#: src/Admin/Builder/Settings/Themes.php:1162 +#: src/Integrations/Gutenberg/FormSelector.php:460 +msgid "Remove Image" +msgstr "" + +#: includes/admin/builder/class-builder.php:876 +msgid "Add" +msgstr "" + +#: includes/admin/builder/class-builder.php:880 +msgid "You should enter a valid absolute address to the Confirmation Redirect URL field." +msgstr "" + +#: includes/admin/builder/class-builder.php:881 +msgid "Add Custom Value" +msgstr "" + +#. translators: %s - choice number. +#: includes/admin/builder/class-builder.php:883 +#: includes/fields/class-checkbox.php:136 +#: includes/fields/class-checkbox.php:748 +#: includes/fields/class-radio.php:182 +#: includes/fields/class-radio.php:747 +#, php-format +msgid "Choice %s" +msgstr "" + +#. translators: %s - choice number. +#. translators: %s - item number. +#: includes/admin/builder/class-builder.php:887 +#: src/Forms/Fields/PaymentCheckbox/Field.php:126 +#: src/Forms/Fields/PaymentCheckbox/Field.php:416 +#: src/Forms/Fields/PaymentMultiple/Field.php:390 +#: src/Forms/Fields/PaymentSelect/Field.php:439 +#: src/Forms/Fields/PaymentTotal/Field.php:691 +#: src/SmartTags/SmartTag/OrderSummary.php:209 +#: src/SmartTags/SmartTag/OrderSummary.php:284 +#, php-format +msgid "Item %s" +msgstr "" + +#: includes/admin/builder/class-builder.php:890 +msgid "Something went wrong while saving the form. Please reload the page and try again." +msgstr "" + +#: includes/admin/builder/class-builder.php:891 +msgid "Please contact support if this behavior persists." +msgstr "" + +#: includes/admin/builder/class-builder.php:893 +msgid "Couldn't load the Setup panel." +msgstr "" + +#: includes/admin/builder/class-builder.php:894 +#: includes/templates/class-blank.php:34 +msgid "Blank Form" +msgstr "" + +#: includes/admin/builder/class-builder.php:896 +msgid "This field cannot be moved." +msgstr "" + +#: includes/admin/builder/class-builder.php:897 +#: includes/fields/class-base.php:2950 +msgid "Empty Label" +msgstr "" + +#: includes/admin/builder/class-builder.php:898 +#: includes/admin/builder/panels/class-fields.php:242 +#: includes/admin/builder/panels/class-settings.php:206 +#: includes/class-form.php:616 +#: includes/class-form.php:708 +#: includes/templates/class-simple-contact-form.php:59 +#: src/Admin/Tools/Importers/ContactForm7.php:135 +#: src/Admin/Tools/Importers/NinjaForms.php:143 +#: src/Frontend/Frontend.php:1323 +#: src/Integrations/AI/Admin/Builder/Forms.php:180 +#: templates/builder/themes/preview.php:84 +msgid "Submit" +msgstr "" + +#: includes/admin/builder/class-builder.php:900 +#: includes/admin/builder/functions.php:851 +#: src/Forms/Fields/Richtext/Field.php:129 +msgid "Full" +msgstr "" + +#: includes/admin/builder/class-builder.php:901 +#: includes/fields/class-name.php:114 +#: includes/fields/class-name.php:469 +msgid "First" +msgstr "" + +#: includes/admin/builder/class-builder.php:902 +#: includes/fields/class-name.php:137 +#: includes/fields/class-name.php:474 +msgid "Middle" +msgstr "" + +#: includes/admin/builder/class-builder.php:903 +#: includes/fields/class-name.php:160 +#: includes/fields/class-name.php:479 +msgid "Last" +msgstr "" + +#: includes/admin/builder/class-builder.php:906 +msgid "Sorry, no results found" +msgstr "" + +#: includes/admin/builder/class-builder.php:907 +msgid "Search" +msgstr "" + +#. translators: %1$s - from value %2$s - to value. +#: includes/admin/builder/class-builder.php:909 +#, php-format +msgid "Please enter a valid value or change the Increment. The nearest valid values are %1$s and %2$s." +msgstr "" + +#: includes/admin/builder/class-builder.php:916 +#: includes/providers/class-base.php:97 +msgid "Connection" +msgstr "" + +#. translators: %s - Integration name. +#: includes/admin/builder/class-builder.php:918 +#, php-format +msgid "%s connection" +msgstr "" + +#. translators: %s - link to the WPForms.com doc article. +#: includes/admin/builder/class-builder.php:927 +#, php-format +msgid "Disabling entry storage for this form will completely prevent any new submissions from getting saved to your site. If you still intend to keep a record of entries through notification emails, then please test your form to ensure emails send reliably." +msgstr "" + +#. translators: %1$s - link to the plugin search page, %2$s - link to the WPForms.com doc article. +#: includes/admin/builder/class-builder.php:947 +#, php-format +msgid "This feature cannot be used at this time because the Akismet plugin has not been installed. For information on how to use this feature please refer to our documentation." +msgstr "" + +#. translators: %1$s - link to the plugins page, %2$s - link to the WPForms.com doc article. +#: includes/admin/builder/class-builder.php:968 +#, php-format +msgid "This feature cannot be used at this time because the Akismet plugin has not been activated. For information on how to use this feature please refer to our documentation." +msgstr "" + +#. translators: %1$s - link to the Akismet settings page, %2$s - link to the WPForms.com doc article. +#: includes/admin/builder/class-builder.php:989 +#, php-format +msgid "This feature cannot be used at this time because the Akismet plugin has not been properly configured. For information on how to use this feature please refer to our documentation." +msgstr "" + +#. translators: %1$s - Documentation page URL. +#: includes/admin/builder/class-builder.php:1010 +#, php-format +msgid "The form cannot be saved due to a 403 error." +msgstr "" + +#: includes/admin/builder/class-builder.php:1060 +msgid "Countries" +msgstr "" + +#: includes/admin/builder/class-builder.php:1064 +msgid "Countries Postal Code" +msgstr "" + +#: includes/admin/builder/class-builder.php:1068 +msgid "States" +msgstr "" + +#: includes/admin/builder/class-builder.php:1072 +msgid "States Postal Code" +msgstr "" + +#: includes/admin/builder/class-builder.php:1076 +msgid "Months" +msgstr "" + +#: includes/admin/builder/class-builder.php:1080 +msgid "Days" +msgstr "" + +#: includes/admin/builder/class-builder.php:1219 +#: includes/admin/class-welcome.php:175 +#: lite/templates/education/builder/lite-connect/ai-modal.php:15 +#: lite/templates/education/lite-connect-modal.php:17 +#: src/Lite/Admin/DashboardWidget.php:261 +#: templates/admin/challenge/modal.php:52 +#: templates/builder/fullscreen/mobile-notice.php:15 +#: templates/builder/help.php:32 +msgid "Sullie the WPForms mascot" +msgstr "" + +#: includes/admin/builder/class-builder.php:1227 +msgid "Now editing" +msgstr "" + +#: includes/admin/builder/class-builder.php:1236 +#: src/Admin/Forms/UserTemplates.php:125 +#: src/Admin/Settings/Email.php:213 +msgid "Template" +msgstr "" + +#: includes/admin/builder/class-builder.php:1248 +msgid "Help Ctrl+H" +msgstr "" + +#: includes/admin/builder/class-builder.php:1251 +#: src/Admin/Payments/Views/Overview/Helpers.php:83 +msgid "Help" +msgstr "" + +#: includes/admin/builder/class-builder.php:1268 +msgid "Preview Form Ctrl+P" +msgstr "" + +#: includes/admin/builder/class-builder.php:1271 +#: includes/admin/settings-api.php:433 +#: src/Admin/Forms/Views.php:602 +#: src/Admin/Settings/Captcha/Page.php:194 +#: src/Admin/Tools/Views/Importer.php:332 +#: templates/builder/notifications/email-template-modal.php:44 +msgid "Preview" +msgstr "" + +#: includes/admin/builder/class-builder.php:1279 +msgid "You cannot embed a form template" +msgstr "" + +#: includes/admin/builder/class-builder.php:1285 +msgid "Embed Form Ctrl+B" +msgstr "" + +#: includes/admin/builder/class-builder.php:1293 +msgid "Save Form Ctrl+S" +msgstr "" + +#: includes/admin/builder/class-builder.php:1299 +msgid "Exit Ctrl+Q" +msgstr "" + +#: includes/admin/builder/functions.php:80 +msgid "Show Smart Tags" +msgstr "" + +#. translators: %d - field ID. +#. translators: %d - Field ID. +#: includes/admin/builder/functions.php:308 +#: src/Integrations/Square/Process.php:762 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:145 +#, php-format +msgid "Field #%d" +msgstr "" + +#: includes/admin/builder/functions.php:852 +#: includes/fields/class-base.php:1901 +#: includes/fields/class-base.php:2250 +#: src/Admin/Builder/Settings/Themes.php:104 +#: src/Admin/Builder/Settings/Themes.php:966 +#: src/Admin/Settings/Email.php:369 +#: src/Forms/Fields/Rating/Field.php:233 +#: src/Forms/IconChoices.php:133 +#: src/Integrations/Elementor/WidgetModern.php:78 +#: src/Integrations/Elementor/WidgetModern.php:532 +#: src/Integrations/Gutenberg/FormSelector.php:526 +#: templates/builder/field-context-menu.php:106 +msgid "Large" +msgstr "" + +#: includes/admin/builder/functions.php:853 +#: includes/fields/class-base.php:1900 +#: includes/fields/class-base.php:2249 +#: src/Admin/Builder/Settings/Themes.php:103 +#: src/Admin/Builder/Settings/Themes.php:965 +#: src/Admin/Settings/Email.php:368 +#: src/Forms/Fields/Password/Field.php:132 +#: src/Forms/Fields/Rating/Field.php:232 +#: src/Forms/IconChoices.php:137 +#: src/Integrations/Elementor/WidgetModern.php:77 +#: src/Integrations/Elementor/WidgetModern.php:531 +#: src/Integrations/Gutenberg/FormSelector.php:525 +#: templates/builder/field-context-menu.php:96 +msgid "Medium" +msgstr "" + +#: includes/admin/builder/functions.php:854 +#: includes/fields/class-base.php:1899 +#: includes/fields/class-base.php:2248 +#: src/Admin/Builder/Settings/Themes.php:102 +#: src/Admin/Builder/Settings/Themes.php:964 +#: src/Admin/Settings/Email.php:367 +#: src/Forms/Fields/Rating/Field.php:231 +#: src/Forms/IconChoices.php:141 +#: src/Integrations/Elementor/WidgetModern.php:76 +#: src/Integrations/Elementor/WidgetModern.php:530 +#: src/Integrations/Gutenberg/FormSelector.php:524 +#: templates/builder/field-context-menu.php:86 +msgid "Small" +msgstr "" + +#: includes/admin/builder/functions.php:859 +#: src/Forms/Fields/Pagebreak/Field.php:449 +msgid "Left" +msgstr "" + +#: includes/admin/builder/functions.php:860 +#: src/Forms/Fields/Pagebreak/Field.php:451 +msgid "Center" +msgstr "" + +#: includes/admin/builder/functions.php:861 +#: src/Forms/Fields/Pagebreak/Field.php:450 +msgid "Right" +msgstr "" + +#: includes/admin/builder/functions.php:879 +msgid "Preview of selected image" +msgstr "" + +#: includes/admin/builder/functions.php:879 +msgid "No image selected" +msgstr "" + +#: includes/admin/builder/functions.php:885 +#: src/Admin/Builder/Settings/Themes.php:531 +#: src/Admin/Builder/Settings/Themes.php:662 +#: src/Admin/Builder/Settings/Themes.php:743 +#: src/Admin/Builder/Settings/Themes.php:1079 +#: src/Integrations/Elementor/WidgetModern.php:233 +#: src/Integrations/Elementor/WidgetModern.php:333 +#: src/Integrations/Elementor/WidgetModern.php:392 +#: src/Integrations/Elementor/WidgetModern.php:626 +#: src/Integrations/Gutenberg/FormSelector.php:499 +msgid "Size" +msgstr "" + +#: includes/admin/builder/functions.php:898 +#: src/Admin/Builder/Settings/Themes.php:1033 +#: src/Integrations/Elementor/WidgetModern.php:585 +#: src/Integrations/Gutenberg/FormSelector.php:461 +msgid "Position" +msgstr "" + +#: includes/admin/builder/functions.php:912 +msgid "Upload an image" +msgstr "" + +#: includes/admin/builder/functions.php:913 +#: includes/admin/settings-api.php:535 +#: includes/fields/class-base.php:1621 +#: includes/fields/class-base.php:1787 +msgid "Upload Image" +msgstr "" + +#: includes/admin/builder/functions.php:918 +msgid "Remove the selected image" +msgstr "" + +#: includes/admin/builder/panels/class-base.php:211 +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:137 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:425 +msgid "Plan Name" +msgstr "" + +#: includes/admin/builder/panels/class-base.php:212 +msgid "You can only use one payment type at a time. If you'd like to enable Recurring Payments, please disable One-Time Payments." +msgstr "" + +#: includes/admin/builder/panels/class-base.php:213 +msgid "You can only use one payment type at a time. If you'd like to enable One-Time Payments, please disable Recurring Payments." +msgstr "" + +#: includes/admin/builder/panels/class-base.php:421 +msgid "Corrupted Form Data" +msgstr "" + +#: includes/admin/builder/panels/class-base.php:429 +msgid "A critical error has occurred, preventing your form from loading. This issue may arise from incorrect code in a third-party theme or plugin, or from invalid characters in your form. You can attempt to restore a previous version of your form using Form Revisions." +msgstr "" + +#. translators: %s - WPForms contact support link. +#: includes/admin/builder/panels/class-base.php:445 +#, php-format +msgid "If the issue persists, please contact support." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:25 +msgid "Fields" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:101 +msgid "Add Fields" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:107 +msgid "Field Options" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:152 +msgid "You need to setup your form before you can manage the fields." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:235 +msgid "Enabled" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:473 +#: includes/fields/class-base.php:3419 +msgid "Duplicate Field" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:479 +#: includes/fields/class-base.php:3422 +msgid "Delete Field" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:491 +#: includes/fields/class-base.php:3433 +msgid "Click to Edit" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:492 +#: includes/fields/class-base.php:3434 +msgid "Drag to Reorder" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:493 +#: includes/fields/class-base.php:3435 +msgid "Hide Helper" +msgstr "" + +#. translators: %s - unavailable field name. +#: includes/admin/builder/panels/class-fields.php:572 +#, php-format +msgid "Unfortunately, the %s field is not available and will be ignored on the front end." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:593 +#: includes/admin/class-settings.php:128 +#: includes/fields/class-internal-information.php:302 +#: includes/fields/class-internal-information.php:456 +#: includes/fields/class-internal-information.php:684 +#: lite/templates/education/builder/did-you-know.php:27 +#: src/Admin/Notifications/EventDriven.php:590 +#: src/Admin/Notifications/EventDriven.php:656 +#: src/Admin/Notifications/EventDriven.php:709 +#: src/Admin/Pages/PrivacyCompliance.php:196 +#: src/Admin/Pages/SugarCalendar.php:234 +#: src/Admin/Pages/UncannyAutomator.php:171 +#: src/Admin/Splash/SplashTrait.php:130 +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:172 +#: src/Lite/Admin/DashboardWidget.php:272 +#: src/Lite/Admin/DashboardWidget.php:438 +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:130 +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:136 +msgid "Learn More" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:594 +msgid "Dismiss this message. The field will be deleted as well." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:613 +msgid "You don't have any fields yet." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:629 +msgid "You don't have any fields yet. Add some!" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:630 +msgid "Take your pick from our wide variety of fields and start building out your form!" +msgstr "" + +#. translators: %s - total number of choices. +#: includes/admin/builder/panels/class-fields.php:732 +#, php-format +msgid "Showing the first 20 choices.
            All %s choices will be displayed when viewing the form." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:772 +msgid "Search fields:" +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:773 +msgid "Search fields..." +msgstr "" + +#: includes/admin/builder/panels/class-fields.php:785 +msgid "Sorry, we didn't find any fields that match your criteria." +msgstr "" + +#: includes/admin/builder/panels/class-payments.php:22 +#: includes/admin/class-menu.php:114 +#: includes/admin/class-menu.php:115 +#: src/Admin/AdminBarMenu.php:225 +#: src/Admin/AdminBarMenu.php:495 +#: src/Admin/Forms/Views.php:592 +#: src/Admin/Payments/Payments.php:173 +#: src/Admin/Payments/Views/Overview/Page.php:151 +#: src/Admin/Settings/Payments.php:47 +#: src/Admin/Settings/Payments.php:78 +msgid "Payments" +msgstr "" + +#: includes/admin/builder/panels/class-payments.php:41 +#: includes/admin/builder/panels/class-providers.php:81 +#: includes/fields/class-base.php:2173 +msgid "Default" +msgstr "" + +#: includes/admin/builder/panels/class-payments.php:62 +msgid "You need to setup your form before you can manage these settings." +msgstr "" + +#: includes/admin/builder/panels/class-payments.php:83 +#: includes/admin/builder/panels/class-payments.php:104 +msgid "Install Your Payment Integration" +msgstr "" + +#. translators: %s - addons page URL. +#: includes/admin/builder/panels/class-payments.php:87 +#, php-format +msgid "It seems you do not have any payment addons activated. You can head over to the Addons page to install and activate the addon for your payment service." +msgstr "" + +#: includes/admin/builder/panels/class-payments.php:105 +msgid "It seems you don't have any payment addons activated. Click one of the available addons and start accepting payments today!" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:27 +msgid "Marketing" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:57 +msgid "We need to save your progress to continue to the Marketing panel. Is that OK?" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:58 +msgid "Are you sure you want to delete this connection?" +msgstr "" + +#. translators: %s - connection type. +#: includes/admin/builder/panels/class-providers.php:60 +#, php-format +msgid "Enter a %s nickname" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:61 +msgid "Eg: Newsletter Optin" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:62 +msgid "You must provide a connection nickname." +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:63 +msgid "Field required" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:64 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:233 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:239 +#: src/Providers/Provider/Settings/FormBuilder.php:163 +#: src/Providers/Provider/Settings/FormBuilder.php:222 +#: templates/integrations/constant-contact-v3/builder/select-field.php:15 +msgid "--- Select Form Field ---" +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:101 +msgid "You need to set up your form before you can manage these settings." +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:124 +msgid "Install Your Marketing Integration" +msgstr "" + +#. translators: %s - plugin admin area Addons page. +#: includes/admin/builder/panels/class-providers.php:129 +#, php-format +msgid "It seems you do not have any marketing addons activated. You can head over to the Addons page to install and activate the addon for your provider." +msgstr "" + +#: includes/admin/builder/panels/class-providers.php:145 +msgid "Select Your Marketing Integration" +msgstr "" + +#: includes/admin/builder/panels/class-revisions.php:31 +msgid "Revisions" +msgstr "" + +#: includes/admin/builder/panels/class-revisions.php:38 +msgid "Form Template Revisions" +msgstr "" + +#: includes/admin/builder/panels/class-revisions.php:39 +msgid "Form Revisions" +msgstr "" + +#: includes/admin/builder/panels/class-revisions.php:117 +msgid "Select a revision to roll back to that version. All changes, including settings, will be reverted." +msgstr "" + +#: includes/admin/builder/panels/class-revisions.php:172 +msgid "Restore this revision" +msgstr "" + +#: includes/admin/builder/panels/class-revisions.php:178 +msgid "go back to the current version" +msgstr "" + +#. translators: %1$s - revision date, %2$s - revision time, %3$s - "Restore this revision" link, %4$s - "go back to the current version" link. +#: includes/admin/builder/panels/class-revisions.php:182 +#, php-format +msgid "You’re currently viewing a form revision from %1$s at %2$s. %3$s or %4$s." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:29 +#: includes/admin/class-menu.php:151 +#: includes/admin/class-menu.php:402 +#: src/Admin/AdminBarMenu.php:538 +msgid "Settings" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:58 +#: includes/admin/builder/panels/class-settings.php:155 +#: includes/admin/class-settings.php:302 +#: includes/admin/class-settings.php:379 +#: includes/fields/class-base.php:1285 +#: src/Admin/AdminBarMenu.php:209 +#: src/Admin/Builder/Settings/Themes.php:406 +msgid "General" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:59 +#: includes/admin/class-about.php:1759 +#: src/Admin/Builder/AntiSpam.php:57 +msgid "Spam Protection and Security" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:60 +#: src/Admin/Builder/Settings/Themes.php:251 +#: src/Admin/Builder/Settings/Themes.php:445 +#: src/Integrations/Elementor/Elementor.php:257 +#: src/Integrations/Elementor/WidgetModern.php:138 +#: src/Integrations/Gutenberg/FormSelector.php:439 +msgid "Themes" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:61 +#: lite/wpforms-lite.php:136 +#: src/Admin/AdminBarMenu.php:457 +#: templates/admin/notifications.php:23 +msgid "Notifications" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:62 +#: lite/wpforms-lite.php:493 +msgid "Confirmations" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:120 +#: src/Admin/Forms/Tags.php:258 +msgid "Press Enter or \",\" key to add new tag" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:136 +msgid "You need to setup your form before you can manage the settings." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:163 +#: src/Integrations/Elementor/Widget.php:244 +#: src/SmartTags/SmartTags.php:117 +msgid "Form Name" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:173 +#: src/Integrations/Elementor/Widget.php:258 +msgid "Form Description" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:175 +msgid "Enter descriptive text or instructions to help your users understand the requirements of your form." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:190 +msgid "Template Description" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:192 +msgid "Describe the use case for your template. Only displayed internally." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:204 +msgid "Submit Button Text" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:214 +msgid "Submit Button Processing Text" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:216 +msgid "Enter the submit button text you would like the button display while the form submit is processing." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:294 +#: src/Admin/Forms/Table/Facades/Columns.php:70 +msgid "Tags" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:299 +msgid "Mark form with the tags. To create a new tag, simply type it and press Enter." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:320 +msgid "Form CSS Class" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:322 +msgid "Enter CSS class names for the form wrapper. Multiple class names should be separated with spaces." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:331 +msgid "Submit Button CSS Class" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:333 +msgid "Enter CSS class names for the form submit button. Multiple names should be separated with spaces." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:342 +msgid "Enable Prefill by URL" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:347 +msgid "How to use Prefill by URL" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:357 +msgid "Enable AJAX form submission" +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:359 +msgid "Enables form submission without page reload." +msgstr "" + +#: includes/admin/builder/panels/class-settings.php:379 +#: includes/fields/class-base.php:2308 +#: src/Admin/Builder/Settings/Themes.php:408 +#: src/Integrations/Elementor/WidgetModern.php:744 +#: src/Integrations/Gutenberg/FormSelector.php:481 +#: src/Lite/Admin/Education/Builder/Notifications.php:130 +msgid "Advanced" +msgstr "" + +#: includes/admin/builder/panels/class-setup.php:33 +msgid "Setup" +msgstr "" + +#: includes/admin/builder/panels/class-setup.php:72 +#: templates/admin/challenge/builder.php:15 +#: templates/admin/challenge/modal.php:38 +msgid "Name Your Form" +msgstr "" + +#: includes/admin/builder/panels/class-setup.php:73 +msgid "Enter your form name here…" +msgstr "" + +#: includes/admin/builder/panels/class-setup.php:77 +#: src/Admin/Tools/Views/Export.php:207 +#: templates/admin/challenge/builder.php:21 +#: templates/admin/challenge/modal.php:39 +msgid "Select a Template" +msgstr "" + +#. translators: %1$s - create a template doc link, %2$s - Contact us page link. +#: includes/admin/builder/panels/class-setup.php:85 +#, php-format +msgid "To speed up the process, you can select from one of our pre-made templates, start with a blank form or create your own." +msgstr "" + +#. translators: %1$s - create a template doc link, %2$s - Contact us page link. +#: includes/admin/builder/panels/class-setup.php:103 +#, php-format +msgid "Have a suggestion for a new template? We’d love to hear it!" +msgstr "" + +#: includes/admin/class-about.php:113 +#: includes/admin/class-menu.php:215 +msgid "About Us" +msgstr "" + +#: includes/admin/class-about.php:114 +#: src/Admin/Builder/Help.php:103 +msgid "Getting Started" +msgstr "" + +#. translators: %1$s - current license type, %2$s - suggested license type. +#: includes/admin/class-about.php:141 +#, php-format +msgid "%1$s vs %2$s" +msgstr "" + +#: includes/admin/class-about.php:270 +msgid "Hello and welcome to WPForms, the most beginner friendly drag & drop WordPress forms plugin. At WPForms, we build software that helps you create beautiful responsive online forms for your website in minutes." +msgstr "" + +#: includes/admin/class-about.php:273 +msgid "Over the years, we found that most WordPress contact form plugins were bloated, buggy, slow, and very hard to use. So we started with a simple goal: build a WordPress forms plugin that’s both easy and powerful." +msgstr "" + +#: includes/admin/class-about.php:276 +msgid "Our goal is to take the pain out of creating online forms and make it easy." +msgstr "" + +#. translators: %1$s - WPBeginner URL, %2$s - OptinMonster URL, %3$s - MonsterInsights URL. +#: includes/admin/class-about.php:282 +#, php-format +msgid "WPForms is brought to you by the same team that’s behind the largest WordPress resource site, WPBeginner, the most popular lead-generation software, OptinMonster, the best WordPress analytics plugin, MonsterInsights, and more!" +msgstr "" + +#: includes/admin/class-about.php:298 +msgid "Yup, we know a thing or two about building awesome products that customers love." +msgstr "" + +#: includes/admin/class-about.php:304 +msgid "The WPForms Team photo" +msgstr "" + +#: includes/admin/class-about.php:306 +msgid "The WPForms Team" +msgstr "" + +#. translators: %s - status label. +#: includes/admin/class-about.php:359 +#, php-format +msgid "Status: %s" +msgstr "" + +#: includes/admin/class-about.php:372 +msgid "WordPress.org" +msgstr "" + +#: includes/admin/class-about.php:446 +#: src/Admin/Tools/Views/Import.php:258 +msgid "Not Installed" +msgstr "" + +#: includes/admin/class-about.php:450 +msgid "Install Plugin" +msgstr "" + +#: includes/admin/class-about.php:487 +msgid "Creating Your First Form" +msgstr "" + +#: includes/admin/class-about.php:491 +msgid "Want to get started creating your first form with WPForms? By following the step by step instructions in this walkthrough, you can easily publish your first form on your site." +msgstr "" + +#: includes/admin/class-about.php:495 +msgid "To begin, you’ll need to be logged into the WordPress admin area. Once there, click on WPForms in the admin sidebar to go to the Forms Overview page." +msgstr "" + +#: includes/admin/class-about.php:499 +msgid "In the Forms Overview page, the forms list will be empty because there are no forms yet. To create a new form, click on the Add New button, and this will launch the WPForms Form Builder." +msgstr "" + +#: includes/admin/class-about.php:505 +msgid "How to Add a New Form" +msgstr "" + +#: includes/admin/class-about.php:510 +msgid "How to Customize Form Fields" +msgstr "" + +#: includes/admin/class-about.php:515 +msgid "How to Display Forms on Your Site" +msgstr "" + +#: includes/admin/class-about.php:533 +#: lite/wpforms-lite.php:719 +msgid "Get WPForms Pro and Unlock all the Powerful Features" +msgstr "" + +#: includes/admin/class-about.php:539 +msgid "Thanks for being a loyal WPForms Lite user. Upgrade to WPForms Pro to unlock all the awesome features and experience
            why WPForms is consistently rated the best WordPress form builder." +msgstr "" + +#. translators: %s - stars. +#: includes/admin/class-about.php:552 +#, php-format +msgid "We know that you will truly love WPForms. It has over 13,000+ five star ratings (%s) and is active on over 6 million websites." +msgstr "" + +#. translators: %s - number of templates. +#: includes/admin/class-about.php:575 +#: lite/wpforms-lite.php:743 +#, php-format +msgid "%s customizable form templates" +msgstr "" + +#: includes/admin/class-about.php:582 +#: lite/wpforms-lite.php:748 +msgid "Store and manage form entries in WordPress" +msgstr "" + +#: includes/admin/class-about.php:586 +#: lite/wpforms-lite.php:749 +msgid "Unlock all fields & features, including smart conditional logic" +msgstr "" + +#: includes/admin/class-about.php:590 +#: lite/wpforms-lite.php:750 +msgid "Create powerful custom calculation forms" +msgstr "" + +#: includes/admin/class-about.php:594 +#: lite/wpforms-lite.php:751 +msgid "Make surveys and generate reports" +msgstr "" + +#: includes/admin/class-about.php:598 +#: lite/wpforms-lite.php:752 +msgid "Accept user-submitted content with the Post Submissions addon" +msgstr "" + +#: includes/admin/class-about.php:606 +#: lite/wpforms-lite.php:755 +msgid "7000+ integrations with marketing and payment services" +msgstr "" + +#: includes/admin/class-about.php:610 +#: lite/wpforms-lite.php:756 +msgid "Let users save & resume submissions to prevent abandonment" +msgstr "" + +#: includes/admin/class-about.php:614 +#: lite/wpforms-lite.php:757 +msgid "Take payments with Stripe, PayPal, Square, & Authorize.Net" +msgstr "" + +#: includes/admin/class-about.php:618 +#: lite/wpforms-lite.php:758 +msgid "Export entries to Google Sheets, Excel, and CSV" +msgstr "" + +#: includes/admin/class-about.php:622 +#: lite/wpforms-lite.php:759 +msgid "Collect signatures, geolocation data, and file uploads" +msgstr "" + +#: includes/admin/class-about.php:626 +#: lite/wpforms-lite.php:760 +msgid "Create user registration and login forms" +msgstr "" + +#: includes/admin/class-about.php:639 +msgid "Get WPForms Pro Today and Unlock all the Powerful Features" +msgstr "" + +#: includes/admin/class-about.php:649 +#: includes/admin/class-about.php:868 +msgid "Bonus: WPForms Lite users get 50% off regular price, automatically applied at checkout." +msgstr "" + +#: includes/admin/class-about.php:670 +msgid "How to Choose the Right Form Field" +msgstr "" + +#: includes/admin/class-about.php:674 +msgid "Are you wondering which form fields you have access to in WPForms and what each field does? WPForms has lots of field types to make creating and filling out forms easy. In this tutorial, we’ll cover all of the fields available in WPForms." +msgstr "" + +#: includes/admin/class-about.php:678 +#: includes/admin/class-about.php:697 +#: includes/admin/class-about.php:716 +#: includes/admin/class-about.php:735 +msgid "Read Documentation" +msgstr "" + +#: includes/admin/class-about.php:689 +msgid "A Complete Guide to WPForms Settings" +msgstr "" + +#: includes/admin/class-about.php:693 +msgid "Would you like to learn more about all of the settings available in WPForms? In addition to tons of customization options within the form builder, WPForms has an extensive list of plugin-wide options available. This includes choosing your currency, adding GDPR enhancements, setting up integrations." +msgstr "" + +#: includes/admin/class-about.php:708 +msgid "How to Create GDPR Compliant Forms" +msgstr "" + +#: includes/admin/class-about.php:712 +msgid "Do you need to check that your forms are compliant with the European Union’s General Data Protection Regulation? The best way to ensure GDPR compliance for your specific site is always to consult legal counsel. In this guide, we’ll discuss general considerations for GDPR compliance in your WordPress forms." +msgstr "" + +#: includes/admin/class-about.php:727 +msgid "How to Install and Activate WPForms Addons" +msgstr "" + +#: includes/admin/class-about.php:731 +msgid "Would you like to access WPForms addons to extend the functionality of your forms? The first thing you need to do is install WPForms. Once that’s done, let’s go ahead and look at the process of activating addons." +msgstr "" + +#: includes/admin/class-about.php:784 +msgid "Get the most out of WPForms by upgrading to Pro and unlocking all of the powerful features." +msgstr "" + +#: includes/admin/class-about.php:792 +msgid "Feature" +msgstr "" + +#. translators: %s - next license level. +#: includes/admin/class-about.php:857 +#, php-format +msgid "Get WPForms %s Today and Unlock all the Powerful Features" +msgstr "" + +#: includes/admin/class-about.php:897 +msgid "OptinMonster" +msgstr "" + +#: includes/admin/class-about.php:898 +msgid "Instantly get more subscribers, leads, and sales with the #1 conversion optimization toolkit. Create high converting popups, announcement bars, spin a wheel, and more with smart targeting and personalization." +msgstr "" + +#: includes/admin/class-about.php:905 +#: src/Admin/Dashboard/Widget.php:187 +msgid "MonsterInsights" +msgstr "" + +#: includes/admin/class-about.php:906 +#: includes/admin/class-about.php:913 +msgid "The leading WordPress analytics plugin that shows you how people find and use your website, so you can make data driven decisions to grow your business. Properly set up Google Analytics without writing code." +msgstr "" + +#: includes/admin/class-about.php:912 +msgid "MonsterInsights Pro" +msgstr "" + +#: includes/admin/class-about.php:921 +#: src/Admin/Dashboard/Widget.php:211 +#: src/Admin/Pages/SMTP.php:402 +msgid "WP Mail SMTP" +msgstr "" + +#: includes/admin/class-about.php:922 +#: includes/admin/class-about.php:929 +msgid "Improve your WordPress email deliverability and make sure that your website emails reach user's inbox with the #1 SMTP plugin for WordPress. Over 3 million websites use it to fix WordPress email issues." +msgstr "" + +#: includes/admin/class-about.php:928 +msgid "WP Mail SMTP Pro" +msgstr "" + +#: includes/admin/class-about.php:937 +#: src/Admin/Dashboard/Widget.php:195 +msgid "AIOSEO" +msgstr "" + +#: includes/admin/class-about.php:938 +#: includes/admin/class-about.php:945 +msgid "The original WordPress SEO plugin and toolkit that improves your website's search rankings. Comes with all the SEO features like Local SEO, WooCommerce SEO, sitemaps, SEO optimizer, schema, and more." +msgstr "" + +#: includes/admin/class-about.php:944 +msgid "AIOSEO Pro" +msgstr "" + +#: includes/admin/class-about.php:953 +#: src/Admin/Dashboard/Widget.php:203 +msgid "SeedProd" +msgstr "" + +#: includes/admin/class-about.php:954 +#: includes/admin/class-about.php:961 +msgid "The fastest drag & drop landing page builder for WordPress. Create custom landing pages without writing code, connect them with your CRM, collect subscribers, and grow your audience. Trusted by 1 million sites." +msgstr "" + +#: includes/admin/class-about.php:960 +msgid "SeedProd Pro" +msgstr "" + +#: includes/admin/class-about.php:969 +msgid "RafflePress" +msgstr "" + +#: includes/admin/class-about.php:970 +#: includes/admin/class-about.php:977 +msgid "Turn your website visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with the most powerful giveaways & contests plugin for WordPress." +msgstr "" + +#: includes/admin/class-about.php:976 +msgid "RafflePress Pro" +msgstr "" + +#: includes/admin/class-about.php:985 +msgid "PushEngage" +msgstr "" + +#: includes/admin/class-about.php:986 +msgid "Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 15 billion notifications each month." +msgstr "" + +#: includes/admin/class-about.php:993 +msgid "Smash Balloon Instagram Feeds" +msgstr "" + +#: includes/admin/class-about.php:994 +#: includes/admin/class-about.php:1001 +msgid "Easily display Instagram content on your WordPress site without writing any code. Comes with multiple templates, ability to show content from multiple accounts, hashtags, and more. Trusted by 1 million websites." +msgstr "" + +#: includes/admin/class-about.php:1000 +msgid "Smash Balloon Instagram Feeds Pro" +msgstr "" + +#: includes/admin/class-about.php:1009 +msgid "Smash Balloon Facebook Feeds" +msgstr "" + +#: includes/admin/class-about.php:1010 +#: includes/admin/class-about.php:1017 +msgid "Easily display Facebook content on your WordPress site without writing any code. Comes with multiple templates, ability to embed albums, group content, reviews, live videos, comments, and reactions." +msgstr "" + +#: includes/admin/class-about.php:1016 +msgid "Smash Balloon Facebook Feeds Pro" +msgstr "" + +#: includes/admin/class-about.php:1025 +msgid "Smash Balloon YouTube Feeds" +msgstr "" + +#: includes/admin/class-about.php:1026 +#: includes/admin/class-about.php:1033 +msgid "Easily display YouTube videos on your WordPress site without writing any code. Comes with multiple layouts, ability to embed live streams, video filtering, ability to combine multiple channel videos, and more." +msgstr "" + +#: includes/admin/class-about.php:1032 +msgid "Smash Balloon YouTube Feeds Pro" +msgstr "" + +#: includes/admin/class-about.php:1041 +msgid "Smash Balloon Twitter Feeds" +msgstr "" + +#: includes/admin/class-about.php:1042 +#: includes/admin/class-about.php:1049 +msgid "Easily display Twitter content in WordPress without writing any code. Comes with multiple layouts, ability to combine multiple Twitter feeds, Twitter card support, tweet moderation, and more." +msgstr "" + +#: includes/admin/class-about.php:1048 +msgid "Smash Balloon Twitter Feeds Pro" +msgstr "" + +#: includes/admin/class-about.php:1057 +msgid "TrustPulse" +msgstr "" + +#: includes/admin/class-about.php:1058 +msgid "Boost your sales and conversions by up to 15% with real-time social proof notifications. TrustPulse helps you show live user activity and purchases to help convince other users to purchase." +msgstr "" + +#: includes/admin/class-about.php:1065 +msgid "SearchWP" +msgstr "" + +#: includes/admin/class-about.php:1066 +msgid "The most advanced WordPress search plugin. Customize your WordPress search algorithm, reorder search results, track search metrics, and everything you need to leverage search to grow your business." +msgstr "" + +#: includes/admin/class-about.php:1074 +msgid "AffiliateWP" +msgstr "" + +#: includes/admin/class-about.php:1075 +msgid "The #1 affiliate management plugin for WordPress. Easily create an affiliate program for your eCommerce store or membership site within minutes and start growing your sales with the power of referral marketing." +msgstr "" + +#: includes/admin/class-about.php:1083 +msgid "WP Simple Pay" +msgstr "" + +#: includes/admin/class-about.php:1084 +#: includes/admin/class-about.php:1091 +msgid "The #1 Stripe payments plugin for WordPress. Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart. No code required." +msgstr "" + +#: includes/admin/class-about.php:1090 +msgid "WP Simple Pay Pro" +msgstr "" + +#: includes/admin/class-about.php:1099 +msgid "Easy Digital Downloads" +msgstr "" + +#: includes/admin/class-about.php:1100 +msgid "The best WordPress eCommerce plugin for selling digital downloads. Start selling eBooks, software, music, digital art, and more within minutes. Accept payments, manage subscriptions, advanced access control, and more." +msgstr "" + +#: includes/admin/class-about.php:1107 +#: src/Admin/Pages/SugarCalendar.php:394 +msgid "Sugar Calendar" +msgstr "" + +#: includes/admin/class-about.php:1108 +#: includes/admin/class-about.php:1115 +msgid "A simple & powerful event calendar plugin for WordPress that comes with all the event management features including payments, scheduling, timezones, ticketing, recurring events, and more." +msgstr "" + +#: includes/admin/class-about.php:1114 +msgid "Sugar Calendar Pro" +msgstr "" + +#: includes/admin/class-about.php:1122 +msgid "Charitable" +msgstr "" + +#: includes/admin/class-about.php:1123 +msgid "Top-rated WordPress donation and fundraising plugin. Over 10,000+ non-profit organizations and website owners use Charitable to create fundraising campaigns and raise more money online." +msgstr "" + +#: includes/admin/class-about.php:1129 +msgid "WPCode" +msgstr "" + +#: includes/admin/class-about.php:1130 +msgid "Future proof your WordPress customizations with the most popular code snippet management plugin for WordPress. Trusted by over 1,500,000+ websites for easily adding code to WordPress right from the admin area." +msgstr "" + +#: includes/admin/class-about.php:1136 +#: src/Admin/Pages/Duplicator.php:389 +msgid "Duplicator" +msgstr "" + +#: includes/admin/class-about.php:1137 +msgid "Leading WordPress backup & site migration plugin. Over 1,500,000+ smart website owners use Duplicator to make reliable and secure WordPress backups to protect their websites. It also makes website migration really easy." +msgstr "" + +#: includes/admin/class-about.php:1161 +msgid "Entries via Email Only" +msgstr "" + +#: includes/admin/class-about.php:1167 +#: includes/admin/class-about.php:1173 +#: includes/admin/class-about.php:1179 +msgid "Complete Entry Management inside WordPress" +msgstr "" + +#: includes/admin/class-about.php:1187 +msgid "Standard and Payment Fields" +msgstr "" + +#: includes/admin/class-about.php:1188 +msgid "Name, Email, Single Line Text, Paragraph Text, Dropdown, Multiple Choice, Checkboxes, Numbers, Number Slider, and Payment Fields (Single Item, Total, etc.)" +msgstr "" + +#: includes/admin/class-about.php:1194 +#: includes/admin/class-about.php:1201 +#: includes/admin/class-about.php:1208 +msgid "Access to all Standard, Fancy, and Payment Fields" +msgstr "" + +#: includes/admin/class-about.php:1195 +#: includes/admin/class-about.php:1202 +#: includes/admin/class-about.php:1209 +msgid "Address, Phone, Website / URL, Date / Time, Password, File Upload, Layout, Rich Text, Content, HTML, Pagebreaks, Entry Preview, Section Dividers, Ratings, and Hidden Field" +msgstr "" + +#: includes/admin/class-about.php:1217 +msgid "Not available" +msgstr "" + +#: includes/admin/class-about.php:1223 +#: includes/admin/class-about.php:1229 +#: includes/admin/class-about.php:1235 +msgid "Powerful Form Logic for Building Smart Forms" +msgstr "" + +#: includes/admin/class-about.php:1243 +#: includes/admin/class-about.php:1249 +#: includes/admin/class-about.php:1255 +msgid "Basic Form Templates" +msgstr "" + +#. translators: %s - number of templates. +#: includes/admin/class-about.php:1263 +#, php-format +msgid "All Form Templates including Bonus %s pre-made form templates" +msgstr "" + +#: includes/admin/class-about.php:1274 +msgid "Basic Anti-Spam Settings" +msgstr "" + +#: includes/admin/class-about.php:1275 +msgid "Basic Protection, reCAPTCHA, hCaptcha, Cloudflare Turnstile and Akismet" +msgstr "" + +#: includes/admin/class-about.php:1281 +#: includes/admin/class-about.php:1288 +#: includes/admin/class-about.php:1295 +msgid "Additional Anti-Spam Settings" +msgstr "" + +#: includes/admin/class-about.php:1282 +#: includes/admin/class-about.php:1289 +#: includes/admin/class-about.php:1296 +msgid "Basic Protection, reCAPTCHA, hCaptcha, Cloudflare Turnstile, Akismet, Country Filter, Keyword Filter, and Custom Captcha" +msgstr "" + +#: includes/admin/class-about.php:1304 +#: includes/admin/class-about.php:1311 +msgid "Limited Marketing Integration" +msgstr "" + +#: includes/admin/class-about.php:1305 +#: includes/admin/class-about.php:1312 +msgid "Constant Contact only" +msgstr "" + +#: includes/admin/class-about.php:1318 +#: includes/admin/class-about.php:1340 +msgid "Additional Marketing Integrations" +msgstr "" + +#: includes/admin/class-about.php:1361 +#: includes/admin/class-about.php:1397 +#: includes/admin/class-about.php:1433 +#: includes/admin/class-about.php:1469 +msgid "Bonus: 7000+ integrations with Zapier." +msgstr "" + +#: includes/admin/class-about.php:1371 +#: includes/admin/class-about.php:1407 +#: includes/admin/class-about.php:1443 +msgid "All Marketing Integrations" +msgstr "" + +#: includes/admin/class-about.php:1481 +#: includes/admin/class-about.php:1488 +#: includes/admin/class-about.php:1495 +msgid "Limited Payment Forms" +msgstr "" + +#: includes/admin/class-about.php:1482 +#: includes/admin/class-about.php:1489 +#: includes/admin/class-about.php:1496 +msgid "Accept payments using Stripe and Square only" +msgstr "" + +#: includes/admin/class-about.php:1502 +#: includes/admin/class-about.php:1509 +#: includes/admin/class-about.php:1516 +#: includes/admin/class-about.php:1523 +msgid "Create Payment Forms" +msgstr "" + +#: includes/admin/class-about.php:1503 +msgid "Accept payments using PayPal Commerce, Stripe, Square, and PayPal Standard" +msgstr "" + +#: includes/admin/class-about.php:1510 +#: includes/admin/class-about.php:1517 +#: includes/admin/class-about.php:1524 +msgid "Accept payments using PayPal Commerce, Stripe, Square, PayPal Standard, and Authorize.Net" +msgstr "" + +#: includes/admin/class-about.php:1532 +#: includes/admin/class-about.php:1538 +#: includes/admin/class-about.php:1544 +msgid "Not Available" +msgstr "" + +#: includes/admin/class-about.php:1550 +msgid "Create interactive Surveys and Polls with beautiful reports" +msgstr "" + +#: includes/admin/class-about.php:1558 +msgid "No Advanced Features" +msgstr "" + +#: includes/admin/class-about.php:1564 +#: includes/admin/class-about.php:1571 +msgid "Limited Advanced Features" +msgstr "" + +#: includes/admin/class-about.php:1565 +msgid "Multi-page Forms, File Upload Forms, Multiple Form Notifications, File Upload and CSV Attachments, Conditional Form Confirmation" +msgstr "" + +#: includes/admin/class-about.php:1572 +msgid "Multi-page Forms, File Upload Forms, Multiple Form Notifications, File Upload and CSV Attachments, Conditional Form Confirmation, Save and Resume Form" +msgstr "" + +#: includes/admin/class-about.php:1578 +msgid "All Advanced Features" +msgstr "" + +#: includes/admin/class-about.php:1579 +msgid "Multi-page Forms, File Upload Forms, Multiple Form Notifications, File Upload and CSV Attachments, Conditional Form Confirmation, Custom CAPTCHA, Offline Forms, Signature Forms, Save and Resume Form, Coupons" +msgstr "" + +#: includes/admin/class-about.php:1587 +#: includes/admin/class-about.php:1593 +msgid "No Addons Included" +msgstr "" + +#: includes/admin/class-about.php:1599 +msgid "Email Marketing Addons included" +msgstr "" + +#: includes/admin/class-about.php:1605 +msgid "Pro Addons Included" +msgstr "" + +#: includes/admin/class-about.php:1612 +#: includes/admin/class-about.php:1619 +#: includes/admin/class-about.php:1626 +msgid "All Addons Included" +msgstr "" + +#: includes/admin/class-about.php:1635 +msgid "Limited Support" +msgstr "" + +#: includes/admin/class-about.php:1641 +#: includes/admin/class-about.php:1647 +msgid "Standard Support" +msgstr "" + +#: includes/admin/class-about.php:1653 +msgid "Priority Support" +msgstr "" + +#: includes/admin/class-about.php:1659 +#: includes/admin/class-about.php:1665 +#: includes/admin/class-about.php:1671 +msgid "Premium Support" +msgstr "" + +#: includes/admin/class-about.php:1679 +msgid "1 Site" +msgstr "" + +#: includes/admin/class-about.php:1685 +msgid "3 Sites" +msgstr "" + +#: includes/admin/class-about.php:1691 +msgid "5 Sites" +msgstr "" + +#: includes/admin/class-about.php:1697 +#: includes/admin/class-about.php:1703 +#: includes/admin/class-about.php:1709 +msgid "Unlimited Sites" +msgstr "" + +#: includes/admin/class-about.php:1756 +#: includes/admin/class-menu.php:104 +msgid "Form Entries" +msgstr "" + +#: includes/admin/class-about.php:1757 +msgid "Form Fields" +msgstr "" + +#: includes/admin/class-about.php:1758 +#: includes/admin/class-menu.php:141 +#: includes/admin/class-welcome.php:235 +#: src/Admin/Pages/Templates.php:114 +msgid "Form Templates" +msgstr "" + +#: includes/admin/class-about.php:1760 +#: includes/admin/class-welcome.php:247 +#: src/Integrations/Square/Admin/Builder/Settings.php:278 +#: src/Integrations/Stripe/Admin/Builder/Settings.php:301 +#: src/Lite/Admin/Education/Builder/Fields.php:81 +msgid "Smart Conditional Logic" +msgstr "" + +#: includes/admin/class-about.php:1761 +#: includes/admin/class-welcome.php:318 +#: src/Admin/Builder/Help.php:107 +msgid "Marketing Integrations" +msgstr "" + +#: includes/admin/class-about.php:1762 +#: includes/admin/class-welcome.php:309 +#: src/Admin/Builder/Help.php:108 +msgid "Payment Forms" +msgstr "" + +#: includes/admin/class-about.php:1763 +#: includes/admin/class-welcome.php:310 +msgid "Surveys & Polls" +msgstr "" + +#: includes/admin/class-about.php:1764 +msgid "Advanced Form Features" +msgstr "" + +#: includes/admin/class-about.php:1765 +#: includes/admin/class-menu.php:180 +#: lite/templates/admin/addons.php:21 +msgid "WPForms Addons" +msgstr "" + +#: includes/admin/class-about.php:1766 +msgid "Customer Support" +msgstr "" + +#: includes/admin/class-about.php:1767 +msgid "Number of Sites" +msgstr "" + +#. translators: %s - number of addons. +#: includes/admin/class-about.php:1788 +#, php-format +msgid "PDF, Calculations, Form Abandonment, Conversational Forms, Lead Forms, Frontend Post Submission, User Registration, Geolocation, Google Sheets, Coupons, Dropbox, Google Calendar, Google Drive, Airtable, Notion, and more (%1$s+ total)" +msgstr "" + +#. translators: %s - number of addons. +#: includes/admin/class-about.php:1811 +#, php-format +msgid "PDF, Calculations, Form Abandonment, Conversational Forms, Lead Forms, Frontend Post Submission, User Registration, Geolocation, Webhooks, Google Sheets, Coupons, Dropbox, Google Calendar, Google Drive, Entry Automation, Airtable, Notion, and more (%1$s+ total)" +msgstr "" + +#: includes/admin/class-editor.php:52 +#: includes/admin/class-editor.php:166 +msgid "Add Form" +msgstr "" + +#: includes/admin/class-editor.php:107 +msgid "Insert Form" +msgstr "" + +#. translators: %s - WPForms documentation URL. +#: includes/admin/class-editor.php:117 +#, php-format +msgid "Heads up! Don't forget to test your form. Check out our complete guide!" +msgstr "" + +#: includes/admin/class-editor.php:133 +msgid "Select a form below to insert" +msgstr "" + +#: includes/admin/class-editor.php:139 +msgid "Show form name" +msgstr "" + +#: includes/admin/class-editor.php:140 +msgid "Show form description" +msgstr "" + +#. translators: %s - WPForms Builder page. +#: includes/admin/class-editor.php:146 +#, php-format +msgid "Whoops, you haven't created a form yet. Want to give it a go?" +msgstr "" + +#: includes/admin/class-menu.php:85 +#: src/Admin/AdminBarMenu.php:476 +msgid "All Forms" +msgstr "" + +#: includes/admin/class-menu.php:94 +msgid "WPForms Builder" +msgstr "" + +#: includes/admin/class-menu.php:95 +#: src/Admin/AdminBarMenu.php:519 +msgid "Add New Form" +msgstr "" + +#: includes/admin/class-menu.php:105 +#: src/Admin/Forms/Table/Facades/Columns.php:82 +#: src/Admin/Forms/Views.php:571 +#: src/Lite/Admin/DashboardWidget.php:170 +#: src/Logger/Log.php:103 +#: templates/emails/summary-body-plain.php:52 +#: templates/emails/summary-body.php:159 +msgid "Entries" +msgstr "" + +#: includes/admin/class-menu.php:140 +msgid "WPForms Templates" +msgstr "" + +#: includes/admin/class-menu.php:150 +msgid "WPForms Settings" +msgstr "" + +#: includes/admin/class-menu.php:160 +msgid "WPForms Tools" +msgstr "" + +#: includes/admin/class-menu.php:161 +#: src/Admin/AdminBarMenu.php:557 +msgid "Tools" +msgstr "" + +#: includes/admin/class-menu.php:171 +#: templates/emails/summary-body.php:280 +msgid "Info" +msgstr "" + +#: includes/admin/class-menu.php:181 +#: src/Integrations/AI/Admin/Builder/Forms.php:218 +msgid "Addons" +msgstr "" + +#: includes/admin/class-menu.php:204 +#: includes/admin/class-menu.php:205 +msgid "SMTP" +msgstr "" + +#: includes/admin/class-menu.php:214 +msgid "About WPForms" +msgstr "" + +#: includes/admin/class-menu.php:224 +#: includes/admin/class-menu.php:225 +#: src/Admin/AdminBarMenu.php:576 +#: src/Admin/Pages/Community.php:137 +msgid "Community" +msgstr "" + +#: includes/admin/class-menu.php:234 +#: includes/admin/class-menu.php:235 +#: lite/templates/education/builder/did-you-know.php:30 +#: lite/wpforms-lite.php:1020 +#: src/Admin/Builder/AntiSpam.php:350 +#: src/Admin/Builder/Templates.php:1037 +#: src/Admin/Education/Builder/PDF.php:224 +#: src/Forms/Fields/Traits/ProField.php:287 +#: src/Integrations/AI/Admin/Builder/Forms.php:217 +#: src/Integrations/Elementor/Elementor.php:259 +msgid "Upgrade to Pro" +msgstr "" + +#: includes/admin/class-menu.php:389 +#: includes/admin/class-welcome.php:377 +#: includes/functions/education.php:78 +#: src/Admin/FlyoutMenu.php:112 +#: src/Admin/Payments/Views/Coupons/Education.php:143 +#: src/Admin/Tools/Views/Importer.php:229 +#: src/Lite/Admin/DashboardWidget.php:319 +#: templates/builder/help.php:91 +#: templates/education/admin/page.php:102 +msgid "Upgrade to WPForms Pro" +msgstr "" + +#: includes/admin/class-menu.php:390 +msgid "Get WPForms Pro" +msgstr "" + +#: includes/admin/class-menu.php:401 +msgid "Go to WPForms Settings page" +msgstr "" + +#: includes/admin/class-menu.php:418 +msgid "Read the documentation" +msgstr "" + +#: includes/admin/class-menu.php:419 +#: includes/admin/class-review.php:321 +#: src/Admin/Blocks/Links.php:91 +#: templates/builder/help.php:122 +msgid "Docs" +msgstr "" + +#: includes/admin/class-menu.php:551 +msgid "Privacy Compliance" +msgstr "" + +#: includes/admin/class-menu.php:557 +msgid "Events" +msgstr "" + +#: includes/admin/class-menu.php:563 +msgid "Backups" +msgstr "" + +#: includes/admin/class-menu.php:569 +msgid "Automation" +msgstr "" + +#: includes/admin/class-review.php:232 +msgid "Hey, there! It looks like you enjoy creating forms with WPForms. Would you do us a favor and take a few seconds to give us a 5-star review? We’d love to hear from you." +msgstr "" + +#: includes/admin/class-review.php:237 +msgid "Ok, you deserve it" +msgstr "" + +#: includes/admin/class-review.php:241 +msgid "Nope, maybe later" +msgstr "" + +#: includes/admin/class-review.php:245 +msgid "I already did" +msgstr "" + +#. translators: $1$s - WPForms plugin name, $2$s - WP.org review link, $3$s - WP.org review link. +#: includes/admin/class-review.php:272 +#, php-format +msgid "Please rate %1$s ★★★★★ on WordPress.org to help us spread the word." +msgstr "" + +#: includes/admin/class-review.php:312 +#: src/Admin/Blocks/Links.php:107 +msgid "Support" +msgstr "" + +#: includes/admin/class-review.php:326 +msgid "VIP Circle" +msgstr "" + +#: includes/admin/class-review.php:331 +msgid "Free Plugins" +msgstr "" + +#: includes/admin/class-review.php:338 +msgid "Made with ♥ by the WPForms Team" +msgstr "" + +#. translators: %1$s - WPForms.com doc page URL; %2$s - button text. +#: includes/admin/class-settings.php:115 +#, php-format +msgid "It looks like you've downgraded to an older version of WPForms. We recommend always using the latest version as some features may not function as expected in older versions. %2$s" +msgstr "" + +#: includes/admin/class-settings.php:273 +msgid "Settings were successfully saved." +msgstr "" + +#: includes/admin/class-settings.php:277 +msgid "You've changed your currency. Please double-check the product prices in your forms and verify that they're correct." +msgstr "" + +#: includes/admin/class-settings.php:304 +#: includes/admin/class-settings.php:309 +#: includes/admin/class-settings.php:324 +#: src/Admin/Settings/Captcha/Page.php:124 +#: src/Admin/Settings/Email.php:178 +#: src/Admin/Settings/Payments.php:49 +#: src/Admin/Tools/Views/Logs.php:128 +msgid "Save Settings" +msgstr "" + +#: includes/admin/class-settings.php:307 +#: src/Admin/AdminBarMenu.php:221 +msgid "Validation" +msgstr "" + +#: includes/admin/class-settings.php:312 +#: includes/admin/class-settings.php:578 +#: includes/admin/class-settings.php:585 +#: src/Admin/AdminBarMenu.php:229 +msgid "Integrations" +msgstr "" + +#: includes/admin/class-settings.php:317 +#: includes/admin/class-welcome.php:315 +#: src/Admin/AdminBarMenu.php:233 +#: src/Admin/Education/Admin/Settings/Geolocation.php:141 +msgid "Geolocation" +msgstr "" + +#: includes/admin/class-settings.php:322 +#: src/Admin/AdminBarMenu.php:241 +msgid "Misc" +msgstr "" + +#: includes/admin/class-settings.php:367 +msgid "License" +msgstr "" + +#: includes/admin/class-settings.php:367 +msgid "Your license key provides access to updates and addons." +msgstr "" + +#: includes/admin/class-settings.php:374 +msgid "License Key" +msgstr "" + +#: includes/admin/class-settings.php:386 +msgid "Include Form Styling" +msgstr "" + +#. translators: %s - WPForms.com form styling setting URL. +#: includes/admin/class-settings.php:389 +#, php-format +msgid "Determines which CSS files to load and use for the site. \"Base and Form Theme Styling\" is recommended, unless you are experienced with CSS or instructed by support to change settings. Learn More" +msgstr "" + +#: includes/admin/class-settings.php:405 +msgid "Base and form theme styling" +msgstr "" + +#: includes/admin/class-settings.php:406 +msgid "Base styling only" +msgstr "" + +#: includes/admin/class-settings.php:407 +msgid "No styling" +msgstr "" + +#: includes/admin/class-settings.php:412 +msgid "Load Assets Globally" +msgstr "" + +#: includes/admin/class-settings.php:413 +msgid "Load WPForms assets site-wide. Only check if your site is having compatibility issues or instructed to by support." +msgstr "" + +#: includes/admin/class-settings.php:419 +msgid "GDPR" +msgstr "" + +#: includes/admin/class-settings.php:426 +msgid "GDPR Enhancements" +msgstr "" + +#. translators: %s - WPForms.com GDPR documentation URL. +#: includes/admin/class-settings.php:429 +#, php-format +msgid "Enable GDPR related features and enhancements. Learn More" +msgstr "" + +#. translators: %s - WPForms.com smart tags documentation URL. +#: includes/admin/class-settings.php:450 +#, php-format +msgid "%1$s These messages are displayed to the users as they fill out a form in real-time. Messages can include plain text and/or %2$sSmart Tags%3$s." +msgstr "" + +#: includes/admin/class-settings.php:451 +msgid "Validation Messages" +msgstr "" + +#: includes/admin/class-settings.php:462 +#: includes/fields/class-base.php:1388 +msgid "Required" +msgstr "" + +#: includes/admin/class-settings.php:464 +#: includes/functions/escape-sanitize.php:456 +#: src/Frontend/Frontend.php:1848 +msgid "This field is required." +msgstr "" + +#: includes/admin/class-settings.php:468 +#: includes/fields/class-email.php:50 +#: includes/fields/class-email.php:144 +#: includes/fields/class-email.php:505 +#: includes/templates/class-simple-contact-form.php:43 +#: src/Admin/AdminBarMenu.php:213 +#: src/Admin/Settings/Email.php:177 +#: src/Emails/Preview.php:406 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:210 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:229 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:244 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:221 +#: templates/admin/settings/email-heading.php:12 +#: templates/builder/themes/preview.php:35 +msgid "Email" +msgstr "" + +#: includes/admin/class-settings.php:470 +#: src/Frontend/Frontend.php:1849 +msgid "Please enter a valid email address." +msgstr "" + +#: includes/admin/class-settings.php:474 +msgid "Email Suggestion" +msgstr "" + +#. translators: %s - suggested email address. +#: includes/admin/class-settings.php:477 +#: src/Frontend/Frontend.php:1853 +#, php-format +msgid "Did you mean %s?" +msgstr "" + +#: includes/admin/class-settings.php:483 +msgid "Email Restricted" +msgstr "" + +#: includes/admin/class-settings.php:485 +#: includes/fields/class-email.php:683 +#: includes/fields/class-email.php:691 +#: src/Frontend/Frontend.php:1858 +msgid "This email address is not allowed." +msgstr "" + +#: includes/admin/class-settings.php:489 +msgid "Number" +msgstr "" + +#: includes/admin/class-settings.php:491 +#: includes/fields/class-number.php:226 +#: src/Frontend/Frontend.php:1859 +msgid "Please enter a valid number." +msgstr "" + +#: includes/admin/class-settings.php:495 +msgid "Number Positive" +msgstr "" + +#: includes/admin/class-settings.php:497 +#: src/Frontend/Frontend.php:1860 +msgid "Please enter a valid positive number." +msgstr "" + +#: includes/admin/class-settings.php:501 +#: src/Forms/Fields/PaymentSingle/Field.php:418 +msgid "Minimum Price" +msgstr "" + +#: includes/admin/class-settings.php:503 +#: src/Frontend/Frontend.php:1861 +msgid "Amount entered is less than the required minimum." +msgstr "" + +#: includes/admin/class-settings.php:507 +msgid "Confirm Value" +msgstr "" + +#: includes/admin/class-settings.php:509 +#: src/Frontend/Frontend.php:1862 +msgid "Field values do not match." +msgstr "" + +#: includes/admin/class-settings.php:513 +msgid "Input Mask Incomplete" +msgstr "" + +#: includes/admin/class-settings.php:515 +#: src/Frontend/Frontend.php:1884 +msgid "Please fill out the field in required format." +msgstr "" + +#: includes/admin/class-settings.php:519 +msgid "Checkbox Selection Limit" +msgstr "" + +#: includes/admin/class-settings.php:521 +#: includes/fields/class-base.php:4387 +#: src/Frontend/Frontend.php:1863 +msgid "You have exceeded the number of allowed selections: {#}." +msgstr "" + +#: includes/admin/class-settings.php:525 +msgid "Character Limit" +msgstr "" + +#. translators: %1$s - characters limit, %2$s - number of characters left. +#: includes/admin/class-settings.php:528 +#, php-format +msgid "Limit is %1$s characters. Characters remaining: %2$s." +msgstr "" + +#: includes/admin/class-settings.php:535 +msgid "Word Limit" +msgstr "" + +#. translators: %1$s - words limit, %2$s - number of words left. +#: includes/admin/class-settings.php:538 +#, php-format +msgid "Limit is %1$s words. Words remaining: %2$s." +msgstr "" + +#: includes/admin/class-settings.php:545 +msgid "Payment Required" +msgstr "" + +#: includes/admin/class-settings.php:547 +#: src/Forms/Fields/PaymentTotal/Field.php:387 +#: src/Frontend/Frontend.php:1984 +msgid "Payment is required." +msgstr "" + +#: includes/admin/class-settings.php:551 +#: src/Forms/Fields/CreditCard/Field.php:25 +msgid "Credit Card" +msgstr "" + +#: includes/admin/class-settings.php:553 +#: src/Frontend/Frontend.php:1985 +msgid "Please enter a valid credit card number." +msgstr "" + +#: includes/admin/class-settings.php:557 +msgid "Minimum Value" +msgstr "" + +#. translators: %s - value to compare with. +#: includes/admin/class-settings.php:560 +#, php-format +msgid "Please enter a value greater than or equal to %s." +msgstr "" + +#: includes/admin/class-settings.php:566 +msgid "Maximum Value" +msgstr "" + +#. translators: %s - value to compare with. +#: includes/admin/class-settings.php:569 +#, php-format +msgid "Please enter a value less than or equal to %s." +msgstr "" + +#: includes/admin/class-settings.php:578 +#: includes/admin/class-settings.php:585 +msgid "Manage integrations with popular providers such as Constant Contact, Mailchimp, Zapier, and more." +msgstr "" + +#: includes/admin/class-settings.php:594 +msgid "Miscellaneous" +msgstr "" + +#: includes/admin/class-settings.php:601 +msgid "Delete Spam Entries" +msgstr "" + +#: includes/admin/class-settings.php:602 +msgid "Choose the frequency spam entries are automatically deleted." +msgstr "" + +#: includes/admin/class-settings.php:607 +msgid "7 Days" +msgstr "" + +#: includes/admin/class-settings.php:608 +msgid "15 Days" +msgstr "" + +#: includes/admin/class-settings.php:609 +msgid "30 Days" +msgstr "" + +#: includes/admin/class-settings.php:610 +msgid "90 Days" +msgstr "" + +#: includes/admin/class-settings.php:615 +msgid "Hide Announcements" +msgstr "" + +#: includes/admin/class-settings.php:616 +msgid "Hide plugin announcements and update details." +msgstr "" + +#: includes/admin/class-settings.php:622 +msgid "Hide Admin Bar Menu" +msgstr "" + +#: includes/admin/class-settings.php:623 +msgid "Hide the WPForms admin bar menu." +msgstr "" + +#: includes/admin/class-settings.php:629 +msgid "Uninstall WPForms" +msgstr "" + +#: includes/admin/class-settings.php:658 +#: includes/admin/class-settings.php:662 +msgid "Remove ALL WPForms data upon plugin deletion." +msgstr "" + +#: includes/admin/class-settings.php:659 +msgid "All forms and settings will be unrecoverable." +msgstr "" + +#: includes/admin/class-settings.php:663 +msgid "All forms, entries, and uploaded files will be unrecoverable." +msgstr "" + +#: includes/admin/class-welcome.php:74 +#: includes/admin/class-welcome.php:75 +#: includes/admin/class-welcome.php:179 +msgid "Welcome to WPForms" +msgstr "" + +#: includes/admin/class-welcome.php:180 +msgid "Thank you for choosing WPForms - the most powerful drag & drop WordPress form builder in the market." +msgstr "" + +#: includes/admin/class-welcome.php:183 +#: includes/admin/class-welcome.php:184 +msgid "Watch how to create your first form" +msgstr "" + +#: includes/admin/class-welcome.php:189 +msgid "WPForms makes it easy to create forms in WordPress. You can watch the video tutorial or read our guide on how to create your first form." +msgstr "" + +#: includes/admin/class-welcome.php:194 +#: includes/admin/class-welcome.php:370 +msgid "Create Your First Form" +msgstr "" + +#: includes/admin/class-welcome.php:200 +msgid "Read the Full Guide" +msgstr "" + +#: includes/admin/class-welcome.php:222 +msgid "WPForms Features & Addons" +msgstr "" + +#: includes/admin/class-welcome.php:223 +msgid "WPForms is both easy to use and extremely powerful. We have tons of helpful features that allow us to give you everything you need from a form builder." +msgstr "" + +#: includes/admin/class-welcome.php:229 +msgid "Drag & Drop Form Builder" +msgstr "" + +#: includes/admin/class-welcome.php:230 +msgid "Easily create an amazing form in just a few minutes without writing any code." +msgstr "" + +#: includes/admin/class-welcome.php:236 +msgid "Start with pre-built form templates to save even more time." +msgstr "" + +#: includes/admin/class-welcome.php:241 +msgid "Responsive Mobile Friendly" +msgstr "" + +#: includes/admin/class-welcome.php:242 +msgid "WPForms is 100% responsive meaning it works on mobile, tablets & desktop." +msgstr "" + +#: includes/admin/class-welcome.php:248 +msgid "Easily create high performance forms with our smart conditional logic." +msgstr "" + +#: includes/admin/class-welcome.php:253 +msgid "Instant Notifications" +msgstr "" + +#: includes/admin/class-welcome.php:254 +msgid "Respond to leads quickly with our instant form notification feature for your team." +msgstr "" + +#: includes/admin/class-welcome.php:259 +#: includes/admin/class-welcome.php:313 +#: src/Admin/Builder/Help.php:105 +msgid "Entry Management" +msgstr "" + +#: includes/admin/class-welcome.php:260 +msgid "View all your leads in one place to streamline your workflow." +msgstr "" + +#: includes/admin/class-welcome.php:265 +msgid "Payments Made Easy" +msgstr "" + +#: includes/admin/class-welcome.php:266 +msgid "Easily collect payments, donations, and online orders without hiring a developer." +msgstr "" + +#: includes/admin/class-welcome.php:271 +msgid "Marketing & Subscriptions" +msgstr "" + +#: includes/admin/class-welcome.php:272 +msgid "Create subscription forms and connect with your email marketing service." +msgstr "" + +#: includes/admin/class-welcome.php:277 +msgid "Easy to Embed" +msgstr "" + +#: includes/admin/class-welcome.php:278 +msgid "Easily embed your forms in blog posts, pages, sidebar widgets, footer, etc." +msgstr "" + +#: includes/admin/class-welcome.php:283 +msgid "Spam Protection" +msgstr "" + +#: includes/admin/class-welcome.php:284 +msgid "Our smart captcha and spam protection automatically prevents spam submissions." +msgstr "" + +#: includes/admin/class-welcome.php:292 +msgid "See All Features" +msgstr "" + +#: includes/admin/class-welcome.php:305 +msgid "Upgrade to PRO" +msgstr "" + +#: includes/admin/class-welcome.php:307 +msgid "Advanced Fields" +msgstr "" + +#: includes/admin/class-welcome.php:308 +#: src/Logger/Log.php:102 +msgid "Conditional Logic" +msgstr "" + +#: includes/admin/class-welcome.php:311 +msgid "Signatures" +msgstr "" + +#: includes/admin/class-welcome.php:312 +msgid "Form Abandonment" +msgstr "" + +#: includes/admin/class-welcome.php:314 +msgid "File Uploads" +msgstr "" + +#: includes/admin/class-welcome.php:316 +msgid "Conversational Forms" +msgstr "" + +#: includes/admin/class-welcome.php:317 +msgid "User Registration" +msgstr "" + +#: includes/admin/class-welcome.php:326 +msgid "per year" +msgstr "" + +#: includes/admin/class-welcome.php:330 +#: lite/templates/admin/addons.php:89 +#: src/Admin/Notifications/EventDriven.php:625 +#: src/Admin/Notifications/EventDriven.php:632 +#: src/Admin/Notifications/EventDriven.php:639 +#: src/Admin/Notifications/EventDriven.php:678 +#: src/Admin/Notifications/EventDriven.php:685 +#: src/Admin/Notifications/EventDriven.php:692 +#: src/Admin/Notifications/EventDriven.php:745 +#: src/Admin/Notifications/EventDriven.php:752 +#: src/Admin/Notifications/EventDriven.php:759 +#: src/Admin/Tools/Views/Importer.php:363 +#: src/Lite/Admin/Pages/Addons.php:95 +msgid "Upgrade Now" +msgstr "" + +#: includes/admin/class-welcome.php:342 +msgid "Testimonials" +msgstr "" + +#: includes/admin/class-welcome.php:346 +msgid "WPForms is by far the easiest form plugin to use. My clients love it – it’s one of the few plugins they can use without any training. As a developer I appreciate how fast, modern, clean and extensible it is." +msgstr "" + +#: includes/admin/class-welcome.php:353 +msgid "As a business owner, time is my most valuable asset. WPForms allow me to create smart online forms with just a few clicks. With their pre-built form templates and the drag & drop builder, I can create a new form that works in less than 2 minutes without writing a single line of code. Well worth the investment." +msgstr "" + +#. translators: %s - ID of a setting. +#: includes/admin/settings-api.php:97 +#, php-format +msgid "The callback function used for the %s setting is missing." +msgstr "" + +#: includes/admin/settings-api.php:129 +msgid "You're using WPForms Lite - no license needed. Enjoy!" +msgstr "" + +#. translators: %s - WPForms.com upgrade URL. +#: includes/admin/settings-api.php:134 +#, php-format +msgid "To unlock more features consider upgrading to PRO." +msgstr "" + +#: includes/admin/settings-api.php:151 +msgid "As a valued WPForms Lite user you receive 50% off, automatically applied at checkout!" +msgstr "" + +#: includes/admin/settings-api.php:158 +msgid "Already purchased? Simply enter your license key below to enable WPForms PRO!" +msgstr "" + +#: includes/admin/settings-api.php:160 +msgid "Paste license key here" +msgstr "" + +#: includes/admin/settings-api.php:161 +msgid "Verify Key" +msgstr "" + +#: includes/admin/settings-api.php:399 +#: templates/builder/notifications/email-template-modal.php:31 +msgid "Email Templates" +msgstr "" + +#: includes/admin/settings-api.php:428 +#: templates/builder/notifications/email-template-modal.php:40 +msgid "Choose" +msgstr "" + +#: includes/admin/settings-api.php:672 +msgid "Copy webhook URL" +msgstr "" + +#: includes/class-form.php:617 +#: includes/templates/class-blank.php:62 +#: includes/templates/class-simple-contact-form.php:60 +msgid "Sending..." +msgstr "" + +#. translators: %s - form name. +#: includes/class-form.php:623 +#: lite/wpforms-lite.php:250 +#: src/Admin/Tools/Importers/ContactForm7.php:144 +#: src/Admin/Tools/Importers/ContactForm7.php:455 +#: src/Admin/Tools/Importers/NinjaForms.php:152 +#: src/Admin/Tools/Importers/NinjaForms.php:441 +#: src/Admin/Tools/Importers/PirateForms.php:467 +#: src/Integrations/AI/Admin/Ajax/Forms.php:219 +#, php-format +msgid "New Entry: %s" +msgstr "" + +#: includes/class-form.php:634 +#: includes/class-process.php:1417 +#: includes/templates/class-simple-contact-form.php:73 +#: lite/wpforms-lite.php:485 +#: lite/wpforms-lite.php:547 +#: src/Admin/Tools/Importers/ContactForm7.php:156 +#: src/Admin/Tools/Importers/NinjaForms.php:164 +#: src/Admin/Tools/Importers/PirateForms.php:480 +msgid "Thanks for contacting us! We will be in touch with you shortly." +msgstr "" + +#: includes/class-form.php:1149 +msgid "Zaps Have Been Disabled" +msgstr "" + +#. translators: %s - URL the to list of Zaps. +#: includes/class-form.php:1152 +#, php-format +msgid "Head over to the Zapier settings in the Marketing tab or visit your Zapier account to restore them." +msgstr "" + +#: includes/class-process.php:227 +msgid "Invalid form." +msgstr "" + +#: includes/class-process.php:252 +msgid "Attempt to submit corrupted post data." +msgstr "" + +#. translators: %s - error unique ID. +#: includes/class-process.php:288 +#, php-format +msgid "Missing form data on form submission process %s" +msgstr "" + +#: includes/class-process.php:289 +msgid "Form data is not an array in `\\WPForms_Process::process()`. It might be caused by incorrect data returned by `wpforms_process_before_form_data` filter. Verify whether you have a custom code using this filter and debug value it is returning." +msgstr "" + +#: includes/class-process.php:296 +msgid "Your form has not been submitted because data is missing from the entry." +msgstr "" + +#. translators: %s - URL to the WForms Logs admin page. +#: includes/class-process.php:301 +#, php-format +msgid "Check the WPForms » Tools » Logs for more details." +msgstr "" + +#. translators: %s - error unique ID. +#: includes/class-process.php:316 +#, php-format +msgid "Error ID: %s." +msgstr "" + +#: includes/class-process.php:440 +#: includes/class-process.php:602 +#: includes/class-process.php:1721 +msgid "Form has not been submitted, please see the errors below." +msgstr "" + +#: includes/class-process.php:464 +msgid "The form could not be submitted due to a security issue." +msgstr "" + +#: includes/class-process.php:725 +msgid "Anti-spam Honeypot V2 verification was failed, please try again later." +msgstr "" + +#: includes/class-process.php:783 +msgid "Direct POST requests are not allowed when the AJAX submission is enabled." +msgstr "" + +#: includes/class-process.php:785 +msgid "Direct POST request" +msgstr "" + +#: includes/class-process.php:973 +msgid "Please wait a little longer before submitting. We’re running a quick security check." +msgstr "" + +#: includes/class-process.php:1042 +msgid "Akismet" +msgstr "" + +#. translators: %s - The CAPTCHA provider name. +#: includes/class-process.php:1105 +#, php-format +msgid "%s verification failed, please try again later." +msgstr "" + +#: includes/class-process.php:1315 +msgid "Uploaded files combined size exceeds allowed maximum." +msgstr "" + +#: includes/class-process.php:1492 +msgid "Redirecting…" +msgstr "" + +#. translators: %1$.3f - total size of the selected files in megabytes, %2$.3f - allowed file upload limit in megabytes. +#: includes/class-process.php:1723 +#, php-format +msgid "The total size of the selected files %1$.3f MB exceeds the allowed limit %2$.3f MB." +msgstr "" + +#. translators: %s - form name. +#: includes/class-process.php:1835 +#: lite/wpforms-lite.php:123 +#, php-format +msgid "New %s Entry" +msgstr "" + +#: includes/class-widget.php:44 +msgctxt "Widget" +msgid "Display a form." +msgstr "" + +#: includes/class-widget.php:54 +msgctxt "Widget" +msgid "WPForms" +msgstr "" + +#: includes/class-widget.php:130 +msgctxt "Widget" +msgid "Title:" +msgstr "" + +#: includes/class-widget.php:136 +msgctxt "Widget" +msgid "Form:" +msgstr "" + +#: includes/class-widget.php:143 +msgctxt "Widget" +msgid "Select your form" +msgstr "" + +#: includes/class-widget.php:149 +msgctxt "Widget" +msgid "No forms" +msgstr "" + +#: includes/class-widget.php:157 +msgctxt "Widget" +msgid "Display form name" +msgstr "" + +#: includes/class-widget.php:162 +msgctxt "Widget" +msgid "Display form description" +msgstr "" + +#: includes/emails/class-emails.php:384 +msgid "You cannot send emails with WPForms_WP_Emails() until init/admin_init has been reached." +msgstr "" + +#: includes/emails/class-emails.php:606 +#: src/Admin/Education/Fields.php:109 +#: src/Emails/Notifications.php:1015 +#: src/Forms/Fields/Pagebreak/Field.php:44 +#: src/Forms/Fields/Pagebreak/Field.php:520 +#: src/Integrations/Elementor/WidgetModern.php:723 +#: src/Integrations/Gutenberg/FormSelector.php:539 +msgid "Page Break" +msgstr "" + +#: includes/emails/class-emails.php:610 +#: src/Emails/Notifications.php:1020 +#: src/Forms/Fields/Html/Field.php:194 +msgid "HTML / Code Block" +msgstr "" + +#: includes/emails/class-emails.php:614 +#: includes/integrations.php:44 +#: src/Admin/Education/Fields.php:133 +#: src/Emails/Notifications.php:1025 +#: src/Forms/Fields/Content/Field.php:27 +#: src/Forms/Fields/Content/Field.php:108 +#: src/Integrations/AI/API/Forms.php:290 +msgid "Content" +msgstr "" + +#: includes/emails/class-emails.php:643 +#: includes/emails/class-emails.php:717 +#: src/Emails/Notifications.php:604 +#: src/Emails/Notifications.php:780 +#: src/SmartTags/SmartTag/FieldHtmlId.php:38 +msgid "(empty)" +msgstr "" + +#. translators: %d - field ID. +#: includes/emails/class-emails.php:649 +#: includes/emails/class-emails.php:722 +#, php-format +msgid "Field ID #%s" +msgstr "" + +#: includes/emails/class-emails.php:734 +#: src/Emails/Notifications.php:441 +msgid "An empty form was submitted." +msgstr "" + +#. translators: %s - link to the site. +#: includes/emails/templates/footer-default.php:39 +#: templates/emails/general-footer.php:24 +#, php-format +msgid "Sent from %s" +msgstr "" + +#. translators: %d - choice number. +#. translators: %d - Choice ID. +#: includes/fields/class-base.php:593 +#: includes/fields/class-base.php:631 +#: includes/fields/class-base.php:4191 +#: src/Integrations/Square/Process.php:803 +#, php-format +msgid "Choice %d" +msgstr "" + +#: includes/fields/class-base.php:1301 +msgid "Enter text for the form field label. Field labels are recommended and can be hidden in the Advanced Settings." +msgstr "" + +#: includes/fields/class-base.php:1308 +#: src/Admin/Builder/Settings/Themes.php:681 +#: src/Forms/Fields/Html/Field.php:74 +#: src/Integrations/Elementor/WidgetModern.php:343 +#: src/Integrations/Gutenberg/FormSelector.php:521 +msgid "Label" +msgstr "" + +#: includes/fields/class-base.php:1340 +msgid "Enter text for the form field description." +msgstr "" + +#: includes/fields/class-base.php:1347 +msgid "Description" +msgstr "" + +#: includes/fields/class-base.php:1380 +msgid "Check this option to mark the field required. A form will not submit unless all required fields are provided." +msgstr "" + +#: includes/fields/class-base.php:1411 +#: src/Admin/Payments/Views/Overview/Table.php:92 +#: src/Admin/Payments/Views/Single.php:358 +#: src/Admin/Settings/Captcha/ReCaptcha.php:58 +#: src/Admin/Settings/Captcha/Turnstile.php:95 +#: src/Forms/Fields/CustomCaptcha/Field.php:130 +#: src/Forms/Fields/DateTime/Field.php:234 +#: templates/admin/payments/single/payment-history.php:31 +#: templates/admin/payments/single/payment-history.php:50 +msgid "Type" +msgstr "" + +#: includes/fields/class-base.php:1435 +msgid "Enter code for the form field." +msgstr "" + +#: includes/fields/class-base.php:1442 +msgid "Code" +msgstr "" + +#: includes/fields/class-base.php:1474 +msgid "Choices" +msgstr "" + +#: includes/fields/class-base.php:1519 +#: includes/fields/class-base.php:1726 +msgid "Add choices for the form field." +msgstr "" + +#: includes/fields/class-base.php:1677 +msgid "Dynamic Choices Active" +msgstr "" + +#. translators: %1$s - source name, %2$s - type name. +#: includes/fields/class-base.php:1681 +#, php-format +msgid "Choices are dynamically populated from the %1$s %2$s. Go to the Advanced tab to change this." +msgstr "" + +#: includes/fields/class-base.php:1725 +msgid "Items" +msgstr "" + +#: includes/fields/class-base.php:1836 +msgid "Add Other Choice" +msgstr "" + +#: includes/fields/class-base.php:1837 +msgid "Add an Other choice so users can input their own value." +msgstr "" + +#: includes/fields/class-base.php:1864 +#: includes/fields/class-base.php:2330 +msgid "Placeholder Text" +msgstr "" + +#: includes/fields/class-base.php:1865 +msgid "Enter placeholder text for the Other input." +msgstr "" + +#: includes/fields/class-base.php:1896 +msgid "Select the size of the Other input." +msgstr "" + +#: includes/fields/class-base.php:1909 +#: includes/fields/class-base.php:2262 +#: templates/builder/field-context-menu.php:76 +msgid "Field Size" +msgstr "" + +#: includes/fields/class-base.php:1948 +msgid "

            Images are not cropped or resized.

            For best results, they should be the same size and 250x250 pixels or smaller.

            " +msgstr "" + +#: includes/fields/class-base.php:1963 +msgid "Use Image Choices" +msgstr "" + +#: includes/fields/class-base.php:1964 +msgid "Enable this option to use images with choices" +msgstr "" + +#: includes/fields/class-base.php:1999 +msgid "Image Choice Style" +msgstr "" + +#: includes/fields/class-base.php:2000 +msgid "Select the style for the image choices." +msgstr "" + +#: includes/fields/class-base.php:2013 +#: includes/fields/class-base.php:2174 +#: includes/fields/class-select.php:329 +#: src/Emails/Notifications.php:1319 +#: src/Forms/Fields/Addons/LikertScale/Field.php:247 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:123 +#: src/Forms/Fields/FileUpload/Field.php:258 +#: src/Forms/Fields/PaymentSelect/Field.php:302 +msgid "Modern" +msgstr "" + +#: includes/fields/class-base.php:2014 +#: includes/fields/class-base.php:2175 +#: includes/fields/class-select.php:328 +#: src/Emails/Notifications.php:1309 +#: src/Forms/Fields/Addons/LikertScale/Field.php:248 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:124 +#: src/Forms/Fields/FileUpload/Field.php:259 +#: src/Forms/Fields/PaymentSelect/Field.php:301 +msgid "Classic" +msgstr "" + +#: includes/fields/class-base.php:2015 +#: includes/fields/class-base.php:2176 +#: includes/fields/class-email.php:395 +#: src/Admin/Builder/Settings/Themes.php:108 +#: src/Admin/Builder/Settings/Themes.php:963 +#: src/Admin/Builder/Settings/Themes.php:1020 +#: src/Admin/Settings/Captcha/Page.php:158 +#: src/Forms/Fields/Pagebreak/Field.php:319 +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:144 +#: src/Integrations/Elementor/WidgetModern.php:82 +#: src/Integrations/Elementor/WidgetModern.php:529 +#: src/Integrations/Elementor/WidgetModern.php:574 +#: src/Integrations/Gutenberg/FormSelector.php:512 +msgid "None" +msgstr "" + +#: includes/fields/class-base.php:2045 +msgid "Use Icon Choices" +msgstr "" + +#: includes/fields/class-base.php:2046 +msgid "Enable this option to use icons with the choices." +msgstr "" + +#: includes/fields/class-base.php:2071 +#: src/Forms/Fields/Rating/Field.php:256 +msgid "Icon Color" +msgstr "" + +#: includes/fields/class-base.php:2072 +msgid "Select an accent color for the icon choices." +msgstr "" + +#: includes/fields/class-base.php:2111 +#: src/Forms/Fields/Rating/Field.php:219 +msgid "Icon Size" +msgstr "" + +#: includes/fields/class-base.php:2112 +msgid "Select icon size." +msgstr "" + +#: includes/fields/class-base.php:2159 +msgid "Icon Choice Style" +msgstr "" + +#: includes/fields/class-base.php:2160 +msgid "Select the style for the icon choices." +msgstr "" + +#: includes/fields/class-base.php:2203 +msgid "Enter text for the default form field value." +msgstr "" + +#: includes/fields/class-base.php:2209 +#: includes/fields/class-name.php:333 +#: includes/fields/class-name.php:359 +#: includes/fields/class-name.php:385 +#: includes/fields/class-name.php:411 +#: src/Forms/Fields/Address/Field.php:219 +#: src/Forms/Fields/Address/Field.php:274 +#: src/Forms/Fields/Address/Field.php:310 +#: src/Forms/Fields/Address/Field.php:345 +#: src/Forms/Fields/Address/Field.php:402 +#: src/Forms/Fields/Address/Field.php:458 +#: src/Forms/Fields/Traits/NumberField.php:248 +msgid "Default Value" +msgstr "" + +#: includes/fields/class-base.php:2246 +msgid "Select the default form field size." +msgstr "" + +#: includes/fields/class-base.php:2323 +msgid "Enter text for the form field placeholder." +msgstr "" + +#: includes/fields/class-base.php:2364 +msgid "Enter CSS class names for the form field container. Class names should be separated with spaces." +msgstr "" + +#: includes/fields/class-base.php:2376 +msgid "CSS Classes" +msgstr "" + +#: includes/fields/class-base.php:2409 +msgid "Check this option to hide the form field label." +msgstr "" + +#: includes/fields/class-base.php:2418 +#: templates/builder/field-context-menu.php:66 +msgid "Hide Label" +msgstr "" + +#: includes/fields/class-base.php:2441 +msgid "Check this option to hide the form field sublabel." +msgstr "" + +#: includes/fields/class-base.php:2450 +msgid "Hide Sublabels" +msgstr "" + +#: includes/fields/class-base.php:2473 +msgid "Select the layout for displaying field choices." +msgstr "" + +#: includes/fields/class-base.php:2475 +msgid "One Column" +msgstr "" + +#: includes/fields/class-base.php:2476 +msgid "Two Columns" +msgstr "" + +#: includes/fields/class-base.php:2477 +msgid "Three Columns" +msgstr "" + +#: includes/fields/class-base.php:2478 +msgid "Inline" +msgstr "" + +#: includes/fields/class-base.php:2486 +msgid "Choice Layout" +msgstr "" + +#: includes/fields/class-base.php:2519 +msgid "Select auto-populate method to use." +msgstr "" + +#: includes/fields/class-base.php:2522 +#: includes/fields/class-base.php:2572 +msgid "Post Type" +msgstr "" + +#: includes/fields/class-base.php:2523 +#: includes/fields/class-base.php:2582 +msgid "Taxonomy" +msgstr "" + +#: includes/fields/class-base.php:2531 +msgid "Dynamic Choices" +msgstr "" + +#. translators: %s - dynamic source type name. +#: includes/fields/class-base.php:2595 +#, php-format +msgid "Select %s to use for auto-populating field choices." +msgstr "" + +#. translators: %s - dynamic source type name. +#: includes/fields/class-base.php:2598 +#, php-format +msgid "Dynamic %s Source" +msgstr "" + +#: includes/fields/class-base.php:2659 +msgid "Enable quantity for this product to allow customers to purchase more than one." +msgstr "" + +#: includes/fields/class-base.php:2660 +msgid "Set the minimum and maximum quantity for this product." +msgstr "" + +#: includes/fields/class-base.php:2666 +msgid "Enable Quantity" +msgstr "" + +#: includes/fields/class-base.php:2700 +#: src/Forms/Fields/Traits/NumberField.php:169 +msgid "Range" +msgstr "" + +#: includes/fields/class-base.php:2714 +#: src/Forms/Fields/Traits/NumberField.php:223 +msgid "Minimum" +msgstr "" + +#: includes/fields/class-base.php:2733 +#: src/Forms/Fields/Traits/NumberField.php:226 +msgid "Maximum" +msgstr "" + +#: includes/fields/class-base.php:2864 +msgid "Hide Images in Entries" +msgstr "" + +#: includes/fields/class-base.php:2864 +msgid "Hide Images in Notifications" +msgstr "" + +#: includes/fields/class-base.php:2865 +msgid "Enable this option to hide the images in entries and notifications." +msgstr "" + +#: includes/fields/class-base.php:2865 +msgid "Enable this option to hide the images in notifications." +msgstr "" + +#: includes/fields/class-base.php:2905 +msgid "Choice Limit" +msgstr "" + +#: includes/fields/class-base.php:2906 +msgid "Limit the number of checkboxes a user can select. Leave empty for unlimited." +msgstr "" + +#: includes/fields/class-base.php:2951 +msgid "Label Hidden" +msgstr "" + +#: includes/fields/class-base.php:2952 +msgid "To ensure your form is accessible, every field should have a descriptive label. If you'd like to hide the label, you can do so by enabling Hide Label in the Advanced Field Options tab." +msgstr "" + +#. translators: %s - total number of choices. +#: includes/fields/class-base.php:3274 +#, php-format +msgid "Showing the first %1$s choices.
            All %2$s choices will be displayed when viewing the form." +msgstr "" + +#: includes/fields/class-base.php:3331 +msgid "No form ID found" +msgstr "" + +#: includes/fields/class-base.php:3336 +msgid "No field type found" +msgstr "" + +#: includes/fields/class-base.php:3940 +msgid "Only unique values can be added" +msgstr "" + +#: includes/fields/class-base.php:3941 +msgid "Only values matching specific conditions can be added" +msgstr "" + +#: includes/fields/class-base.php:4126 +msgid "Dynamic choices" +msgstr "" + +#: includes/fields/class-base.php:4127 +msgid "items" +msgstr "" + +#. translators: %d - choice number. +#: includes/fields/class-base.php:4191 +#, php-format +msgid "Item %d" +msgstr "" + +#: includes/fields/class-checkbox.php:22 +#: templates/builder/themes/preview.php:63 +msgid "Checkboxes" +msgstr "" + +#: includes/fields/class-checkbox.php:23 +#: includes/fields/class-select.php:53 +msgid "choice" +msgstr "" + +#: includes/fields/class-checkbox.php:29 +#: includes/fields/class-radio.php:29 +#: includes/fields/class-select.php:59 +#: src/Integrations/AI/Admin/Builder/Enqueues.php:270 +#: templates/builder/themes/preview.php:47 +#: templates/builder/themes/preview.php:48 +#: templates/builder/themes/preview.php:66 +#: templates/builder/themes/preview.php:67 +msgid "First Choice" +msgstr "" + +#: includes/fields/class-checkbox.php:37 +#: includes/fields/class-radio.php:37 +#: includes/fields/class-select.php:64 +#: src/Integrations/AI/Admin/Builder/Enqueues.php:271 +#: templates/builder/themes/preview.php:51 +#: templates/builder/themes/preview.php:52 +#: templates/builder/themes/preview.php:70 +#: templates/builder/themes/preview.php:71 +msgid "Second Choice" +msgstr "" + +#: includes/fields/class-checkbox.php:45 +#: includes/fields/class-radio.php:45 +#: includes/fields/class-select.php:69 +#: src/Integrations/AI/Admin/Builder/Enqueues.php:272 +#: templates/builder/themes/preview.php:55 +#: templates/builder/themes/preview.php:56 +#: templates/builder/themes/preview.php:74 +#: templates/builder/themes/preview.php:75 +msgid "Third Choice" +msgstr "" + +#: includes/fields/class-checkbox.php:133 +#: src/Forms/Fields/PaymentCheckbox/Field.php:123 +msgid "Checked" +msgstr "" + +#: includes/fields/class-checkbox.php:247 +#: includes/fields/class-radio.php:282 +#: includes/fields/class-select.php:216 +#: src/Integrations/AI/Admin/Builder/Enqueues.php:206 +msgid "Generate Choices" +msgstr "" + +#: includes/fields/class-checkbox.php:313 +#: includes/fields/class-radio.php:357 +msgid "Randomize Choices" +msgstr "" + +#: includes/fields/class-checkbox.php:314 +#: includes/fields/class-radio.php:358 +msgid "Check this option to randomize the order of the choices." +msgstr "" + +#: includes/fields/class-checkbox.php:335 +#: includes/fields/class-radio.php:379 +#: includes/fields/class-select.php:258 +msgid "Show Values" +msgstr "" + +#: includes/fields/class-checkbox.php:336 +#: includes/fields/class-radio.php:380 +#: includes/fields/class-select.php:259 +msgid "Check this option to manually set form field values." +msgstr "" + +#: includes/fields/class-checkbox.php:374 +msgid "Enable Disclaimer / Terms of Service Display" +msgstr "" + +#: includes/fields/class-checkbox.php:375 +msgid "Check this option to adjust the field styling to support Disclaimers and Terms of Service type agreements." +msgstr "" + +#: includes/fields/class-email.php:51 +#: src/Forms/Fields/Password/Field.php:26 +msgid "user" +msgstr "" + +#: includes/fields/class-email.php:168 +#: includes/fields/class-email.php:510 +msgid "Confirm Email" +msgstr "" + +#: includes/fields/class-email.php:308 +msgid "Enable Email Confirmation" +msgstr "" + +#: includes/fields/class-email.php:309 +msgid "Check this option to ask users to provide an email address twice." +msgstr "" + +#: includes/fields/class-email.php:351 +#: src/Forms/Fields/Password/Field.php:196 +msgid "Confirmation Placeholder Text" +msgstr "" + +#: includes/fields/class-email.php:352 +#: src/Forms/Fields/Password/Field.php:197 +msgid "Enter text for the confirmation field placeholder." +msgstr "" + +#: includes/fields/class-email.php:382 +msgid "Allowlist / Denylist" +msgstr "" + +#: includes/fields/class-email.php:383 +msgid "Restrict which email addresses are allowed. Be sure to separate each email address with a comma." +msgstr "" + +#: includes/fields/class-email.php:396 +msgid "Allowlist" +msgstr "" + +#: includes/fields/class-email.php:397 +msgid "Denylist" +msgstr "" + +#: includes/fields/class-email.php:467 +msgid "Disable Suggestions" +msgstr "" + +#: includes/fields/class-email.php:468 +msgid "Prevent email suggestions for common typos. Enable this if you find the suggestions distracting." +msgstr "" + +#: includes/fields/class-email.php:611 +#: includes/fields/class-email.php:661 +#: includes/fields/class-email.php:671 +#: includes/fields/class-email.php:1119 +msgid "The provided email is not valid." +msgstr "" + +#: includes/fields/class-email.php:677 +msgid "The provided emails do not match." +msgstr "" + +#: includes/fields/class-email.php:1111 +msgid "We’ve detected the same text in your allowlist and denylist. To prevent a conflict, we’ve removed the following text from the list you’re currently viewing:" +msgstr "" + +#: includes/fields/class-email.php:1115 +msgid "At least one of the emails in your list contained an error and has been removed." +msgstr "" + +#: includes/fields/class-gdpr-checkbox.php:22 +msgid "GDPR Agreement" +msgstr "" + +#: includes/fields/class-gdpr-checkbox.php:29 +msgid "I consent to having this website store my submitted information so they can respond to my inquiry." +msgstr "" + +#: includes/fields/class-gdpr-checkbox.php:191 +msgid "Agreement" +msgstr "" + +#: includes/fields/class-internal-information.php:33 +msgid "Internal Information" +msgstr "" + +#: includes/fields/class-internal-information.php:33 +msgid "This field is not editable" +msgstr "" + +#: includes/fields/class-internal-information.php:206 +msgid "Heading" +msgstr "" + +#: includes/fields/class-internal-information.php:207 +msgid "Enter text for the form field heading." +msgstr "" + +#: includes/fields/class-internal-information.php:246 +msgid "Expanded Content" +msgstr "" + +#: includes/fields/class-internal-information.php:247 +msgid "Enter text for the form field expanded description." +msgstr "" + +#: includes/fields/class-internal-information.php:264 +msgid "Adds an expandable content area below the description." +msgstr "" + +#: includes/fields/class-internal-information.php:291 +msgid "CTA Label" +msgstr "" + +#: includes/fields/class-internal-information.php:292 +msgid "Enter label for the form field call to action button. The label will be ignored if the field has extended description content: in that case button will be used to expand the description content." +msgstr "" + +#: includes/fields/class-internal-information.php:331 +msgid "CTA Link" +msgstr "" + +#: includes/fields/class-internal-information.php:332 +msgid "Enter the URL for the form field call to action button. URL will be ignored if the field has extended description content: in that case button will be used to expand the description content." +msgstr "" + +#: includes/fields/class-internal-information.php:349 +msgid "CTA is hidden if Expanded Content is used." +msgstr "" + +#: includes/fields/class-internal-information.php:682 +msgid "You should enter a valid absolute address to the CTA Link field or leave it empty." +msgstr "" + +#: includes/fields/class-internal-information.php:683 +#: src/Lite/Admin/DashboardWidget.php:441 +msgid "Dismiss" +msgstr "" + +#: includes/fields/class-internal-information.php:824 +msgid "This field is disabled in the editor mode." +msgstr "" + +#: includes/fields/class-name.php:25 +#: includes/fields/class-name.php:322 +#: includes/templates/class-simple-contact-form.php:36 +#: src/Admin/Forms/Table/Facades/Columns.php:66 +#: src/Emails/Preview.php:401 +#: templates/builder/themes/preview.php:21 +msgid "Name" +msgstr "" + +#: includes/fields/class-name.php:26 +msgid "user, first, last" +msgstr "" + +#: includes/fields/class-name.php:255 +#: src/Forms/Fields/DateTime/Field.php:119 +#: src/Forms/Fields/DateTime/Field.php:265 +#: src/Forms/Fields/DateTime/Field.php:366 +#: src/Forms/Fields/Phone/Field.php:87 +#: src/Forms/Fields/Traits/CameraTrait.php:80 +msgid "Format" +msgstr "" + +#: includes/fields/class-name.php:256 +msgid "Select format to use for the name form field" +msgstr "" + +#: includes/fields/class-name.php:268 +msgid "Simple" +msgstr "" + +#: includes/fields/class-name.php:269 +msgid "First Last" +msgstr "" + +#: includes/fields/class-name.php:270 +msgid "First Middle Last" +msgstr "" + +#: includes/fields/class-name.php:323 +msgid "Name field advanced options." +msgstr "" + +#: includes/fields/class-name.php:329 +#: includes/fields/class-name.php:355 +#: includes/fields/class-name.php:381 +#: includes/fields/class-name.php:407 +#: src/Forms/Fields/Address/Field.php:215 +#: src/Forms/Fields/Address/Field.php:270 +#: src/Forms/Fields/Address/Field.php:306 +#: src/Forms/Fields/Address/Field.php:341 +#: src/Forms/Fields/Address/Field.php:398 +#: src/Forms/Fields/Address/Field.php:454 +#: src/Forms/Fields/DateTime/Field.php:279 +#: src/Forms/Fields/DateTime/Field.php:380 +msgid "Placeholder" +msgstr "" + +#: includes/fields/class-name.php:348 +#: src/Integrations/ConstantContact/V3/ConstantContact.php:156 +#: templates/builder/themes/preview.php:25 +msgid "First Name" +msgstr "" + +#: includes/fields/class-name.php:349 +msgid "First name field advanced options." +msgstr "" + +#: includes/fields/class-name.php:374 +msgid "Middle Name" +msgstr "" + +#: includes/fields/class-name.php:375 +msgid "Middle name field advanced options." +msgstr "" + +#: includes/fields/class-name.php:400 +#: src/Integrations/ConstantContact/V3/ConstantContact.php:157 +#: templates/builder/themes/preview.php:29 +msgid "Last Name" +msgstr "" + +#: includes/fields/class-name.php:401 +msgid "Last name field advanced options." +msgstr "" + +#: includes/fields/class-number-slider.php:47 +msgid "Number Slider" +msgstr "" + +#: includes/fields/class-number-slider.php:70 +msgid "Increment value should be greater than zero. Decimal fractions allowed." +msgstr "" + +#. translators: %1$s - Number slider selected value, %2$s - its minimum value, %3$s - its maximum value. +#: includes/fields/class-number-slider.php:102 +#, php-format +msgid "%1$s (%2$s min / %3$s max)" +msgstr "" + +#: includes/fields/class-number-slider.php:152 +msgid "Value Range" +msgstr "" + +#: includes/fields/class-number-slider.php:153 +msgid "Define the minimum and the maximum values for the slider." +msgstr "" + +#: includes/fields/class-number-slider.php:166 +msgid "Determines the increment between selectable values on the slider." +msgstr "" + +#: includes/fields/class-number-slider.php:209 +msgid "Value Display" +msgstr "" + +#: includes/fields/class-number-slider.php:210 +msgid "Displays the currently selected value below the slider." +msgstr "" + +#. translators: %s - value. +#: includes/fields/class-number-slider.php:259 +#, php-format +msgid "Selected Value: %s" +msgstr "" + +#: includes/fields/class-number-slider.php:311 +msgid "Selected Value: {value}" +msgstr "" + +#: includes/fields/class-number-slider.php:368 +msgid "Please provide a valid value." +msgstr "" + +#: includes/fields/class-number.php:26 +msgid "Numbers" +msgstr "" + +#: includes/fields/class-radio.php:22 +#: templates/builder/themes/preview.php:44 +msgid "Multiple Choice" +msgstr "" + +#: includes/fields/class-radio.php:23 +msgid "radio" +msgstr "" + +#: includes/fields/class-select.php:52 +msgid "Dropdown" +msgstr "" + +#: includes/fields/class-select.php:281 +msgid "Multiple Options Selection" +msgstr "" + +#: includes/fields/class-select.php:282 +msgid "Allow users to select multiple choices in this field." +msgstr "" + +#. translators: %s - URL to WPForms.com doc article. +#: includes/fields/class-select.php:285 +#, php-format +msgid "For details, including how this looks and works for your site's visitors, please check out our doc." +msgstr "" + +#: includes/fields/class-select.php:315 +#: src/Forms/Fields/Addons/LikertScale/Field.php:235 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:111 +#: src/Forms/Fields/Camera/Field.php:317 +#: src/Forms/Fields/EntryPreview/Field.php:143 +#: src/Forms/Fields/FileUpload/Field.php:245 +#: src/Forms/Fields/PaymentSelect/Field.php:288 +msgid "Style" +msgstr "" + +#: includes/fields/class-select.php:316 +#: src/Forms/Fields/PaymentSelect/Field.php:289 +msgid "Classic style is the default one generated by your browser. Modern has a fresh look and displays all selected options in a single row." +msgstr "" + +#: includes/fields/class-text.php:22 +msgid "Single Line Text" +msgstr "" + +#: includes/fields/class-text.php:287 +#: includes/fields/class-textarea.php:125 +msgid "Limit Length" +msgstr "" + +#: includes/fields/class-text.php:288 +#: includes/fields/class-textarea.php:126 +msgid "Check this option to limit text length by characters or words count." +msgstr "" + +#: includes/fields/class-text.php:319 +#: includes/fields/class-textarea.php:157 +msgid "Characters" +msgstr "" + +#: includes/fields/class-text.php:320 +#: includes/fields/class-textarea.php:158 +msgid "Words" +msgstr "" + +#: includes/fields/class-text.php:343 +msgid "Input Mask" +msgstr "" + +#: includes/fields/class-text.php:344 +msgid "Enter your custom input mask." +msgstr "" + +#: includes/fields/class-text.php:345 +msgid "See Examples & Docs" +msgstr "" + +#. translators: %s - limit characters number. +#: includes/fields/class-text.php:543 +#: includes/fields/class-textarea.php:365 +#, php-format +msgid "Text can't exceed %d character." +msgid_plural "Text can't exceed %d characters." +msgstr[0] "" +msgstr[1] "" + +#. translators: %s - limit words number. +#: includes/fields/class-text.php:550 +#: includes/fields/class-textarea.php:372 +#, php-format +msgid "Text can't exceed %d word." +msgid_plural "Text can't exceed %d words." +msgstr[0] "" +msgstr[1] "" + +#: includes/fields/class-textarea.php:22 +msgid "Paragraph Text" +msgstr "" + +#: includes/fields/class-textarea.php:23 +msgid "textarea" +msgstr "" + +#: includes/functions/data-presets.php:18 +msgid "Alabama" +msgstr "" + +#: includes/functions/data-presets.php:19 +msgid "Alaska" +msgstr "" + +#: includes/functions/data-presets.php:20 +msgid "Arizona" +msgstr "" + +#: includes/functions/data-presets.php:21 +msgid "Arkansas" +msgstr "" + +#: includes/functions/data-presets.php:22 +msgid "California" +msgstr "" + +#: includes/functions/data-presets.php:23 +msgid "Colorado" +msgstr "" + +#: includes/functions/data-presets.php:24 +msgid "Connecticut" +msgstr "" + +#: includes/functions/data-presets.php:25 +msgid "Delaware" +msgstr "" + +#: includes/functions/data-presets.php:26 +msgid "District of Columbia" +msgstr "" + +#: includes/functions/data-presets.php:27 +msgid "Florida" +msgstr "" + +#: includes/functions/data-presets.php:28 +msgctxt "US State" +msgid "Georgia" +msgstr "" + +#: includes/functions/data-presets.php:29 +msgid "Hawaii" +msgstr "" + +#: includes/functions/data-presets.php:30 +msgid "Idaho" +msgstr "" + +#: includes/functions/data-presets.php:31 +msgid "Illinois" +msgstr "" + +#: includes/functions/data-presets.php:32 +msgid "Indiana" +msgstr "" + +#: includes/functions/data-presets.php:33 +msgid "Iowa" +msgstr "" + +#: includes/functions/data-presets.php:34 +msgid "Kansas" +msgstr "" + +#: includes/functions/data-presets.php:35 +msgid "Kentucky" +msgstr "" + +#: includes/functions/data-presets.php:36 +msgid "Louisiana" +msgstr "" + +#: includes/functions/data-presets.php:37 +msgid "Maine" +msgstr "" + +#: includes/functions/data-presets.php:38 +msgid "Maryland" +msgstr "" + +#: includes/functions/data-presets.php:39 +msgid "Massachusetts" +msgstr "" + +#: includes/functions/data-presets.php:40 +msgid "Michigan" +msgstr "" + +#: includes/functions/data-presets.php:41 +msgid "Minnesota" +msgstr "" + +#: includes/functions/data-presets.php:42 +msgid "Mississippi" +msgstr "" + +#: includes/functions/data-presets.php:43 +msgid "Missouri" +msgstr "" + +#: includes/functions/data-presets.php:44 +msgid "Montana" +msgstr "" + +#: includes/functions/data-presets.php:45 +msgid "Nebraska" +msgstr "" + +#: includes/functions/data-presets.php:46 +msgid "Nevada" +msgstr "" + +#: includes/functions/data-presets.php:47 +msgid "New Hampshire" +msgstr "" + +#: includes/functions/data-presets.php:48 +msgid "New Jersey" +msgstr "" + +#: includes/functions/data-presets.php:49 +msgid "New Mexico" +msgstr "" + +#: includes/functions/data-presets.php:50 +msgid "New York" +msgstr "" + +#: includes/functions/data-presets.php:51 +msgid "North Carolina" +msgstr "" + +#: includes/functions/data-presets.php:52 +msgid "North Dakota" +msgstr "" + +#: includes/functions/data-presets.php:53 +msgid "Ohio" +msgstr "" + +#: includes/functions/data-presets.php:54 +msgid "Oklahoma" +msgstr "" + +#: includes/functions/data-presets.php:55 +msgid "Oregon" +msgstr "" + +#: includes/functions/data-presets.php:56 +msgid "Pennsylvania" +msgstr "" + +#: includes/functions/data-presets.php:57 +msgid "Rhode Island" +msgstr "" + +#: includes/functions/data-presets.php:58 +msgid "South Carolina" +msgstr "" + +#: includes/functions/data-presets.php:59 +msgid "South Dakota" +msgstr "" + +#: includes/functions/data-presets.php:60 +msgid "Tennessee" +msgstr "" + +#: includes/functions/data-presets.php:61 +msgid "Texas" +msgstr "" + +#: includes/functions/data-presets.php:62 +msgid "Utah" +msgstr "" + +#: includes/functions/data-presets.php:63 +msgid "Vermont" +msgstr "" + +#: includes/functions/data-presets.php:64 +msgid "Virginia" +msgstr "" + +#: includes/functions/data-presets.php:65 +msgid "Washington" +msgstr "" + +#: includes/functions/data-presets.php:66 +msgid "West Virginia" +msgstr "" + +#: includes/functions/data-presets.php:67 +msgid "Wisconsin" +msgstr "" + +#: includes/functions/data-presets.php:68 +msgid "Wyoming" +msgstr "" + +#: includes/functions/data-presets.php:84 +msgid "Afghanistan" +msgstr "" + +#: includes/functions/data-presets.php:85 +msgid "Ã…land Islands" +msgstr "" + +#: includes/functions/data-presets.php:86 +msgid "Albania" +msgstr "" + +#: includes/functions/data-presets.php:87 +msgid "Algeria" +msgstr "" + +#: includes/functions/data-presets.php:88 +msgid "American Samoa" +msgstr "" + +#: includes/functions/data-presets.php:89 +msgid "Andorra" +msgstr "" + +#: includes/functions/data-presets.php:90 +msgid "Angola" +msgstr "" + +#: includes/functions/data-presets.php:91 +msgid "Anguilla" +msgstr "" + +#: includes/functions/data-presets.php:92 +msgid "Antarctica" +msgstr "" + +#: includes/functions/data-presets.php:93 +msgid "Antigua and Barbuda" +msgstr "" + +#: includes/functions/data-presets.php:94 +msgid "Argentina" +msgstr "" + +#: includes/functions/data-presets.php:95 +msgid "Armenia" +msgstr "" + +#: includes/functions/data-presets.php:96 +msgid "Aruba" +msgstr "" + +#: includes/functions/data-presets.php:97 +msgid "Australia" +msgstr "" + +#: includes/functions/data-presets.php:98 +msgid "Austria" +msgstr "" + +#: includes/functions/data-presets.php:99 +msgid "Azerbaijan" +msgstr "" + +#: includes/functions/data-presets.php:100 +msgid "Bahamas" +msgstr "" + +#: includes/functions/data-presets.php:101 +msgid "Bahrain" +msgstr "" + +#: includes/functions/data-presets.php:102 +msgid "Bangladesh" +msgstr "" + +#: includes/functions/data-presets.php:103 +msgid "Barbados" +msgstr "" + +#: includes/functions/data-presets.php:104 +msgid "Belarus" +msgstr "" + +#: includes/functions/data-presets.php:105 +msgid "Belgium" +msgstr "" + +#: includes/functions/data-presets.php:106 +msgid "Belize" +msgstr "" + +#: includes/functions/data-presets.php:107 +msgid "Benin" +msgstr "" + +#: includes/functions/data-presets.php:108 +msgid "Bermuda" +msgstr "" + +#: includes/functions/data-presets.php:109 +msgid "Bhutan" +msgstr "" + +#: includes/functions/data-presets.php:110 +msgid "Bolivia (Plurinational State of)" +msgstr "" + +#: includes/functions/data-presets.php:111 +msgid "Bonaire, Saint Eustatius and Saba" +msgstr "" + +#: includes/functions/data-presets.php:112 +msgid "Bosnia and Herzegovina" +msgstr "" + +#: includes/functions/data-presets.php:113 +msgid "Botswana" +msgstr "" + +#: includes/functions/data-presets.php:114 +msgid "Bouvet Island" +msgstr "" + +#: includes/functions/data-presets.php:115 +msgid "Brazil" +msgstr "" + +#: includes/functions/data-presets.php:116 +msgid "British Indian Ocean Territory" +msgstr "" + +#: includes/functions/data-presets.php:117 +msgid "Brunei Darussalam" +msgstr "" + +#: includes/functions/data-presets.php:118 +msgid "Bulgaria" +msgstr "" + +#: includes/functions/data-presets.php:119 +msgid "Burkina Faso" +msgstr "" + +#: includes/functions/data-presets.php:120 +msgid "Burundi" +msgstr "" + +#: includes/functions/data-presets.php:121 +msgid "Cabo Verde" +msgstr "" + +#: includes/functions/data-presets.php:122 +msgid "Cambodia" +msgstr "" + +#: includes/functions/data-presets.php:123 +msgid "Cameroon" +msgstr "" + +#: includes/functions/data-presets.php:124 +msgid "Canada" +msgstr "" + +#: includes/functions/data-presets.php:125 +msgid "Cayman Islands" +msgstr "" + +#: includes/functions/data-presets.php:126 +msgid "Central African Republic" +msgstr "" + +#: includes/functions/data-presets.php:127 +msgid "Chad" +msgstr "" + +#: includes/functions/data-presets.php:128 +msgid "Chile" +msgstr "" + +#: includes/functions/data-presets.php:129 +msgid "China" +msgstr "" + +#: includes/functions/data-presets.php:130 +msgid "Christmas Island" +msgstr "" + +#: includes/functions/data-presets.php:131 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#: includes/functions/data-presets.php:132 +msgid "Colombia" +msgstr "" + +#: includes/functions/data-presets.php:133 +msgid "Comoros" +msgstr "" + +#: includes/functions/data-presets.php:134 +msgid "Congo" +msgstr "" + +#: includes/functions/data-presets.php:135 +msgid "Congo (Democratic Republic of the)" +msgstr "" + +#: includes/functions/data-presets.php:136 +msgid "Cook Islands" +msgstr "" + +#: includes/functions/data-presets.php:137 +msgid "Costa Rica" +msgstr "" + +#: includes/functions/data-presets.php:138 +msgid "Côte d'Ivoire" +msgstr "" + +#: includes/functions/data-presets.php:139 +msgid "Croatia" +msgstr "" + +#: includes/functions/data-presets.php:140 +msgid "Cuba" +msgstr "" + +#: includes/functions/data-presets.php:141 +msgid "Curaçao" +msgstr "" + +#: includes/functions/data-presets.php:142 +msgid "Cyprus" +msgstr "" + +#: includes/functions/data-presets.php:143 +msgid "Czech Republic" +msgstr "" + +#: includes/functions/data-presets.php:144 +msgid "Denmark" +msgstr "" + +#: includes/functions/data-presets.php:145 +msgid "Djibouti" +msgstr "" + +#: includes/functions/data-presets.php:146 +msgid "Dominica" +msgstr "" + +#: includes/functions/data-presets.php:147 +msgid "Dominican Republic" +msgstr "" + +#: includes/functions/data-presets.php:148 +msgid "Ecuador" +msgstr "" + +#: includes/functions/data-presets.php:149 +msgid "Egypt" +msgstr "" + +#: includes/functions/data-presets.php:150 +msgid "El Salvador" +msgstr "" + +#: includes/functions/data-presets.php:151 +msgid "Equatorial Guinea" +msgstr "" + +#: includes/functions/data-presets.php:152 +msgid "Eritrea" +msgstr "" + +#: includes/functions/data-presets.php:153 +msgid "Estonia" +msgstr "" + +#: includes/functions/data-presets.php:154 +msgid "Ethiopia" +msgstr "" + +#: includes/functions/data-presets.php:155 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#: includes/functions/data-presets.php:156 +msgid "Faroe Islands" +msgstr "" + +#: includes/functions/data-presets.php:157 +msgid "Fiji" +msgstr "" + +#: includes/functions/data-presets.php:158 +msgid "Finland" +msgstr "" + +#: includes/functions/data-presets.php:159 +msgid "France" +msgstr "" + +#: includes/functions/data-presets.php:160 +msgid "French Guiana" +msgstr "" + +#: includes/functions/data-presets.php:161 +msgid "French Polynesia" +msgstr "" + +#: includes/functions/data-presets.php:162 +msgid "French Southern Territories" +msgstr "" + +#: includes/functions/data-presets.php:163 +msgid "Gabon" +msgstr "" + +#: includes/functions/data-presets.php:164 +msgid "Gambia" +msgstr "" + +#: includes/functions/data-presets.php:165 +msgctxt "Country" +msgid "Georgia" +msgstr "" + +#: includes/functions/data-presets.php:166 +msgid "Germany" +msgstr "" + +#: includes/functions/data-presets.php:167 +msgid "Ghana" +msgstr "" + +#: includes/functions/data-presets.php:168 +msgid "Gibraltar" +msgstr "" + +#: includes/functions/data-presets.php:169 +msgid "Greece" +msgstr "" + +#: includes/functions/data-presets.php:170 +msgid "Greenland" +msgstr "" + +#: includes/functions/data-presets.php:171 +msgid "Grenada" +msgstr "" + +#: includes/functions/data-presets.php:172 +msgid "Guadeloupe" +msgstr "" + +#: includes/functions/data-presets.php:173 +msgid "Guam" +msgstr "" + +#: includes/functions/data-presets.php:174 +msgid "Guatemala" +msgstr "" + +#: includes/functions/data-presets.php:175 +msgid "Guernsey" +msgstr "" + +#: includes/functions/data-presets.php:176 +msgid "Guinea" +msgstr "" + +#: includes/functions/data-presets.php:177 +msgid "Guinea-Bissau" +msgstr "" + +#: includes/functions/data-presets.php:178 +msgid "Guyana" +msgstr "" + +#: includes/functions/data-presets.php:179 +msgid "Haiti" +msgstr "" + +#: includes/functions/data-presets.php:180 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#: includes/functions/data-presets.php:181 +msgid "Honduras" +msgstr "" + +#: includes/functions/data-presets.php:182 +msgid "Hong Kong" +msgstr "" + +#: includes/functions/data-presets.php:183 +msgid "Hungary" +msgstr "" + +#: includes/functions/data-presets.php:184 +msgid "Iceland" +msgstr "" + +#: includes/functions/data-presets.php:185 +msgid "India" +msgstr "" + +#: includes/functions/data-presets.php:186 +msgid "Indonesia" +msgstr "" + +#: includes/functions/data-presets.php:187 +msgid "Iran (Islamic Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:188 +msgid "Iraq" +msgstr "" + +#: includes/functions/data-presets.php:189 +msgid "Ireland (Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:190 +msgid "Isle of Man" +msgstr "" + +#: includes/functions/data-presets.php:191 +msgid "Israel" +msgstr "" + +#: includes/functions/data-presets.php:192 +msgid "Italy" +msgstr "" + +#: includes/functions/data-presets.php:193 +msgid "Jamaica" +msgstr "" + +#: includes/functions/data-presets.php:194 +msgid "Japan" +msgstr "" + +#: includes/functions/data-presets.php:195 +msgid "Jersey" +msgstr "" + +#: includes/functions/data-presets.php:196 +msgid "Jordan" +msgstr "" + +#: includes/functions/data-presets.php:197 +msgid "Kazakhstan" +msgstr "" + +#: includes/functions/data-presets.php:198 +msgid "Kenya" +msgstr "" + +#: includes/functions/data-presets.php:199 +msgid "Kiribati" +msgstr "" + +#: includes/functions/data-presets.php:200 +msgid "Korea (Democratic People's Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:201 +msgid "Korea (Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:202 +msgid "Kosovo" +msgstr "" + +#: includes/functions/data-presets.php:203 +msgid "Kuwait" +msgstr "" + +#: includes/functions/data-presets.php:204 +msgid "Kyrgyzstan" +msgstr "" + +#: includes/functions/data-presets.php:205 +msgid "Lao People's Democratic Republic" +msgstr "" + +#: includes/functions/data-presets.php:206 +msgid "Latvia" +msgstr "" + +#: includes/functions/data-presets.php:207 +msgid "Lebanon" +msgstr "" + +#: includes/functions/data-presets.php:208 +msgid "Lesotho" +msgstr "" + +#: includes/functions/data-presets.php:209 +msgid "Liberia" +msgstr "" + +#: includes/functions/data-presets.php:210 +msgid "Libya" +msgstr "" + +#: includes/functions/data-presets.php:211 +msgid "Liechtenstein" +msgstr "" + +#: includes/functions/data-presets.php:212 +msgid "Lithuania" +msgstr "" + +#: includes/functions/data-presets.php:213 +msgid "Luxembourg" +msgstr "" + +#: includes/functions/data-presets.php:214 +msgid "Macao" +msgstr "" + +#: includes/functions/data-presets.php:215 +msgid "North Macedonia (Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:216 +msgid "Madagascar" +msgstr "" + +#: includes/functions/data-presets.php:217 +msgid "Malawi" +msgstr "" + +#: includes/functions/data-presets.php:218 +msgid "Malaysia" +msgstr "" + +#: includes/functions/data-presets.php:219 +msgid "Maldives" +msgstr "" + +#: includes/functions/data-presets.php:220 +msgid "Mali" +msgstr "" + +#: includes/functions/data-presets.php:221 +msgid "Malta" +msgstr "" + +#: includes/functions/data-presets.php:222 +msgid "Marshall Islands" +msgstr "" + +#: includes/functions/data-presets.php:223 +msgid "Martinique" +msgstr "" + +#: includes/functions/data-presets.php:224 +msgid "Mauritania" +msgstr "" + +#: includes/functions/data-presets.php:225 +msgid "Mauritius" +msgstr "" + +#: includes/functions/data-presets.php:226 +msgid "Mayotte" +msgstr "" + +#: includes/functions/data-presets.php:227 +msgid "Mexico" +msgstr "" + +#: includes/functions/data-presets.php:228 +msgid "Micronesia (Federated States of)" +msgstr "" + +#: includes/functions/data-presets.php:229 +msgid "Moldova (Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:230 +msgid "Monaco" +msgstr "" + +#: includes/functions/data-presets.php:231 +msgid "Mongolia" +msgstr "" + +#: includes/functions/data-presets.php:232 +msgid "Montenegro" +msgstr "" + +#: includes/functions/data-presets.php:233 +msgid "Montserrat" +msgstr "" + +#: includes/functions/data-presets.php:234 +msgid "Morocco" +msgstr "" + +#: includes/functions/data-presets.php:235 +msgid "Mozambique" +msgstr "" + +#: includes/functions/data-presets.php:236 +msgid "Myanmar" +msgstr "" + +#: includes/functions/data-presets.php:237 +msgid "Namibia" +msgstr "" + +#: includes/functions/data-presets.php:238 +msgid "Nauru" +msgstr "" + +#: includes/functions/data-presets.php:239 +msgid "Nepal" +msgstr "" + +#: includes/functions/data-presets.php:240 +msgid "Netherlands" +msgstr "" + +#: includes/functions/data-presets.php:241 +msgid "New Caledonia" +msgstr "" + +#: includes/functions/data-presets.php:242 +msgid "New Zealand" +msgstr "" + +#: includes/functions/data-presets.php:243 +msgid "Nicaragua" +msgstr "" + +#: includes/functions/data-presets.php:244 +msgid "Niger" +msgstr "" + +#: includes/functions/data-presets.php:245 +msgid "Nigeria" +msgstr "" + +#: includes/functions/data-presets.php:246 +msgid "Niue" +msgstr "" + +#: includes/functions/data-presets.php:247 +msgid "Norfolk Island" +msgstr "" + +#: includes/functions/data-presets.php:248 +msgid "Northern Mariana Islands" +msgstr "" + +#: includes/functions/data-presets.php:249 +msgid "Norway" +msgstr "" + +#: includes/functions/data-presets.php:250 +msgid "Oman" +msgstr "" + +#: includes/functions/data-presets.php:251 +msgid "Pakistan" +msgstr "" + +#: includes/functions/data-presets.php:252 +msgid "Palau" +msgstr "" + +#: includes/functions/data-presets.php:253 +msgid "Palestine (State of)" +msgstr "" + +#: includes/functions/data-presets.php:254 +msgid "Panama" +msgstr "" + +#: includes/functions/data-presets.php:255 +msgid "Papua New Guinea" +msgstr "" + +#: includes/functions/data-presets.php:256 +msgid "Paraguay" +msgstr "" + +#: includes/functions/data-presets.php:257 +msgid "Peru" +msgstr "" + +#: includes/functions/data-presets.php:258 +msgid "Philippines" +msgstr "" + +#: includes/functions/data-presets.php:259 +msgid "Pitcairn" +msgstr "" + +#: includes/functions/data-presets.php:260 +msgid "Poland" +msgstr "" + +#: includes/functions/data-presets.php:261 +msgid "Portugal" +msgstr "" + +#: includes/functions/data-presets.php:262 +msgid "Puerto Rico" +msgstr "" + +#: includes/functions/data-presets.php:263 +msgid "Qatar" +msgstr "" + +#: includes/functions/data-presets.php:264 +msgid "Réunion" +msgstr "" + +#: includes/functions/data-presets.php:265 +msgid "Romania" +msgstr "" + +#: includes/functions/data-presets.php:266 +msgid "Russian Federation" +msgstr "" + +#: includes/functions/data-presets.php:267 +msgid "Rwanda" +msgstr "" + +#: includes/functions/data-presets.php:268 +msgid "Saint Barthélemy" +msgstr "" + +#: includes/functions/data-presets.php:269 +msgid "Saint Helena, Ascension and Tristan da Cunha" +msgstr "" + +#: includes/functions/data-presets.php:270 +msgid "Saint Kitts and Nevis" +msgstr "" + +#: includes/functions/data-presets.php:271 +msgid "Saint Lucia" +msgstr "" + +#: includes/functions/data-presets.php:272 +msgid "Saint Martin (French part)" +msgstr "" + +#: includes/functions/data-presets.php:273 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#: includes/functions/data-presets.php:274 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#: includes/functions/data-presets.php:275 +msgid "Samoa" +msgstr "" + +#: includes/functions/data-presets.php:276 +msgid "San Marino" +msgstr "" + +#: includes/functions/data-presets.php:277 +msgid "Sao Tome and Principe" +msgstr "" + +#: includes/functions/data-presets.php:278 +msgid "Saudi Arabia" +msgstr "" + +#: includes/functions/data-presets.php:279 +msgid "Senegal" +msgstr "" + +#: includes/functions/data-presets.php:280 +msgid "Serbia" +msgstr "" + +#: includes/functions/data-presets.php:281 +msgid "Seychelles" +msgstr "" + +#: includes/functions/data-presets.php:282 +msgid "Sierra Leone" +msgstr "" + +#: includes/functions/data-presets.php:283 +msgid "Singapore" +msgstr "" + +#: includes/functions/data-presets.php:284 +msgid "Sint Maarten (Dutch part)" +msgstr "" + +#: includes/functions/data-presets.php:285 +msgid "Slovakia" +msgstr "" + +#: includes/functions/data-presets.php:286 +msgid "Slovenia" +msgstr "" + +#: includes/functions/data-presets.php:287 +msgid "Solomon Islands" +msgstr "" + +#: includes/functions/data-presets.php:288 +msgid "Somalia" +msgstr "" + +#: includes/functions/data-presets.php:289 +msgid "South Africa" +msgstr "" + +#: includes/functions/data-presets.php:290 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#: includes/functions/data-presets.php:291 +msgid "South Sudan" +msgstr "" + +#: includes/functions/data-presets.php:292 +msgid "Spain" +msgstr "" + +#: includes/functions/data-presets.php:293 +msgid "Sri Lanka" +msgstr "" + +#: includes/functions/data-presets.php:294 +msgid "Sudan" +msgstr "" + +#: includes/functions/data-presets.php:295 +msgid "Suriname" +msgstr "" + +#: includes/functions/data-presets.php:296 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#: includes/functions/data-presets.php:297 +msgid "Eswatini (Kingdom of)" +msgstr "" + +#: includes/functions/data-presets.php:298 +msgid "Sweden" +msgstr "" + +#: includes/functions/data-presets.php:299 +msgid "Switzerland" +msgstr "" + +#: includes/functions/data-presets.php:300 +msgid "Syrian Arab Republic" +msgstr "" + +#: includes/functions/data-presets.php:301 +msgid "Taiwan, Republic of China" +msgstr "" + +#: includes/functions/data-presets.php:302 +msgid "Tajikistan" +msgstr "" + +#: includes/functions/data-presets.php:303 +msgid "Tanzania (United Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:304 +msgid "Thailand" +msgstr "" + +#: includes/functions/data-presets.php:305 +msgid "Timor-Leste" +msgstr "" + +#: includes/functions/data-presets.php:306 +msgid "Togo" +msgstr "" + +#: includes/functions/data-presets.php:307 +msgid "Tokelau" +msgstr "" + +#: includes/functions/data-presets.php:308 +msgid "Tonga" +msgstr "" + +#: includes/functions/data-presets.php:309 +msgid "Trinidad and Tobago" +msgstr "" + +#: includes/functions/data-presets.php:310 +msgid "Tunisia" +msgstr "" + +#: includes/functions/data-presets.php:311 +msgid "Türkiye" +msgstr "" + +#: includes/functions/data-presets.php:312 +msgid "Turkmenistan" +msgstr "" + +#: includes/functions/data-presets.php:313 +msgid "Turks and Caicos Islands" +msgstr "" + +#: includes/functions/data-presets.php:314 +msgid "Tuvalu" +msgstr "" + +#: includes/functions/data-presets.php:315 +msgid "Uganda" +msgstr "" + +#: includes/functions/data-presets.php:316 +msgid "Ukraine" +msgstr "" + +#: includes/functions/data-presets.php:317 +msgid "United Arab Emirates" +msgstr "" + +#: includes/functions/data-presets.php:318 +msgid "United Kingdom of Great Britain and Northern Ireland" +msgstr "" + +#: includes/functions/data-presets.php:319 +msgid "United States of America" +msgstr "" + +#: includes/functions/data-presets.php:320 +msgid "United States Minor Outlying Islands" +msgstr "" + +#: includes/functions/data-presets.php:321 +msgid "Uruguay" +msgstr "" + +#: includes/functions/data-presets.php:322 +msgid "Uzbekistan" +msgstr "" + +#: includes/functions/data-presets.php:323 +msgid "Vanuatu" +msgstr "" + +#: includes/functions/data-presets.php:324 +msgid "Vatican City State" +msgstr "" + +#: includes/functions/data-presets.php:325 +msgid "Venezuela (Bolivarian Republic of)" +msgstr "" + +#: includes/functions/data-presets.php:326 +msgid "Vietnam" +msgstr "" + +#: includes/functions/data-presets.php:327 +msgid "Virgin Islands (British)" +msgstr "" + +#: includes/functions/data-presets.php:328 +msgid "Virgin Islands (U.S.)" +msgstr "" + +#: includes/functions/data-presets.php:329 +msgid "Wallis and Futuna" +msgstr "" + +#: includes/functions/data-presets.php:330 +msgid "Western Sahara" +msgstr "" + +#: includes/functions/data-presets.php:331 +msgid "Yemen" +msgstr "" + +#: includes/functions/data-presets.php:332 +msgid "Zambia" +msgstr "" + +#: includes/functions/data-presets.php:333 +msgid "Zimbabwe" +msgstr "" + +#: includes/functions/data-presets.php:349 +msgid "January" +msgstr "" + +#: includes/functions/data-presets.php:350 +msgid "February" +msgstr "" + +#: includes/functions/data-presets.php:351 +msgid "March" +msgstr "" + +#: includes/functions/data-presets.php:352 +msgid "April" +msgstr "" + +#: includes/functions/data-presets.php:353 +msgid "May" +msgstr "" + +#: includes/functions/data-presets.php:354 +msgid "June" +msgstr "" + +#: includes/functions/data-presets.php:355 +msgid "July" +msgstr "" + +#: includes/functions/data-presets.php:356 +msgid "August" +msgstr "" + +#: includes/functions/data-presets.php:357 +msgid "September" +msgstr "" + +#: includes/functions/data-presets.php:358 +msgid "October" +msgstr "" + +#: includes/functions/data-presets.php:359 +msgid "November" +msgstr "" + +#: includes/functions/data-presets.php:360 +msgid "December" +msgstr "" + +#: includes/functions/data-presets.php:376 +msgid "Sunday" +msgstr "" + +#: includes/functions/data-presets.php:377 +msgid "Monday" +msgstr "" + +#: includes/functions/data-presets.php:378 +msgid "Tuesday" +msgstr "" + +#: includes/functions/data-presets.php:379 +msgid "Wednesday" +msgstr "" + +#: includes/functions/data-presets.php:380 +msgid "Thursday" +msgstr "" + +#: includes/functions/data-presets.php:381 +msgid "Friday" +msgstr "" + +#: includes/functions/data-presets.php:382 +msgid "Saturday" +msgstr "" + +#. translators: %1$s - formatted date, %2$s - formatted time. +#. translators: %1$s - date, %2$s - time when item was created, e.g. "Oct 22, 2022 at 11:11 am". +#. translators: %1$s - date, %2$s - time when item was created, e.g. "Oct 22 at 11:11am". +#: includes/functions/date-time.php:35 +#: src/Admin/Payments/Views/Single.php:992 +#: src/Admin/Revisions.php:324 +#: templates/admin/payments/single/log.php:34 +#, php-format +msgid "%1$s at %2$s" +msgstr "" + +#: includes/functions/education.php:38 +msgid "Install & Activate" +msgstr "" + +#: includes/functions/education.php:45 +msgid "Plugin installation is disabled for this site." +msgstr "" + +#. translators: %s: License name. +#: includes/functions/education.php:83 +#, php-format +msgid "Upgrade to WPForms %s" +msgstr "" + +#. translators: %d - post ID. +#: includes/functions/form-fields.php:347 +#, php-format +msgid "#%d (no title)" +msgstr "" + +#. translators: %d - taxonomy term ID. +#: includes/functions/form-fields.php:368 +#, php-format +msgid "#%d (no name)" +msgstr "" + +#: includes/functions/form-fields.php:443 +msgid "Standard Fields" +msgstr "" + +#: includes/functions/form-fields.php:447 +msgid "Fancy Fields" +msgstr "" + +#: includes/functions/form-fields.php:451 +msgid "Payment Fields" +msgstr "" + +#: includes/functions/payments.php:19 +msgid "U.S. Dollar" +msgstr "" + +#: includes/functions/payments.php:27 +msgid "Pound Sterling" +msgstr "" + +#: includes/functions/payments.php:35 +msgid "Euro" +msgstr "" + +#: includes/functions/payments.php:43 +msgid "Australian Dollar" +msgstr "" + +#: includes/functions/payments.php:51 +msgid "Brazilian Real" +msgstr "" + +#: includes/functions/payments.php:59 +msgid "Bulgarian Lev" +msgstr "" + +#: includes/functions/payments.php:67 +msgid "Canadian Dollar" +msgstr "" + +#: includes/functions/payments.php:75 +msgid "Costa Rican Colón" +msgstr "" + +#: includes/functions/payments.php:83 +msgid "Central African CFA Franc" +msgstr "" + +#: includes/functions/payments.php:91 +msgid "Czech Koruna" +msgstr "" + +#: includes/functions/payments.php:99 +msgid "Danish Krone" +msgstr "" + +#: includes/functions/payments.php:107 +msgid "Hong Kong Dollar" +msgstr "" + +#: includes/functions/payments.php:115 +msgid "Hungarian Forint" +msgstr "" + +#: includes/functions/payments.php:123 +msgid "Indian Rupee" +msgstr "" + +#: includes/functions/payments.php:131 +msgid "Israeli New Sheqel" +msgstr "" + +#: includes/functions/payments.php:139 +msgid "Japanese Yen" +msgstr "" + +#: includes/functions/payments.php:147 +msgid "Malaysian Ringgit" +msgstr "" + +#: includes/functions/payments.php:155 +msgid "Mexican Peso" +msgstr "" + +#: includes/functions/payments.php:163 +msgid "Norwegian Krone" +msgstr "" + +#: includes/functions/payments.php:171 +msgid "New Zealand Dollar" +msgstr "" + +#: includes/functions/payments.php:179 +msgid "Philippine Peso" +msgstr "" + +#: includes/functions/payments.php:187 +msgid "Polish Zloty" +msgstr "" + +#: includes/functions/payments.php:195 +msgid "Romanian Leu" +msgstr "" + +#: includes/functions/payments.php:203 +msgid "Russian Ruble" +msgstr "" + +#: includes/functions/payments.php:211 +msgid "Saudi Arabian Riyal" +msgstr "" + +#: includes/functions/payments.php:219 +msgid "Singapore Dollar" +msgstr "" + +#: includes/functions/payments.php:227 +msgid "Serbian Dinar" +msgstr "" + +#: includes/functions/payments.php:235 +msgid "South African Rand" +msgstr "" + +#: includes/functions/payments.php:243 +msgid "South Korean Won" +msgstr "" + +#: includes/functions/payments.php:251 +msgid "Sri Lankan Rupee" +msgstr "" + +#: includes/functions/payments.php:259 +msgid "Swedish Krona" +msgstr "" + +#: includes/functions/payments.php:267 +msgid "Swiss Franc" +msgstr "" + +#: includes/functions/payments.php:275 +msgid "Taiwan New Dollar" +msgstr "" + +#: includes/functions/payments.php:283 +msgid "Thai Baht" +msgstr "" + +#: includes/functions/payments.php:291 +msgid "Turkish Lira" +msgstr "" + +#: includes/functions/payments.php:299 +msgid "United Arab Emirates Dirham" +msgstr "" + +#. translators: %1$s - payment amount; %2$d - payment quantity. +#: includes/functions/payments.php:778 +#, php-format +msgid "%1$s × %2$d" +msgstr "" + +#: includes/functions/utilities.php:375 +#: src/Integrations/AI/Admin/Builder/Forms.php:205 +#: templates/admin/payments/reset-filter-notice.php:57 +msgid "and" +msgstr "" + +#: includes/integrations.php:27 +msgid "Select a form to display" +msgstr "" + +#: includes/integrations.php:35 +msgid "No forms found" +msgstr "" + +#: includes/integrations.php:45 +msgid "Add your form" +msgstr "" + +#: includes/integrations.php:49 +#: src/Admin/Payments/Views/Overview/Table.php:105 +#: src/Forms/Preview.php:185 +#: src/Forms/Preview.php:391 +#: src/Integrations/Divi/WPFormsSelector.php:65 +#: src/Integrations/Elementor/Widget.php:135 +#: src/Integrations/Elementor/Widget.php:163 +#: src/Integrations/Gutenberg/FormSelector.php:483 +#: templates/emails/summary-body-plain.php:52 +#: templates/emails/summary-body.php:158 +msgid "Form" +msgstr "" + +#: includes/integrations.php:53 +msgid "Select a form to add it to your post or page." +msgstr "" + +#: includes/integrations.php:58 +msgid "Display Form Name" +msgstr "" + +#: includes/integrations.php:61 +#: includes/integrations.php:76 +#: src/Integrations/Gutenberg/FormSelector.php:528 +msgid "No" +msgstr "" + +#: includes/integrations.php:62 +#: includes/integrations.php:77 +#: src/Integrations/Gutenberg/FormSelector.php:527 +msgid "Yes" +msgstr "" + +#: includes/integrations.php:65 +msgid "Would you like to display the forms name?" +msgstr "" + +#: includes/integrations.php:73 +msgid "Display Form Description" +msgstr "" + +#: includes/integrations.php:80 +msgid "Would you like to display the form description?" +msgstr "" + +#: includes/providers/class-base.php:168 +#: includes/providers/class-base.php:1226 +#: includes/providers/class-base.php:1274 +msgid "You do not have permission" +msgstr "" + +#. translators: %s - Name field label. +#: includes/providers/class-base.php:492 +#, php-format +msgid "%s (Full)" +msgstr "" + +#. translators: %s - Name field label. +#: includes/providers/class-base.php:507 +#, php-format +msgid "%s (First)" +msgstr "" + +#. translators: %s - Name field label. +#: includes/providers/class-base.php:523 +#, php-format +msgid "%s (Middle)" +msgstr "" + +#. translators: %s - Name field label. +#: includes/providers/class-base.php:539 +#, php-format +msgid "%s (Last)" +msgstr "" + +#: includes/providers/class-base.php:765 +#: templates/integrations/constant-contact-v3/builder/connection.php:32 +#: templates/integrations/constant-contact-v3/builder/connection.php:35 +msgid "Select Account" +msgstr "" + +#: includes/providers/class-base.php:777 +#: includes/providers/class-base.php:1407 +#: includes/providers/class-constant-contact.php:543 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:186 +#: src/Integrations/ConstantContact/V3/Settings/PageIntegrations.php:91 +#: src/Providers/Provider/Settings/FormBuilder.php:533 +#: src/Providers/Provider/Settings/PageIntegrations.php:256 +msgid "Add New Account" +msgstr "" + +#: includes/providers/class-base.php:811 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:216 +msgid "Select List" +msgstr "" + +#: includes/providers/class-base.php:858 +msgid "Select Groups" +msgstr "" + +#: includes/providers/class-base.php:860 +msgid "We also noticed that you have some segments in your list. You can select specific list segments below if needed. This is optional." +msgstr "" + +#: includes/providers/class-base.php:924 +#: includes/providers/class-base.php:929 +msgid "List Fields" +msgstr "" + +#: includes/providers/class-base.php:929 +msgid "Available Form Fields" +msgstr "" + +#. translators: %s - provider type. +#: includes/providers/class-base.php:1151 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/providers/class-base.php:1234 +#: includes/providers/class-base.php:1285 +msgid "Missing data" +msgstr "" + +#: includes/providers/class-base.php:1250 +msgid "Connection missing" +msgstr "" + +#: includes/providers/class-base.php:1297 +msgid "Could not connect to the provider." +msgstr "" + +#. translators: %1$s - Connection date. +#: includes/providers/class-base.php:1309 +#: includes/providers/class-base.php:1392 +#: src/Providers/Provider/Settings/PageIntegrations.php:180 +#, php-format +msgid "Connected on: %1$s" +msgstr "" + +#: includes/providers/class-base.php:1314 +#: includes/providers/class-base.php:1397 +#: src/Integrations/Square/Admin/Settings.php:524 +#: src/Providers/Provider/Settings/PageIntegrations.php:193 +msgid "Disconnect" +msgstr "" + +#. translators: %s - provider name. +#: includes/providers/class-base.php:1340 +#: src/Providers/Provider/Settings/PageIntegrations.php:294 +#, php-format +msgid "Connect to %s" +msgstr "" + +#: includes/providers/class-base.php:1358 +#: src/Providers/Provider/Settings/PageIntegrations.php:70 +msgid "Show Accounts" +msgstr "" + +#. translators: %s - provider name. +#: includes/providers/class-base.php:1367 +#: lite/templates/education/admin/settings/integrations-item.php:36 +#: src/Providers/Provider/Settings/PageIntegrations.php:79 +#, php-format +msgid "Integrate %s with WPForms" +msgstr "" + +#: includes/providers/class-base.php:1374 +#: src/Providers/Provider/Settings/PageIntegrations.php:86 +msgid "Connected" +msgstr "" + +#: includes/providers/class-base.php:1415 +#: src/Providers/Provider/Settings/PageIntegrations.php:264 +msgid "Please fill out all of the fields below to add your new provider account." +msgstr "" + +#: includes/providers/class-constant-contact.php:546 +msgid "Please fill out all of the fields below to register your new Constant Contact account." +msgstr "" + +#: includes/providers/class-constant-contact.php:549 +#: src/Integrations/ConstantContact/V3/Settings/PageIntegrations.php:101 +msgid "Click here for documentation on connecting WPForms with Constant Contact." +msgstr "" + +#: includes/providers/class-constant-contact.php:554 +#: includes/providers/class-constant-contact.php:720 +msgid "Because Constant Contact requires external authentication, you will need to register WPForms with Constant Contact before you can proceed." +msgstr "" + +#: includes/providers/class-constant-contact.php:560 +#: includes/providers/class-constant-contact.php:726 +msgid "Click here to register with Constant Contact" +msgstr "" + +#: includes/providers/class-constant-contact.php:569 +#: includes/providers/class-constant-contact.php:735 +msgid "Authorization Code" +msgstr "" + +#: includes/providers/class-constant-contact.php:575 +#: includes/providers/class-constant-contact.php:741 +msgid "Account Nickname" +msgstr "" + +#: includes/providers/class-constant-contact.php:581 +msgid "Connect" +msgstr "" + +#: includes/providers/class-constant-contact.php:624 +#: includes/providers/class-constant-contact.php:819 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:375 +msgid "Try Constant Contact for Free" +msgstr "" + +#: includes/providers/class-constant-contact.php:632 +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:383 +msgid "Learn more about the power of email marketing." +msgstr "" + +#: includes/providers/class-constant-contact.php:677 +msgid "The \"Authorization Code\" is required." +msgstr "" + +#: includes/providers/class-constant-contact.php:685 +msgid "The \"Account Nickname\" is required." +msgstr "" + +#. translators: %1$s - Documentation URL. +#: includes/providers/class-constant-contact.php:703 +#, php-format +msgid "If you need help connecting WPForms to Constant Contact, read our documentation." +msgstr "" + +#: includes/providers/class-constant-contact.php:810 +msgid "Get the most out of the WPForms plugin — use it with an active Constant Contact account." +msgstr "" + +#: includes/providers/class-constant-contact.php:822 +msgid "Connect your existing account" +msgstr "" + +#. translators: %s - WPForms Constant Contact internal URL. +#: includes/providers/class-constant-contact.php:827 +#, php-format +msgid "Learn More about the power of email marketing" +msgstr "" + +#: includes/templates/class-blank.php:38 +msgid "The blank form allows you to create any type of form using our drag & drop builder." +msgstr "" + +#: includes/templates/class-simple-contact-form.php:21 +msgid "Simple Contact Form" +msgstr "" + +#: includes/templates/class-simple-contact-form.php:28 +msgid "Collect the names, emails, and messages from site visitors that need to talk to you." +msgstr "" + +#: includes/templates/class-simple-contact-form.php:50 +#: src/Emails/Preview.php:411 +msgid "Comment or Message" +msgstr "" + +#: lite/templates/admin/addons.php:25 +msgid "Search Addons" +msgstr "" + +#: lite/templates/admin/addons.php:34 +msgid "Unknown Addon" +msgstr "" + +#. translators: %s - addon title. +#: lite/templates/admin/addons.php:49 +#, php-format +msgid "%s logo" +msgstr "" + +#: lite/templates/admin/addons.php:71 +#: src/Integrations/Gutenberg/FormSelector.php:493 +msgid "Learn more" +msgstr "" + +#: lite/templates/admin/addons.php:96 +msgid "Sorry, we didn't find any addons that match your criteria." +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:17 +msgid "Form entries are not stored in WPForms Lite." +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:22 +msgid "View and Manage Your Form Entries inside WordPress" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:25 +msgid "Once you upgrade to WPForms Pro, all future form entries will be stored in your WordPress database and displayed on this Entries screen." +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:29 +msgid "View Entries in Dashboard" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:30 +msgid "Export Entries in a CSV File" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:31 +msgid "Add Notes / Comments" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:32 +msgid "Save Favorite Entries" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:35 +msgid "Mark Read / Unread" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:36 +msgid "Print Entries" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:37 +msgid "Resend Notifications" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:38 +msgid "See Geolocation Data" +msgstr "" + +#. translators: %d - backed up entries count. +#: lite/templates/admin/entries/overview/modal.php:50 +#, php-format +msgid "%d entry has been backed up" +msgid_plural "%d entries have been backed up" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s - time when Lite Connect was enabled. +#: lite/templates/admin/entries/overview/modal.php:64 +#, php-format +msgid "since you enabled Lite Connect on %s" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:71 +msgid "Upgrade to WPForms Pro & Restore Form Entries" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:77 +msgid "Upgrade to WPForms Pro Now" +msgstr "" + +#: lite/templates/admin/entries/overview/modal.php:84 +msgid "Explore Entries & Learn More" +msgstr "" + +#: lite/templates/admin/entries/single/entry.php:25 +msgid "Back to All Entries" +msgstr "" + +#: lite/templates/builder/context-menu.php:35 +msgid "Duplicate Template" +msgstr "" + +#: lite/templates/builder/context-menu.php:50 +msgid "Duplicate Form" +msgstr "" + +#: lite/templates/builder/context-menu.php:63 +msgid "Save as Template" +msgstr "" + +#: lite/templates/builder/context-menu.php:82 +#: src/Admin/AdminBarMenu.php:635 +#: src/Admin/Builder/Shortcuts.php:57 +#: src/Forms/Preview.php:238 +#: src/Integrations/Gutenberg/FormSelector.php:438 +msgid "View Entries" +msgstr "" + +#: lite/templates/builder/context-menu.php:97 +#: src/Admin/AdminBarMenu.php:636 +#: src/Forms/Preview.php:257 +msgid "View Payments" +msgstr "" + +#: lite/templates/builder/context-menu.php:111 +msgid "What's New" +msgstr "" + +#: lite/templates/builder/context-menu.php:123 +#: src/Admin/Builder/Shortcuts.php:75 +msgid "Keyboard Shortcuts" +msgstr "" + +#: lite/templates/education/admin/did-you-know.php:42 +#: lite/templates/education/admin/did-you-know.php:56 +#: lite/templates/education/admin/notice-bar.php:35 +#: lite/templates/education/builder/did-you-know.php:31 +#: lite/templates/education/builder/lite-connect/top-bar.php:26 +#: lite/wpforms-lite.php:149 +#: src/Integrations/Stripe/Admin/Notices.php:173 +msgid "Dismiss this message." +msgstr "" + +#: lite/templates/education/admin/lite-connect/challenge-popup-footer.php:19 +msgid "One More Thing" +msgstr "" + +#: lite/templates/education/admin/lite-connect/challenge-popup-footer.php:23 +msgid "WPForms now offers offsite backups for your form entries. If you decide to upgrade to WPForms Pro, you can restore entries collected while you used WPForms Lite." +msgstr "" + +#: lite/templates/education/admin/lite-connect/challenge-popup-footer.php:31 +#: lite/templates/education/builder/lite-connect/top-bar.php:23 +msgid "Form Entry Backups Are Enabled" +msgstr "" + +#: lite/templates/education/admin/lite-connect/dashboard-widget-before.php:26 +msgid "Restore Entries" +msgstr "" + +#. translators: %s - WPForms.com Upgrade page URL. +#: lite/templates/education/admin/notice-bar.php:21 +#, php-format +msgid "You're using WPForms Lite. To unlock more features consider upgrading to Pro for 50%% off." +msgstr "" + +#: lite/templates/education/builder/did-you-know.php:21 +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:128 +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:134 +msgid "Did You Know?" +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:16 +msgid "Enable AI Features in WPForms" +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:18 +msgid "Before you can proceed, we need your permission to record what you input in order to generate content with AI. You’ll also get..." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:22 +#: lite/templates/education/lite-connect-modal.php:44 +msgid "WPForms AI." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:24 +#: lite/templates/education/lite-connect-modal.php:46 +msgid "WPForms AI" +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:26 +#: lite/templates/education/lite-connect-modal.php:48 +msgid "Build your forms even faster with state-of-the-art generative AI built right into the form builder." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:31 +#: lite/templates/education/lite-connect-modal.php:24 +msgid "Backup and Restore." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:33 +msgid "Form Entry Backup & Restore" +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:35 +#: lite/templates/education/lite-connect-modal.php:28 +msgid "When you upgrade to WPForms Pro, we'll automatically restore all of the entries that you collected in WPForms Lite." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:40 +msgid "Security & Protection." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:42 +#: lite/templates/education/lite-connect-modal.php:35 +msgid "Security & Protection" +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:44 +#: lite/templates/education/lite-connect-modal.php:37 +msgid "Entries are stored securely and privately until you're ready to upgrade. Our team cannot view your forms or entries." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:49 +#: lite/templates/education/lite-connect-modal.php:55 +msgid "WPForms Newsletter." +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:51 +#: lite/templates/education/lite-connect-modal.php:57 +msgid "WPForms Newsletter" +msgstr "" + +#: lite/templates/education/builder/lite-connect/ai-modal.php:53 +#: lite/templates/education/lite-connect-modal.php:59 +msgid "Ready to grow your website? Get the latest pro tips and updates from the WPForms team." +msgstr "" + +#. translators: %s - WPForms Terms of Service link. +#: lite/templates/education/builder/lite-connect/ai-modal.php:62 +#: lite/templates/education/lite-connect-modal.php:69 +#, php-format +msgid "By enabling Lite Connect you agree to our Terms of Service and to share your information with WPForms." +msgstr "" + +#: lite/templates/education/builder/lite-connect/top-bar.php:25 +msgid "Easily restore your entries when you upgrade to WPForms Pro." +msgstr "" + +#: lite/templates/education/builder/providers-item.php:34 +#: src/Admin/Education/Helpers.php:99 +#: templates/builder/payment/sidebar.php:29 +msgid "Recommended" +msgstr "" + +#: lite/templates/education/lite-connect-modal.php:18 +msgid "Form Entry Backups" +msgstr "" + +#: lite/templates/education/lite-connect-modal.php:20 +msgid "If your email notifications aren't delivered, you’ll lose form entries. Turn on free backups now and restore your entries when you upgrade to Pro." +msgstr "" + +#: lite/templates/education/lite-connect-modal.php:26 +msgid "Backup & Restore" +msgstr "" + +#: lite/templates/education/lite-connect-modal.php:33 +msgid "Security and Protection." +msgstr "" + +#: lite/wpforms-lite.php:140 +msgid "Multiple notifications" +msgstr "" + +#: lite/wpforms-lite.php:141 +msgid "Add New Notification" +msgstr "" + +#. translators: %s - link to the WPForms.com doc article. +#: lite/wpforms-lite.php:153 +#, php-format +msgid "Notifications are emails sent when a form is submitted. By default, these emails include entry details. For setup and customization options, including a video overview, please see our tutorial." +msgstr "" + +#. translators: 1$s, %2$s - links to the WPForms.com doc articles. +#: lite/wpforms-lite.php:168 +#, php-format +msgid "After saving these settings, be sure to test a form submission. This lets you see how emails will look, and to ensure that they are delivered successfully." +msgstr "" + +#: lite/wpforms-lite.php:190 +msgid "Enable Notifications" +msgstr "" + +#: lite/wpforms-lite.php:208 +msgid "Send To Email Address" +msgstr "" + +#: lite/wpforms-lite.php:211 +msgid "Enter the email address to receive form entry notifications. For multiple notifications, separate email addresses with a comma." +msgstr "" + +#: lite/wpforms-lite.php:229 +msgid "CC" +msgstr "" + +#: lite/wpforms-lite.php:247 +msgid "Email Subject Line" +msgstr "" + +#: lite/wpforms-lite.php:266 +msgid "From Name" +msgstr "" + +#: lite/wpforms-lite.php:299 +msgid "From Email" +msgstr "" + +#: lite/wpforms-lite.php:333 +msgid "Reply-To" +msgstr "" + +#. translators: %s - . +#: lite/wpforms-lite.php:337 +#, php-format +msgid "Enter the email address or email address with recipient's name in \"First Last %s\" format." +msgstr "" + +#: lite/wpforms-lite.php:358 +msgid "Email Message" +msgstr "" + +#. translators: %s - {all_fields} Smart Tag. +#: lite/wpforms-lite.php:372 +#, php-format +msgid "To display all form fields, use the %s Smart Tag." +msgstr "" + +#: lite/wpforms-lite.php:496 +msgid "Multiple confirmations" +msgstr "" + +#: lite/wpforms-lite.php:497 +msgid "Add New Confirmation" +msgstr "" + +#: lite/wpforms-lite.php:526 +msgid "Confirmation Type" +msgstr "" + +#: lite/wpforms-lite.php:530 +#: src/Logger/ListTable.php:291 +#: src/Logger/ListTable.php:481 +#: templates/builder/themes/preview.php:39 +msgid "Message" +msgstr "" + +#: lite/wpforms-lite.php:531 +msgid "Show Page" +msgstr "" + +#: lite/wpforms-lite.php:532 +msgid "Go to URL (Redirect)" +msgstr "" + +#: lite/wpforms-lite.php:545 +msgid "Confirmation Message" +msgstr "" + +#: lite/wpforms-lite.php:566 +msgid "Automatically scroll to the confirmation message" +msgstr "" + +#: lite/wpforms-lite.php:579 +msgid "Confirmation Page" +msgstr "" + +#: lite/wpforms-lite.php:598 +msgid "URL Parameters" +msgstr "" + +#: lite/wpforms-lite.php:604 +msgid "Add query string parameters to append to the URL when the form is submitted. Separate multiple parameters with an ampersand (&)." +msgstr "" + +#: lite/wpforms-lite.php:613 +msgid "Confirmation Redirect URL" +msgstr "" + +#: lite/wpforms-lite.php:626 +msgid "Open confirmation in new tab" +msgstr "" + +#. translators: %s - WPForms.com docs page URL. +#: lite/wpforms-lite.php:682 +#, php-format +msgid "You've just turned off notification emails for this form. Since entries are not stored in WPForms Lite, notification emails are recommended for collecting entry details. For setup steps, please see our notification tutorial." +msgstr "" + +#: lite/wpforms-lite.php:718 +#: templates/admin/notifications.php:27 +msgid "Dismiss this message" +msgstr "" + +#: lite/wpforms-lite.php:720 +msgid "Thanks for being a loyal WPForms Lite user. Upgrade to WPForms Pro to unlock all the awesome features and experience why WPForms is consistently rated the best WordPress form builder." +msgstr "" + +#. translators: %s - star icons. +#: lite/wpforms-lite.php:725 +#, php-format +msgid "We know that you will truly love WPForms. It has over 13,000+ five star ratings (%s) and is active on over 6 million websites." +msgstr "" + +#: lite/wpforms-lite.php:737 +msgid "Pro Features:" +msgstr "" + +#: lite/wpforms-lite.php:766 +msgid "Get WPForms Pro Today and Unlock all the Powerful Features »" +msgstr "" + +#: lite/wpforms-lite.php:772 +msgid "Bonus: WPForms Lite users get 50% off regular price, automatically applied at checkout." +msgstr "" + +#: lite/wpforms-lite.php:806 +#: src/Admin/Forms/BulkActions.php:345 +msgid "Security check failed. Please try again." +msgstr "" + +#. translators: %s - addon name. +#: src/Admin/Addons/Addons.php:506 +#: src/Admin/Education/AddonsItemBase.php:152 +#, php-format +msgid "%s addon" +msgstr "" + +#: src/Admin/AdminBarMenu.php:217 +#: src/Admin/Builder/AntiSpam.php:233 +#: src/Admin/Education/Builder/Captcha.php:120 +#: src/Admin/Settings/Captcha/Page.php:122 +#: src/Admin/Settings/Captcha/Page.php:145 +msgid "CAPTCHA" +msgstr "" + +#: src/Admin/AdminBarMenu.php:237 +msgid "Access Control" +msgstr "" + +#: src/Admin/AdminBarMenu.php:293 +#: src/Admin/Tools/Views/Import.php:102 +#: src/Admin/Tools/Views/Import.php:224 +#: src/Admin/Tools/Views/Import.php:276 +#: src/Admin/Tools/Views/Importer.php:190 +msgid "Import" +msgstr "" + +#: src/Admin/AdminBarMenu.php:297 +#: src/Admin/Tools/Views/Export.php:58 +#: src/Admin/Tools/Views/Export.php:157 +msgid "Export" +msgstr "" + +#: src/Admin/AdminBarMenu.php:301 +#: src/Admin/Tools/Views/EntryAutomation.php:72 +msgid "Entry Automation" +msgstr "" + +#: src/Admin/AdminBarMenu.php:305 +#: src/Admin/Tools/Views/System.php:42 +msgid "System Info" +msgstr "" + +#: src/Admin/AdminBarMenu.php:309 +#: src/Admin/Tools/Views/ActionScheduler.php:61 +#: src/Admin/Tools/Views/ActionSchedulerList.php:39 +msgid "Scheduled Actions" +msgstr "" + +#: src/Admin/AdminBarMenu.php:313 +#: src/Admin/Tools/Views/Logs.php:52 +#: src/Logger/ListTable.php:44 +msgid "Logs" +msgstr "" + +#: src/Admin/AdminBarMenu.php:317 +#: src/Admin/Tools/Views/CodeSnippets.php:113 +#: templates/integrations/wpcode/code-snippets.php:53 +msgid "Code Snippets" +msgstr "" + +#: src/Admin/AdminBarMenu.php:370 +#: templates/builder/help.php:122 +msgid "View All" +msgstr "" + +#: src/Admin/AdminBarMenu.php:374 +msgid "Completed Actions" +msgstr "" + +#: src/Admin/AdminBarMenu.php:378 +msgid "Failed Actions" +msgstr "" + +#: src/Admin/AdminBarMenu.php:382 +msgid "Pending Actions" +msgstr "" + +#: src/Admin/AdminBarMenu.php:386 +msgid "Past Due Actions" +msgstr "" + +#: src/Admin/AdminBarMenu.php:610 +msgid "Help Docs" +msgstr "" + +#: src/Admin/AdminBarMenu.php:634 +#: src/Forms/Preview.php:222 +#: src/Integrations/Gutenberg/FormSelector.php:437 +msgid "Edit Form" +msgstr "" + +#: src/Admin/AdminBarMenu.php:637 +msgid "Survey Results" +msgstr "" + +#. translators: %d - form ID. +#: src/Admin/AdminBarMenu.php:651 +#, php-format +msgid "Form ID: %d" +msgstr "" + +#: src/Admin/Blocks/Links.php:97 +msgid "Videos" +msgstr "" + +#: src/Admin/Blocks/Links.php:107 +msgid "Support Forum" +msgstr "" + +#: src/Admin/Blocks/Links.php:114 +msgid "What’s New" +msgstr "" + +#: src/Admin/Builder/Ajax/PanelLoader.php:64 +#: src/Admin/Education/Core.php:105 +#: src/Admin/Forms/Ajax/Columns.php:64 +#: src/Integrations/ConstantContact/V3/Auth.php:78 +#: src/Integrations/ConstantContact/V3/Migration/Migration.php:268 +#: src/Providers/Provider/Settings/FormBuilder.php:314 +msgid "You do not have permission to perform this action." +msgstr "" + +#: src/Admin/Builder/Ajax/PanelLoader.php:109 +msgid "Invalid panel." +msgstr "" + +#: src/Admin/Builder/Ajax/PanelLoader.php:129 +#: src/Admin/Forms/Ajax/Columns.php:96 +#: src/Admin/Forms/Ajax/Tags.php:195 +msgid "Most likely, your session expired. Please reload the page." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:65 +msgid "Enable modern anti-spam protection" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:68 +msgid "Turn on invisible modern spam protection." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:76 +msgid "Behind-the-scenes spam filtering that's invisible to your visitors." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:77 +msgid "Protection" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:87 +msgid "Enable anti-spam protection" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:89 +msgid "Turn on invisible spam protection." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:100 +msgid "Enable anti-spam honeypot" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:138 +msgid "Also Available" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:200 +msgid "Enable hCaptcha" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:201 +msgid "Enable Cloudflare Turnstile" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:203 +msgid "Enable Google Checkbox v2 reCAPTCHA" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:204 +msgid "Enable Google Invisible v2 reCAPTCHA" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:205 +msgid "Enable Google v3 reCAPTCHA" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:224 +msgid "Enable third-party CAPTCHAs to prevent form submissions from bots." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:232 +msgid "Automated tests that help to prevent bots from submitting your forms." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:257 +msgid "Store spam entries in the database" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:277 +msgid "Enable minimum time to submit" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:281 +msgid "Set a minimum amount of time a user must spend on a form before submitting." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:291 +msgid "Minimum time to submit" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:298 +msgid "seconds" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:335 +msgid "Enable Akismet anti-spam protection" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:349 +msgid "Get Started →" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:358 +msgid "Country Filter" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:359 +msgid "Stop spam at its source. Allow or deny entries from specific countries." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:367 +msgid "Keyword Filter" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:368 +msgid "Block form entries that contain specific words or phrases that you define." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:376 +#: src/Admin/Education/Fields.php:173 +#: src/Forms/Fields/CustomCaptcha/Field.php:51 +msgid "Custom Captcha" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:377 +msgid "Ask custom questions or require your visitor to answer a random math puzzle." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:379 +msgid "Add to Form" +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:386 +msgid "Add Google's free anti-spam service and choose between visible or invisible CAPTCHAs." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:394 +msgid "Turn on free, privacy-oriented spam prevention that displays a visual CAPTCHA." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:402 +msgid "Enable free, CAPTCHA-like spam protection that protects data privacy." +msgstr "" + +#: src/Admin/Builder/AntiSpam.php:410 +msgid "Integrate the powerful spam-fighting service trusted by millions of sites." +msgstr "" + +#: src/Admin/Builder/Help.php:104 +msgid "Form Creation" +msgstr "" + +#: src/Admin/Builder/Help.php:106 +msgid "Form Management" +msgstr "" + +#: src/Admin/Builder/Help.php:109 +msgid "Payment Processing" +msgstr "" + +#: src/Admin/Builder/Help.php:110 +msgid "Spam Prevention and Security" +msgstr "" + +#: src/Admin/Builder/Help.php:111 +msgid "Extending Functionality" +msgstr "" + +#: src/Admin/Builder/Help.php:112 +msgid "Troubleshooting and Support" +msgstr "" + +#: src/Admin/Builder/Notifications/Advanced/EmailTemplate.php:109 +msgid "Email Template" +msgstr "" + +#: src/Admin/Builder/Notifications/Advanced/EmailTemplate.php:119 +msgid "Override the default email template for this specific notification." +msgstr "" + +#: src/Admin/Builder/Notifications/Advanced/EmailTemplate.php:172 +msgid "Default Template" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:109 +#: src/Integrations/Elementor/WidgetModern.php:83 +#: src/Integrations/Gutenberg/FormSelector.php:513 +msgid "Solid" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:110 +#: src/Integrations/Elementor/WidgetModern.php:84 +#: src/Integrations/Gutenberg/FormSelector.php:514 +msgid "Dashed" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:111 +#: src/Integrations/Elementor/WidgetModern.php:85 +#: src/Integrations/Gutenberg/FormSelector.php:515 +msgid "Dotted" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:232 +#: src/Admin/Builder/Templates.php:184 +#: src/Integrations/Gutenberg/FormSelector.php:541 +msgid "Heads Up!" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:233 +#: src/Integrations/Elementor/Elementor.php:258 +msgid "Error loading themes. Please try again later." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:234 +#: src/Integrations/Elementor/Elementor.php:244 +#: src/Integrations/Gutenberg/FormSelector.php:455 +msgid "Button Background" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:235 +#: src/Forms/Fields/Addons/Coupon/Field.php:154 +#: src/Integrations/Elementor/Elementor.php:245 +#: src/Integrations/Gutenberg/FormSelector.php:456 +msgid "Button Text" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:236 +#: src/Integrations/Elementor/Elementor.php:243 +#: src/Integrations/Gutenberg/FormSelector.php:530 +msgid "There was an error parsing your JSON code. Please check your code and try again." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:237 +#: src/Integrations/Elementor/Elementor.php:246 +#: src/Integrations/Gutenberg/FormSelector.php:451 +msgid "Field Label" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:238 +#: src/Integrations/Elementor/Elementor.php:247 +#: src/Integrations/Gutenberg/FormSelector.php:452 +msgid "Field Sublabel" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:239 +#: src/Integrations/Elementor/Elementor.php:248 +#: src/Integrations/Gutenberg/FormSelector.php:453 +msgid "Field Border" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:240 +#: src/Integrations/Elementor/Elementor.php:249 +#: src/Integrations/Gutenberg/FormSelector.php:442 +msgid "Delete Form Theme" +msgstr "" + +#. Translators: %1$s: Theme name. +#: src/Admin/Builder/Settings/Themes.php:242 +#: src/Integrations/Elementor/Elementor.php:251 +#: src/Integrations/Gutenberg/FormSelector.php:444 +#, php-format +msgid "Are you sure you want to delete the %1$s theme?" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:243 +#: src/Integrations/Elementor/Elementor.php:252 +#: src/Integrations/Gutenberg/FormSelector.php:445 +msgid "This cannot be undone." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:244 +#: src/Admin/Builder/Templates.php:190 +#: src/Integrations/Elementor/Elementor.php:253 +#: src/Integrations/Gutenberg/FormSelector.php:446 +msgid "Yes, Delete" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:245 +#: src/Integrations/Elementor/Elementor.php:254 +#: src/Integrations/Gutenberg/FormSelector.php:447 +msgid "Copy" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:246 +#: src/Integrations/Elementor/Elementor.php:255 +#: src/Integrations/Gutenberg/FormSelector.php:448 +msgid "Custom Theme" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:247 +#: src/Integrations/Elementor/Elementor.php:256 +#: src/Integrations/Gutenberg/FormSelector.php:449 +msgid "Noname Theme" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:249 +#: src/Admin/Builder/Settings/Themes.php:990 +#: src/Integrations/Elementor/Elementor.php:264 +#: src/Integrations/Elementor/WidgetModern.php:563 +#: src/Integrations/Gutenberg/FormSelector.php:459 +msgid "Background Styles" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:250 +#: src/Admin/Builder/Settings/Themes.php:863 +#: src/Integrations/Elementor/Elementor.php:265 +#: src/Integrations/Elementor/WidgetModern.php:475 +#: src/Integrations/Gutenberg/FormSelector.php:458 +msgid "Container Styles" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:254 +msgid "Insufficient Permissions" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:255 +msgid "Sorry, your user role doesn't have permission to access this feature." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:321 +msgid "Form Themes" +msgstr "" + +#. translators: %s - URL to the documentation. +#: src/Admin/Builder/Settings/Themes.php:330 +#, php-format +msgid "Customize the look and feel of your form with premade themes or simple style settings that allow you to use your own colors to match your brand. Themes and style settings are also available in the Block Editor and Elementor, where you can see a realtime preview. Learn more about styling your forms." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:339 +msgid "Preview only" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:342 +msgid "The fields shown below are for demo purposes and do not reflect the fields in your actual form." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:403 +msgid "Back to Settings" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:456 +msgid "Theme" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:490 +#: src/Integrations/Elementor/WidgetModern.php:186 +#: src/Integrations/Gutenberg/FormSelector.php:440 +msgid "Theme Name" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:501 +#: src/Integrations/Gutenberg/FormSelector.php:441 +msgid "Delete Theme" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:519 +#: src/Integrations/Elementor/WidgetModern.php:225 +#: src/Integrations/Gutenberg/FormSelector.php:450 +msgid "Field Styles" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:544 +#: src/Admin/Builder/Settings/Themes.php:612 +#: src/Admin/Builder/Settings/Themes.php:756 +#: src/Admin/Builder/Settings/Themes.php:825 +#: src/Admin/Builder/Settings/Themes.php:891 +#: src/Admin/Builder/Settings/Themes.php:947 +#: src/Integrations/Elementor/WidgetModern.php:243 +#: src/Integrations/Elementor/WidgetModern.php:285 +#: src/Integrations/Elementor/WidgetModern.php:402 +#: src/Integrations/Elementor/WidgetModern.php:444 +#: src/Integrations/Elementor/WidgetModern.php:493 +#: src/Integrations/Elementor/WidgetModern.php:541 +#: src/Integrations/Gutenberg/FormSelector.php:502 +#: src/Integrations/Gutenberg/FormSelector.php:519 +msgid "Border" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:562 +#: src/Admin/Builder/Settings/Themes.php:775 +#: src/Admin/Builder/Settings/Themes.php:909 +#: src/Integrations/Gutenberg/FormSelector.php:510 +#: src/Integrations/Gutenberg/FormSelector.php:518 +msgid "Border Size" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:578 +#: src/Admin/Builder/Settings/Themes.php:791 +#: src/Admin/Builder/Settings/Themes.php:925 +#: src/Integrations/Gutenberg/FormSelector.php:509 +msgid "Border Radius" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:600 +#: src/Admin/Builder/Settings/Themes.php:813 +#: src/Admin/Settings/Email.php:520 +#: src/Integrations/Elementor/WidgetModern.php:276 +#: src/Integrations/Elementor/WidgetModern.php:435 +#: src/Integrations/Elementor/WidgetModern.php:696 +#: src/Integrations/Gutenberg/FormSelector.php:501 +msgid "Background" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:624 +#: src/Admin/Builder/Settings/Themes.php:837 +#: src/Admin/Settings/Email.php:522 +#: src/Forms/Fields/Richtext/Field.php:176 +#: src/Forms/Fields/Traits/ContentInput.php:316 +#: src/Integrations/Elementor/WidgetModern.php:295 +#: src/Integrations/Elementor/WidgetModern.php:456 +#: src/Integrations/Gutenberg/FormSelector.php:503 +msgid "Text" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:650 +#: src/Integrations/Elementor/WidgetModern.php:325 +#: src/Integrations/Gutenberg/FormSelector.php:454 +msgid "Label Styles" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:693 +msgid "Sublabel" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:705 +#: src/Admin/Tools/Views/Import.php:305 +#: src/Admin/Tools/Views/Import.php:323 +#: src/Integrations/AI/Admin/Builder/Forms.php:202 +#: src/Integrations/Elementor/WidgetModern.php:363 +#: src/Lite/Admin/Education/LiteConnect.php:252 +msgid "Error" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:731 +#: src/Integrations/Elementor/WidgetModern.php:384 +#: src/Integrations/Gutenberg/FormSelector.php:457 +msgid "Button Styles" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:875 +#: src/Integrations/Gutenberg/FormSelector.php:500 +msgid "Padding" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:959 +#: src/Integrations/Elementor/WidgetModern.php:526 +#: src/Integrations/Gutenberg/FormSelector.php:517 +msgid "Shadow" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:999 +msgid "Color" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1016 +#: src/Integrations/Elementor/WidgetModern.php:571 +#: src/Integrations/Gutenberg/FormSelector.php:505 +msgid "Image" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1021 +#: src/Integrations/Elementor/WidgetModern.php:575 +#: src/Integrations/Gutenberg/FormSelector.php:506 +msgid "Media Library" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1022 +#: src/Integrations/Elementor/WidgetModern.php:576 +#: src/Integrations/Gutenberg/FormSelector.php:508 +msgid "Stock Photo" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1037 +#: src/Integrations/Elementor/WidgetModern.php:588 +#: src/Integrations/Gutenberg/FormSelector.php:462 +msgid "Top Left" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1038 +#: src/Integrations/Elementor/WidgetModern.php:589 +#: src/Integrations/Gutenberg/FormSelector.php:463 +msgid "Top Center" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1039 +#: src/Integrations/Elementor/WidgetModern.php:590 +#: src/Integrations/Gutenberg/FormSelector.php:464 +msgid "Top Right" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1040 +#: src/Integrations/Elementor/WidgetModern.php:591 +#: src/Integrations/Gutenberg/FormSelector.php:465 +msgid "Center Left" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1041 +#: src/Integrations/Elementor/WidgetModern.php:592 +#: src/Integrations/Gutenberg/FormSelector.php:466 +msgid "Center Center" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1042 +#: src/Integrations/Elementor/WidgetModern.php:593 +#: src/Integrations/Gutenberg/FormSelector.php:467 +msgid "Center Right" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1043 +#: src/Integrations/Elementor/WidgetModern.php:594 +#: src/Integrations/Gutenberg/FormSelector.php:468 +msgid "Bottom Left" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1044 +#: src/Integrations/Elementor/WidgetModern.php:595 +#: src/Integrations/Gutenberg/FormSelector.php:469 +msgid "Bottom Center" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1045 +#: src/Integrations/Elementor/WidgetModern.php:596 +#: src/Integrations/Gutenberg/FormSelector.php:470 +msgid "Bottom Right" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1061 +#: src/Integrations/Elementor/WidgetModern.php:608 +#: src/Integrations/Gutenberg/FormSelector.php:471 +msgid "Repeat" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1065 +#: src/Integrations/Elementor/WidgetModern.php:611 +#: src/Integrations/Gutenberg/FormSelector.php:472 +msgid "No Repeat" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1066 +#: src/Integrations/Elementor/WidgetModern.php:612 +#: src/Integrations/Gutenberg/FormSelector.php:475 +msgid "Tile" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1067 +#: src/Integrations/Elementor/WidgetModern.php:613 +msgid "Repeat X" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1068 +#: src/Integrations/Elementor/WidgetModern.php:614 +msgid "Repeat Y" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1083 +#: src/Integrations/Elementor/WidgetModern.php:629 +#: src/Integrations/Gutenberg/FormSelector.php:477 +msgid "Dimensions" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1084 +#: src/Integrations/Elementor/WidgetModern.php:630 +#: src/Integrations/Gutenberg/FormSelector.php:476 +msgid "Cover" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1113 +#: src/Integrations/Gutenberg/FormSelector.php:478 +msgid "Width" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1129 +#: src/Integrations/Gutenberg/FormSelector.php:479 +msgid "Height" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1160 +#: src/Integrations/Elementor/WidgetModern.php:678 +#: src/Integrations/Gutenberg/FormSelector.php:507 +msgid "Choose Image" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1181 +#: src/Integrations/Elementor/WidgetModern.php:715 +#: src/Integrations/Gutenberg/FormSelector.php:538 +msgid "Other Styles" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1233 +#: src/Integrations/Gutenberg/FormSelector.php:532 +msgid "Custom CSS" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1237 +#: src/Integrations/Gutenberg/FormSelector.php:533 +msgid "Further customize the look of this form without having to edit theme files." +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1246 +#: src/Integrations/Elementor/WidgetModern.php:772 +#: src/Integrations/Gutenberg/FormSelector.php:529 +msgid "Copy / Paste Style Settings" +msgstr "" + +#: src/Admin/Builder/Settings/Themes.php:1250 +#: src/Integrations/Elementor/WidgetModern.php:774 +#: src/Integrations/Gutenberg/FormSelector.php:531 +msgid "If you've copied style settings from another form, you can paste them here to add the same styling to this form. Any current style settings will be overwritten." +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:49 +msgid "Save Form" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:50 +msgid "Preview Form" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:51 +msgid "Embed Form" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:52 +msgid "Search Fields" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:55 +msgid "Open Help" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:56 +msgid "Toggle Sidebar" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:58 +msgid "Close Builder" +msgstr "" + +#: src/Admin/Builder/Shortcuts.php:76 +msgid "Handy shortcuts for common actions in the builder." +msgstr "" + +#: src/Admin/Builder/Templates.php:182 +#: src/Admin/Education/StringsTrait.php:38 +msgid "Activating" +msgstr "" + +#: src/Admin/Builder/Templates.php:185 +msgid "Install and activate" +msgstr "" + +#: src/Admin/Builder/Templates.php:187 +#: src/Admin/Education/StringsTrait.php:24 +msgid "Ok" +msgstr "" + +#: src/Admin/Builder/Templates.php:188 +msgid "Could not install OR activate all the required addons. Please download from wpforms.com and install them manually. Would you like to use the template anyway?" +msgstr "" + +#: src/Admin/Builder/Templates.php:189 +msgid "Yes, use template" +msgstr "" + +#: src/Admin/Builder/Templates.php:191 +msgid "Delete Form Template" +msgstr "" + +#: src/Admin/Builder/Templates.php:192 +msgid "Are you sure you want to delete this form template? This cannot be undone." +msgstr "" + +#. translators: %1$s - template name, %2$s - addon name(s). +#: src/Admin/Builder/Templates.php:197 +#, php-format +msgid "The %1$s template requires the %2$s. Would you like to install and activate it?" +msgstr "" + +#. translators: %1$s - template name, %2$s - addon name(s). +#: src/Admin/Builder/Templates.php:199 +#, php-format +msgid "The %1$s template requires the %2$s. Would you like to install and activate all the required addons?" +msgstr "" + +#. translators: %1$s - template name, %2$s - addon name(s). +#: src/Admin/Builder/Templates.php:201 +#, php-format +msgid "The %1$s template requires the %2$s. Would you like to activate it?" +msgstr "" + +#. translators: %s - addon name(s). +#: src/Admin/Builder/Templates.php:204 +#, php-format +msgid "To use all of the features in this template, you'll need the %s. Contact your site administrator to install it, then try opening this template again." +msgstr "" + +#. translators: %s - addon name(s). +#: src/Admin/Builder/Templates.php:208 +#, php-format +msgid "To use all of the features in this template, you'll need the %s. Contact your site administrator to install them, then try opening this template again." +msgstr "" + +#: src/Admin/Builder/Templates.php:854 +#: src/Integrations/Elementor/Widget.php:221 +msgid "New form" +msgstr "" + +#. translators: %d - templates count. +#: src/Admin/Builder/Templates.php:1058 +#, php-format +msgid "Get Access to Our Complete Library of %d+ Form Templates" +msgstr "" + +#: src/Admin/Builder/Templates.php:1061 +msgid "Save time and reduce effort with our pre-built form templates covering popular use-cases in business operations, customer service, feedback, marketing, registrations, event planning, non-profit, healthcare, and education." +msgstr "" + +#. translators: %d - templates count. +#: src/Admin/Builder/Templates.php:1079 +#, php-format +msgid "Get Access to Our Library of %d+ Pre-Made Form Templates" +msgstr "" + +#: src/Admin/Builder/Templates.php:1082 +msgid "Never start from scratch again! While WPForms Lite allows you to create any type of form, you can save even more time with WPForms Pro. Upgrade to access hundreds more form templates and advanced form fields." +msgstr "" + +#: src/Admin/Builder/Templates.php:1129 +msgid "User Registration Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1135 +msgid "Create customized WordPress user registration forms and add them anywhere on your website." +msgstr "" + +#: src/Admin/Builder/Templates.php:1138 +msgid "User Login Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1144 +msgid "Allow your users to easily log in to your site with their username and password." +msgstr "" + +#: src/Admin/Builder/Templates.php:1147 +msgid "User Password Reset Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1153 +msgid "Allow your users to easily reset their password." +msgstr "" + +#: src/Admin/Builder/Templates.php:1173 +msgid "Blog Post Submission Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1179 +msgid "User-submitted content made easy. Allow your users to submit guest blog posts in WordPress. You can add and remove fields as needed." +msgstr "" + +#: src/Admin/Builder/Templates.php:1199 +msgid "Survey Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1205 +msgid "Collect customer feedback, then generate survey reports to determine satisfaction and spot trends." +msgstr "" + +#: src/Admin/Builder/Templates.php:1208 +msgid "Poll Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1214 +msgid "Ask visitors a question and display the results after they provide an answer." +msgstr "" + +#: src/Admin/Builder/Templates.php:1217 +msgid "NPS Survey Simple Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1223 +msgid "Find out if your clients or customers would recommend you to someone else with this basic Net Promoter Score survey template." +msgstr "" + +#: src/Admin/Builder/Templates.php:1226 +msgid "NPS Survey Enhanced Form" +msgstr "" + +#: src/Admin/Builder/Templates.php:1232 +msgid "Measure customer loyalty and find out exactly what they are thinking with this enhanced Net Promoter Score survey template." +msgstr "" + +#: src/Admin/Challenge.php:191 +msgid "Challenge is frozen." +msgstr "" + +#: src/Admin/Dashboard/Widget.php:246 +msgid "Select timespan" +msgstr "" + +#. translators: %d - number of days. +#: src/Admin/Dashboard/Widget.php:270 +#, php-format +msgid "Last %d day" +msgid_plural "Last %d days" +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Education/Admin/EditPost.php:173 +#: src/Admin/Splash/SplashTrait.php:129 +#: src/Integrations/Divi/Divi.php:226 +#: templates/admin/empty-states/payments/get-started.php:34 +#: templates/integrations/elementor/no-forms.php:26 +#: assets/js/integrations/gutenberg/formselector-legacy.es5.js:261 +#: assets/js/integrations/gutenberg/formselector-legacy.es5.js:304 +#: assets/js/integrations/gutenberg/formselector-legacy.js:238 +#: assets/js/integrations/gutenberg/formselector-legacy.js:275 +#: assets/js/integrations/gutenberg/modules/common.js:786 +#: assets/js/integrations/gutenberg/modules/common.js:1014 +#: assets/lite/js/integrations/gutenberg/formselector.es5.js:3123 +#: assets/lite/js/integrations/gutenberg/formselector.es5.js:3322 +#: assets/pro/js/integrations/gutenberg/formselector.es5.js:3134 +#: assets/pro/js/integrations/gutenberg/formselector.es5.js:3333 +msgid "Get Started" +msgstr "" + +#: src/Admin/Education/Admin/EditPost.php:186 +msgid "Easily add your contact form" +msgstr "" + +#: src/Admin/Education/Admin/EditPost.php:187 +msgid "Oh hey, it looks like you're working on a contact page. Don't forget to embed your contact form. Click the plus icon above and search for WPForms." +msgstr "" + +#: src/Admin/Education/Admin/EditPost.php:191 +msgid "Embed your form" +msgstr "" + +#: src/Admin/Education/Admin/EditPost.php:192 +msgid "Then click on the WPForms block to embed your desired contact form." +msgstr "" + +#: src/Admin/Education/Admin/EditPost.php:209 +msgid "Don't forget to embed your contact form. Simply click the Add Form button below." +msgstr "" + +#. translators: %1$s - link to create a new form. +#: src/Admin/Education/Admin/EditPost.php:211 +#: src/Admin/Education/Admin/EditPost.php:237 +#, php-format +msgid "Did you know that with WPForms, you can create an easy-to-use contact form in a matter of minutes?" +msgstr "" + +#: src/Admin/Education/Admin/EditPost.php:235 +msgid "You've already created a form, now add it to the page so your customers can get in touch." +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:113 +#: src/Forms/Fields/Address/Field.php:46 +#: src/Forms/Fields/Address/Field.php:55 +#: src/Forms/Fields/Address/Field.php:298 +#: src/Forms/Fields/Address/Field.php:522 +msgid "City" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:114 +msgid "Latitude/Longitude" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:115 +msgid "Google Places API" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:116 +#: src/Forms/Fields/Address/Field.php:59 +#: src/Forms/Fields/Address/Field.php:430 +#: src/Forms/Fields/Address/Field.php:525 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:225 +msgid "Country" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:117 +#: src/Admin/Education/Builder/Geolocation.php:108 +msgid "Address Autocomplete" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:118 +msgid "Mapbox API" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:119 +msgid "Postal/Zip Code" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:120 +msgid "Embedded Map in Forms" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:126 +msgid "Location Info in Entries" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:131 +msgid "Address Autocomplete Field" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:136 +msgid "Smart Address Field" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:144 +msgid "Do you want to learn more about visitors who fill out your online forms? Our geolocation addon allows you to collect and store your website visitors geolocation data along with their form submission. This insight can help you to be better informed and turn more leads into customers. Furthermore, add a smart address field that autocompletes using the Google Places API." +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:146 +#: src/Lite/Admin/Settings/Access.php:167 +msgid "Pro" +msgstr "" + +#: src/Admin/Education/Admin/Settings/Geolocation.php:147 +msgid "Powerful location-based insights and features…" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:49 +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:71 +msgid "Upgrade to WPForms Elite" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:55 +msgid "Automated Task Scheduling" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:56 +msgid "Scheduled Exports" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:57 +msgid "Task Chaining" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:58 +msgid "Automated Deletions" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:59 +msgid "Enhanced Data Management" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:60 +msgid "Robust Failsafes" +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:72 +msgid "Tired of manually exporting and deleting entries? Wish you could schedule these actions for optimal efficiency?" +msgstr "" + +#. translators: %1$s - WPForms.com Upgrade page URL. +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:74 +msgid "Entry Automation introduces powerful, automated task chaining, allowing you to seamlessly schedule exports and deletions, ensuring your data is managed precisely how you need it. Chain multiple tasks together for complex workflows – export to CSV, then automatically delete after a specified period, for example. We've built robust failsafes to guarantee data integrity, so you can automate with confidence, knowing your valuable entries are always protected. Take back your time and let our addon handle the heavy lifting, keeping your WPForms data organized and secure, automatically." +msgstr "" + +#: src/Admin/Education/Admin/Tools/EntryAutomation.php:87 +msgid "Powerful Automation Features" +msgstr "" + +#: src/Admin/Education/Builder/Calculations.php:113 +#: src/Admin/Education/Builder/PDF.php:154 +msgid "NEW FEATURE" +msgstr "" + +#: src/Admin/Education/Builder/Calculations.php:114 +msgid "AI Calculations Are Here!" +msgstr "" + +#. translators: %1$s - link to the WPForms.com doc article. +#: src/Admin/Education/Builder/Calculations.php:118 +#, php-format +msgid "Easily create advanced calculations with WPForms AI. Head over to the Advanced Tab to get started or read our documentation to learn more." +msgstr "" + +#: src/Admin/Education/Builder/Calculations.php:139 +#: src/Admin/Education/Builder/Calculations.php:175 +#: templates/education/admin/edit-post/classic-notice.php:27 +msgid "Dismiss this notice." +msgstr "" + +#. translators: %1$s - link to the WPForms.com doc article. +#: src/Admin/Education/Builder/Calculations.php:158 +#, php-format +msgid "Easily perform calculations based on user input. Head over to the Advanced Tab to get started or read our documentation to learn more." +msgstr "" + +#: src/Admin/Education/Builder/Calculations.php:239 +msgid "Calculations" +msgstr "" + +#: src/Admin/Education/Builder/Calculations.php:263 +#: src/Admin/Education/Builder/Calculations.php:274 +msgid "Enable Calculation" +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:61 +msgid "No form ID found." +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:68 +#: src/Admin/Pages/Page.php:378 +#: src/Admin/Pages/SMTP.php:466 +#: src/Lite/Admin/Education/LiteConnect.php:418 +#: src/Logger/Log.php:200 +#: src/Providers/Provider/Settings/PageIntegrations.php:323 +msgid "You do not have permission." +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:79 +#: src/Admin/Forms/Tags.php:259 +msgid "Something wrong. Please try again later." +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:124 +#: src/Frontend/Amp.php:360 +msgid "hCaptcha" +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:128 +msgid "Cloudflare Turnstile" +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:132 +msgid "Google Checkbox v2 reCAPTCHA" +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:133 +msgid "Google Invisible v2 reCAPTCHA" +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:134 +msgid "Google v3 reCAPTCHA" +msgstr "" + +#: src/Admin/Education/Builder/Captcha.php:154 +msgid "Something wrong. Please, try again later." +msgstr "" + +#. translators: %1$s - CAPTCHA settings page URL, %2$s - WPForms.com doc URL. +#: src/Admin/Education/Builder/Captcha.php:164 +#, php-format +msgid "Please complete the setup in your WPForms Settings, and check out our guide to learn about available CAPTCHA solutions." +msgstr "" + +#. translators: %s - CAPTCHA name. +#: src/Admin/Education/Builder/Captcha.php:180 +#, php-format +msgid "%s has been enabled for this form. Don't forget to save your form!" +msgstr "" + +#. translators: %s - CAPTCHA name. +#: src/Admin/Education/Builder/Captcha.php:185 +#, php-format +msgid "Are you sure you want to disable %s for this form?" +msgstr "" + +#: src/Admin/Education/Builder/Fields.php:72 +#: src/Integrations/AI/Admin/Builder/Forms.php:219 +#: templates/education/admin/payments/single-page.php:50 +#: templates/education/admin/settings/smtp-notice.php:37 +msgid "Dismiss this notice" +msgstr "" + +#: src/Admin/Education/Builder/Geolocation.php:111 +msgid "We're sorry, Address Autocomplete is part of the Geolocation Addon and not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features." +msgstr "" + +#: src/Admin/Education/Builder/Geolocation.php:133 +#: src/Admin/Education/Builder/Geolocation.php:144 +msgid "Enable Address Autocomplete" +msgstr "" + +#: src/Admin/Education/Builder/PDF.php:155 +msgid "PDF Addon" +msgstr "" + +#: src/Admin/Education/Builder/PDF.php:156 +msgid "Easily turn form entry data into beautifully designed PDFs and attach them to notifications." +msgstr "" + +#: src/Admin/Education/Builder/PDF.php:225 +msgid "Try it Out" +msgstr "" + +#: src/Admin/Education/Builder/PDF.php:240 +msgid "WPForms PDF Addon" +msgstr "" + +#: src/Admin/Education/Core.php:98 +msgid "Please specify a section." +msgstr "" + +#: src/Admin/Education/Fields.php:37 +#: src/Forms/Fields/Phone/Field.php:32 +#: src/Integrations/ConstantContact/V3/ConstantContact.php:158 +msgid "Phone" +msgstr "" + +#: src/Admin/Education/Fields.php:45 +#: src/Forms/Fields/Address/Field.php:34 +#: src/Integrations/ConstantContact/V3/ConstantContact.php:164 +msgid "Address" +msgstr "" + +#: src/Admin/Education/Fields.php:53 +#: src/Forms/Fields/DateTime/Field.php:60 +msgid "Date / Time" +msgstr "" + +#: src/Admin/Education/Fields.php:61 +#: src/Forms/Fields/Url/Field.php:25 +msgid "Website / URL" +msgstr "" + +#: src/Admin/Education/Fields.php:69 +#: src/Forms/Fields/FileUpload/Field.php:65 +msgid "File Upload" +msgstr "" + +#: src/Admin/Education/Fields.php:77 +#: src/Forms/Fields/Camera/Field.php:34 +msgid "Camera" +msgstr "" + +#: src/Admin/Education/Fields.php:85 +#: src/Forms/Fields/Password/Field.php:25 +#: src/Forms/Fields/Password/Field.php:304 +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:430 +msgid "Password" +msgstr "" + +#: src/Admin/Education/Fields.php:93 +msgid "Layout" +msgstr "" + +#: src/Admin/Education/Fields.php:101 +msgid "Repeater" +msgstr "" + +#: src/Admin/Education/Fields.php:117 +#: src/Forms/Fields/Divider/Field.php:25 +msgid "Section Divider" +msgstr "" + +#: src/Admin/Education/Fields.php:125 +#: src/Forms/Fields/Richtext/Field.php:25 +msgid "Rich Text" +msgstr "" + +#: src/Admin/Education/Fields.php:141 +#: src/Forms/Fields/Html/Field.php:25 +msgid "HTML" +msgstr "" + +#: src/Admin/Education/Fields.php:149 +#: src/Forms/Fields/EntryPreview/Field.php:25 +#: src/Forms/Fields/EntryPreview/Field.php:179 +msgid "Entry Preview" +msgstr "" + +#: src/Admin/Education/Fields.php:157 +#: src/Forms/Fields/Rating/Field.php:35 +#: src/Integrations/Gutenberg/FormSelector.php:540 +msgid "Rating" +msgstr "" + +#: src/Admin/Education/Fields.php:165 +#: src/Forms/Fields/Hidden/Field.php:25 +msgid "Hidden Field" +msgstr "" + +#: src/Admin/Education/Fields.php:174 +#: src/Forms/Fields/CustomCaptcha/Field.php:52 +msgid "spam, math, maths, question" +msgstr "" + +#: src/Admin/Education/Fields.php:183 +#: src/Forms/Fields/Addons/Signature/Field.php:25 +msgid "Signature" +msgstr "" + +#: src/Admin/Education/Fields.php:184 +#: src/Forms/Fields/Addons/Signature/Field.php:26 +msgid "user, e-signature" +msgstr "" + +#: src/Admin/Education/Fields.php:193 +#: src/Forms/Fields/Addons/LikertScale/Field.php:25 +msgid "Likert Scale" +msgstr "" + +#: src/Admin/Education/Fields.php:194 +#: src/Forms/Fields/Addons/LikertScale/Field.php:26 +msgid "survey, rating scale" +msgstr "" + +#: src/Admin/Education/Fields.php:203 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:25 +msgid "Net Promoter Score" +msgstr "" + +#: src/Admin/Education/Fields.php:204 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:26 +msgid "survey, nps" +msgstr "" + +#: src/Admin/Education/Fields.php:213 +#: src/Db/Payments/ValueValidator.php:70 +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:175 +msgid "PayPal Commerce" +msgstr "" + +#: src/Admin/Education/Fields.php:214 +#: src/Admin/Education/Fields.php:224 +#: src/Integrations/Square/Fields/Square.php:25 +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:23 +msgid "store, ecommerce, credit card, pay, payment, debit card" +msgstr "" + +#: src/Admin/Education/Fields.php:223 +msgid "Authorize.Net" +msgstr "" + +#: src/Admin/Education/Fields.php:233 +#: src/Admin/Payments/Views/Overview/Table.php:96 +#: src/Admin/Payments/Views/Single.php:373 +#: src/Admin/Payments/Views/Single.php:764 +#: src/Forms/Fields/Addons/Coupon/Field.php:34 +msgid "Coupon" +msgstr "" + +#: src/Admin/Education/Fields.php:234 +#: src/Forms/Fields/Addons/Coupon/Field.php:35 +msgid "discount, sale" +msgstr "" + +#: src/Admin/Education/Fields.php:294 +msgid "captcha, spam, antispam" +msgstr "" + +#: src/Admin/Education/Helpers.php:104 +msgid "New" +msgstr "" + +#: src/Admin/Education/Helpers.php:108 +msgid "Featured" +msgstr "" + +#: src/Admin/Education/Pointers/Payment.php:128 +msgid "Payment and Donation Forms are here!" +msgstr "" + +#. translators: %1$s - Payments page URL. +#: src/Admin/Education/Pointers/Payment.php:130 +#, php-format +msgid "Now available for you: create forms that accept credit cards, Apple Pay, and Google Pay payments. Visit our new Payments area to get started." +msgstr "" + +#. translators: %s - addon name. +#: src/Admin/Education/StringsTrait.php:31 +#, php-format +msgid "The %s is installed but not activated. Would you like to activate it?" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:35 +#: src/Integrations/AI/Admin/Builder/Forms.php:189 +msgid "Yes, Activate" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:36 +msgid "Addon activated" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:37 +msgid "Plugin activated" +msgstr "" + +#. translators: %s - addon name. +#: src/Admin/Education/StringsTrait.php:41 +#, php-format +msgid "The %s is not installed. Would you like to install and activate it?" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:45 +msgid "Yes, Install and Activate" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:46 +#: src/Integrations/WPCode/WPCode.php:242 +msgid "Installing" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:47 +msgid "Almost done! Would you like to save and refresh the form builder?" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:48 +msgid "Yes, save and refresh" +msgstr "" + +#: src/Admin/Education/StringsTrait.php:49 +msgid "Saving ..." +msgstr "" + +#. translators: %s - addon name. +#: src/Admin/Education/StringsTrait.php:65 +#, php-format +msgid "The %s is not installed. Please install and activate it to use this feature." +msgstr "" + +#. translators: %s - addon name. +#: src/Admin/Education/StringsTrait.php:75 +#, php-format +msgid "The %s is not installed. Please contact the site administrator." +msgstr "" + +#. translators: %s - addon name. +#: src/Admin/Education/StringsTrait.php:87 +#, php-format +msgid "The %s is not activated. Please contact the site administrator." +msgstr "" + +#: src/Admin/Education/StringsTrait.php:103 +msgid "Bonus: WPForms Lite users get 50% off regular price, automatically applied at checkout." +msgstr "" + +#. translators: %s - level name, either Pro or Elite. +#: src/Admin/Education/StringsTrait.php:143 +#, php-format +msgid "is a %s Feature" +msgstr "" + +#. translators: %s - level name, either Pro or Elite. +#: src/Admin/Education/StringsTrait.php:149 +#, php-format +msgid "are a %s Feature" +msgstr "" + +#. translators: %1$s - addon name, %2$s - level name, either Pro or Elite. +#: src/Admin/Education/StringsTrait.php:155 +#, php-format +msgid "We're sorry, the %1$s is not available on your plan. Please upgrade to the %2$s plan to unlock all these awesome features." +msgstr "" + +#. translators: %1$s - addon name, %2$s - level name, either Pro or Elite. +#: src/Admin/Education/StringsTrait.php:162 +#, php-format +msgid "We're sorry, %1$s are not available on your plan. Please upgrade to the %2$s plan to unlock all these awesome features." +msgstr "" + +#: src/Admin/Education/StringsTrait.php:170 +msgid "Already purchased?" +msgstr "" + +#. translators: %s - level name, either Pro or Elite. +#: src/Admin/Education/StringsTrait.php:174 +#, php-format +msgid "Upgrade to %s" +msgstr "" + +#: src/Admin/FlyoutMenu.php:63 +msgid "See Quick Links" +msgstr "" + +#: src/Admin/FlyoutMenu.php:119 +msgid "Support & Docs" +msgstr "" + +#: src/Admin/FlyoutMenu.php:124 +msgid "Join Our Community" +msgstr "" + +#: src/Admin/FlyoutMenu.php:129 +#: src/Admin/Pages/Community.php:116 +#: src/Admin/Pages/Community.php:118 +msgid "Suggest a Feature" +msgstr "" + +#: src/Admin/Forms/Ajax/Columns.php:79 +msgid "Cannot save columns order." +msgstr "" + +#: src/Admin/Forms/Ajax/Tags.php:226 +msgid "No forms selected when trying to add a tag to them." +msgstr "" + +#: src/Admin/Forms/BulkActions.php:291 +#: src/Admin/Forms/Views.php:694 +#: src/Admin/Payments/Views/Overview/Table.php:497 +msgid "Restore" +msgstr "" + +#: src/Admin/Forms/BulkActions.php:292 +#: src/Admin/Forms/Views.php:715 +#: src/Admin/Payments/Views/Overview/Table.php:498 +msgid "Delete Permanently" +msgstr "" + +#: src/Admin/Forms/BulkActions.php:296 +#: src/Admin/Payments/Views/Overview/Table.php:503 +msgid "Move to Trash" +msgstr "" + +#. translators: %1$d - restored forms count. +#: src/Admin/Forms/BulkActions.php:426 +#, php-format +msgid "%1$d form was successfully restored." +msgid_plural "%1$d forms were successfully restored." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - deleted forms count. +#: src/Admin/Forms/BulkActions.php:431 +#, php-format +msgid "%1$d form was successfully permanently deleted." +msgid_plural "%1$d forms were successfully permanently deleted." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - duplicated forms count. +#: src/Admin/Forms/BulkActions.php:436 +#, php-format +msgid "%1$d form was successfully duplicated." +msgid_plural "%1$d forms were successfully duplicated." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - trashed forms count. +#: src/Admin/Forms/BulkActions.php:441 +#, php-format +msgid "%1$d form was successfully moved to Trash." +msgid_plural "%1$d forms were successfully moved to Trash." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - restored templates count. +#: src/Admin/Forms/BulkActions.php:468 +#, php-format +msgid "%1$d template was successfully restored." +msgid_plural "%1$d templates were successfully restored." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - deleted templates count. +#: src/Admin/Forms/BulkActions.php:473 +#, php-format +msgid "%1$d template was successfully permanently deleted." +msgid_plural "%1$d templates were successfully permanently deleted." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - duplicated templates count. +#: src/Admin/Forms/BulkActions.php:478 +#, php-format +msgid "%1$d template was successfully duplicated." +msgid_plural "%1$d templates were successfully duplicated." +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$d - trashed templates count. +#: src/Admin/Forms/BulkActions.php:483 +#, php-format +msgid "%1$d template was successfully moved to Trash." +msgid_plural "%1$d templates were successfully moved to Trash." +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Forms/ListTable.php:156 +#: src/Admin/Payments/Views/Overview/Helpers.php:50 +#: src/Providers/Provider/Settings/PageIntegrations.php:160 +#: templates/admin/payments/single/payment-details.php:48 +msgid "N/A" +msgstr "" + +#. translators: %1$s - Post created date. +#: src/Admin/Forms/ListTable.php:165 +#, php-format +msgid "Created
            %1$s" +msgstr "" + +#. translators: %1$s - Post modified date. +#: src/Admin/Forms/ListTable.php:173 +#, php-format +msgid "Last Modified
            %1$s" +msgstr "" + +#: src/Admin/Forms/ListTable.php:185 +msgid "Entries are securely backed up in the cloud. Upgrade to restore." +msgstr "" + +#: src/Admin/Forms/ListTable.php:318 +#: src/Admin/Forms/Views.php:601 +msgid "View preview" +msgstr "" + +#: src/Admin/Forms/ListTable.php:335 +#: src/Admin/Forms/Views.php:570 +msgid "View entries" +msgstr "" + +#: src/Admin/Forms/ListTable.php:352 +msgid "Edit This Form" +msgstr "" + +#: src/Admin/Forms/ListTable.php:451 +msgid "No form templates found." +msgstr "" + +#: src/Admin/Forms/ListTable.php:452 +#: src/Admin/Tools/Views/Importer.php:162 +msgid "No forms found." +msgstr "" + +#: src/Admin/Forms/ListTable.php:594 +msgid "0 items" +msgstr "" + +#: src/Admin/Forms/Page.php:37 +msgid "Pagination" +msgstr "" + +#: src/Admin/Forms/Page.php:40 +msgid "Number of forms per page:" +msgstr "" + +#: src/Admin/Forms/Page.php:54 +msgid "View" +msgstr "" + +#: src/Admin/Forms/Page.php:57 +msgid "Show form templates" +msgstr "" + +#: src/Admin/Forms/Page.php:263 +msgid "Forms Overview" +msgstr "" + +#: src/Admin/Forms/Page.php:269 +msgid "Add New" +msgstr "" + +#: src/Admin/Forms/Page.php:299 +msgid "Search Forms" +msgstr "" + +#: src/Admin/Forms/Page.php:345 +#: src/Forms/Fields/Addons/LikertScale/Field.php:175 +msgid "Columns" +msgstr "" + +#. translators: %1$d - number of forms found, %2$s - search term. +#: src/Admin/Forms/Search.php:232 +#, php-format +msgid "Found %1$d form containing \"%2$s\"" +msgid_plural "Found %1$d forms containing \"%2$s\"" +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Forms/Table/Facades/Columns.php:63 +msgid "ID" +msgstr "" + +#: src/Admin/Forms/Table/Facades/Columns.php:73 +msgid "Author" +msgstr "" + +#: src/Admin/Forms/Table/Facades/Columns.php:76 +msgid "Shortcode" +msgstr "" + +#: src/Admin/Forms/Table/Facades/Columns.php:79 +#: src/Admin/Payments/Views/Overview/Table.php:84 +#: src/Forms/Fields/DateTime/Field.php:132 +#: src/Forms/Fields/DateTime/Field.php:208 +#: src/Forms/Fields/DateTime/Field.php:669 +#: src/Forms/Fields/DateTime/Field.php:675 +#: src/Logger/ListTable.php:294 +#: src/Logger/ListTable.php:486 +#: src/SmartTags/SmartTags.php:121 +#: templates/admin/payments/single/payment-history.php:30 +#: templates/admin/payments/single/payment-history.php:47 +msgid "Date" +msgstr "" + +#: src/Admin/Forms/Tags.php:181 +msgid "No tags to choose from" +msgstr "" + +#: src/Admin/Forms/Tags.php:260 +#: src/Admin/Forms/Tags.php:504 +msgid "All Tags" +msgstr "" + +#: src/Admin/Forms/Tags.php:262 +msgid "1 form selected for Bulk Edit." +msgstr "" + +#. translators: %d - number of forms selected for Bulk Edit. +#: src/Admin/Forms/Tags.php:266 +#, php-format +msgid "%d forms selected for Bulk Edit." +msgstr "" + +#: src/Admin/Forms/Tags.php:269 +#: src/Admin/Forms/Tags.php:515 +msgid "Manage Tags" +msgstr "" + +#: src/Admin/Forms/Tags.php:270 +msgid "Delete tags that you're no longer using. Deleting a tag will remove it from a form, but will not delete the form itself." +msgstr "" + +#: src/Admin/Forms/Tags.php:271 +msgid "Delete Tags" +msgstr "" + +#: src/Admin/Forms/Tags.php:273 +msgid "You have 1 tag selected for deletion." +msgstr "" + +#. translators: %d - number of forms selected for Bulk Edit. +#: src/Admin/Forms/Tags.php:277 +#, php-format +msgid "You have %d tags selected for deletion." +msgstr "" + +#: src/Admin/Forms/Tags.php:281 +msgid "There are no tags to delete.
            Please create at least one by adding it to any form." +msgstr "" + +#: src/Admin/Forms/Tags.php:284 +msgid "1 tag was successfully deleted." +msgstr "" + +#. translators: %d - number of deleted tags. +#: src/Admin/Forms/Tags.php:286 +#, php-format +msgid "%d tags were successfully deleted." +msgstr "" + +#: src/Admin/Forms/Tags.php:287 +msgid "Almost done!" +msgstr "" + +#: src/Admin/Forms/Tags.php:288 +msgid "In order to update the tags in the forms list, please refresh the page." +msgstr "" + +#: src/Admin/Forms/Tags.php:289 +msgid "Refresh" +msgstr "" + +#. translators: used between list items, there is a space after the comma. +#: src/Admin/Forms/Tags.php:392 +msgid ", " +msgstr "" + +#: src/Admin/Forms/Tags.php:416 +#: src/Admin/Forms/Views.php:553 +#: src/Admin/Tools/Views/Importer.php:330 +#: templates/builder/field-context-menu.php:24 +msgid "Edit" +msgstr "" + +#: src/Admin/Forms/Tags.php:453 +msgid "Save changes" +msgstr "" + +#: src/Admin/Forms/Tags.php:514 +#: templates/admin/payments/tablenav-filters.php:35 +msgid "Filter" +msgstr "" + +#: src/Admin/Forms/Tags.php:590 +msgid "Edit Tags" +msgstr "" + +#. translators: %s - delay in formatted time. +#: src/Admin/Forms/UserTemplates.php:188 +#, php-format +msgid "Form template entries are for testing purposes and will be automatically deleted after %s." +msgstr "" + +#. translators: %s - delay in formatted time. +#: src/Admin/Forms/UserTemplates.php:242 +#, php-format +msgid "Form template entries are for testing purposes. This entry will be automatically deleted in %s." +msgstr "" + +#: src/Admin/Forms/UserTemplates.php:333 +#: src/Admin/Traits/FormTemplates.php:455 +msgid "Create Form" +msgstr "" + +#: src/Admin/Forms/UserTemplates.php:334 +msgid "Edit Template" +msgstr "" + +#: src/Admin/Forms/UserTemplates.php:367 +msgid "You do not have permission to delete this template." +msgstr "" + +#: src/Admin/Forms/UserTemplates.php:374 +msgid "Template not found." +msgstr "" + +#: src/Admin/Forms/UserTemplates.php:381 +msgid "Failed to delete the template." +msgstr "" + +#: src/Admin/Forms/Views.php:73 +#: src/Admin/Payments/Views/Overview/Table.php:1106 +msgid "All" +msgstr "" + +#: src/Admin/Forms/Views.php:78 +#: src/Admin/Forms/Views.php:648 +#: src/Admin/Payments/Views/Overview/Table.php:1120 +msgid "Trash" +msgstr "" + +#: src/Admin/Forms/Views.php:95 +msgid "Forms" +msgstr "" + +#: src/Admin/Forms/Views.php:103 +msgid "Templates" +msgstr "" + +#: src/Admin/Forms/Views.php:552 +msgid "Edit this template" +msgstr "" + +#: src/Admin/Forms/Views.php:552 +msgid "Edit this form" +msgstr "" + +#: src/Admin/Forms/Views.php:591 +msgid "View payments" +msgstr "" + +#: src/Admin/Forms/Views.php:622 +msgid "Duplicate this template" +msgstr "" + +#: src/Admin/Forms/Views.php:622 +msgid "Duplicate this form" +msgstr "" + +#: src/Admin/Forms/Views.php:624 +#: templates/builder/field-context-menu.php:34 +msgid "Duplicate" +msgstr "" + +#: src/Admin/Forms/Views.php:647 +msgid "Move this form template to trash" +msgstr "" + +#: src/Admin/Forms/Views.php:647 +msgid "Move this form to trash" +msgstr "" + +#: src/Admin/Forms/Views.php:693 +msgid "Restore this template" +msgstr "" + +#: src/Admin/Forms/Views.php:693 +msgid "Restore this form" +msgstr "" + +#: src/Admin/Forms/Views.php:713 +msgid "Delete this template permanently" +msgstr "" + +#: src/Admin/Forms/Views.php:713 +msgid "Delete this form permanently" +msgstr "" + +#. translators: %1$d - number of forms found in the trash, %2$s - search term. +#: src/Admin/Forms/Views.php:743 +#, php-format +msgid "Found %1$d form in the trash containing \"%2$s\"" +msgid_plural "Found %1$d forms in the trash containing \"%2$s\"" +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Forms/Views.php:795 +msgid "Empty Trash" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:415 +msgid "Today" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:416 +msgid "Yesterday" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:417 +msgid "Last 7 days" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:418 +msgid "Last 30 days" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:419 +msgid "Last 90 days" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:420 +msgid "Last 1 year" +msgstr "" + +#: src/Admin/Helpers/Datepicker.php:421 +#: src/Admin/Traits/FormTemplates.php:382 +#: src/Forms/Fields/Traits/CameraTrait.php:140 +msgid "Custom" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:546 +msgid "Welcome to WPForms!" +msgstr "" + +#. translators: %s - number of templates. +#: src/Admin/Notifications/EventDriven.php:548 +#, php-format +msgid "We’re grateful that you chose WPForms for your website! Now that you’ve installed the plugin, you’re less than 5 minutes away from publishing your first form. To make it easy, we’ve got %s form templates to get you started!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:554 +msgid "Start Building" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:561 +msgid "Read the Guide" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:578 +msgid "Don’t Miss Your Form Notification Emails!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:579 +msgid "Did you know that many WordPress sites are not properly configured to send emails? With the free WP Mail SMTP plugin, you can easily optimize your site to send emails, avoid the spam folder, and make sure your emails land in the recipient’s inbox every time." +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:583 +#: src/Admin/Notifications/EventDriven.php:643 +#: src/Admin/Notifications/EventDriven.php:647 +#: src/Admin/Notifications/EventDriven.php:696 +#: src/Admin/Notifications/EventDriven.php:700 +#: src/Admin/Notifications/EventDriven.php:763 +#: src/Admin/Notifications/EventDriven.php:767 +#: src/Admin/Pages/Page.php:464 +#: src/Admin/Pages/PrivacyCompliance.php:213 +#: src/Admin/Pages/SMTP.php:186 +#: src/Admin/Pages/SugarCalendar.php:285 +#: src/Admin/Pages/UncannyAutomator.php:188 +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:116 +msgid "Install Now" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:599 +msgid "Want to Be a VIP? Join Now!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:600 +msgid "Running a WordPress site can be challenging. But help is just around the corner! Our Facebook group contains tons of tips and help to get your business growing! When you join our VIP Circle, you’ll get instant access to tips, tricks, and answers from a community of loyal WPForms users. Best of all, membership is 100% free!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:604 +msgid "Join Now" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:612 +msgid "Want to Know What Your Customers Really Think?" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:613 +msgid "Nothing beats real feedback from your customers and visitors. That’s why many small businesses love our awesome Surveys and Polls addon. Instantly unlock full survey reporting right in your WordPress dashboard. And don’t forget: building a survey is easy with our pre-made templates, so you could get started within a few minutes!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:665 +msgid "Get More Leads From Your Forms!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:666 +msgid "Are your forms converting fewer visitors than you hoped? Often, visitors quit forms partway through. That can prevent you from getting all the leads you deserve to capture. With our Form Abandonment addon, you can capture partial entries even if your visitor didn’t hit Submit! From there, it’s easy to follow up with leads and turn them into loyal customers." +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:718 +msgid "What’s Your Dream WPForms Feature?" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:719 +msgid "If you could add just one feature to WPForms, what would it be? We want to know! Our team is busy surveying valued customers like you as we plan the year ahead. We’d love to know which features would take your business to the next level! Do you have a second to share your idea with us?" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:723 +msgid "Share Your Idea" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:732 +msgid "Congratulations! You Just Got Your 100th Form Entry!" +msgstr "" + +#: src/Admin/Notifications/EventDriven.php:733 +msgid "You just hit 100 entries… and this is just the beginning! Now it’s time to dig into the data and figure out what makes your visitors tick. The User Journey addon shows you what your visitors looked at before submitting your form. Now you can easily find which areas of your site are triggering form conversions." +msgstr "" + +#: src/Admin/Notifications/Notifications.php:790 +msgid "Watch Video" +msgstr "" + +#: src/Admin/Pages/Community.php:66 +msgid "WPForms VIP Circle Facebook Group" +msgstr "" + +#: src/Admin/Pages/Community.php:67 +msgid "Powered by the community, for the community. Anything and everything WPForms: Discussions. Questions. Tutorials. Insights and sneak peaks. Also, exclusive giveaways!" +msgstr "" + +#: src/Admin/Pages/Community.php:68 +msgid "Join WPForms VIP Circle" +msgstr "" + +#: src/Admin/Pages/Community.php:76 +msgid "WPForms Announcements" +msgstr "" + +#: src/Admin/Pages/Community.php:77 +msgid "Check out the latest releases from WPForms. Our team is always innovating to bring you powerful features and functionality that are simple to use. Every release is designed with you in mind!" +msgstr "" + +#: src/Admin/Pages/Community.php:78 +msgid "View WPForms Announcements" +msgstr "" + +#: src/Admin/Pages/Community.php:86 +msgid "WPForms YouTube Channel" +msgstr "" + +#: src/Admin/Pages/Community.php:87 +msgid "Take a visual dive into everything WPForms has to offer. From simple contact forms to advanced payment forms and email marketing integrations, our extensive video collection covers it all." +msgstr "" + +#: src/Admin/Pages/Community.php:88 +msgid "Visit WPForms YouTube Channel" +msgstr "" + +#: src/Admin/Pages/Community.php:96 +msgid "WPForms Developer Documentation" +msgstr "" + +#: src/Admin/Pages/Community.php:97 +msgid "Customize and extend WPForms with code. Our comprehensive developer resources include tutorials, snippets, and documentation on core actions, filters, functions, and more." +msgstr "" + +#: src/Admin/Pages/Community.php:98 +msgid "View WPForms Dev Docs" +msgstr "" + +#: src/Admin/Pages/Community.php:106 +msgid "WPBeginner Engage Facebook Group" +msgstr "" + +#: src/Admin/Pages/Community.php:107 +msgid "Hang out with other WordPress experts and like minded website owners such as yourself! Hosted by WPBeginner, the largest free WordPress site for beginners." +msgstr "" + +#: src/Admin/Pages/Community.php:108 +msgid "Join WPBeginner Engage" +msgstr "" + +#: src/Admin/Pages/Community.php:117 +msgid "Do you have an idea or suggestion for WPForms? If you have thoughts on features, integrations, addons, or improvements - we want to hear it! We appreciate all feedback and insight from our users." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:74 +msgid "WPForms Collects It. Duplicator Protects It." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:86 +msgid "WPForms ♥ Duplicator" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:99 +msgid "Every form entry lives in your database. One bad update, one crash, and it's gone. Duplicator backs up your entire site automatically so you can restore everything with one click." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:100 +msgid "Trusted by over 1.5 million websites." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:130 +msgid "Duplicator screenshot" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:161 +#: src/Admin/Pages/PrivacyCompliance.php:173 +#: src/Admin/Pages/SugarCalendar.php:162 +#: src/Admin/Pages/UncannyAutomator.php:149 +msgid "Step 3" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:162 +msgid "Set Up Scheduled Cloud Backups" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:163 +msgid "Keep your data safe forever with automatic daily backups to Google Drive, Dropbox, or Amazon S3." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:202 +msgid "Because the data you collect with WPForms is too valuable to lose." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:221 +msgid "Set Up Cloud Backups" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:233 +msgid "Cloud Backups Set Up" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:365 +msgid "Install and Activate Duplicator" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:377 +msgid "Your first step toward bulletproof backups." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:401 +msgid "Install Duplicator" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:413 +msgid "Duplicator Installed & Activated" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:425 +msgid "Activate Duplicator" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:437 +msgid "Create Your First Backup" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:449 +msgid "Back up your site — forms, entries, settings, everything — in just one click." +msgstr "" + +#: src/Admin/Pages/Duplicator.php:461 +msgid "Create First Backup" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:473 +msgid "Backup Created" +msgstr "" + +#: src/Admin/Pages/Duplicator.php:485 +msgid "Duplicator Pro Installed & Activated" +msgstr "" + +#: src/Admin/Pages/Page.php:223 +#: src/Admin/Pages/SMTP.php:331 +msgid "Step 1" +msgstr "" + +#: src/Admin/Pages/Page.php:259 +#: src/Admin/Pages/SMTP.php:365 +msgid "Step 2" +msgstr "" + +#: src/Admin/Pages/Page.php:386 +#: src/Admin/Pages/SMTP.php:476 +msgid "Plugin unavailable." +msgstr "" + +#. translators: %1$s - Lite plugin download URL. +#: src/Admin/Pages/Page.php:437 +#, php-format +msgid "Could not install the plugin automatically. Please download it and install it manually." +msgstr "" + +#. translators: %1$s - Plugins page URL. +#: src/Admin/Pages/Page.php:449 +#, php-format +msgid "Could not activate the plugin. Please activate it on the Plugins page." +msgstr "" + +#: src/Admin/Pages/Page.php:460 +#: src/Admin/Pages/SMTP.php:183 +#: src/Integrations/AI/Admin/Builder/Forms.php:193 +msgid "Installing..." +msgstr "" + +#: src/Admin/Pages/Page.php:461 +#: src/Admin/Pages/SMTP.php:184 +#: src/Integrations/AI/Admin/Builder/Forms.php:194 +msgid "Activating..." +msgstr "" + +#: src/Admin/Pages/Page.php:465 +#: src/Admin/Pages/SMTP.php:187 +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:116 +msgid "Activate Now" +msgstr "" + +#: src/Admin/Pages/Page.php:466 +#: src/Admin/Pages/SMTP.php:188 +msgid "Download Now" +msgstr "" + +#: src/Admin/Pages/Page.php:467 +#: src/Admin/Pages/SMTP.php:189 +msgid "Go to Plugins page" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:85 +msgid "Make Your Website Privacy-Compliant in Minutes" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:97 +msgid "WPForms ♥ WPConsent" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:110 +msgid "Build trust with clear, compliant privacy practices. WPConsent adds clean, professional banners and handles the technical side for you." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:111 +msgid "Built for transparency. Designed for ease." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:125 +msgid "A professional banner that fits your site." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:126 +msgid "Tools like Google Analytics and Facebook Pixel paused until consent." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:127 +msgid "Peace of mind knowing you’re aligned with global laws." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:128 +msgid "Self-hosted. Your data remains on your site." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:141 +msgid "WPConsent screenshot" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:174 +msgid "Get Advanced Cookie Consent Features" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:175 +msgid "With WPConsent Pro you can access advanced features like geolocation, popup layout, records of consent, multilanguage support, and more." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:212 +#: src/Admin/Pages/PrivacyCompliance.php:479 +msgid "WPConsent Pro Installed & Activated" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:359 +msgid "Install & Activate WPConsent" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:371 +msgid "Install WPConsent from the WordPress.org plugin repository." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:383 +msgid "WPConsent" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:395 +msgid "Install WPConsent" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:407 +msgid "WPConsent Installed & Activated" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:419 +msgid "Activate WPConsent" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:431 +msgid "Set Up WPConsent" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:443 +msgid "WPConsent has an intuitive setup wizard to guide you through the cookie consent configuration process." +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:455 +msgid "Run Setup Wizard" +msgstr "" + +#: src/Admin/Pages/PrivacyCompliance.php:467 +msgid "Setup Complete" +msgstr "" + +#. translators: %s - Lite plugin download URL. +#: src/Admin/Pages/SMTP.php:160 +#, php-format +msgid "Could not install the plugin automatically. Please download it and install it manually." +msgstr "" + +#. translators: %s - Lite plugin download URL. +#: src/Admin/Pages/SMTP.php:172 +#, php-format +msgid "Could not activate the plugin. Please activate it on the Plugins page." +msgstr "" + +#: src/Admin/Pages/SMTP.php:185 +#: src/Admin/Pages/SMTP.php:411 +msgid "WP Mail SMTP Installed & Activated" +msgstr "" + +#: src/Admin/Pages/SMTP.php:194 +#: src/Admin/Pages/SMTP.php:445 +msgid "Go to SMTP settings" +msgstr "" + +#: src/Admin/Pages/SMTP.php:195 +#: src/Admin/Pages/SMTP.php:436 +msgid "Open Setup Wizard" +msgstr "" + +#: src/Admin/Pages/SMTP.php:234 +msgid "WPForms ♥ WP Mail SMTP" +msgstr "" + +#: src/Admin/Pages/SMTP.php:235 +msgid "Making Email Deliverability Easy for WordPress" +msgstr "" + +#: src/Admin/Pages/SMTP.php:236 +msgid "WP Mail SMTP fixes deliverability problems with your WordPress emails and form notifications. It's built by the same folks behind WPForms." +msgstr "" + +#: src/Admin/Pages/SMTP.php:262 +msgid "WP Mail SMTP screenshot" +msgstr "" + +#: src/Admin/Pages/SMTP.php:264 +msgid "Improves email deliverability in WordPress." +msgstr "" + +#: src/Admin/Pages/SMTP.php:265 +msgid "Used by 4+ million websites." +msgstr "" + +#: src/Admin/Pages/SMTP.php:266 +msgid "Free mailers: SendLayer, SMTP.com, Brevo, Google Workspace / Gmail, Mailgun, Postmark, SendGrid." +msgstr "" + +#: src/Admin/Pages/SMTP.php:267 +msgid "Pro mailers: Amazon SES, Microsoft 365 / Outlook.com, Zoho Mail." +msgstr "" + +#: src/Admin/Pages/SMTP.php:366 +msgid "Set Up WP Mail SMTP" +msgstr "" + +#: src/Admin/Pages/SMTP.php:367 +msgid "Select and configure your mailer." +msgstr "" + +#: src/Admin/Pages/SMTP.php:385 +msgid "Install and Activate WP Mail SMTP" +msgstr "" + +#: src/Admin/Pages/SMTP.php:386 +msgid "Install WP Mail SMTP from the WordPress.org plugin repository." +msgstr "" + +#: src/Admin/Pages/SMTP.php:396 +msgid "Install WP Mail SMTP" +msgstr "" + +#: src/Admin/Pages/SMTP.php:404 +msgid "WP Mail SMTP on WordPress.org" +msgstr "" + +#: src/Admin/Pages/SMTP.php:411 +msgid "Activate WP Mail SMTP" +msgstr "" + +#: src/Admin/Pages/SMTP.php:440 +msgid "Start Setup" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:73 +msgid "Taking Bookings? Put Them on a Calendar" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:85 +msgid "WPForms ♥ Sugar Calendar" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:98 +msgid "WPForms collects the \"yes.\" Sugar Calendar shows the \"when and where.\"" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:99 +msgid "Together, they turn bookings into events your visitors can browse, sync, and show up for." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:100 +msgid "Simple, elegant, and built for your workflow." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:114 +msgid "Display events on beautiful calendars visitors can browse and filter." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:115 +msgid "Sell tickets with Stripe or WooCommerce integration." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:116 +msgid "Visitors can add events to Google, Apple, or Outlook calendars with one click." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:117 +msgid "Set up recurring events: daily, weekly, monthly, or custom patterns." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:130 +msgid "Sugar Calendar screenshot" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:163 +msgid "Display Events on Your Site" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:164 +msgid "Use the Calendar block or shortcode [sc_events_calendar] to embed events anywhere on your site." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:182 +msgid "From the same team trusted by over 6 million sites." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:284 +#: src/Admin/Pages/SugarCalendar.php:490 +msgid "Sugar Calendar Pro Installed & Activated" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:370 +msgid "Install and Activate Sugar Calendar" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:382 +msgid "Bring your forms to life. Install Sugar Calendar and start creating events." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:406 +msgid "Install Sugar Calendar" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:418 +msgid "Sugar Calendar Installed & Activated" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:430 +msgid "Activate Sugar Calendar" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:442 +msgid "Create Your First Event" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:454 +msgid "Add your first booking or class to your calendar in seconds. Clean, simple, and built right into WordPress." +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:466 +msgid "Add First Event" +msgstr "" + +#: src/Admin/Pages/SugarCalendar.php:478 +msgid "Event Created" +msgstr "" + +#: src/Admin/Pages/Templates.php:118 +msgid "Get a Head Start With Our Pre-Made Form Templates" +msgstr "" + +#. translators: %1$s - create template doc link; %2$s - Contact us page link. +#: src/Admin/Pages/Templates.php:125 +#, php-format +msgid "Choose a template to speed up the process of creating your form. You can also start with a blank form or create your own.
            Have a suggestion for a new template? We’d love to hear it!" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:62 +msgid "Let Your Site Handle the Busywork." +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:74 +msgid "WPForms ♥ Uncanny Automator" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:87 +msgid "Automate tasks, save time, and keep everything running smoothly. Uncanny Automator connects your favorite tools so your site works smarter. No code. No stress." +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:117 +msgid "Uncanny Automator screenshot" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:150 +msgid "Save and Test Your Automation" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:151 +msgid "Click Save Recipe, run a test, and watch your workflow run on its own, no code needed." +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:187 +#: src/Admin/Pages/UncannyAutomator.php:440 +msgid "Uncanny Automator Pro Installed & Activated" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:241 +msgid "Create Your First Automation (Recipe)" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:253 +msgid "Open the Automator menu, click Add New, choose your trigger (e.g. form submission), and define your action (e.g. send email, update CRM)." +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:344 +msgid "Install and Activate Uncanny Automator" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:356 +msgid "Connect Automator and start building automations that save hours every week." +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:368 +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:69 +msgid "Uncanny Automator" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:380 +msgid "Install Uncanny Automator" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:392 +msgid "Uncanny Automator Installed & Activated" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:404 +msgid "Activate Uncanny Automator" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:416 +msgid "Create Your First Recipe" +msgstr "" + +#: src/Admin/Pages/UncannyAutomator.php:428 +msgid "Recipe Created" +msgstr "" + +#: src/Admin/Payments/ScreenOptions.php:93 +msgid "Number of payments per page:" +msgstr "" + +#: src/Admin/Payments/ScreenOptions.php:119 +msgid "Advanced details" +msgstr "" + +#: src/Admin/Payments/ScreenOptions.php:120 +#: src/Logger/ListTable.php:45 +#: src/Logger/Log.php:105 +#: templates/admin/payments/single/log.php:19 +msgid "Log" +msgstr "" + +#: src/Admin/Payments/ScreenOptions.php:124 +msgid "Additional information" +msgstr "" + +#: src/Admin/Payments/ScreenOptions.php:140 +#: src/Forms/Fields/Addons/Coupon/Field.php:166 +#: src/Forms/Fields/Addons/Coupon/Field.php:284 +#: src/Logger/ListTable.php:462 +#: templates/admin/components/datepicker.php:73 +msgid "Apply" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:53 +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:171 +msgid "Coupons" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:148 +msgid "Custom Coupon Codes" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:149 +msgid "Percentage or Fixed Discounts" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:150 +msgid "Start and End Dates" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:151 +msgid "Maximum Usage Limit" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:152 +msgid "Once Per Email Address Limit" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:153 +msgid "Usage Statistics" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:159 +msgid "Coupons Overview" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:164 +msgid "Coupon Settings" +msgstr "" + +#. translators: %1$s - WPForms.com Upgrade page URL. +#: src/Admin/Payments/Views/Coupons/Education.php:171 +#, php-format +msgid "With the Coupons addon, you can offer customers discounts using custom coupon codes. Create your own percentage or fixed rate discount, then add the Coupon field to any payment form. When a customer enters your unique code, they’ll receive the specified discount. You can also add limits to restrict when coupons are available and how often they can be used. The Coupons addon requires a license level of Pro or higher.%s" +msgstr "" + +#: src/Admin/Payments/Views/Coupons/Education.php:184 +msgid "Easy to Use, Yet Powerful" +msgstr "" + +#: src/Admin/Payments/Views/Overview/BulkActions.php:89 +#: src/Providers/Provider/Settings/PageIntegrations.php:314 +#: src/Providers/Provider/Settings/PageIntegrations.php:364 +msgid "Your session expired. Please reload the page." +msgstr "" + +#. translators: %d - number of deleted payments. +#: src/Admin/Payments/Views/Overview/BulkActions.php:183 +#, php-format +msgid "%d payment was successfully permanently deleted." +msgid_plural "%d payments were successfully permanently deleted." +msgstr[0] "" +msgstr[1] "" + +#. translators: %d - number of restored payments. +#: src/Admin/Payments/Views/Overview/BulkActions.php:188 +#, php-format +msgid "%d payment was successfully restored." +msgid_plural "%d payments were successfully restored." +msgstr[0] "" +msgstr[1] "" + +#. translators: %d - number of trashed payments. +#: src/Admin/Payments/Views/Overview/BulkActions.php:193 +#, php-format +msgid "%d payment was successfully moved to the Trash." +msgid_plural "%d payments were successfully moved to the Trash." +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Payments/Views/Overview/Chart.php:92 +msgid "Payments Summary" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:147 +msgid "Viewing Test Data" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:168 +#: src/Admin/Payments/Views/Overview/Page.php:155 +msgid "No payments for selected period" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:169 +msgid "Please select a different period or check back later." +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:216 +msgid "Total Payments" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:222 +msgid "Total Sales" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:235 +msgid "Total Refunded" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:244 +msgid "New Subscriptions" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:261 +msgid "Subscription Renewals" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Chart.php:278 +msgid "Coupons Redeemed" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:75 +#: templates/emails/summary-body.php:119 +msgid "Overview" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:152 +#: src/Providers/Provider/Settings/FormBuilder.php:243 +#: templates/admin/payments/single/details.php:79 +#: templates/builder/field-context-menu.php:44 +#: templates/builder/templates-item.php:78 +msgid "Delete" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:156 +msgid "No sales for selected period" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:157 +msgid "No refunds for selected period" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:158 +msgid "No new subscriptions for selected period" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:159 +msgid "No subscription renewals for the selected period" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:160 +msgid "No coupons applied during the selected period" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Page.php:367 +msgid "First you need to set up a payment gateway. We've partnered with Stripe and Square to bring easy payment forms to everyone. " +msgstr "" + +#. translators: %s - WPForms Addons admin page URL. +#: src/Admin/Payments/Views/Overview/Page.php:370 +#, php-format +msgid "Other payment gateways such as PayPal and Authorize.Net can be installed from the Addons screen." +msgstr "" + +#. translators: %s - WPForms.com Upgrade page URL. +#: src/Admin/Payments/Views/Overview/Page.php:381 +#, php-format +msgid "If you'd like to use another payment gateway, please consider upgrading to WPForms Pro." +msgstr "" + +#. translators: WPForms.com docs page URL. +#: src/Admin/Payments/Views/Overview/Page.php:498 +#, php-format +msgid "Deleting one or more selected payments may prevent processing of future subscription renewals. Payment filtering may also be affected. Learn More" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:83 +#: src/Logger/Log.php:106 +#: templates/integrations/stripe/builder/custom-metadata.php:66 +msgid "Payment" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:88 +msgid "Gateway" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:99 +#: src/Admin/Payments/Views/Single.php:350 +#: src/Forms/Fields/PaymentTotal/Field.php:24 +#: src/Forms/Fields/PaymentTotal/Field.php:556 +#: src/Forms/Fields/PaymentTotal/Field.php:617 +#: src/SmartTags/SmartTag/OrderSummary.php:172 +#: templates/admin/payments/single/payment-history.php:32 +#: templates/admin/payments/single/payment-history.php:53 +#: templates/fields/total/summary-preview.php:85 +msgid "Total" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:102 +#: src/Db/Payments/ValueValidator.php:156 +msgid "Subscription" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:106 +#: templates/admin/payments/single/payment-history.php:33 +#: templates/admin/payments/single/payment-history.php:56 +msgid "Status" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:225 +msgid "No payments found in the trash." +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:231 +msgid "No payments found, please try a different search." +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:236 +msgid "No payments found." +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:328 +msgid "Search Payments" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:352 +msgid "types" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:356 +msgid "gateways" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:360 +msgid "subscriptions" +msgstr "" + +#. translators: %s - plural label. +#: src/Admin/Payments/Views/Overview/Table.php:433 +#, php-format +msgid "Multiple %s selected" +msgstr "" + +#. translators: %s - plural label. +#: src/Admin/Payments/Views/Overview/Table.php:437 +#, php-format +msgid "All %s" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:464 +msgid "Select which field to use when searching for payments" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:473 +msgid "Select which comparison method to use when searching for payments" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:642 +msgid "Payment Title" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:643 +#: src/Admin/Payments/Views/Single.php:741 +msgid "Transaction ID" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:644 +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:172 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:390 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:489 +msgid "Customer Email" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:645 +#: src/Admin/Payments/Views/Single.php:746 +msgid "Subscription ID" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:646 +msgid "Last 4 digits of credit card" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:647 +msgid "Any payment field" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:700 +msgid "equals" +msgstr "" + +#. translators: %s - relative time difference, e.g. "5 minutes", "12 days". +#: src/Admin/Payments/Views/Overview/Table.php:826 +#: src/Admin/Revisions.php:319 +#, php-format +msgid "%s ago" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:928 +msgid "% Refunded" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Table.php:1005 +msgid "Filter entries by coupon" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:74 +msgid "where" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:110 +msgid "with the status" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:146 +msgid "with the coupon" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:180 +msgid "with the form titled" +msgstr "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:209 +msgid "with the type" +msgid_plural "with the types" +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:238 +msgid "with the gateway" +msgid_plural "with the gateways" +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Payments/Views/Overview/Traits/ResetNotices.php:267 +msgid "with the subscription status" +msgid_plural "with the subscription statuses" +msgstr[0] "" +msgstr[1] "" + +#: src/Admin/Payments/Views/Single.php:150 +msgid "Are you sure you want to delete this payment and all its information (details, notes, etc.)?" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:151 +msgid "Are you sure you want to refund this payment?" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:152 +msgid "Are you sure you want to cancel this subscription?" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:153 +msgid "Payment was successfully refunded!" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:154 +msgid "Subscription was successfully canceled!" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:170 +msgid "It looks like the provided payment ID is not valid." +msgstr "" + +#: src/Admin/Payments/Views/Single.php:180 +msgid "It looks like the payment you are trying to access is no longer available." +msgstr "" + +#: src/Admin/Payments/Views/Single.php:188 +msgid "You can't edit this payment because it's in the trash." +msgstr "" + +#: src/Admin/Payments/Views/Single.php:333 +msgid "Payment Details" +msgstr "" + +#. translators: %s - payment gateway name. +#: src/Admin/Payments/Views/Single.php:337 +#: src/Admin/Payments/Views/Single.php:407 +#, php-format +msgid "View in %s" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:341 +msgid "Refund" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:365 +msgid "Method" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:404 +msgid "Subscription Details" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:420 +msgid "Lifetime Total" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:428 +msgid "Billing Cycle" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:435 +msgid "Times Billed" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:442 +msgid "Renewal Date" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:476 +msgid "Payment History" +msgstr "" + +#. translators: %s - credit card expiry date. +#: src/Admin/Payments/Views/Single.php:649 +#, php-format +msgid "Expires %s" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:751 +msgid "Customer ID" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:756 +msgid "Customer IP Address" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:760 +msgid "Payment Method" +msgstr "" + +#. translators: %d - field ID. +#: src/Admin/Payments/Views/Single.php:940 +#, php-format +msgid "Field ID #%d" +msgstr "" + +#: src/Admin/Payments/Views/Single.php:948 +msgid "Empty" +msgstr "" + +#: src/Admin/Revisions.php:386 +msgid "You do not have permission to restore revisions for this form." +msgstr "" + +#: src/Admin/Revisions.php:394 +msgid "Invalid revision. The revision does not belong to this form." +msgstr "" + +#: src/Admin/Revisions.php:472 +msgid "You’re about to save a form revision. Continuing will make this the current version." +msgstr "" + +#: src/Admin/Settings/Captcha/HCaptcha.php:58 +#: src/Admin/Settings/Captcha/ReCaptcha.php:70 +#: src/Admin/Settings/Captcha/Turnstile.php:78 +msgid "Site Key" +msgstr "" + +#: src/Admin/Settings/Captcha/HCaptcha.php:63 +#: src/Admin/Settings/Captcha/ReCaptcha.php:75 +#: src/Admin/Settings/Captcha/Turnstile.php:83 +msgid "Secret Key" +msgstr "" + +#: src/Admin/Settings/Captcha/HCaptcha.php:68 +#: src/Admin/Settings/Captcha/ReCaptcha.php:80 +#: src/Admin/Settings/Captcha/Turnstile.php:88 +msgid "Fail Message" +msgstr "" + +#: src/Admin/Settings/Captcha/HCaptcha.php:69 +#: src/Admin/Settings/Captcha/ReCaptcha.php:81 +#: src/Admin/Settings/Captcha/Turnstile.php:89 +msgid "Displays to users who fail the verification process." +msgstr "" + +#: src/Admin/Settings/Captcha/HCaptcha.php:71 +msgid "hCaptcha verification failed, please try again later." +msgstr "" + +#: src/Admin/Settings/Captcha/Page.php:145 +msgid "A CAPTCHA is an anti-spam technique which helps to protect your website from spam and abuse while letting real people pass through with ease." +msgstr "" + +#. translators: %s - WPForms.com CAPTCHA comparison page URL. +#: src/Admin/Settings/Captcha/Page.php:162 +#, php-format +msgid "Not sure which service is right for you? Check out our comparison for more details." +msgstr "" + +#: src/Admin/Settings/Captcha/Page.php:186 +msgid "No-Conflict Mode" +msgstr "" + +#: src/Admin/Settings/Captcha/Page.php:187 +msgid "Forcefully remove other CAPTCHA occurrences in order to prevent conflicts. Only enable this option if your site is having compatibility issues or instructed by support." +msgstr "" + +#: src/Admin/Settings/Captcha/Page.php:195 +msgid "Please save settings to generate a preview of your CAPTCHA here." +msgstr "" + +#: src/Admin/Settings/Captcha/Page.php:228 +msgid "This CAPTCHA is generated using your site and secret keys. If an error is displayed, please double-check your keys." +msgstr "" + +#: src/Admin/Settings/Captcha/Page.php:274 +msgid "A preview of your CAPTCHA is displayed below. Please view to verify the CAPTCHA settings are correct." +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:62 +msgid "Checkbox reCAPTCHA v2" +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:63 +msgid "Invisible reCAPTCHA v2" +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:64 +msgid "reCAPTCHA v3" +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:83 +#: src/Frontend/Frontend.php:1882 +msgid "Google reCAPTCHA verification failed, please try again later." +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:87 +msgid "Score Threshold" +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:88 +msgid "reCAPTCHA v3 returns a score (1.0 is very likely a good interaction, 0.0 is very likely a bot). If the score is less than or equal to this threshold, the form submission will be blocked and the message above will be displayed." +msgstr "" + +#: src/Admin/Settings/Captcha/ReCaptcha.php:95 +msgid "0.4" +msgstr "" + +#: src/Admin/Settings/Captcha/Turnstile.php:91 +#: src/Frontend/Frontend.php:1883 +msgid "Cloudflare Turnstile verification failed, please try again later." +msgstr "" + +#: src/Admin/Settings/Captcha/Turnstile.php:99 +msgid "Auto" +msgstr "" + +#: src/Admin/Settings/Captcha/Turnstile.php:100 +#: src/Admin/Settings/Email.php:231 +msgid "Light" +msgstr "" + +#: src/Admin/Settings/Captcha/Turnstile.php:101 +#: src/Admin/Settings/Email.php:232 +msgid "Dark" +msgstr "" + +#: src/Admin/Settings/Email.php:122 +msgid "This color combination may be hard to read. Try increasing the contrast between the body and text colors." +msgstr "" + +#: src/Admin/Settings/Email.php:224 +msgid "Appearance" +msgstr "" + +#: src/Admin/Settings/Email.php:225 +msgid "Modern email clients support viewing emails in light and dark modes. You can upload a header image and customize the style for each appearance mode independently to ensure an optimal reading experience." +msgstr "" + +#: src/Admin/Settings/Email.php:243 +#: src/Admin/Tools/Importers/ContactForm7.php:136 +#: src/Admin/Tools/Importers/NinjaForms.php:144 +#: src/Admin/Tools/Importers/PirateForms.php:460 +msgid "Sending" +msgstr "" + +#: src/Admin/Settings/Email.php:250 +msgid "Optimize Email Sending" +msgstr "" + +#. translators: %1$s - WPForms.com Email settings documentation URL. +#: src/Admin/Settings/Email.php:253 +#, php-format +msgid "Send emails asynchronously, which can make processing faster but may delay email delivery by a minute or two. Learn More" +msgstr "" + +#: src/Admin/Settings/Email.php:270 +msgid "Carbon Copy" +msgstr "" + +#: src/Admin/Settings/Email.php:271 +msgid "Enable the ability to CC: email addresses in the form notification settings." +msgstr "" + +#. translators: %1$s - WPForms.com Email settings legacy template documentation URL. +#: src/Admin/Settings/Email.php:304 +#, php-format +msgid "Some style settings are not available when using the Legacy template. Learn More" +msgstr "" + +#: src/Admin/Settings/Email.php:351 +msgid "Header Image" +msgstr "" + +#: src/Admin/Settings/Email.php:352 +msgid "Upload or choose a logo to be displayed at the top of email notifications." +msgstr "" + +#: src/Admin/Settings/Email.php:374 +#: src/Admin/Settings/Email.php:379 +#: templates/admin/dashboard/widget/settings.php:43 +msgid "Color Scheme" +msgstr "" + +#: src/Admin/Settings/Email.php:384 +#: src/Admin/Settings/Email.php:388 +msgid "Typography" +msgstr "" + +#: src/Admin/Settings/Email.php:385 +msgid "Choose the style that’s applied to all text in email notifications." +msgstr "" + +#: src/Admin/Settings/Email.php:394 +msgid "Sans Serif" +msgstr "" + +#: src/Admin/Settings/Email.php:395 +msgid "Serif" +msgstr "" + +#: src/Admin/Settings/Email.php:449 +msgid "Upload or choose a logo to be displayed at the top of email notifications. Light mode image will be used if not set." +msgstr "" + +#: src/Admin/Settings/Email.php:521 +msgid "Body" +msgstr "" + +#: src/Admin/Settings/Email.php:523 +msgid "Links" +msgstr "" + +#. translators: %1$s - Email template preview URL. +#: src/Admin/Settings/Email.php:567 +#, php-format +msgid "Preview Email Template" +msgstr "" + +#: src/Admin/Settings/Email.php:604 +msgid "Background Color" +msgstr "" + +#: src/Admin/Settings/Email.php:605 +msgid "Customize the background color of the email template." +msgstr "" + +#: src/Admin/Settings/ModernMarkup.php:76 +msgid "Use Modern Markup" +msgstr "" + +#. translators: %s - WPForms.com form markup setting URL. +#: src/Admin/Settings/ModernMarkup.php:79 +#, php-format +msgid "Check this option to use modern markup, which has increased accessibility and allows you to easily customize your forms in the block editor. Read our form markup documentation to learn more." +msgstr "" + +#. translators: %s - WPForms Stripe addon URL. +#: src/Admin/Settings/ModernMarkup.php:125 +#, php-format +msgid "You cannot use modern markup because you’re using the deprecated Credit Card field. If you’d like to use modern markup, replace your credit card field with a payment gateway like Stripe." +msgstr "" + +#: src/Admin/Settings/Payments.php:85 +msgid "Currency" +msgstr "" + +#: src/Admin/SiteHealth.php:47 +msgid "Version" +msgstr "" + +#: src/Admin/SiteHealth.php:58 +msgid "Lite install date" +msgstr "" + +#: src/Admin/SiteHealth.php:65 +msgid "Pro install date" +msgstr "" + +#: src/Admin/SiteHealth.php:73 +msgid "Uploads directory" +msgstr "" + +#: src/Admin/SiteHealth.php:74 +msgid "Writable" +msgstr "" + +#: src/Admin/SiteHealth.php:74 +msgid "Not writable" +msgstr "" + +#: src/Admin/SiteHealth.php:81 +msgid "Not found" +msgstr "" + +#: src/Admin/SiteHealth.php:84 +msgid "DB tables" +msgstr "" + +#: src/Admin/SiteHealth.php:92 +msgid "Total forms" +msgstr "" + +#: src/Admin/SiteHealth.php:111 +msgid "Total submissions (since v1.5.0)" +msgstr "" + +#: src/Admin/Splash/SplashCache.php:146 +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:216 +msgid "Update Now" +msgstr "" + +#: src/Admin/Splash/SplashTrait.php:134 +msgid "What’s New in WPForms" +msgstr "" + +#: src/Admin/Splash/SplashTrait.php:135 +msgid "We've added some great new features to help grow your business and generate more leads. Here are the highlights..." +msgstr "" + +#: src/Admin/Splash/SplashTrait.php:138 +msgid "Start Building Smarter WordPress Forms" +msgstr "" + +#: src/Admin/Splash/SplashTrait.php:139 +msgid "Add advanced form fields and conditional logic, plus offer more payment options, manage entries, and connect to your favorite marketing tools – all when you purchase a premium plan." +msgstr "" + +#: src/Admin/Splash/SplashTrait.php:141 +msgid "Upgrade to Pro Today" +msgstr "" + +#: src/Admin/Tools/Importers/Base.php:111 +msgid "There was an error while creating a new form." +msgstr "" + +#: src/Admin/Tools/Importers/ContactForm7.php:112 +msgid "Unknown Form" +msgstr "" + +#: src/Admin/Tools/Importers/ContactForm7.php:113 +msgid "The form you are trying to import does not exist." +msgstr "" + +#: src/Admin/Tools/Importers/ContactForm7.php:141 +#: src/Admin/Tools/Importers/NinjaForms.php:149 +msgid "Notification 1" +msgstr "" + +#: src/Admin/Tools/Importers/ContactForm7.php:170 +#: src/Admin/Tools/Importers/NinjaForms.php:178 +#: src/Admin/Tools/Importers/PirateForms.php:446 +msgid "No form fields found." +msgstr "" + +#: src/Admin/Tools/Importers/ContactForm7.php:345 +msgid "Acceptance Field" +msgstr "" + +#: src/Admin/Tools/Importers/ContactForm7.php:452 +msgid "Notification 2" +msgstr "" + +#. translators: %1$s - field type, %2$s - field name if available. +#: src/Admin/Tools/Importers/ContactForm7.php:546 +#, php-format +msgid "%1$s Field %2$s" +msgstr "" + +#: src/Admin/Tools/Importers/NinjaForms.php:255 +#: src/Admin/Tools/Importers/PirateForms.php:262 +#: src/Admin/Tools/Importers/PirateForms.php:355 +msgid "Single Checkbox Field" +msgstr "" + +#: src/Admin/Tools/Importers/NinjaForms.php:438 +#: src/Admin/Tools/Importers/NinjaForms.php:455 +#: templates/emails/summary-body.php:223 +msgid "Notification" +msgstr "" + +#. translators: %s - field type. +#: src/Admin/Tools/Importers/NinjaForms.php:508 +#, php-format +msgid "%s Field" +msgstr "" + +#: src/Admin/Tools/Importers/PirateForms.php:100 +#: src/Admin/Tools/Importers/PirateForms.php:190 +msgid "Default Form" +msgstr "" + +#. translators: %s - Action Scheduler website URL. +#: src/Admin/Tools/Views/ActionSchedulerList.php:45 +#, php-format +msgid "WPForms is using the Action Scheduler library, which allows it to queue and process bigger tasks in the background without making your site slower for your visitors. Below you can see the list of all tasks and their status. This table can be very useful when debugging certain issues." +msgstr "" + +#: src/Admin/Tools/Views/ActionSchedulerList.php:60 +msgid "Action Scheduler library is also used by other plugins, like WP Mail SMTP and WooCommerce, so you might see tasks that are not related to our plugin in the table below." +msgstr "" + +#. translators: %s - search term. +#: src/Admin/Tools/Views/ActionSchedulerList.php:71 +#, php-format +msgid "Search results for %s" +msgstr "" + +#: src/Admin/Tools/Views/Export.php:146 +msgid "Export Forms" +msgstr "" + +#: src/Admin/Tools/Views/Export.php:148 +msgid "Use form export files to create a backup of your forms or to import forms to another site." +msgstr "" + +#: src/Admin/Tools/Views/Export.php:153 +msgid "Select Form(s)" +msgstr "" + +#: src/Admin/Tools/Views/Export.php:161 +msgid "You need to create a form before you can use form export." +msgstr "" + +#: src/Admin/Tools/Views/Export.php:177 +msgid "Export a Form Template" +msgstr "" + +#. translators: %s - WPForms.com docs URL. +#: src/Admin/Tools/Views/Export.php:184 +#, php-format +msgid "For more information see our documentation." +msgstr "" + +#: src/Admin/Tools/Views/Export.php:196 +msgid "The following code can be used to register your custom form template. Copy and paste the following code to your theme's functions.php file or include it within an external file." +msgstr "" + +#: src/Admin/Tools/Views/Export.php:203 +msgid "Select a form to generate PHP code that can be used to register a custom form template." +msgstr "" + +#: src/Admin/Tools/Views/Export.php:211 +msgid "Export Template" +msgstr "" + +#: src/Admin/Tools/Views/Export.php:215 +msgid "You need to create a form before you can generate a template." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:156 +msgid "Import was successfully finished." +msgstr "" + +#. translators: %s - forms list page URL. +#: src/Admin/Tools/Views/Import.php:161 +#, php-format +msgid "You can go and check your forms." +msgstr "" + +#. translators: %s - WPForms contact page URL. +#: src/Admin/Tools/Views/Import.php:184 +#, php-format +msgid "You can’t import forms because you don’t have unfiltered HTML permissions. Please contact your site administrator or reach out to our support team." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:207 +msgid "WPForms Import" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:208 +msgid "Select a WPForms export file." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:213 +msgid "files selected" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:216 +msgid "No file chosen" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:218 +msgid "Choose a File" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:241 +msgid "Import from Other Form Plugins" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:242 +msgid "Not happy with other WordPress contact form plugins?" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:243 +msgid "WPForms makes it easy for you to switch by allowing you import your third-party forms with a single click." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:247 +msgid "No form importers are currently enabled." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:252 +msgid "Select previous contact form plugin..." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:260 +msgid "Not Active" +msgstr "" + +#: src/Admin/Tools/Views/Import.php:304 +#: src/Admin/Tools/Views/Import.php:354 +msgid "Please upload a valid .json form export file." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:347 +msgid "The unfiltered HTML permissions are required to import form." +msgstr "" + +#: src/Admin/Tools/Views/Import.php:358 +msgid "There was an error saving your form. Please check your file and try again." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:137 +msgid "Form Import" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:153 +msgid "Select the forms you would like to import." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:157 +msgid "Available Forms" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:176 +msgid "Select All" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:181 +msgid "Forms to Import" +msgstr "" + +#. translators: %s - provider name. +#: src/Admin/Tools/Views/Importer.php:211 +#, php-format +msgid "Analyzing 1 of 0 forms from %s." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:224 +msgid "One or more of your forms contain fields that are not available in WPForms Lite. To properly import these fields, we recommend upgrading to WPForms Pro." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:225 +msgid "You can continue with the import without upgrading, and we will do our best to match the fields. However, some of them will be omitted due to compatibility issues." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:231 +msgid "Continue Import without Upgrading" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:234 +msgid "Below is the list of form fields that may be impacted:" +msgstr "" + +#. translators: %s - provider name. +#: src/Admin/Tools/Views/Importer.php:255 +#, php-format +msgid "Importing 1 of 0 forms from %s." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:270 +msgid "Congrats, the import process has finished! We have successfully imported forms. You can review the results below." +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:336 +msgid "The following fields are available in PRO and were not imported:" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:344 +msgid "The following fields are available in PRO and were imported as text fields:" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:352 +msgid "The following fields are not supported and were not imported:" +msgstr "" + +#: src/Admin/Tools/Views/Importer.php:361 +msgid "Upgrade to the PRO plan to import these fields." +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:98 +msgid "Log Settings" +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:99 +msgid "Enable and configure the logging functionality while debugging behavior of various parts of the plugin, including form and entry processing." +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:103 +msgid "Enable Logs" +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:114 +msgid "Start logging WPForms-related events. This is recommended only while debugging." +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:153 +msgid "Log Types" +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:169 +msgid "Select the types of events you want to log. Everything is logged by default." +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:187 +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:193 +msgid "User Roles" +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:208 +msgid "Select the user roles you want to log. All roles are logged by default." +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:227 +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:281 +msgid "Users" +msgstr "" + +#: src/Admin/Tools/Views/Logs.php:249 +msgid "Log events for specific users only. All users are logged by default." +msgstr "" + +#: src/Admin/Tools/Views/System.php:65 +msgid "System Information" +msgstr "" + +#: src/Admin/Tools/Views/System.php:71 +msgid "Copy System Information" +msgstr "" + +#: src/Admin/Tools/Views/System.php:76 +msgid "Test SSL Connections" +msgstr "" + +#: src/Admin/Tools/Views/System.php:77 +msgid "Click the button below to verify your web server can perform SSL connections successfully." +msgstr "" + +#: src/Admin/Tools/Views/System.php:79 +msgid "Test Connection" +msgstr "" + +#: src/Admin/Tools/Views/System.php:92 +msgid "Recreate custom tables" +msgstr "" + +#: src/Admin/Tools/Views/System.php:93 +msgid "Click the button below to recreate WPForms custom database tables." +msgstr "" + +#: src/Admin/Tools/Views/System.php:95 +msgid "Recreate Tables" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:101 +msgid "Search Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:117 +msgid "Sorry, we didn't find any templates that match your criteria." +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:166 +msgid "All Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:170 +msgid "Available Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:173 +msgid "Favorite Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:174 +msgid "New Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:175 +msgid "My Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:184 +msgid "Custom Templates" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:188 +msgid "Addon Templates" +msgstr "" + +#. translators: %s - form template name. +#: src/Admin/Traits/FormTemplates.php:365 +#, php-format +msgid "%s template" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:375 +#: src/Integrations/AI/Admin/Builder/Forms.php:204 +msgid "Addon" +msgstr "" + +#: src/Admin/Traits/FormTemplates.php:451 +msgid "Create Blank Form" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:45 +msgid "Live" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:46 +#: templates/admin/payments/single/details.php:70 +msgid "Test" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:69 +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:179 +msgid "PayPal Standard" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:71 +#: src/Integrations/Stripe/Admin/Settings.php:273 +msgid "Stripe" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:72 +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:183 +#: src/Integrations/Square/Admin/Settings.php:252 +#: src/Integrations/Square/Fields/Square.php:24 +msgid "Square" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:73 +msgid "Authorize.net" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:103 +msgid "Processed" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:104 +msgid "Completed" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:105 +msgid "Pending" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:106 +#: src/Db/Payments/ValueValidator.php:125 +msgid "Failed" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:107 +msgid "Refunded" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:108 +msgid "Partially Refunded" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:123 +msgid "Cancelled" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:124 +msgid "Not Synced" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:140 +msgid "One-Time" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:157 +msgid "Renewal" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:172 +msgid "day" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:173 +msgid "week" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:174 +msgid "month" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:175 +msgid "quarter" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:176 +msgid "semi-year" +msgstr "" + +#: src/Db/Payments/ValueValidator.php:177 +msgid "year" +msgstr "" + +#: src/Emails/Helpers.php:34 +msgid "Legacy" +msgstr "" + +#: src/Emails/Mailer.php:317 +msgid "New Email Submit" +msgstr "" + +#. translators: %1$s - namespaced class name, %2$s - invalid email. +#: src/Emails/Mailer.php:506 +#, php-format +msgid "%1$s Invalid email address %2$s." +msgstr "" + +#. translators: %s - namespaced class name. +#: src/Emails/Mailer.php:515 +#, php-format +msgid "%s Empty subject line." +msgstr "" + +#. translators: %s - namespaced class name. +#: src/Emails/Mailer.php:522 +#, php-format +msgid "%s Empty message." +msgstr "" + +#: src/Emails/Mailer.php:568 +msgid "You cannot send emails with WPForms\\Emails\\Mailer until init/admin_init has been reached." +msgstr "" + +#. translators: %1$d - field ID. +#: src/Emails/Notifications.php:1176 +#, php-format +msgid "Field ID #%1$s" +msgstr "" + +#: src/Emails/Notifications.php:1314 +#: src/Forms/Fields/EntryPreview/Field.php:266 +msgid "Compact" +msgstr "" + +#: src/Emails/Notifications.php:1324 +msgid "Elegant" +msgstr "" + +#: src/Emails/Notifications.php:1329 +msgid "Tech" +msgstr "" + +#: src/Emails/Notifications.php:1334 +msgid "Plain Text" +msgstr "" + +#: src/Emails/Summaries.php:119 +msgid "Disable Email Summaries weekly delivery." +msgstr "" + +#: src/Emails/Summaries.php:122 +msgid "View Email Summary Example" +msgstr "" + +#: src/Emails/Summaries.php:134 +msgid "Disable Email Summaries" +msgstr "" + +#: src/Emails/Summaries.php:264 +msgid "Weekly WPForms Email Summaries" +msgstr "" + +#. translators: %s - site domain. +#: src/Emails/Summaries.php:322 +#, php-format +msgid "Your Weekly WPForms Summary for %s" +msgstr "" + +#: src/Forms/Akismet.php:318 +msgid "Anti-spam verification failed, please try again later." +msgstr "" + +#: src/Forms/Fields/Addons/Coupon/Field.php:113 +msgid "You haven't selected any coupons that can be used with this form. Please choose at least one coupon." +msgstr "" + +#: src/Forms/Fields/Addons/Coupon/Field.php:121 +msgid "Allowed Coupons" +msgstr "" + +#: src/Forms/Fields/Addons/Coupon/Field.php:122 +msgid "Choose coupons that can be used in the field." +msgstr "" + +#: src/Forms/Fields/Addons/Coupon/Field.php:155 +msgid "Change button text." +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:38 +msgid "Item #1" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:39 +msgid "Item #2" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:40 +msgid "Item #3" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:43 +msgid "Strongly Disagree" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:44 +msgid "Disagree" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:45 +msgid "Neutral" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:46 +msgid "Agree" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:47 +msgid "Strongly Agree" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:95 +msgid "Rows" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:96 +msgid "Add rows to the likert scale." +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:113 +msgid "Add likert scale row" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:114 +msgid "Remove likert scale row" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:140 +msgid "Make this a single-row rating scale" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:141 +msgid "Check this option to make this a single-row rating scale and remove the row choices." +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:160 +msgid "Allow multiple responses per row" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:161 +msgid "Check this option to allow multiple responses per row (uses checkboxes)." +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:176 +msgid "Add columns to the likert scale." +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:186 +msgid "Add likert scale column" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:187 +msgid "Remove likert scale column" +msgstr "" + +#: src/Forms/Fields/Addons/LikertScale/Field.php:236 +msgid "Select the style for the likert scale." +msgstr "" + +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:112 +msgid "Select the style for the net promoter score." +msgstr "" + +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:148 +#: src/Forms/Fields/Rating/Field.php:319 +msgid "Lowest Score Label" +msgstr "" + +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:158 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:240 +msgid "Not at all Likely" +msgstr "" + +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:178 +#: src/Forms/Fields/Rating/Field.php:350 +msgid "Highest Score Label" +msgstr "" + +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:188 +#: src/Forms/Fields/Addons/NetPromoterScore/Field.php:241 +msgid "Extremely Likely" +msgstr "" + +#: src/Forms/Fields/Addons/Signature/Field.php:109 +msgid "Ink Color" +msgstr "" + +#: src/Forms/Fields/Addons/Signature/Field.php:110 +msgid "Select the color for the signature ink." +msgstr "" + +#: src/Forms/Fields/Address/Field.php:43 +#: src/Forms/Fields/Phone/Field.php:100 +msgid "US" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:44 +#: src/Forms/Fields/Address/Field.php:53 +#: src/Forms/Fields/Address/Field.php:207 +#: src/Forms/Fields/Address/Field.php:520 +msgid "Address Line 1" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:45 +#: src/Forms/Fields/Address/Field.php:54 +#: src/Forms/Fields/Address/Field.php:246 +#: src/Forms/Fields/Address/Field.php:521 +msgid "Address Line 2" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:47 +msgid "Zip Code" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:48 +msgid "State" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:52 +#: src/Forms/Fields/Phone/Field.php:101 +msgid "International" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:56 +#: src/Forms/Fields/Address/Field.php:524 +msgid "Postal Code" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:57 +#: src/Forms/Fields/Address/Field.php:333 +#: src/Forms/Fields/Address/Field.php:523 +msgid "State / Province / Region" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:118 +msgid "Select scheme format for the address field." +msgstr "" + +#: src/Forms/Fields/Address/Field.php:133 +msgid "Scheme" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:256 +#: src/Forms/Fields/Address/Field.php:384 +#: src/Forms/Fields/Address/Field.php:440 +#: src/Integrations/Elementor/Widget.php:247 +#: src/Integrations/Elementor/Widget.php:261 +msgid "Hide" +msgstr "" + +#: src/Forms/Fields/Address/Field.php:257 +#: src/Forms/Fields/Address/Field.php:385 +#: src/Forms/Fields/Address/Field.php:441 +msgid "Turn On if you want to hide this sub field." +msgstr "" + +#: src/Forms/Fields/Address/Field.php:374 +msgid "ZIP / Postal" +msgstr "" + +#. translators: %s - subfield name, e.g., state, country. +#: src/Forms/Fields/Address/Field.php:765 +#, php-format +msgid "--- Select %s ---" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:35 +msgid "photo, image, capture, webcam" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:94 +#: src/Forms/Fields/Camera/Field.php:365 +msgid "Button Link Text" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:95 +#: src/Forms/Fields/Camera/Field.php:365 +msgid "Link Text" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:96 +#: src/Forms/Fields/Camera/Field.php:366 +msgid "Enter the text for the button link." +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:97 +#: src/Forms/Fields/Camera/Field.php:366 +msgid "Enter the text for the link." +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:98 +msgid "Camera field with Link style cannot have empty Link Text. Please enter text or change style to Button." +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:99 +msgid "Missing Link Text" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:168 +#: src/Forms/Fields/FileUpload/Field.php:284 +msgid "Store Files in WordPress Media Library" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:169 +#: src/Forms/Fields/FileUpload/Field.php:285 +msgid "Check this option to store the final uploaded file in the WordPress Media Library" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:215 +#: src/Forms/Fields/Camera/Field.php:376 +#: src/Forms/Fields/FileUpload/Field.php:358 +msgid "Capture With Your Camera" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:267 +#: src/Forms/Fields/FileUpload/Field.php:153 +msgid "Max File Size" +msgstr "" + +#. translators: %s - max upload size. +#: src/Forms/Fields/Camera/Field.php:269 +#: src/Forms/Fields/FileUpload/Field.php:155 +#, php-format +msgid "Enter the max size of each file, in megabytes, to allow. If left blank, the value defaults to the maximum size the server allows which is %s." +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:318 +msgid "Choose the style of the camera button." +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:330 +msgid "Button" +msgstr "" + +#: src/Forms/Fields/Camera/Field.php:331 +msgid "Link" +msgstr "" + +#: src/Forms/Fields/Content/Field.php:28 +#: src/Forms/Fields/Richtext/Field.php:26 +msgid "image, text, table, list, heading, wysiwyg, visual" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:107 +msgid "Card Number Placeholder Text" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:132 +msgid "Security Code Placeholder Text" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:157 +#: src/Integrations/Square/Fields/Square.php:313 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:120 +msgid "Name on Card Placeholder Text" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:215 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:222 +msgid "Card Number" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:220 +msgid "Security Code" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:227 +#: src/Integrations/Square/Fields/Square.php:119 +#: src/Integrations/Square/Fields/Square.php:542 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:82 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:166 +msgid "Name on Card" +msgstr "" + +#: src/Forms/Fields/CreditCard/Field.php:232 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:223 +msgid "Expiration" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:60 +msgid "What is 7+4?" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:61 +msgid "11" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:131 +msgid "Select type of captcha to use." +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:142 +msgid "Math" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:143 +msgid "Question and Answer" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:164 +msgid "Questions and Answers" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:165 +msgid "Add questions to ask the user. Questions are randomly selected." +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:183 +msgid "Question" +msgstr "" + +#: src/Forms/Fields/CustomCaptcha/Field.php:191 +msgid "Answer" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:120 +msgid "Select format for the date field." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:131 +msgid "Date and Time" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:133 +#: src/Forms/Fields/DateTime/Field.php:320 +#: src/Forms/Fields/DateTime/Field.php:682 +msgid "Time" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:209 +msgid "Advanced date options." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:223 +msgid "Date Picker" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:228 +msgid "Date Dropdown" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:304 +msgid "15 minutes" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:305 +msgid "30 minutes" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:306 +msgid "1 hour" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:321 +msgid "Advanced time options." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:344 +msgid "Interval" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:448 +msgid "Limit Days" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:449 +msgid "Check this option to adjust which days of the week can be selected." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:466 +msgid "Sun" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:467 +msgid "Mon" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:468 +msgid "Tue" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:469 +msgid "Wed" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:470 +msgid "Thu" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:471 +msgid "Fri" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:472 +msgid "Sat" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:500 +msgid "Disable Today's Date" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:501 +msgid "Check this option to prevent today's date from being selected." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:534 +msgid "Limit Hours" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:535 +msgid "Check this option to adjust the range of times that can be selected." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:795 +msgid "Disable Past Dates" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:796 +msgid "Check this option to prevent any previous date from being selected." +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:882 +msgid "Start Time" +msgstr "" + +#: src/Forms/Fields/DateTime/Field.php:882 +msgid "End Time" +msgstr "" + +#: src/Forms/Fields/Divider/Field.php:26 +msgid "line, hr" +msgstr "" + +#: src/Forms/Fields/Divider/Field.php:134 +msgid "Hide Divider Line" +msgstr "" + +#: src/Forms/Fields/Divider/Field.php:135 +msgid "Do not show the horizontal divider line." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:26 +msgid "confirm" +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:74 +msgid "Entry Preview must be displayed on its own page, without other fields. HTML fields are allowed." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:92 +msgid "Display Preview Notice" +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:93 +msgid "Check this option to show a message above the entry preview." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:111 +msgid "Preview Notice" +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:112 +msgid "Fill in the message to show above the entry preview." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:144 +msgid "Choose the entry preview display style." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:199 +msgid "Entry preview will be displayed here and will contain all fields found on the previous page." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:232 +msgid "Page breaks are required for entry previews to work. If you'd like to remove page breaks, you'll have to first remove the entry preview field." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:234 +msgid "You can't hide the previous button because it is required for the entry preview field on this page." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:250 +msgid "This is a preview of your submission. It has not been submitted yet!" +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:251 +msgid "Please take a moment to verify your information. You can also go back to make changes." +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:265 +#: src/Forms/Fields/Richtext/Field.php:130 +msgid "Basic" +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:267 +msgid "Table" +msgstr "" + +#: src/Forms/Fields/EntryPreview/Field.php:268 +msgid "Table, Compact" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:117 +msgid "Allowed File Extensions" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:118 +msgid "Enter the extensions you would like to allow, comma separated." +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:122 +msgid "See More Details" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:193 +msgid "Max File Uploads" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:194 +msgid "Enter the max number of files to allow. If left blank, the value defaults to 1." +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:246 +msgid "Modern Style supports multiple file uploads, displays a drag-and-drop upload box, and uses AJAX. Classic Style supports single file upload and displays a traditional upload button." +msgstr "" + +#. translators: %1$s: Choose File to Upload opening tag, %2$s: Choose File to Upload closing tag. +#: src/Forms/Fields/FileUpload/Field.php:391 +#: templates/fields/file-upload/file-upload-backend.php:23 +#, php-format +msgid "Drag & Drop File or %1$sChoose File to Upload%2$s" +msgid_plural "Drag & Drop Files or %1$sChoose Files to Upload%2$s" +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$s: Choose Files to Upload opening tag, %2$s: Choose Files to Upload closing tag. +#: src/Forms/Fields/FileUpload/Field.php:397 +#, php-format +msgid "Drag & Drop Files or %1$sChoose Files to Upload%2$s" +msgstr "" + +#. translators: %1$s: Choose File to Upload opening tag, %2$s: Closing tag, %3$s: Capture With Camera opening tag. +#: src/Forms/Fields/FileUpload/Field.php:403 +#: templates/fields/file-upload/file-upload-backend.php:19 +#, php-format +msgid "Drag & Drop File, %1$sChoose File to Upload%2$s, or %3$sCapture With Camera%2$s" +msgid_plural "Drag & Drop Files, %1$sChoose Files to Upload%2$s, or %3$sCapture With Camera%2$s" +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$s: Choose Files to Upload opening tag, %2$s: Closing tag, %3$s: Capture With Camera opening tag. +#: src/Forms/Fields/FileUpload/Field.php:410 +#, php-format +msgid "Drag & Drop Files, %1$sChoose Files to Upload%2$s, or %3$sCapture With Camera%2$s" +msgstr "" + +#. translators: % - max number of files as a template string (not a number), replaced by a number later. +#: src/Forms/Fields/FileUpload/Field.php:416 +#, php-format +msgid "You can upload up to %s files." +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:419 +msgid "Passwords Do Not Match" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:420 +msgid "Please check the password for the following fields: {fields}" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:421 +msgid "Passwords Are Empty" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:422 +msgid "Please enter a password for the following fields: {fields}" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:423 +msgid "Cannot Enable Restrictions" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:424 +msgid "This field is attached to Notifications. In order to enable restrictions, please first remove it from File Upload Attachments in Notifications." +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:425 +msgid "Cannot Enable Attachments" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:426 +msgid "The following fields ({fields}) cannot be attached to notifications because restrictions are enabled for them." +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:427 +msgid "All User Roles already selected" +msgstr "" + +#: src/Forms/Fields/FileUpload/Field.php:428 +msgid "File Upload Restrictions can't be enabled because the current version of the Post Submissions addon is incompatible." +msgstr "" + +#. translators: %1$s - addons list. +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:59 +#, php-format +msgid "The following addons require an update to support product quantities: %1$s" +msgstr "" + +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:76 +msgid "You're using an older version of the Coupons addon that does not support order summary." +msgstr "" + +#. translators: %1$s - addon name. +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:143 +#, php-format +msgid "You're using an older version of the %1$s addon that does not support the Repeater field." +msgstr "" + +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:187 +msgid "Save and Resume" +msgstr "" + +#: src/Forms/Fields/Helpers/RequirementsAlerts.php:213 +msgid "Update Required" +msgstr "" + +#: src/Forms/Fields/Hidden/Field.php:77 +msgid "Enter text for the form field label. Never displayed on the front-end." +msgstr "" + +#: src/Forms/Fields/Html/Field.php:26 +msgid "code" +msgstr "" + +#: src/Forms/Fields/Html/Field.php:75 +msgid "Enter text for the form field label. It will help identify your HTML blocks inside the form builder, but will not be displayed in the form." +msgstr "" + +#: src/Forms/Fields/Html/Field.php:198 +msgid "Contents of this field are not displayed in the form builder preview." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:45 +msgid "progress bar, multi step, multi part" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:129 +msgid "Page Title" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:130 +msgid "Enter text for the page title." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:162 +msgid "Next Label" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:163 +msgid "Enter text for Next page navigation button." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:172 +#: src/Forms/Fields/Pagebreak/Field.php:515 +msgid "Next" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:198 +msgid "Display Previous" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:199 +msgid "Toggle displaying the Previous page navigation button." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:219 +msgid "Previous Label" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:220 +msgid "Enter text for Previous page navigation button." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:269 +msgid "Progress Text" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:270 +msgid "Enter text for the progress indicator." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:281 +msgid "Enter text to show the user's progress. You can use {current_page} and {last_page} to indicate the current and last steps." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:316 +msgid "Progress Bar" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:317 +msgid "Circles" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:318 +msgid "Connector" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:335 +msgid "Progress Indicator" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:336 +msgid "Select theme for Page Indicator which is displayed at the top of the form." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:367 +msgid "Page Indicator Color" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:368 +msgid "Select the primary color for the Page Indicator theme." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:437 +msgid "Page Navigation Alignment" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:438 +msgid "Select the alignment for the Next/Previous page navigation buttons" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:452 +msgid "Split" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:474 +msgid "Disable Scroll Animation" +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:475 +msgid "By default, a user's view is pulled to the top of each form page. Set to ON to disable this animation." +msgstr "" + +#: src/Forms/Fields/Pagebreak/Field.php:519 +msgid "First Page / Progress Indicator" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:84 +msgid "Enable Password Confirmation" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:85 +msgid "Check this option to ask users to provide their password twice." +msgstr "" + +#: src/Forms/Fields/Password/Field.php:103 +msgid "Enable Password Strength" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:104 +msgid "Check this option to set minimum password strength." +msgstr "" + +#: src/Forms/Fields/Password/Field.php:119 +msgid "Minimum Strength" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:120 +msgid "Select minimum password strength level." +msgstr "" + +#: src/Forms/Fields/Password/Field.php:131 +msgid "Weak" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:133 +msgid "Strong" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:154 +msgid "Enable Password Visibility" +msgstr "" + +#: src/Forms/Fields/Password/Field.php:155 +msgid "Check this option to add a toggle for showing and hiding the password." +msgstr "" + +#: src/Forms/Fields/Password/Field.php:325 +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:553 +msgid "Confirm Password" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:22 +msgid "Checkbox Items" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:23 +#: src/Forms/Fields/PaymentMultiple/Field.php:23 +#: src/Forms/Fields/PaymentSelect/Field.php:41 +#: src/Forms/Fields/PaymentSingle/Field.php:57 +msgid "product, store, ecommerce, pay, payment" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:30 +#: src/Forms/Fields/PaymentMultiple/Field.php:30 +#: src/Forms/Fields/PaymentSelect/Field.php:48 +msgid "First Item" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:38 +#: src/Forms/Fields/PaymentMultiple/Field.php:38 +#: src/Forms/Fields/PaymentSelect/Field.php:53 +msgid "Second Item" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:46 +#: src/Forms/Fields/PaymentMultiple/Field.php:46 +#: src/Forms/Fields/PaymentSelect/Field.php:58 +msgid "Third Item" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:286 +#: src/Forms/Fields/PaymentMultiple/Field.php:263 +#: src/Forms/Fields/PaymentSelect/Field.php:251 +msgid "Show Price After Item Labels" +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:287 +#: src/Forms/Fields/PaymentMultiple/Field.php:264 +#: src/Forms/Fields/PaymentSelect/Field.php:252 +msgid "Check this option to show price of the item after the label." +msgstr "" + +#: src/Forms/Fields/PaymentCheckbox/Field.php:511 +#: src/Forms/Fields/PaymentMultiple/Field.php:486 +msgid "Invalid payment option." +msgstr "" + +#: src/Forms/Fields/PaymentMultiple/Field.php:22 +msgid "Multiple Items" +msgstr "" + +#: src/Forms/Fields/PaymentSelect/Field.php:40 +msgid "Dropdown Items" +msgstr "" + +#: src/Forms/Fields/PaymentSelect/Field.php:477 +msgid "Invalid payment option" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:56 +#: src/Forms/Fields/PaymentSingle/Field.php:352 +msgid "Single Item" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:248 +msgid "Price Display" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:249 +msgid "Specify how the price is displayed under the product name." +msgstr "" + +#. translators: %s - Single item field price label. +#: src/Forms/Fields/PaymentSingle/Field.php:287 +#, php-format +msgid "Price: %s" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:305 +msgid "Enter the price of the item, without a currency symbol." +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:312 +msgid "Item Price" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:350 +msgid "Select the item type." +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:353 +msgid "User Defined" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:354 +msgid "Hidden" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:362 +msgid "Item Type" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:410 +msgid "Enter the minimum price of the item, without a currency symbol." +msgstr "" + +#. translators: %1$s - the default minimum price. +#: src/Forms/Fields/PaymentSingle/Field.php:440 +#, php-format +msgid "Requiring a minimum price of at least %1$s helps protect you against card testing by fraudsters." +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:451 +msgid "Security Recommendation" +msgstr "" + +#. translators: %1$s - Item Price value. +#: src/Forms/Fields/PaymentSingle/Field.php:506 +#, php-format +msgid "Price: %1$s" +msgstr "" + +#. translators: %1$s - Minimum Price value. +#: src/Forms/Fields/PaymentSingle/Field.php:543 +#, php-format +msgid "Minimum Price: %1$s" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:555 +msgid "Note: Item type is set to hidden and will not be visible when viewing the form." +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:671 +msgid "Amount mismatch" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:684 +msgid "Amount can't be negative" +msgstr "" + +#: src/Forms/Fields/PaymentSingle/Field.php:694 +msgid "Amount can't be less than the required minimum." +msgstr "" + +#. translators: %1$s - Minimum Price value. +#: src/Forms/Fields/PaymentSingle/Field.php:752 +#, php-format +msgid "Minimum Price: %1$s" +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:25 +msgid "store, ecommerce, pay, payment, sum" +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:431 +msgid "Enable Summary" +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:432 +msgid "Enable order summary for this field." +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:478 +msgid "Example data is shown in the form editor. Actual products and totals will be displayed when you preview or embed your form." +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:513 +msgid "Example Product 1" +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:519 +msgid "Example Product 2" +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:525 +msgid "Example Product 3" +msgstr "" + +#: src/Forms/Fields/PaymentTotal/Field.php:810 +msgid "Show order summary after confirmation message" +msgstr "" + +#: src/Forms/Fields/Phone/Field.php:33 +msgid "telephone, mobile, cell" +msgstr "" + +#: src/Forms/Fields/Phone/Field.php:88 +msgid "Select format for the phone form field" +msgstr "" + +#: src/Forms/Fields/Phone/Field.php:99 +msgid "Smart" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:36 +msgid "review, emoji, star" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:115 +msgid "Scale" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:116 +msgid "Select rating scale" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:182 +msgid "Icon" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:183 +msgid "Select icon to display" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:195 +msgid "Star" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:196 +msgid "Heart" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:197 +msgid "Thumb" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:198 +msgid "Smiley Face" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:220 +msgid "Select the size of the rating icon" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:257 +msgid "Select the color for the rating icon" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:320 +msgid "This label indicates the lowest score on the scale." +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:351 +msgid "This label indicates the highest score on the scale." +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:381 +msgid "Label Position" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:382 +msgid "Select the position of the label" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:394 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:108 +msgid "Above" +msgstr "" + +#: src/Forms/Fields/Rating/Field.php:395 +msgid "Below" +msgstr "" + +#: src/Forms/Fields/Richtext/Field.php:77 +msgid "Allow Media Uploads" +msgstr "" + +#: src/Forms/Fields/Richtext/Field.php:78 +msgid "Check this option to allow uploading and embedding files." +msgstr "" + +#: src/Forms/Fields/Richtext/Field.php:91 +msgid "Store files in WordPress Media Library" +msgstr "" + +#: src/Forms/Fields/Richtext/Field.php:92 +msgid "Check this option to store files in the WordPress Media Library." +msgstr "" + +#: src/Forms/Fields/Richtext/Field.php:117 +msgid "Field Style" +msgstr "" + +#: src/Forms/Fields/Richtext/Field.php:175 +#: src/Forms/Fields/Traits/ContentInput.php:313 +msgid "Visual" +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:36 +msgid "Enable File Access Restrictions" +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:37 +msgid "Choose who can access the uploaded files." +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:132 +msgid "User Restriction" +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:145 +msgid "Logged-in Users" +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:194 +msgid "Select the user roles that can access the uploaded files." +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:205 +msgid "All users with selected roles will be able to access the uploaded files." +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:282 +msgid "Select the users that can access the uploaded files." +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:398 +msgid "Password Protection" +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:399 +msgid "Check this option to password protect the uploaded files." +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:431 +msgid "Set a password to protect the uploaded files." +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:517 +msgid "Enter Password" +msgstr "" + +#: src/Forms/Fields/Traits/AccessRestrictionsTrait.php:565 +msgid "Passwords do not match" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:41 +msgid "Enable Camera" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:42 +msgid "Check this option to enable the camera field." +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:81 +msgid "Select the camera format." +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:94 +msgid "Photo" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:95 +msgid "Video" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:130 +msgid "Aspect Ratio" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:131 +msgid "Select the camera aspect ratio." +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:139 +msgid "Original" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:141 +msgid "Freeform" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:143 +msgid "Landscape orientation" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:144 +msgid "16:9" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:145 +msgid "5:4" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:146 +msgid "3:2" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:149 +msgid "Portrait orientation" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:150 +msgid "9:16" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:151 +msgid "4:5" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:152 +msgid "2:3" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:215 +msgid "Ratio Width" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:233 +msgid "Ratio Height" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:264 +msgid "Time Limit" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:265 +msgid "Set the time limit for camera recording." +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:283 +msgid "Minutes" +msgstr "" + +#: src/Forms/Fields/Traits/CameraTrait.php:302 +msgid "Seconds" +msgstr "" + +#: src/Forms/Fields/Traits/ContentInput.php:176 +msgid "Uploaded to this form" +msgstr "" + +#: src/Forms/Fields/Traits/ContentInput.php:308 +msgid "Add Media" +msgstr "" + +#: src/Forms/Fields/Traits/ContentInput.php:358 +msgid "

            Add Text and Images to Your Form With Ease

            To get started, replace this text with your own.

            " +msgstr "" + +#: src/Forms/Fields/Traits/ContentInput.php:359 +msgid "Expand Editor" +msgstr "" + +#: src/Forms/Fields/Traits/ContentInput.php:360 +msgid "Collapse Editor" +msgstr "" + +#: src/Forms/Fields/Traits/ContentInput.php:361 +msgid "Update Preview" +msgstr "" + +#. translators: %s - link to the Media Library. +#: src/Forms/Fields/Traits/FileEntriesEditTrait.php:105 +#, php-format +msgid "Please use the default WordPress Media interface to remove this file." +msgstr "" + +#: src/Forms/Fields/Traits/NumberField.php:170 +msgid "Define the minimum and the maximum values for the field." +msgstr "" + +#: src/Forms/Fields/Traits/NumberField.php:249 +msgid "Enter a default value for this field." +msgstr "" + +#: src/Forms/Fields/Traits/NumberField.php:279 +msgid "Increment" +msgstr "" + +#: src/Forms/Fields/Traits/NumberField.php:280 +msgid "Determines the increment between selectable values on the field." +msgstr "" + +#. translators: %1$s - Field name. +#: src/Forms/Fields/Traits/ProField.php:261 +#, php-format +msgid "%1$s is a Pro Feature" +msgstr "" + +#: src/Forms/Fields/Traits/ProField.php:264 +msgid "Incompatible Addon" +msgstr "" + +#. translators: %1$s - Field name. +#: src/Forms/Fields/Traits/ProField.php:269 +#, php-format +msgid "Upgrade to gain access to the %1$s field and dozens of other powerful features to help you build smarter forms and grow your business." +msgstr "" + +#. translators: %1$s - Addon name. +#: src/Forms/Fields/Traits/ProField.php:273 +#, php-format +msgid "You have access to the %1$s, but it's not currently installed." +msgstr "" + +#. translators: %1$s - Addon name. +#: src/Forms/Fields/Traits/ProField.php:277 +#, php-format +msgid "You have access to the %1$s, but it's not currently activated." +msgstr "" + +#. translators: %1$s - Addon name. +#: src/Forms/Fields/Traits/ProField.php:281 +#, php-format +msgid "The %1$s is not compatible with this version of WPForms and requires an update." +msgstr "" + +#: src/Forms/Fields/Traits/ProField.php:289 +msgid "Activate Addon" +msgstr "" + +#: src/Forms/Fields/Traits/ProField.php:290 +msgid "Update Addon" +msgstr "" + +#: src/Forms/Fields/Traits/ProField.php:367 +msgid "Update required" +msgstr "" + +#: src/Forms/Fields/Traits/ReadOnlyField.php:53 +msgid "Check this option to show the field’s value without allowing changes. It will still be submitted." +msgstr "" + +#: src/Forms/Fields/Traits/ReadOnlyField.php:61 +msgid "Read-Only" +msgstr "" + +#: src/Forms/Fields/Url/Field.php:26 +msgid "uri, link, hyperlink" +msgstr "" + +#: src/Forms/Honeypot.php:79 +msgid "WPForms honeypot field triggered." +msgstr "" + +#: src/Forms/IconChoices.php:489 +msgid "Done!" +msgstr "" + +#: src/Forms/IconChoices.php:501 +msgid "In order to use the Icon Choices feature, an icon library must be downloaded and installed. It's quick and easy, and you'll only have to do this once." +msgstr "" + +#: src/Forms/IconChoices.php:502 +msgid "Installing Icon Library" +msgstr "" + +#: src/Forms/IconChoices.php:503 +msgid "This should only take a minute. Please don’t close or reload your browser window." +msgstr "" + +#: src/Forms/IconChoices.php:504 +msgid "The icon library has been installed successfully. We will now save your form and reload the form builder." +msgstr "" + +#. translators: %s - WPForms Support URL. +#: src/Forms/IconChoices.php:507 +#, php-format +msgid "There was an error installing the icon library. Please try again later or contact support if the issue persists." +msgstr "" + +#: src/Forms/IconChoices.php:524 +msgid "The icon library appears to be missing or damaged. It will now be reinstalled." +msgstr "" + +#: src/Forms/IconChoices.php:525 +msgid "Icon Picker" +msgstr "" + +#: src/Forms/IconChoices.php:526 +msgid "Browse or search for the perfect icon." +msgstr "" + +#: src/Forms/IconChoices.php:527 +msgid "Search 2000+ icons..." +msgstr "" + +#: src/Forms/IconChoices.php:528 +msgid "Sorry, we didn't find any matching icons." +msgstr "" + +#: src/Forms/Locator.php:182 +msgid "WPForms Widget" +msgstr "" + +#: src/Forms/Locator.php:183 +msgid "Text Widget" +msgstr "" + +#: src/Forms/Locator.php:184 +msgid "Block Widget" +msgstr "" + +#: src/Forms/Locator.php:232 +#: src/Forms/Locator.php:236 +#: src/Forms/Locator.php:312 +msgid "Locations" +msgstr "" + +#: src/Forms/Locator.php:237 +msgid "Form locations" +msgstr "" + +#: src/Forms/Locator.php:281 +#: src/Forms/Locator.php:311 +msgid "View form locations" +msgstr "" + +#: src/Forms/Locator.php:349 +msgid "Form Locations" +msgstr "" + +#: src/Forms/Locator.php:433 +msgid "Inactive widgets" +msgstr "" + +#: src/Forms/Locator.php:454 +msgid "Site editor template" +msgstr "" + +#: src/Forms/Locator.php:616 +msgid "(no title)" +msgstr "" + +#. translators: %s - form name. +#: src/Forms/Preview.php:178 +#, php-format +msgid "%s Template Preview" +msgstr "" + +#: src/Forms/Preview.php:179 +msgid "Form Template" +msgstr "" + +#. translators: %s - form name. +#: src/Forms/Preview.php:184 +#: src/Forms/Preview.php:390 +#, php-format +msgid "%s Preview" +msgstr "" + +#: src/Forms/Preview.php:222 +msgid "Edit Form Template" +msgstr "" + +#: src/Forms/Preview.php:264 +msgid "Close this window" +msgstr "" + +#: src/Forms/Preview.php:274 +msgid "This is a preview of the latest saved revision of your form template. If this preview does not match your template, save your changes and then refresh this page. This template preview is not publicly accessible." +msgstr "" + +#: src/Forms/Preview.php:275 +msgid "This is a preview of the latest saved revision of your form. If this preview does not match your form, save your changes and then refresh this page. This form preview is not publicly accessible." +msgstr "" + +#. translators: %s - WPForms doc link. +#: src/Forms/Preview.php:298 +#, php-format +msgid "For form testing tips, check out our complete guide!" +msgstr "" + +#: src/Forms/Preview.php:339 +msgid "You're viewing a preview of a form template." +msgstr "" + +#. translators: %s - time period, e.g. 24 hours. +#: src/Forms/Preview.php:347 +#, php-format +msgid "Entries are automatically deleted after %s." +msgstr "" + +#: src/Forms/Token.php:273 +msgid "Antispam token is invalid." +msgstr "" + +#: src/Forms/Token.php:285 +msgid "Antispam filter did not allow your data to pass through." +msgstr "" + +#: src/Forms/Token.php:299 +msgid "Please reload the page and try submitting the form again." +msgstr "" + +#. translators: placeholders are links. +#: src/Forms/Token.php:322 +#, php-format +msgid "Please check out our %1$stroubleshooting guide%2$s for details on resolving this issue." +msgstr "" + +#: src/Forms/Token.php:341 +msgid "Error updating token. Please try again or contact support if the issue persists." +msgstr "" + +#: src/Forms/Token.php:345 +msgid "Network error or server is unreachable. Check your connection or try again later." +msgstr "" + +#. translators: %s - URL to a non-amp version of a page with the form. +#: src/Frontend/Amp.php:95 +#, php-format +msgid "Go to the full page to view and submit the form." +msgstr "" + +#: src/Frontend/Amp.php:360 +msgid "Google reCAPTCHA v2" +msgstr "" + +#. translators: %1$s - CAPTCHA provider name, %2$s - URL to reCAPTCHA documentation. +#: src/Frontend/Amp.php:365 +#, php-format +msgid "%1$s is not supported by AMP and is currently disabled.
            Upgrade to reCAPTCHA v3 for full AMP support.
            Please note: this message is only displayed to site administrators." +msgstr "" + +#: src/Frontend/Frontend.php:782 +msgid "Please enable JavaScript in your browser to complete this form." +msgstr "" + +#: src/Frontend/Frontend.php:1857 +msgid "Click to accept this suggestion." +msgstr "" + +#. translators: %1$s - character count, %2$s - character limit. +#: src/Frontend/Frontend.php:1867 +#, php-format +msgid "%1$s of %2$s max characters." +msgstr "" + +#. translators: %1$s - word count, %2$s - word limit. +#: src/Frontend/Frontend.php:1875 +#, php-format +msgid "%1$s of %2$s max words." +msgstr "" + +#: src/Frontend/Frontend.php:1880 +msgid "Please enter a value greater than or equal to {0}." +msgstr "" + +#: src/Frontend/Frontend.php:1881 +msgid "Please enter a value less than or equal to {0}." +msgstr "" + +#: src/Frontend/Frontend.php:1900 +msgid "Country list" +msgstr "" + +#. translators: %s - URL to the troubleshooting guide. +#: src/Frontend/Frontend.php:2179 +#, php-format +msgid "Heads up! WPForms has detected an issue with JavaScript on this page. JavaScript is required for this form to work properly, so this form may not work as expected. See our troubleshooting guide to learn more or contact support." +msgstr "" + +#: src/Frontend/Frontend.php:2192 +msgid "This message is only displayed to site administrators." +msgstr "" + +#: src/Frontend/Modern.php:73 +#: src/Frontend/Modern.php:86 +#: src/Frontend/Modern.php:99 +#: src/Frontend/Modern.php:112 +#: src/Frontend/Modern.php:316 +msgid "Form error message" +msgstr "" + +#: src/Frontend/Modern.php:122 +msgid "Recaptcha error message" +msgstr "" + +#: src/Frontend/Modern.php:270 +#: src/Frontend/Modern.php:317 +msgid "Error message" +msgstr "" + +#: src/Frontend/Modern.php:318 +msgid "Submit button is disabled during form submission." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:92 +msgid "Empty prompt." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:133 +msgid "Empty field data." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:278 +msgid "Empty form data." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:292 +msgid "Form database object not found." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:358 +msgid "Form could not be created." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:415 +msgid "Please specify an element." +msgstr "" + +#: src/Integrations/AI/Admin/Ajax/Forms.php:422 +msgid "Sorry, you are not allowed to dismiss." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:132 +msgid "Bad response" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:133 +msgid "Clear chat history" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:134 +msgid "Yes, Continue" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:137 +msgid "Clear Chat History" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:138 +msgid "Are you sure you want to clear the AI chat history and start over?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:141 +msgid "An error occurred." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:142 +#: src/Integrations/AI/Admin/Builder/Forms.php:201 +#: src/Integrations/AI/API/Http/Response.php:82 +msgid "There appears to be a network error." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:143 +msgid "I'm not sure what to do with that." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:146 +msgid "Prohibited code has been removed." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:149 +msgid "Please try again." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:150 +msgid "Please try a different prompt. You might need to be more descriptive." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:151 +msgid "Only basic styling tags are permitted. All other code deemed unsafe has been removed." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:155 +msgid "Dock to the Left" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:155 +msgid "Dock to the Right" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:156 +msgid "Open in Popup" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:207 +msgid "Describe the choices you would like to create or use one of the examples below to get started." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:210 +msgid "What do you think of these choices? If you’re happy with them, you can insert these choices, or make changes by entering additional prompts." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:215 +#: src/Integrations/AI/Admin/Builder/Forms.php:247 +msgid "Learn More About WPForms AI" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:216 +msgid "It looks like you have some existing choices in this field. If you generate new choices, your existing choices will be overwritten. You can simply close this window if you’d like to keep your existing choices." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:217 +#: src/Integrations/AI/Admin/Builder/Forms.php:251 +msgid "What would you like to create?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:218 +#: src/Integrations/AI/Admin/Builder/Forms.php:252 +msgid "Just a minute..." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:219 +msgid "Insert Choices" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:222 +msgid "An error occurred while generating choices." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:223 +msgid "Sorry, you've reached your daily limit for generating choices." +msgstr "" + +#. translators: %s - WPForms contact support link. +#: src/Integrations/AI/Admin/Builder/Enqueues.php:228 +#, php-format +msgid "You may only generate choices 50 times per day. If you believe this is an error, please contact WPForms support." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:241 +msgid "Prohibited code has been removed from your choices." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:246 +msgid "american public holidays with dates in brackets" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:250 +msgid "provinces of canada ordered by population" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:254 +msgid "top 5 social networks in europe" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:258 +msgid "top 10 most spoken languages in the world" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:262 +msgid "top 20 most popular tropical travel destinations" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Enqueues.php:266 +msgid "30 household item categories for a marketplace" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/FieldOption.php:68 +msgid "Open AI Modal" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/FieldOption.php:125 +#: src/Integrations/AI/Admin/Builder/Forms.php:174 +#: src/Integrations/AI/Admin/Pages/Templates.php:70 +msgid "WPForms AI is not available on local sites." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:126 +#: src/Integrations/AI/Admin/Builder/Forms.php:169 +#: src/Integrations/AI/Admin/Pages/Templates.php:97 +msgid "Generate With AI" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:170 +#: src/Integrations/AI/Admin/Pages/Templates.php:99 +msgid "Write simple prompts to create complex forms catered to your specific needs." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:171 +#: src/Integrations/AI/Admin/Pages/Templates.php:102 +msgid "Generate Form" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:172 +msgid "Continue Generating" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:173 +#: src/Integrations/AI/Admin/Pages/Templates.php:98 +msgid "NEW!" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:177 +msgid "Back to Templates" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:178 +msgid "Build Your Form Fast With the Help of AI" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:179 +msgid "Not sure where to begin? Use our Generative AI tool to get started or take your pick from our wide variety of fields and start building out your form!" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:181 +msgid "This is just a preview of your form." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:182 +msgid "Click \"Use This Form\" to start editing." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:185 +msgid "Before We Proceed" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:186 +msgid "In order to build the best forms possible, we need to install some addons. Would you like to install the recommended addons?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:187 +msgid "In order to build the best forms possible, we need to activate some addons. Would you like to activate the recommended addons?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:188 +msgid "Yes, Install" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:190 +msgid "No, Thanks" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:191 +msgid "Don't show this again" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:192 +msgid "Okay" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:195 +msgid "Addons Installed" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:196 +msgid "Addons Activated" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:197 +msgid "You’re all set. We’re going to reload the builder and you can start building your form." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:198 +msgid "Addons Installation Error" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:199 +msgid "Addons Activation Error" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:200 +msgid "Can't install or activate the required addons." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:203 +msgid "Can't dismiss the modal window." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:208 +msgid "This Form Would Be Even Better With Fields From" +msgstr "" + +#. translators: %1$s - Upgrade to Pro link attributes. +#: src/Integrations/AI/Admin/Builder/Forms.php:210 +msgid "Upgrade to Pro and gain access to all fields and create the best possible forms." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:222 +msgid "You’re about to overwrite your existing form. This will delete all fields and reset external connections. Are you sure you want to continue?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:223 +msgid "The challenge will continue once AI form generation is complete" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:244 +msgid "Generate a Form" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:245 +msgid "Describe the form you would like to create or use one of the example prompts below to get started." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:249 +msgid "Go back to this version of the form" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:250 +msgid "Use This Form" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:254 +msgid "An error occurred while generating form." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:255 +msgid "Sorry, you've reached your daily limit for generating forms." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:258 +msgid "What do you think of the form I created for you? If you’re happy with it, you can use this form. Otherwise, make changes by entering additional prompts." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:259 +msgid "How’s that? Are you ready to use this form?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:260 +msgid "Does this look good? Are you ready to implement this form?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:261 +msgid "Is this what you had in mind? Are you satisfied with the results?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:262 +msgid "Happy with the form? Ready to move forward?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:263 +msgid "Is this form a good fit for your needs? Can we proceed?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:264 +msgid "Are you pleased with the outcome? Ready to use this form?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:265 +msgid "Does this form meet your expectations? Can we move on to the next step?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:266 +msgid "Is this form what you were envisioning? Are you ready to use it?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:267 +msgid "Satisfied with the form? Let's use it!" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:268 +msgid "Does this form align with your goals? Are you ready to implement it?" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:269 +msgid "Happy with the results? Let's put this form to work!" +msgstr "" + +#. translators: %1$s - Reload link class. +#: src/Integrations/AI/Admin/Builder/Forms.php:274 +#, php-format +msgid "Reload this window and try again." +msgstr "" + +#. translators: %s - WPForms contact support link. +#: src/Integrations/AI/Admin/Builder/Forms.php:286 +#, php-format +msgid "You may only generate forms 50 times per day. If you believe this is an error, please contact WPForms support." +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:301 +msgid "restaurant customer satisfaction survey" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:305 +msgid "online event registration" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:309 +msgid "job application for a web designer" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:313 +msgid "cancelation survey for a subscription" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:317 +msgid "takeout order for a pizza store" +msgstr "" + +#: src/Integrations/AI/Admin/Builder/Forms.php:321 +msgid "market vendor application" +msgstr "" + +#: src/Integrations/AI/Admin/Settings.php:49 +msgid "Hide AI Features" +msgstr "" + +#: src/Integrations/AI/Admin/Settings.php:50 +msgid "Hide everything related to AI in WPForms." +msgstr "" + +#: src/Integrations/AI/Admin/Settings.php:59 +msgid "AI features were hidden by filter or constant." +msgstr "" + +#: src/Integrations/AI/API/Forms.php:119 +msgid "Untitled Form" +msgstr "" + +#. translators: %1$s - error code, %2$s - error message. +#: src/Integrations/AI/API/Http/Response.php:105 +#, php-format +msgid "API response: %1$s %2$s" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Api/Api.php:376 +msgid "Cannot refresh the token." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Auth.php:62 +msgid "Please wait a moment..." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Auth.php:63 +msgid "There was an error while processing your request. Please try again." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Auth.php:108 +msgid "Invalid code." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Auth.php:135 +msgid "Invalid account." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Auth.php:150 +msgid "This email is already connected." +msgstr "" + +#: src/Integrations/ConstantContact/V3/ConstantContact.php:159 +msgid "Job Title" +msgstr "" + +#: src/Integrations/ConstantContact/V3/ConstantContact.php:160 +msgid "Company Name" +msgstr "" + +#. translators: %1$s - link to the migration page, %2$s - closing HTML tag. +#: src/Integrations/ConstantContact/V3/Migration/Migration.php:154 +#, php-format +msgid "You need to migrate your existing forms to the new version of the Constant Contact addon. Please %1$s click here%2$s to start the migration." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Migration/Migration.php:756 +msgid "Can't receive v2 lists and finish migration." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:203 +msgid "Subscribe" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:204 +msgid "Unsubscribe" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:205 +msgid "Delete subscriber" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:219 +msgid "--- Select Mailing List ---" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:222 +#: src/Providers/Provider/Settings/FormBuilder.php:125 +msgid "Custom Fields" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/FormBuilder.php:236 +msgid "Reason" +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/PageIntegrations.php:61 +msgid "Your Constant Contact account connection has expired. Please reconnect your account." +msgstr "" + +#: src/Integrations/ConstantContact/V3/Settings/PageIntegrations.php:73 +msgid "Reconnect Account" +msgstr "" + +#. translators: %s - forms overview page URL. +#: src/Integrations/DefaultContent/DefaultContent.php:58 +#, php-format +msgctxt "Theme starter content" +msgid "Create your contact form with WPForms in minutes." +msgstr "" + +#: src/Integrations/Divi/Divi.php:220 +#: templates/integrations/elementor/no-forms.php:20 +#: assets/js/integrations/gutenberg/modules/common.js:997 +#: assets/lite/js/integrations/gutenberg/formselector.es5.js:3314 +#: assets/pro/js/integrations/gutenberg/formselector.es5.js:3325 +msgid "You can use WPForms to build contact forms, surveys, payment forms, and more with just a few clicks." +msgstr "" + +#: src/Integrations/Divi/Divi.php:228 +msgid "comprehensive guide" +msgstr "" + +#: src/Integrations/Divi/Divi.php:229 +msgid "Need some help? Check out our" +msgstr "" + +#: src/Integrations/Divi/Divi.php:274 +msgid "You do not have permission to preview form." +msgstr "" + +#: src/Integrations/Divi/WPFormsSelector.php:59 +msgid "Select form" +msgstr "" + +#: src/Integrations/Divi/WPFormsSelector.php:73 +#: src/Integrations/Gutenberg/FormSelector.php:484 +msgid "Show Title" +msgstr "" + +#: src/Integrations/Divi/WPFormsSelector.php:83 +#: src/Integrations/Gutenberg/FormSelector.php:485 +msgid "Show Description" +msgstr "" + +#: src/Integrations/Elementor/Elementor.php:260 +msgid "To access the %name%, please enter and activate your WPForms license key in the plugin settings." +msgstr "" + +#: src/Integrations/Elementor/Elementor.php:261 +msgid "Enter License Key" +msgstr "" + +#: src/Integrations/Elementor/RestApi.php:128 +#: src/Integrations/Gutenberg/RestApi.php:129 +msgid "This route is private." +msgstr "" + +#: src/Integrations/Elementor/RestApi.php:145 +#: src/Integrations/Gutenberg/RestApi.php:146 +msgid "This route is accessible only to administrators." +msgstr "" + +#: src/Integrations/Elementor/RestApi.php:203 +#: src/Integrations/Gutenberg/RestApi.php:217 +msgid "Can't save theme data." +msgstr "" + +#: src/Integrations/Elementor/Widget.php:149 +msgid "You haven't created a form yet.
            What are you waiting for?" +msgstr "" + +#. translators: %s - WPForms documentation link. +#: src/Integrations/Elementor/Widget.php:177 +msgid "Need to make changes? Edit the selected form." +msgstr "" + +#. translators: %s - WPForms documentation link. +#: src/Integrations/Elementor/Widget.php:193 +#, php-format +msgid "Heads up! Don't forget to test your form. Check out our complete guide!" +msgstr "" + +#: src/Integrations/Elementor/Widget.php:233 +msgid "Display Options" +msgstr "" + +#: src/Integrations/Elementor/Widget.php:246 +#: src/Integrations/Elementor/Widget.php:260 +msgid "Show" +msgstr "" + +#: src/Integrations/Elementor/Widget.php:288 +#: templates/builder/themes/notices.php:31 +msgid "Upgrade your forms to use our modern markup and unlock extensive style controls." +msgstr "" + +#: src/Integrations/Elementor/Widget.php:289 +#: templates/builder/themes/notices.php:33 +msgid "Update your forms to use base and form theme styling and unlock extensive style controls." +msgstr "" + +#. translators: %s - WPForms documentation link. +#: src/Integrations/Elementor/Widget.php:298 +#, php-format +msgid "Want to customize your form styles without editing CSS?

            %1$s

            Learn more" +msgstr "" + +#: src/Integrations/Elementor/Widget.php:425 +msgid "Select a form" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:150 +#: src/Integrations/Gutenberg/FormSelector.php:497 +msgid "Form Styles are disabled because Lead Form Mode is turned on." +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:151 +#: src/Integrations/Gutenberg/FormSelector.php:498 +msgid "To change the styling for this form, open it in the form builder and edit the options in the Lead Forms settings." +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:202 +msgid "DELETE THEME" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:253 +#: src/Integrations/Elementor/WidgetModern.php:412 +#: src/Integrations/Elementor/WidgetModern.php:503 +msgid "Border Size (px)" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:266 +#: src/Integrations/Elementor/WidgetModern.php:425 +#: src/Integrations/Elementor/WidgetModern.php:516 +msgid "Border Radius (px)" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:353 +#: src/Integrations/Gutenberg/FormSelector.php:522 +msgid "Sublabel & Hint" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:483 +msgid "Padding (px)" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:650 +msgid "Width (px)" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:664 +msgid "Height (px)" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:752 +msgid "Additional Classes" +msgstr "" + +#: src/Integrations/Elementor/WidgetModern.php:754 +msgid "Separate multiple classes with spaces." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:429 +msgid "Select and display one of your forms." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:431 +msgid "form" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:432 +msgid "contact" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:433 +msgid "survey" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:435 +msgid "Select a Form" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:436 +msgid "Form Settings" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:473 +msgid "Repeat Horizontal" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:474 +msgid "Repeat Vertical" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:480 +msgid "Also used for other fields like Multiple Choice, Checkboxes, Rating, and NPS Survey." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:482 +msgid "Additional CSS Classes" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:487 +msgid "Do not forget to test your form." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:489 +msgid "Check out our complete guide!" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:490 +#: src/Integrations/Gutenberg/FormSelector.php:494 +msgid "Want to customize your form styles without editing CSS?" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:491 +msgid "Update WordPress to the latest version to use our modern markup and unlock the controls below." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:495 +msgid "Enable modern markup in your WPForms settings to unlock the controls below." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:504 +msgid "Menu" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:511 +msgid "Border Style" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:516 +msgid "Double" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:520 +msgid "Colors" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:523 +msgid "Error Message" +msgstr "" + +#. Translators: %1$s: Opening strong tag, %2$s: Closing strong tag. +#: src/Integrations/Gutenberg/FormSelector.php:535 +#, php-format +msgid "You can use %1$sWPForms%2$s to build contact forms, surveys, payment forms, and more with just a few clicks." +msgstr "" + +#. Translators: %1$s: Opening anchor tag, %2$s: Closing anchor tag. +#: src/Integrations/Gutenberg/FormSelector.php:537 +#, php-format +msgid "Need some help? Check out our %1$scomprehensive guide.%2$s" +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:542 +msgid "It looks like the form you had selected is in the Trash or has been permanently deleted." +msgstr "" + +#: src/Integrations/Gutenberg/FormSelector.php:862 +msgid "The form cannot be displayed." +msgstr "" + +#: src/Integrations/Gutenberg/RestApi.php:203 +msgid "Can't create themes storage file." +msgstr "" + +#. translators: %s - WPForms documentation link. +#: src/Integrations/LiteConnect/Integration.php:366 +#, php-format +msgid "Your form entries can’t be backed up because WPForms can’t connect to the backup server. If you’d like to back up your entries, find out how to fix entry backup issues." +msgstr "" + +#: src/Integrations/LiteConnect/LiteConnect.php:240 +msgid "This is the Lite Connect endpoint page." +msgstr "" + +#: src/Integrations/SMTP/Notifications.php:66 +#: src/Integrations/SMTP/Notifications.php:90 +msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." +msgstr "" + +#: src/Integrations/SMTP/Notifications.php:91 +#: src/Integrations/SMTP/Notifications.php:125 +msgid "Notifications can only use 1 From Email. Please do not enter multiple addresses." +msgstr "" + +#: src/Integrations/SMTP/Notifications.php:92 +msgid "This smart tag does not point to an Email field in your form." +msgstr "" + +#. translators: %1$s - WordPress site domain. +#: src/Integrations/SMTP/Notifications.php:180 +#, php-format +msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam." +msgstr "" + +#. translators: %1$s - WP Mail SMTP install page URL. +#: src/Integrations/SMTP/Notifications.php:193 +#, php-format +msgid "We strongly recommend that you install the free WP Mail SMTP plugin! The Setup Wizard makes it easy to fix your emails." +msgstr "" + +#. translators: %1$s - WordPress site domain. +#: src/Integrations/SMTP/Notifications.php:209 +#, php-format +msgid "Alternately, try using a From Address that matches your website domain (admin@%1$s)." +msgstr "" + +#. translators: %1$s - fixing email delivery issues doc URL. +#: src/Integrations/SMTP/Notifications.php:215 +#, php-format +msgid "Please check out our doc on fixing email delivery issues for more details." +msgstr "" + +#: src/Integrations/Square/AddonCompatibility.php:64 +msgid "The WPForms Square addon is out of date. To avoid payment processing issues, please upgrade the Square addon to the latest version." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Enqueues.php:80 +msgid "

            Square account connection is required when using the Square field.

            To proceed, please go to WPForms Settings » Payments » Square and press Connect with Square button.

            " +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Enqueues.php:88 +msgid "

            Square Payments must be enabled when using the Square field.

            To proceed, please go to Payments » Square and check Enable Square Payments.

            " +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Enqueues.php:96 +msgid "

            AJAX form submissions are required when using the Square field.

            To proceed, please go to Settings » General » Advanced and check Enable AJAX form submission.

            " +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Enqueues.php:103 +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:49 +msgid "Missing Required Fields" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Enqueues.php:104 +msgid "When recurring subscription payments are enabled, the Customer Email and Customer Name are required." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Enqueues.php:106 +msgid "Please go to the Square payment settings and select a Customer Email and Customer Name." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Notifications.php:55 +msgid "Enable for Square completed payments" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Notifications.php:109 +msgid "The Square Pro addon is required to enable notification for completed payments. Would you like to install and activate it?" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Notifications.php:119 +msgid "The Square Pro addon is required to enable notification for completed payments. Would you like to activate it?" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Notifications.php:127 +msgid "Notification for Square Completed Payments" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Settings.php:219 +#: src/Integrations/Stripe/Admin/Builder/Settings.php:243 +msgid "Enable Conditional Logic" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Settings.php:260 +msgid "The Square Pro addon is required to enable conditional logic for payments. Would you like to install and activate it?" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Settings.php:270 +msgid "The Square Pro addon is required to enable conditional logic for payments. Would you like to activate it?" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:77 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:362 +msgid "Payment Description" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:80 +msgid "Enter your payment description. Eg: Donation for the soccer team." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:90 +msgid "Buyer Email" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:94 +msgid "--- Select Buyer Email ---" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:95 +msgid "Select the field that contains the buyer's email address. This field is optional." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:105 +msgid "Billing Name" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:109 +msgid "--- Select Billing Name ---" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:110 +msgid "Select the field that contains the billing's name. This field is optional." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:142 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:430 +msgid "Enter the subscription name. Eg: Email Newsletter. Subscription period and price are automatically appended. If left empty the form name will be used." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:153 +msgid "Phase Cadence" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:160 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:455 +msgid "How often you would like the charge to recur." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:179 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:379 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:394 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:496 +msgid "--- Select Email ---" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:180 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:497 +msgid "Select the field that contains the customer's email address. This field is required." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:192 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:569 +msgid "Customer Name" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:199 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:555 +msgid "--- Select Name ---" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:200 +msgid "Select the field that contains the customer's name. This field is required." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:221 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:111 +msgid "One-Time Payments" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:229 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:119 +msgid "Enable one-time payments" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:233 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:123 +msgid "Allow your customers to one-time pay via the form." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:255 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:145 +msgid "Recurring Payments " +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:266 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:156 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:333 +msgid "Enable recurring subscription payments" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:270 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:160 +msgid "Allow your customer to pay recurringly via the form." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:308 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:199 +msgid "Add New Plan" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:315 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:226 +msgid "Multiple Subscriptions" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:335 +msgid "Square Pro" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:361 +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:382 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:605 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:620 +msgid "Customer Address" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:368 +msgid "Select the field that contains the customer's Address. This field is optional." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:373 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:589 +msgid "--- Select Address ---" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:389 +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:401 +msgid "Billing Address" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:391 +msgid "Select the field that contains the billing's address. This field is optional." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:394 +msgid "--- Select Billing Address ---" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:420 +msgid "Heads up! Square payments can't be enabled yet." +msgstr "" + +#. translators: %s - Admin area Payments settings page URL. +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:423 +#, php-format +msgid "First, please connect to your Square account on the WPForms Settings page." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:440 +msgid "Square payments can't be processed because there's a problem with the account connection." +msgstr "" + +#. translators: %s - the WPForms Payments settings page URL. +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:443 +#, php-format +msgid "First, please resolve the connection issue on the Payment Settings page." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:450 +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:471 +#: src/Integrations/Square/Admin/Settings.php:377 +#: src/Integrations/Square/Admin/Settings.php:390 +msgid "Sandbox" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:450 +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:471 +#: src/Integrations/Square/Admin/Settings.php:377 +#: src/Integrations/Square/Admin/Settings.php:390 +msgid "Production" +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:461 +msgid "Heads up! Square account connection is expired." +msgstr "" + +#. translators: %s - the WPForms Payments settings page URL. +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:464 +#, php-format +msgid "Tokens must be refreshed. Please refresh them on the WPForms Settings page." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:528 +msgid "To use Square, first add the Square payment field to your form." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:546 +msgid "Connect WPForms to Square." +msgstr "" + +#: src/Integrations/Square/Admin/Builder/Traits/Content.php:562 +msgid "Learn more about our Square integration." +msgstr "" + +#: src/Integrations/Square/Admin/Connect.php:258 +#: src/Integrations/Square/Api/WebhooksManager.php:42 +msgid "You are not allowed to perform this action" +msgstr "" + +#: src/Integrations/Square/Admin/Connect.php:261 +msgid "Something went wrong while performing a refresh tokens request" +msgstr "" + +#: src/Integrations/Square/Admin/Connect.php:408 +msgid "Square Error: We could not connect to Square. No tokens were given." +msgstr "" + +#: src/Integrations/Square/Admin/Connect.php:427 +msgid "Square Error: We could not save an account connection safely. Please, try again later." +msgstr "" + +#: src/Integrations/Square/Admin/Notices.php:80 +msgid "There Are Some Problems With Your Square Connection" +msgstr "" + +#: src/Integrations/Square/Admin/Notices.php:103 +msgid "Square account connection is missing required data. You must reconnect your Square account." +msgstr "" + +#: src/Integrations/Square/Admin/Notices.php:107 +msgid "Square account connection is invalid. You must reconnect your Square account." +msgstr "" + +#: src/Integrations/Square/Admin/Notices.php:111 +msgid "Square account connection is expired. Tokens must be refreshed." +msgstr "" + +#: src/Integrations/Square/Admin/Notices.php:115 +#: src/Integrations/Square/Admin/Settings.php:308 +msgid "Business Location is required to process Square payments." +msgstr "" + +#. translators: %1$s - Selected currency on the WPForms Settings admin page; %2$s - Currency of a business location. +#: src/Integrations/Square/Admin/Notices.php:123 +#, php-format +msgid "The currency you have set (%1$s) does not match the currency of your Square business location (%2$s). Please choose a different business location or update your WPForms currency to %2$s." +msgstr "" + +#: src/Integrations/Square/Admin/Notices.php:153 +#: src/Integrations/Square/Admin/WebhookSettings.php:207 +msgid "Webhooks are enabled, but not yet connected." +msgstr "" + +#. translators: %s - general admin settings page URL. +#: src/Integrations/Square/Admin/Notices.php:216 +#, php-format +msgid "Pay-as-you-go Pricing
            3%% fee per-transaction + Square fees. Activate your license to remove additional fees and unlock powerful features." +msgstr "" + +#. translators: %s - general admin settings page URL. +#: src/Integrations/Square/Admin/Notices.php:232 +#, php-format +msgid "Pay-as-you-go Pricing
            3%% fee per-transaction + Square fees. Renew your license to remove additional fees and unlock powerful features." +msgstr "" + +#. translators: %s - WPForms.com Upgrade page URL. +#: src/Integrations/Square/Admin/Notices.php:263 +#, php-format +msgid "Pay-as-you-go Pricing
            3%% fee per-transaction + Square fees. Upgrade to Pro to remove additional fees and unlock powerful features." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:102 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:122 +msgid "Refund failed." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:111 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:139 +msgid "Refund successful." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:114 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:142 +msgid "Saving refund in the database failed." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:131 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:175 +msgid "Subscription cancellation failed." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:135 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:179 +msgid "Subscription cancelled." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:138 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:182 +msgid "Updating subscription in the database failed." +msgstr "" + +#: src/Integrations/Square/Admin/Payments/SingleActionsHandler.php:160 +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:109 +msgid "Payment not found in the database." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:114 +msgid "

            Switching sandbox/production modes requires Square account reconnection.

            Press the \"Connect with Square\" button after saving the settings to reconnect.

            " +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:123 +msgid "Something went wrong while performing a refresh tokens request." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:124 +#: src/Integrations/Square/Admin/Settings.php:140 +msgid "Personal Access Token" +msgstr "" + +#. translators: %s - the Square developer dashboard URL. +#: src/Integrations/Square/Admin/Settings.php:127 +#, php-format +msgid "

            To receive events, create a webhook route by providing your Personal Access Token, which you can find after registering an app on the Square Developer Dashboard. You can also set it up manually in the Advanced section.

            See our documentation for details.

            " +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:141 +msgid "Personal Access Token is required to proceed." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:177 +#: src/Integrations/Stripe/Admin/Settings.php:196 +msgid "Connection Status" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:190 +msgid "Business Location" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:191 +msgid "Only active locations that support credit card processing in Square can be chosen." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:209 +#: src/Integrations/Stripe/Admin/Settings.php:202 +msgid "Test Mode" +msgstr "" + +#. translators: %s - WPForms.com URL for Square payment with more details. +#: src/Integrations/Square/Admin/Settings.php:212 +#, php-format +msgid "Prevent Square from processing live transactions. Learn More" +msgstr "" + +#. translators: %s - WPForms.com Square documentation article URL. +#: src/Integrations/Square/Admin/Settings.php:255 +#, php-format +msgid "Easily collect credit card payments with Square. For getting started and more information, see our Square documentation." +msgstr "" + +#. translators: %s - Square mode. +#: src/Integrations/Square/Admin/Settings.php:372 +#, php-format +msgid "Connected to Square in %s mode." +msgstr "" + +#. translators: %1$s - Square connected account name; %2$s - Square mode. +#: src/Integrations/Square/Admin/Settings.php:383 +#, php-format +msgid "Connected to Square as %1$s in %2$s mode." +msgstr "" + +#. translators: %s - WPForms.com Square documentation article URL. +#: src/Integrations/Square/Admin/Settings.php:409 +#, php-format +msgid "Securely connect to Square with just a few clicks to begin accepting payments! Learn More" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:435 +msgid "Your connection is missing required data. You must reconnect your Square account." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:450 +msgid "It appears your connection may be invalid. You must refresh tokens or reconnect your account." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:466 +msgid "Your connection is expired. You must refresh tokens or reconnect your account." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:482 +msgid "WPForms currency and Business Location currency are not matched." +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:501 +msgid "Connect Square account" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:502 +msgid "Connect with Square" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:523 +msgid "Disconnect Square account" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:545 +msgid "Refresh connection tokens" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:546 +msgid "Refresh tokens" +msgstr "" + +#: src/Integrations/Square/Admin/Settings.php:575 +msgid "No locations were found" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:55 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:47 +msgid "Enable Webhooks" +msgstr "" + +#. translators: %s - WPForms.com URL for Square webhooks documentation. +#: src/Integrations/Square/Admin/WebhookSettings.php:61 +#, php-format +msgid "Square uses webhooks to notify WPForms when an event has occurred in your Square account. Please see our documentation on Square webhooks for full details." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:100 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:77 +msgid "Webhooks Method" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:104 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:81 +msgid "REST API (recommended)" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:105 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:82 +msgid "PHP listener" +msgstr "" + +#. translators: %s - WPForms.com URL for Square webhooks documentation. +#: src/Integrations/Square/Admin/WebhookSettings.php:109 +#, php-format +msgid "Choose the method of communication between Square and WPForms. If REST API support is disabled for WordPress, use PHP listener. Learn more." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:133 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:102 +msgid "Webhooks Endpoint" +msgstr "" + +#. translators: %s - Square Dashboard Webhooks Settings URL. +#: src/Integrations/Square/Admin/WebhookSettings.php:139 +#, php-format +msgid "Ensure an endpoint with the above URL is present in the Square webhook settings." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:155 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:123 +msgid "Webhooks Test ID" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:163 +msgid "Webhooks Test Signature Key" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:171 +#: src/Integrations/Stripe/Admin/WebhookSettings.php:139 +msgid "Webhooks Live ID" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:179 +msgid "Webhooks Live Signature Key" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:223 +msgid "Make sure that Webhooks Endpoint is updated inside the Square app after Webhooks Method switch." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:239 +msgid "Live Mode Endpoint Subscription ID" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:240 +msgid "Test Mode Endpoint Subscription ID" +msgstr "" + +#. translators: %1$s - Live Mode Endpoint ID or Test Mode Endpoint ID. %2$s - Square Dashboard Webhooks Settings URL. +#: src/Integrations/Square/Admin/WebhookSettings.php:245 +#, php-format +msgid "Retrieve your %1$s from your Square webhook settings. Select the endpoint, then click Copy button." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:271 +msgid "Live Mode Signature Key" +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:272 +msgid "Test Mode Signature Key" +msgstr "" + +#. translators: %1$s - Live Mode Signing Secret or Test Mode Signing Secret. %2$s - Square Dashboard Webhooks Settings URL. +#: src/Integrations/Square/Admin/WebhookSettings.php:277 +#, php-format +msgid "Retrieve your %1$s from your Square webhook settings. Select the endpoint, then click Reveal." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:408 +msgid "Webhooks are connected and active." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:414 +msgid "Press here to see the further instructions." +msgstr "" + +#: src/Integrations/Square/Admin/WebhookSettings.php:415 +msgid "Connect Webhooks" +msgstr "" + +#. translators: %s - WPForms.com URL for Square webhooks documentation. +#: src/Integrations/Square/Admin/WebhookSettings.php:422 +#, php-format +msgid "To start using webhooks, please register a webhook route inside our application. You can do this by pressing the button above or setting the credentials manually. Please see our documentation on Square webhooks for full details." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:140 +msgid "Square account connection is missing." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:146 +msgid "Square account connection is invalid." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:152 +msgid "The currency associated with the payment is not valid for the provided business location." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:164 +msgid "Square payment stopped, missing card tokens." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:178 +msgid "Missing location ID." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:182 +msgid "Missing currency." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:186 +msgid "Missing amount." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:200 +msgid "Missing order/payment items." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:632 +#: src/Integrations/Square/Api/Api.php:641 +msgid "Square fail: order was not created." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:688 +#: src/Integrations/Square/Api/Api.php:699 +msgid "Square fail: payment was not processed." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1102 +msgid "Missing subscription plan name." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1106 +msgid "Missing subscription plan variation name." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1110 +msgid "Missing subscription cadence." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1114 +msgid "Missing customer name." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1118 +msgid "Missing customer email." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1365 +#: src/Integrations/Square/Api/Api.php:1374 +msgid "Square fail: customer was not created." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1420 +#: src/Integrations/Square/Api/Api.php:1429 +msgid "Square fail: customer card was not created." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1511 +#: src/Integrations/Square/Api/Api.php:1520 +msgid "Square fail: subscription plan was not created." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1541 +#: src/Integrations/Square/Api/Api.php:1550 +msgid "Square fail: subscription plan variation was not created." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1571 +#: src/Integrations/Square/Api/Api.php:1580 +msgid "Square fail: something went wrong during subscription process." +msgstr "" + +#: src/Integrations/Square/Api/Api.php:1628 +#: src/Integrations/Square/Api/Api.php:1637 +msgid "Square fail: something went wrong during subscription update." +msgstr "" + +#: src/Integrations/Square/Api/WebhookRoute.php:156 +msgid "It seems to be request to Square PHP Listener method handler but the site is not configured to use it." +msgstr "" + +#. translators: %s - transaction id. +#: src/Integrations/Square/Api/Webhooks/RefundUpdated.php:55 +#, php-format +msgid "Payment for transaction %s was not updated." +msgstr "" + +#: src/Integrations/Square/Api/WebhooksManager.php:48 +msgid "Personal access token is required." +msgstr "" + +#: src/Integrations/Square/Api/WebhooksManager.php:60 +msgid "Webhook created successfully!" +msgstr "" + +#: src/Integrations/Square/Api/WebhooksManager.php:63 +msgid "Failed to create webhook." +msgstr "" + +#: src/Integrations/Square/CurlCompatibility.php:56 +msgid "The WPForms Square payments require cURL to be enabled to work correctly." +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:99 +#: src/Integrations/Square/Fields/Square.php:535 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:61 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:160 +msgid "Card" +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:381 +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:337 +msgid "This page is insecure. Credit Card field should be used for testing purposes only." +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:389 +msgid "Credit Card field is disabled, Square account connection is missing." +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:397 +msgid "Credit Card field is disabled, Square account connection is invalid. Please, contact to the site administrator." +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:405 +msgid "Credit Card field is disabled, Square payments are not enabled in the form settings." +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:413 +msgid "Heads up! Square account connection is expired. Tokens must be refreshed." +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:528 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:142 +#: src/Integrations/Stripe/Fields/StripeCreditCard.php:247 +msgid "Card number" +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:531 +msgid "MM/YY" +msgstr "" + +#: src/Integrations/Square/Fields/Square.php:532 +msgid "CVV" +msgstr "" + +#: src/Integrations/Square/Frontend.php:142 +msgid "Square.js failed to load properly." +msgstr "" + +#: src/Integrations/Square/Frontend.php:143 +msgid "An unexpected Square SDK error has occurred." +msgstr "" + +#: src/Integrations/Square/Frontend.php:144 +msgid "Client ID and/or Location ID is incorrect." +msgstr "" + +#: src/Integrations/Square/Frontend.php:145 +msgid "Initializing Card failed." +msgstr "" + +#: src/Integrations/Square/Frontend.php:146 +msgid "Tokenization of the payment card failed." +msgstr "" + +#: src/Integrations/Square/Frontend.php:147 +msgid "Tokenization failed with status:" +msgstr "" + +#: src/Integrations/Square/Frontend.php:148 +msgid "The verification was not successful. An issue occurred while verifying the buyer." +msgstr "" + +#: src/Integrations/Square/Frontend.php:149 +#: src/Integrations/Stripe/Frontend.php:172 +msgid "Please fill out payment details to continue." +msgstr "" + +#: src/Integrations/Square/Helpers.php:423 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:448 +#: src/Integrations/Stripe/Api/Common.php:373 +msgid "Daily" +msgstr "" + +#: src/Integrations/Square/Helpers.php:428 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:449 +#: src/Integrations/Stripe/Api/Common.php:379 +msgid "Weekly" +msgstr "" + +#: src/Integrations/Square/Helpers.php:433 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:450 +#: src/Integrations/Stripe/Api/Common.php:385 +msgid "Monthly" +msgstr "" + +#: src/Integrations/Square/Helpers.php:438 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:451 +#: src/Integrations/Stripe/Api/Common.php:391 +msgid "Quarterly" +msgstr "" + +#: src/Integrations/Square/Helpers.php:443 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:452 +#: src/Integrations/Stripe/Api/Common.php:397 +msgid "Semi-Yearly" +msgstr "" + +#: src/Integrations/Square/Helpers.php:448 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:453 +#: src/Integrations/Stripe/Api/Common.php:403 +msgid "Yearly" +msgstr "" + +#: src/Integrations/Square/Process.php:261 +msgid "Square payment stopped, account connection is missing." +msgstr "" + +#: src/Integrations/Square/Process.php:272 +msgid "Square payment stopped, amount is smaller than the allowed minimum amount for a payment." +msgstr "" + +#: src/Integrations/Square/Process.php:289 +msgid "Square payment stopped, missing payment fields." +msgstr "" + +#: src/Integrations/Square/Process.php:438 +msgid "Square Subscription payment stopped validation error." +msgstr "" + +#: src/Integrations/Square/Process.php:528 +msgid "Square subscription payment stopped, missing form settings." +msgstr "" + +#: src/Integrations/Square/Process.php:533 +msgid "Square subscription payment stopped, customer email not found." +msgstr "" + +#: src/Integrations/Square/Process.php:538 +msgid "Square subscription payment stopped, customer name not found." +msgstr "" + +#. translators: %d - Form ID. +#: src/Integrations/Square/Process.php:712 +#, php-format +msgid "Form #%d" +msgstr "" + +#: src/Integrations/Square/Process.php:859 +msgid "Square subscription payment stopped" +msgstr "" + +#: src/Integrations/Square/Process.php:861 +msgid "Square payment stopped" +msgstr "" + +#. translators: %s - WPForms.com URL for Square webhooks documentation. +#: src/Integrations/Square/WebhooksHealthCheck.php:204 +#, php-format +msgid "Looks like you have a problem with your webhooks configuration. Please check and confirm that you've configured the WPForms webhooks in your Square account. This notice will disappear automatically when a new Square request comes in. See our documentation for more information." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:50 +msgid "When recurring subscription payments are enabled, the Customer Email is required." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:51 +msgid "In order to complete your form's Stripe One-Time Payments, please check that all required (*) fields have been filled out." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:52 +msgid "In order to complete your form's Stripe Recurring Subscription Payments, please check that all required (*) fields have been filled out." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:53 +msgid "In order to complete your form's Stripe One-Time Payments and Recurring Subscription Payments, please check that all required (*) fields have been filled out." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:55 +msgid "Please go to the Stripe payment settings and fill out the required field(s)." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Enqueues.php:119 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:475 +msgid "Unlimited" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Notifications.php:55 +msgid "Enable for Stripe completed payments" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Notifications.php:109 +msgid "The Stripe Pro addon is required to enable notification for completed payments. Would you like to install and activate it?" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Notifications.php:119 +msgid "The Stripe Pro addon is required to enable notification for completed payments. Would you like to activate it?" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Notifications.php:127 +msgid "Notification for Stripe Completed Payments" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Settings.php:283 +msgid "The Stripe Pro addon is required to enable conditional logic for payments. Would you like to install and activate it?" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Settings.php:293 +msgid "The Stripe Pro addon is required to enable conditional logic for payments. Would you like to activate it?" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:216 +msgid "Stripe Pro" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:251 +msgid "Heads up! Stripe payments can't be enabled yet." +msgstr "" + +#. translators: %1$s - admin area Payments settings page URL. +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:255 +#, php-format +msgid "First, please connect to your Stripe account on the WPForms Settings page." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:287 +msgid "To use Stripe, first add the Stripe payment field to your form." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:307 +msgid "Enable Stripe payments" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:326 +msgid "Subscriptions" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:365 +msgid "Enter your payment description. Eg: Donation for the soccer team. Only used for standard one-time payments." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:375 +msgid "Stripe Payment Receipt" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:380 +msgid "If you would like to have Stripe send a receipt after payment, select the email field to use. This is optional but recommended. Only used for standard one-time payments." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:395 +msgid "Select the field that contains the customer's email address. This is optional but recommended." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:441 +msgid "Recurring Period" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:469 +msgid "Recurring Cycles" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:476 +msgid "How many times you want the payment to repeat. Stripe supports up to 100 recurrences or a maximum duration of 20 years, whichever comes first." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:521 +msgid "Connect WPForms to Stripe." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:537 +msgid "Learn more about our Stripe integration." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:556 +msgid "Select the field that contains the customer's name. This is optional but recommended." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:612 +msgid "Select the field that contains the customer's address. This is optional but required for some regions." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:630 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:640 +msgid "Shipping Address" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:632 +msgid "Select the field that contains the shipping address. This is optional but required for some regions." +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:662 +msgid "--- Select Phone ---" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:676 +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:691 +msgid "Customer Phone" +msgstr "" + +#: src/Integrations/Stripe/Admin/Builder/Traits/ContentTrait.php:683 +msgid "Select the field that contains the customer's phone. This is optional but recommended." +msgstr "" + +#. translators: %s - general admin settings page URL. +#: src/Integrations/Stripe/Admin/Notices.php:75 +#, php-format +msgid "Pay-as-you-go Pricing
            3%% fee per-transaction + Stripe fees. Activate your license to remove additional fees and unlock powerful features." +msgstr "" + +#. translators: %s - general admin settings page URL. +#: src/Integrations/Stripe/Admin/Notices.php:91 +#, php-format +msgid "Pay-as-you-go Pricing
            3%% fee per-transaction + Stripe fees. Renew your license to remove additional fees and unlock powerful features." +msgstr "" + +#. translators: %s - WPForms.com Upgrade page URL. +#: src/Integrations/Stripe/Admin/Notices.php:122 +#, php-format +msgid "Pay-as-you-go Pricing
            3%% fee per-transaction + Stripe fees. Upgrade to Pro to remove additional fees and unlock powerful features." +msgstr "" + +#: src/Integrations/Stripe/Admin/Notices.php:153 +msgid "A new and improved Stripe interface is available with new Stripe Pro addon." +msgstr "" + +#: src/Integrations/Stripe/Admin/Notices.php:155 +msgid "A new and improved Stripe interface is available when you create new forms." +msgstr "" + +#: src/Integrations/Stripe/Admin/Notices.php:167 +msgid "What's new?" +msgstr "" + +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:95 +msgid "Missing payment ID." +msgstr "" + +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:155 +msgid "Payment ID not provided." +msgstr "" + +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:169 +msgid "Subscription not found in the database." +msgstr "" + +#. translators: %s - Payments settings page URL. +#: src/Integrations/Stripe/Admin/Payments/SingleActionsHandler.php:201 +#, php-format +msgid "The used Stripe payment collection type doesn't support this action.

            Please update your payment collection type to continue processing payments successfully." +msgstr "" + +#: src/Integrations/Stripe/Admin/Settings.php:78 +msgid "Stripe is not connected for your current payment mode. Please press the \"Connect with Stripe\" button to complete this setup." +msgstr "" + +#. translators: %1$s - Selected currency on the WPForms Settings admin page. +#: src/Integrations/Stripe/Admin/Settings.php:114 +#, php-format +msgid "Payments Cannot Be Processed
            The currency you have set (%1$s) is not supported by Stripe. Please choose a different currency." +msgstr "" + +#: src/Integrations/Stripe/Admin/Settings.php:151 +msgid "

            Switching test/live modes requires Stripe account reconnection.

            Press the \"Connect with Stripe\" button after saving the settings to reconnect.

            " +msgstr "" + +#. translators: %s - WPForms.com URL for Stripe payments with more details. +#: src/Integrations/Stripe/Admin/Settings.php:207 +#, php-format +msgid "Prevent Stripe from processing live transactions. Please see our documentation on Stripe test payments for full details." +msgstr "" + +#: src/Integrations/Stripe/Admin/Settings.php:230 +msgid "Credit Card Field Mode" +msgstr "" + +#: src/Integrations/Stripe/Admin/Settings.php:235 +msgid "Card Element" +msgstr "" + +#: src/Integrations/Stripe/Admin/Settings.php:236 +msgid "Payment Element" +msgstr "" + +#. translators: %s - WPForms.com Stripe documentation article URL. +#: src/Integrations/Stripe/Admin/Settings.php:277 +#, php-format +msgid "Easily collect credit card payments with Stripe. For getting started and more information, see our Stripe documentation." +msgstr "" + +#. translators: %1$s - Stripe account name connected, %2$s - Stripe mode connected (live or test). +#: src/Integrations/Stripe/Admin/Settings.php:344 +#, php-format +msgid "Connected to Stripe as %1$s in %2$s Mode." +msgstr "" + +#. translators: %s - Stripe connect URL. +#: src/Integrations/Stripe/Admin/Settings.php:357 +#, php-format +msgid "Switch Accounts" +msgstr "" + +#. translators: %s - Stripe disconnect URL. +#: src/Integrations/Stripe/Admin/Settings.php:370 +#, php-format +msgid "Disconnect" +msgstr "" + +#. translators: %s - WPForms.com Stripe documentation article URL. +#: src/Integrations/Stripe/Admin/Settings.php:398 +#, php-format +msgid "Securely connect to Stripe with just a few clicks to begin accepting payments! Learn More" +msgstr "" + +#: src/Integrations/Stripe/Admin/Settings.php:414 +msgid "Connect with Stripe" +msgstr "" + +#. translators: %s - WPForms.com Stripe documentation article URL. +#: src/Integrations/Stripe/Admin/Settings.php:430 +#, php-format +msgid "Please see our documentation on Stripe Credit Card field modes for full details." +msgstr "" + +#. translators: %s - WPForms.com URL for Stripe webhooks documentation. +#: src/Integrations/Stripe/Admin/WebhookSettings.php:53 +#, php-format +msgid "Stripe uses webhooks to notify WPForms when an event has occurred in your Stripe account. Please see our documentation on Stripe webhooks for full details." +msgstr "" + +#. translators: %s - WPForms.com URL for Stripe webhooks documentation. +#: src/Integrations/Stripe/Admin/WebhookSettings.php:86 +#, php-format +msgid "Choose the method of communication between Stripe and WPForms. If REST API support is disabled for WordPress, use PHP listener. Learn more." +msgstr "" + +#. translators: %s - Stripe Webhooks Settings url. +#: src/Integrations/Stripe/Admin/WebhookSettings.php:107 +#, php-format +msgid "Ensure an endpoint with the above URL is present in the Stripe webhook settings." +msgstr "" + +#: src/Integrations/Stripe/Admin/WebhookSettings.php:131 +msgid "Webhooks Test Secret" +msgstr "" + +#: src/Integrations/Stripe/Admin/WebhookSettings.php:147 +msgid "Webhooks Live Secret" +msgstr "" + +#: src/Integrations/Stripe/Admin/WebhookSettings.php:168 +msgid "Live Mode Endpoint ID" +msgstr "" + +#: src/Integrations/Stripe/Admin/WebhookSettings.php:169 +msgid "Test Mode Endpoint ID" +msgstr "" + +#. translators: %1$s - Live Mode Endpoint ID or Test Mode Endpoint ID. %2$s - WPForms.com Stripe documentation article URL. +#: src/Integrations/Stripe/Admin/WebhookSettings.php:174 +#, php-format +msgid "Retrieve your %1$s from your Stripe webhook settings. Select the endpoint, then click Copy button." +msgstr "" + +#: src/Integrations/Stripe/Admin/WebhookSettings.php:200 +msgid "Live Mode Signing Secret" +msgstr "" + +#: src/Integrations/Stripe/Admin/WebhookSettings.php:201 +msgid "Test Mode Signing Secret" +msgstr "" + +#. translators: %1$s - Live Mode Signing Secret or Test Mode Signing Secret. %2$s - WPForms.com Stripe documentation article URL. +#: src/Integrations/Stripe/Admin/WebhookSettings.php:206 +#, php-format +msgid "Retrieve your %1$s from your Stripe webhook settings. Select the endpoint, then click Reveal." +msgstr "" + +#: src/Integrations/Stripe/Api/Common.php:316 +msgid "Too many requests made to the API too quickly." +msgstr "" + +#: src/Integrations/Stripe/Api/Common.php:317 +msgid "Invalid parameters were supplied to Stripe API." +msgstr "" + +#: src/Integrations/Stripe/Api/Common.php:318 +msgid "Authentication with Stripe API failed." +msgstr "" + +#: src/Integrations/Stripe/Api/Common.php:319 +msgid "Network communication with Stripe failed." +msgstr "" + +#: src/Integrations/Stripe/Api/Common.php:320 +msgid "Unable to process Stripe payment." +msgstr "" + +#: src/Integrations/Stripe/Api/Common.php:321 +msgid "Unable to process payment." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:242 +msgid "Stripe payment stopped, missing both PaymentMethod and PaymentIntent ids." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:441 +msgid "Stripe payment stopped, missing PaymentMethod id." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:470 +msgid "Stripe payment stopped. Invalid PaymentIntent status." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:507 +msgid "Stripe payment was not confirmed. Please check your Stripe dashboard." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:549 +msgid "Stripe subscription stopped, missing PaymentMethod id." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:596 +msgid "Stripe subscription stopped. invalid PaymentIntent status." +msgstr "" + +#: src/Integrations/Stripe/Api/PaymentIntents.php:633 +msgid "Stripe subscription was not confirmed. Please check your Stripe dashboard." +msgstr "" + +#: src/Integrations/Stripe/Api/WebhookRoute.php:153 +msgid "It seems to be request to Stripe PHP Listener method handler but the site is not configured to use it." +msgstr "" + +#. translators: %1$s - Stripe.com URL for domains registration documentation. +#: src/Integrations/Stripe/DomainHealthCheck.php:140 +#, php-format +msgid "Heads up! It looks like there's a problem with your domain verification, and Stripe Apple Pay may stop working. If this notice does not disappear in a day, please register it manually." +msgstr "" + +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:60 +msgid "Link Email" +msgstr "" + +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:61 +msgid "Select an Email field to autofill your customers’ payment information using Link." +msgstr "" + +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:76 +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:134 +msgid "Stripe Credit Card Email" +msgstr "" + +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:96 +msgid "Sublabel Position" +msgstr "" + +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:109 +msgid "Floating" +msgstr "" + +#: src/Integrations/Stripe/Fields/PaymentElementCreditCard.php:224 +msgid "CVC" +msgstr "" + +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:22 +msgid "Stripe Credit Card" +msgstr "" + +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:210 +msgid "

            AJAX form submissions are required when using the Stripe Credit Card field.

            To proceed, please go to Settings » General » Advanced and check Enable AJAX form submission.

            " +msgstr "" + +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:218 +msgid "

            Stripe account connection is required when using the Stripe Credit Card field.

            To proceed, please go to WPForms Settings » Payments » Stripe and press Connect with Stripe button.

            " +msgstr "" + +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:226 +msgid "

            Stripe Payments must be enabled when using the Stripe Credit Card field.

            To proceed, please go to Payments » Stripe and check Enable Stripe payments.

            " +msgstr "" + +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:343 +msgid "Credit Card field is disabled, Stripe keys are missing." +msgstr "" + +#: src/Integrations/Stripe/Fields/Traits/CreditCard.php:351 +msgid "Credit Card field is disabled, Stripe payments are not enabled in the form settings." +msgstr "" + +#: src/Integrations/Stripe/Frontend.php:173 +msgid "Payment Element failed to load. Stripe API responded with the message:" +msgstr "" + +#: src/Integrations/Stripe/Frontend.php:174 +msgid "The security token has expired. Please resubmit the form." +msgstr "" + +#: src/Integrations/Stripe/Process.php:220 +msgid "Unable to process payment, please try again later." +msgstr "" + +#: src/Integrations/Stripe/Process.php:665 +msgid "Stripe payment stopped, missing keys." +msgstr "" + +#: src/Integrations/Stripe/Process.php:671 +msgid "Stripe payment stopped, missing payment fields." +msgstr "" + +#: src/Integrations/Stripe/Process.php:676 +msgid "Stripe payment stopped, invalid/empty amount." +msgstr "" + +#: src/Integrations/Stripe/Process.php:680 +msgid "Stripe payment stopped, amount less than minimum charge required." +msgstr "" + +#: src/Integrations/Stripe/Process.php:901 +msgid "Stripe Subscription payment stopped validation error." +msgstr "" + +#. translators: %s - error message. +#: src/Integrations/Stripe/Process.php:1033 +#, php-format +msgid "Payment Error: %s" +msgstr "" + +#: src/Integrations/Stripe/Process.php:1040 +msgid "Stripe subscription payment stopped by error" +msgstr "" + +#: src/Integrations/Stripe/Process.php:1042 +msgid "Stripe payment stopped by error" +msgstr "" + +#: src/Integrations/Stripe/Process.php:1159 +msgid "Stripe subscription payment stopped, missing form settings." +msgstr "" + +#: src/Integrations/Stripe/Process.php:1164 +msgid "Stripe subscription payment stopped, customer email not found." +msgstr "" + +#: src/Integrations/Stripe/Process.php:1282 +msgid "Secondary form submission was declined." +msgstr "" + +#: src/Integrations/Stripe/Process.php:1300 +msgid "Irregular activity detected. Your submission has been declined and payment refunded." +msgstr "" + +#: src/Integrations/Stripe/StripeAddonCompatibility.php:87 +msgid "The WPForms Stripe addon is out of date. To avoid payment processing issues, please upgrade the Stripe addon to the latest version." +msgstr "" + +#. translators: %s - WPForms.com URL for Stripe webhooks documentation. +#: src/Integrations/Stripe/WebhooksHealthCheck.php:227 +#, php-format +msgid "Heads up! Looks like you have a problem with your webhooks configuration. Please check and confirm that you've configured the WPForms webhooks in your Stripe account. This notice will disappear automatically when a new Stripe request comes in. See our documentation for more information." +msgstr "" + +#. translators: %s - plugin name. +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:150 +#, php-format +msgid "%s plugin" +msgstr "" + +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:165 +msgid "Put Your WordPress Site on Autopilot" +msgstr "" + +#: src/Integrations/UncannyAutomator/UncannyAutomator.php:166 +msgid "Build powerful automations that control what happens on form submission. Connect your forms to Google Sheets, Zoom, social media, membership plugins, elearning platforms, and more with Uncanny Automator." +msgstr "" + +#: src/Integrations/UsageTracking/UsageTracking.php:109 +msgid "Allow Usage Tracking" +msgstr "" + +#: src/Integrations/UsageTracking/UsageTracking.php:110 +msgid "By allowing us to track usage data, we can better help you, as we will know which WordPress configurations, themes, and plugins we should test." +msgstr "" + +#: src/Integrations/WooCommerce/Notifications.php:133 +#: templates/education/admin/settings/smtp-notice.php:15 +msgid "Make Sure Important Emails Reach Your Customers" +msgstr "" + +#: src/Integrations/WooCommerce/Notifications.php:137 +msgid "Solve common email deliverability issues for good." +msgstr "" + +#: src/Integrations/WooCommerce/Notifications.php:141 +msgid "Get WP Mail SMTP" +msgstr "" + +#: src/Integrations/WooCommerce/Notifications.php:147 +msgid "Close the notification" +msgstr "" + +#. translators: %s - URL WP Mail SMTP settings. +#: src/Integrations/WPMailSMTP/Notifications.php:188 +#, php-format +msgid "This setting is disabled because you have the \"Force From Name\" setting enabled in the WP Mail SMTP plugin." +msgstr "" + +#. translators: %s - URL WP Mail SMTP settings. +#: src/Integrations/WPMailSMTP/Notifications.php:217 +#, php-format +msgid "This setting is disabled because you have the \"Force From Email\" setting enabled in the WP Mail SMTP plugin." +msgstr "" + +#: src/Lite/Admin/Connect.php:79 +msgid "You are not allowed to install plugins." +msgstr "" + +#: src/Lite/Admin/Connect.php:87 +msgid "There must be a non-developer Lite version installed to upgrade." +msgstr "" + +#: src/Lite/Admin/Connect.php:94 +msgid "Please enter your license key to connect." +msgstr "" + +#: src/Lite/Admin/Connect.php:99 +msgid "Only the Lite version can be upgraded." +msgstr "" + +#: src/Lite/Admin/Connect.php:115 +msgid "WPForms Pro is installed but not activated." +msgstr "" + +#: src/Lite/Admin/Connect.php:166 +msgid "There was an error while installing an upgrade. Please download the plugin from wpforms.com and install it manually." +msgstr "" + +#: src/Lite/Admin/Connect.php:225 +msgid "There was an error while installing an upgrade. Please check file system permissions and try again. Also, you can download the plugin from wpforms.com and install it manually." +msgstr "" + +#: src/Lite/Admin/Connect.php:251 +msgid "No key provided." +msgstr "" + +#: src/Lite/Admin/Connect.php:282 +msgid "Pro version installed but needs to be activated on the Plugins page inside your WordPress admin." +msgstr "" + +#: src/Lite/Admin/ConnectSkin.php:32 +msgid "There was an error installing WPForms Pro. Please try again." +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:167 +#: src/Lite/Admin/DashboardWidget.php:400 +msgid "Show More" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:168 +msgid "Show Less" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:262 +msgid "Create Your First Form to Start Collecting Leads" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:263 +#: templates/admin/empty-states/no-forms.php:18 +msgid "You can use WPForms to build contact forms, surveys, payment forms, and more with just a few clicks." +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:267 +#: templates/admin/empty-states/no-forms.php:25 +msgid "Create Your Form" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:313 +msgid "View all Form Entries inside the WordPress Dashboard" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:314 +msgid "Form entries reports are not available." +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:315 +msgid "Form entries are not stored in Lite." +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:316 +msgid "Upgrade to Pro and get access to the reports." +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:330 +msgid "Total Entries by Form" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:371 +msgid "No entries were submitted yet." +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:399 +msgid "Show all forms" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:430 +msgid "Recommended Plugin:" +msgstr "" + +#: src/Lite/Admin/DashboardWidget.php:435 +msgid "Install" +msgstr "" + +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:69 +msgid "Entries are not stored in WPForms Lite" +msgstr "" + +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:70 +msgid "Entries are available through email notifications. If you enable Entry Backups, you can restore them once you upgrade to WPForms Pro." +msgstr "" + +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:71 +#: src/Lite/Admin/Education/LiteConnect.php:234 +#: src/Lite/Integrations/LiteConnect/LiteConnect.php:112 +msgid "Enable Entry Backups" +msgstr "" + +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:77 +msgid "Entries Backups Are Enabled" +msgstr "" + +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:78 +msgid "Restore Form Entries" +msgstr "" + +#. translators: %d - backed up entries count. +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:159 +#: src/Lite/Admin/Education/LiteConnect.php:273 +#, php-format +msgid "%d entry backed up" +msgid_plural "%d entries backed up" +msgstr[0] "" +msgstr[1] "" + +#. translators: %1$s - time when Lite Connect was enabled. +#: src/Lite/Admin/Education/Admin/DidYouKnow.php:173 +#, php-format +msgid "since %1$s" +msgstr "" + +#: src/Lite/Admin/Education/Builder/Confirmations.php:66 +msgid "Show entry preview after confirmation" +msgstr "" + +#: src/Lite/Admin/Education/Builder/Confirmations.php:75 +msgid "Show Entry Preview" +msgstr "" + +#: src/Lite/Admin/Education/Builder/DidYouKnow.php:61 +msgid "You can have multiple notifications with conditional logic." +msgstr "" + +#: src/Lite/Admin/Education/Builder/DidYouKnow.php:74 +msgid "You can have multiple confirmations with conditional logic." +msgstr "" + +#: src/Lite/Admin/Education/Builder/Fields.php:83 +msgid "Smart Logic" +msgstr "" + +#. translators: %s - WPForms.com announcement page URL. +#: src/Lite/Admin/Education/Builder/Fields.php:147 +#, php-format +msgid "They will not be present in the published form. Upgrade now to unlock these features." +msgstr "" + +#: src/Lite/Admin/Education/Builder/Fields.php:162 +msgid "Your Form Contains Pro Fields" +msgstr "" + +#: src/Lite/Admin/Education/Builder/Notifications.php:77 +msgid "Enable File Upload Attachments" +msgstr "" + +#: src/Lite/Admin/Education/Builder/Notifications.php:85 +msgid "File Upload Attachments" +msgstr "" + +#: src/Lite/Admin/Education/Builder/Notifications.php:102 +msgid "Enable Entry CSV Attachment" +msgstr "" + +#: src/Lite/Admin/Education/Builder/Notifications.php:110 +msgid "Entry CSV Attachment" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:235 +msgid "No Thanks" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:238 +msgid "Enable AI Features" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:239 +msgid "AI Features Enabled" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:242 +msgid "Are you sure?" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:243 +msgid "If you disable Lite Connect, you will no longer be able to restore your entries when you upgrade to WPForms Pro." +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:244 +msgid "Disable Entry Backups" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:248 +msgid "Entry Backups Enabled" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:249 +msgid "Awesome! If you decide to upgrade to WPForms Pro, you can restore your entries and will have instant access to reports." +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:250 +msgid "Entry Backups Disabled" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:251 +msgid "Form Entry Backups were successfully disabled." +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:253 +msgid "Unfortunately, the error occurs while updating Form Entry Backups setting. Please try again later." +msgstr "" + +#. translators: %s - time when Lite Connect was enabled. +#: src/Lite/Admin/Education/LiteConnect.php:286 +#, php-format +msgid "since %s" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:311 +msgid "Enable Form Entry Backups" +msgstr "" + +#: src/Lite/Admin/Education/LiteConnect.php:355 +#: src/Lite/Admin/Education/LiteConnect.php:391 +msgid "Enable Form Entry Backups for Free" +msgstr "" + +#: src/Lite/Admin/Pages/Addons.php:92 +msgid "Upgrade to Unlock WPForms Addons" +msgstr "" + +#: src/Lite/Admin/Pages/Addons.php:93 +msgid "Access powerful marketing and payment integrations, advanced form fields, and more when you purchase our Plus, Pro, or Elite plans." +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:86 +msgid "Access" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:129 +msgid "Create Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:130 +msgid "Delete Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:131 +msgid "Edit Forms Entries" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:132 +msgid "Edit Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:133 +msgid "Delete Others Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:134 +msgid "Edit Others Forms Entries" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:135 +msgid "Edit Others Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:136 +msgid "View Forms Entries" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:137 +msgid "Delete Forms Entries" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:138 +msgid "View Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:139 +msgid "View Others Forms Entries" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:140 +msgid "Delete Others Forms Entries" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:141 +msgid "View Others Forms" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:147 +msgid "Simple Built-in Controls" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:152 +msgid "Members Integration" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:157 +msgid "User Role Editor Integration" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:162 +msgid "Access Controls" +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:165 +msgid "Access controls allows you to manage and customize access to WPForms functionality. You can easily grant or restrict access using the simple built-in controls, or use our official integrations with Members and User Role Editor plugins." +msgstr "" + +#: src/Lite/Admin/Settings/Access.php:168 +msgid "Custom access to the following capabilities…" +msgstr "" + +#: src/Lite/Emails/Summaries.php:82 +msgid "Calculate WPForms Lite Weekly Entries Count" +msgstr "" + +#: src/Lite/Integrations/LiteConnect/LiteConnect.php:111 +msgid "Lite Connect" +msgstr "" + +#. translators: %s - upgrade to WPForms Pro landing page URL. +#: src/Lite/Integrations/LiteConnect/LiteConnect.php:119 +#, php-format +msgid "Your form entries are not being stored locally, but are backed up remotely. If you upgrade to WPForms PRO, you can restore your entries and they’ll be available in the WordPress dashboard." +msgstr "" + +#. translators: %s - upgrade to WPForms Pro landing page URL. +#: src/Lite/Integrations/LiteConnect/LiteConnect.php:134 +#, php-format +msgid "Your form entries are not being stored in WordPress, and your entry backups are not active. If there's a problem with deliverability, you'll lose form entries. We recommend that you enable Entry Backups, especially if you're considering upgrading to WPForms PRO." +msgstr "" + +#: src/Logger/ListTable.php:290 +#: src/Logger/ListTable.php:477 +msgid "Log Title" +msgstr "" + +#: src/Logger/ListTable.php:292 +#: src/Logger/ListTable.php:500 +#: src/SmartTags/SmartTags.php:116 +msgid "Form ID" +msgstr "" + +#: src/Logger/ListTable.php:293 +#: src/Logger/ListTable.php:490 +msgid "Types" +msgstr "" + +#: src/Logger/ListTable.php:307 +msgid "View Logs" +msgstr "" + +#. translators: %s - search query. +#: src/Logger/ListTable.php:312 +#, php-format +msgid "Search results for \"%s\"" +msgstr "" + +#: src/Logger/ListTable.php:321 +msgid "Search Logs" +msgstr "" + +#: src/Logger/ListTable.php:376 +msgid "Delete All Logs" +msgstr "" + +#: src/Logger/ListTable.php:421 +msgid "No logs found." +msgstr "" + +#: src/Logger/ListTable.php:453 +msgid "All Logs" +msgstr "" + +#: src/Logger/ListTable.php:496 +msgid "Log ID" +msgstr "" + +#: src/Logger/ListTable.php:512 +msgid "Entry ID" +msgstr "" + +#: src/Logger/ListTable.php:524 +#: src/SmartTags/SmartTags.php:124 +msgid "User ID" +msgstr "" + +#: src/Logger/Log.php:104 +msgid "Errors" +msgstr "" + +#: src/Logger/Log.php:107 +msgid "Providers" +msgstr "" + +#: src/Logger/Log.php:108 +msgid "Security" +msgstr "" + +#: src/Logger/Log.php:109 +msgid "Spam" +msgstr "" + +#: src/Logger/Log.php:110 +msgid "Translation" +msgstr "" + +#: src/Logger/Log.php:206 +msgid "Record ID not found" +msgstr "" + +#: src/Logger/Log.php:212 +msgid "No such record." +msgstr "" + +#: src/Migrations/Upgrade177.php:29 +msgid "Please fill out all blanks." +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:129 +msgid "Custom Field Name" +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:130 +msgid "Form Field Value" +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:156 +#: src/Providers/Provider/Settings/FormBuilder.php:215 +msgid "Field Name" +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:184 +#: src/Providers/Provider/Settings/FormBuilder.php:237 +#: templates/integrations/stripe/builder/custom-metadata.php:110 +msgid "Add Another" +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:190 +#: templates/integrations/stripe/builder/custom-metadata.php:115 +msgid "Remove" +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:253 +msgid "Map custom fields (or properties) to form fields values." +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:320 +#: templates/integrations/constant-contact-v3/builder/error.php:10 +msgid "Something went wrong while performing an AJAX request." +msgstr "" + +#. translators: %s - provider name. +#: src/Providers/Provider/Settings/FormBuilder.php:472 +#, php-format +msgid "Get the most out of WPForms — use it with an active %s account." +msgstr "" + +#: src/Providers/Provider/Settings/FormBuilder.php:527 +msgid "Add New Connection" +msgstr "" + +#. translators: %1$s - Documentation URL. +#: src/Providers/Provider/Settings/FormBuilder.php:779 +#, php-format +msgid "Something went wrong, and we can’t connect to the provider. Please check your connection settings." +msgstr "" + +#: src/Providers/Provider/Settings/PageIntegrations.php:175 +msgid "No Label" +msgstr "" + +#: src/Providers/Provider/Settings/PageIntegrations.php:331 +msgid "Missing data." +msgstr "" + +#: src/Providers/Provider/Settings/PageIntegrations.php:347 +msgid "Connection missing." +msgstr "" + +#: src/Providers/Provider/Settings/PageIntegrations.php:373 +msgid "You do not have permissions." +msgstr "" + +#: src/Providers/Provider/Settings/PageIntegrations.php:381 +msgid "Missing required data in payload." +msgstr "" + +#. translators: %1$s - requirements message. +#: src/Requirements/Requirements.php:1022 +#, php-format +msgid "It requires %1$s." +msgstr "" + +#: src/Requirements/Requirements.php:1057 +msgid "WPForms plugin" +msgstr "" + +#. translators: %1$s - WPForms addon name. +#: src/Requirements/Requirements.php:1061 +#, php-format +msgid "%1$s addon" +msgstr "" + +#. translators: %1$s - WPForms plugin or addon name, %2$d - requirements message. +#: src/Requirements/Requirements.php:1068 +#, php-format +msgid "The %1$s requires %2$s." +msgstr "" + +#. translators: %1$s - Read More link. +#: src/Requirements/Requirements.php:1104 +#, php-format +msgid "%1$s for additional information on PHP version." +msgstr "" + +#. translators: %1$s - Read More link. +#: src/Requirements/Requirements.php:1110 +#, php-format +msgid "%1$s for additional information on PHP extensions." +msgstr "" + +#: src/Requirements/Requirements.php:1137 +msgid "Read more" +msgstr "" + +#. translators: %s - PHP extension name(s). +#: src/Requirements/Requirements.php:1211 +#, php-format +msgid "%s PHP extension" +msgid_plural "%s PHP extensions" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s - license name(s). +#: src/Requirements/Requirements.php:1282 +#, php-format +msgid "%s license" +msgstr "" + +#. translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". +#: src/Requirements/Requirements.php:1391 +#, php-format +msgid "%1$s %2$s or above" +msgstr "" + +#. translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". +#: src/Requirements/Requirements.php:1393 +#, php-format +msgid "%1$s %2$s or below" +msgstr "" + +#. translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". +#: src/Requirements/Requirements.php:1396 +#, php-format +msgid "a newer version of %1$s than %2$s" +msgstr "" + +#. translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". +#: src/Requirements/Requirements.php:1398 +#, php-format +msgid "an older version of %1$s than %2$s" +msgstr "" + +#: src/SmartTags/SmartTag/OrderSummary.php:304 +msgid "Subtotal" +msgstr "" + +#. translators: %s - Coupon value. +#: src/SmartTags/SmartTag/OrderSummary.php:311 +#, php-format +msgid "Coupon (%s)" +msgstr "" + +#: src/SmartTags/SmartTags.php:112 +msgid "Site Administrator Email" +msgstr "" + +#: src/SmartTags/SmartTags.php:113 +msgid "Field ID" +msgstr "" + +#: src/SmartTags/SmartTags.php:114 +msgid "Field HTML ID" +msgstr "" + +#: src/SmartTags/SmartTags.php:115 +msgid "Field Value" +msgstr "" + +#: src/SmartTags/SmartTags.php:118 +msgid "Embedded Post/Page Title" +msgstr "" + +#: src/SmartTags/SmartTags.php:119 +msgid "Embedded Post/Page URL" +msgstr "" + +#: src/SmartTags/SmartTags.php:120 +msgid "Embedded Post/Page ID" +msgstr "" + +#: src/SmartTags/SmartTags.php:122 +msgid "Query String Variable" +msgstr "" + +#: src/SmartTags/SmartTags.php:123 +msgid "User IP Address" +msgstr "" + +#: src/SmartTags/SmartTags.php:125 +msgid "User Display Name" +msgstr "" + +#: src/SmartTags/SmartTags.php:126 +msgid "User Full Name" +msgstr "" + +#: src/SmartTags/SmartTags.php:127 +msgid "User First Name" +msgstr "" + +#: src/SmartTags/SmartTags.php:128 +msgid "User Last Name" +msgstr "" + +#: src/SmartTags/SmartTags.php:129 +msgid "Logged-in User's Email" +msgstr "" + +#: src/SmartTags/SmartTags.php:130 +msgid "User Meta" +msgstr "" + +#: src/SmartTags/SmartTags.php:131 +msgid "Author ID" +msgstr "" + +#: src/SmartTags/SmartTags.php:132 +msgid "Author Name" +msgstr "" + +#: src/SmartTags/SmartTags.php:133 +msgid "Author Email" +msgstr "" + +#: src/SmartTags/SmartTags.php:134 +msgid "Referrer URL" +msgstr "" + +#: src/SmartTags/SmartTags.php:135 +msgid "Login URL" +msgstr "" + +#: src/SmartTags/SmartTags.php:136 +msgid "Logout URL" +msgstr "" + +#: src/SmartTags/SmartTags.php:137 +msgid "Register URL" +msgstr "" + +#: src/SmartTags/SmartTags.php:138 +msgid "Lost Password URL" +msgstr "" + +#: src/SmartTags/SmartTags.php:139 +msgid "Unique Value" +msgstr "" + +#: src/SmartTags/SmartTags.php:140 +msgid "Site Name" +msgstr "" + +#: src/SmartTags/SmartTags.php:141 +#: templates/fields/total/summary-preview.php:77 +msgid "Order Summary" +msgstr "" + +#: src/SmartTags/SmartTags.php:175 +msgid "Apply changes" +msgstr "" + +#: src/SmartTags/SmartTags.php:176 +msgid "Delete smart tag" +msgstr "" + +#: src/SmartTags/SmartTags.php:177 +msgid "edit" +msgstr "" + +#: src/SmartTags/SmartTags.php:178 +msgid "argument" +msgstr "" + +#: src/SmartTags/SmartTags.php:179 +msgid "Unknown Field" +msgstr "" + +#. translators: %1$s - field ID, %2$s - field label. +#: src/SmartTags/SmartTags.php:182 +#, php-format +msgid "Field %1$s" +msgstr "" + +#. translators: %1$s - field ID, %2$s - field label. +#: src/SmartTags/SmartTags.php:184 +#, php-format +msgid "Field value %1$s" +msgstr "" + +#. translators: %1$s - field ID, %2$s - field label. +#: src/SmartTags/SmartTags.php:186 +#, php-format +msgid "Field HTML %1$s" +msgstr "" + +#. translators: %1$s - Query String Variable. +#: src/SmartTags/SmartTags.php:188 +#, php-format +msgid "Query String Variable: %1$s" +msgstr "" + +#. translators: %1$s - User meta key. +#: src/SmartTags/SmartTags.php:190 +#, php-format +msgid "User Meta: %1$s" +msgstr "" + +#. translators: %1$s - Date format. +#: src/SmartTags/SmartTags.php:192 +#, php-format +msgid "Date: %1$s" +msgstr "" + +#. translators: %1$s - Date format. +#: src/SmartTags/SmartTags.php:194 +#, php-format +msgid "Entry Date: %1$s" +msgstr "" + +#. translators: %1$s - link to the WPForms.com doc article. +#: src/SmartTags/SmartTags.php:208 +#, php-format +msgid "Easily add dynamic information from various sources with Smart Tags." +msgstr "" + +#: templates/admin/challenge/builder.php:16 +msgid "Give your form a name so you can easily identify it." +msgstr "" + +#: templates/admin/challenge/builder.php:17 +#: templates/admin/challenge/builder.php:27 +#: templates/admin/challenge/builder.php:33 +#: templates/admin/challenge/embed.php:44 +#: templates/admin/form-embed-wizard/tooltip.php:41 +msgid "Done" +msgstr "" + +#: templates/admin/challenge/builder.php:22 +msgid "Build your form from scratch or use one of our pre-made templates." +msgstr "" + +#: templates/admin/challenge/builder.php:26 +msgid "You can add additional fields to your form, if you need them." +msgstr "" + +#: templates/admin/challenge/builder.php:31 +msgid "Check Notification Settings" +msgstr "" + +#: templates/admin/challenge/builder.php:32 +msgid "The default notification settings might be sufficient, but double‑check to be sure." +msgstr "" + +#: templates/admin/challenge/builder.php:40 +msgid "Welcome to the Form Builder" +msgstr "" + +#: templates/admin/challenge/builder.php:41 +msgid "Our form builder is a full-screen, distraction-free experience where you manage your forms. The following steps will walk you through essential areas." +msgstr "" + +#: templates/admin/challenge/builder.php:42 +#: templates/admin/form-embed-wizard/popup.php:41 +msgid "Let’s Go!" +msgstr "" + +#: templates/admin/challenge/embed.php:19 +#: templates/admin/form-embed-wizard/tooltip.php:17 +msgid "Add a Block" +msgstr "" + +#. translators: %s - link to the WPForms documentation page. +#: templates/admin/challenge/embed.php:25 +#: templates/admin/form-embed-wizard/tooltip.php:22 +#, php-format +msgid "Click the plus button, search for WPForms, click the block to
            embed it. Learn More" +msgstr "" + +#: templates/admin/challenge/embed.php:41 +#: templates/admin/challenge/modal.php:42 +#: templates/admin/form-embed-wizard/popup.php:18 +#: templates/admin/form-embed-wizard/tooltip.php:38 +msgid "Embed in a Page" +msgstr "" + +#: templates/admin/challenge/embed.php:42 +#: templates/admin/form-embed-wizard/tooltip.php:39 +msgid "Click the “Add Form†button, select your form, then add the embed code." +msgstr "" + +#: templates/admin/challenge/embed.php:53 +msgid "Congrats, You Did It!" +msgstr "" + +#. translators: %1$s - number of minutes in HTML container, %2$s - singular or plural form of 'minute', %3$s - number of seconds in HTML container, %4$s - singular or plural form of 'second', %5$s - 5 rating star symbols HTML. +#: templates/admin/challenge/embed.php:61 +#, php-format +msgid "You completed the WPForms Challenge in %1$s %2$s %3$s %4$s. Share your success story with other WPForms users and help us spread the word by giving WPForms a 5-star rating (%5$s) on WordPress.org. Thanks for your support and we look forward to bringing you more awesome features." +msgstr "" + +#: templates/admin/challenge/embed.php:63 +#: templates/admin/challenge/embed.php:105 +#: templates/admin/challenge/modal.php:31 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/challenge/embed.php:65 +msgid "second" +msgid_plural "seconds" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/challenge/embed.php:84 +msgid "Rate WPForms on WordPress.org" +msgstr "" + +#: templates/admin/challenge/embed.php:97 +msgid "Do you need more help?" +msgstr "" + +#. translators: %1$d - number of minutes, %2$s - singular or plural form of 'minute'. +#: templates/admin/challenge/embed.php:103 +#, php-format +msgid "We're sorry that it took longer than %1$d %2$s to publish your form. Our goal is to create the most beginner-friendly WordPress form plugin.
            How can we help you to be successful? Please send us your feedback. Our support team is standing by to help." +msgstr "" + +#: templates/admin/challenge/embed.php:114 +msgid "Yes, I give WPForms permission to contact me for any follow up questions." +msgstr "" + +#: templates/admin/challenge/embed.php:117 +msgid "Submit Feedback" +msgstr "" + +#: templates/admin/challenge/modal.php:21 +msgid "Toggle list" +msgstr "" + +#: templates/admin/challenge/modal.php:22 +msgid "Skip challenge" +msgstr "" + +#: templates/admin/challenge/modal.php:23 +msgid "Cancel challenge" +msgstr "" + +#. translators: %1$d - number of minutes, %2$s - singular or plural form of 'minute'. +#: templates/admin/challenge/modal.php:29 +#, php-format +msgid "Complete the WPForms Challenge and get up and running within %1$d %2$s." +msgstr "" + +#: templates/admin/challenge/modal.php:40 +msgid "Add Fields to Your Form" +msgstr "" + +#: templates/admin/challenge/modal.php:41 +msgid "Check Notifications" +msgstr "" + +#: templates/admin/challenge/modal.php:43 +msgid "Challenge Complete" +msgstr "" + +#: templates/admin/challenge/modal.php:54 +msgid "WPForms Challenge" +msgstr "" + +#. translators: %s - minutes in 2:00 format. +#: templates/admin/challenge/modal.php:59 +#, php-format +msgid "%s remaining" +msgstr "" + +#: templates/admin/challenge/modal.php:70 +msgid "Start Challenge" +msgstr "" + +#: templates/admin/challenge/modal.php:73 +msgid "Pause" +msgstr "" + +#: templates/admin/challenge/modal.php:75 +msgid "End Challenge" +msgstr "" + +#: templates/admin/challenge/welcome.php:15 +msgid "Take the WPForms Challenge" +msgstr "" + +#: templates/admin/challenge/welcome.php:16 +msgid "Create your first form with our guided setup wizard in less than 5 minutes to experience the WPForms difference." +msgstr "" + +#: templates/admin/challenge/welcome.php:19 +msgid "Start the WPForms Challenge" +msgstr "" + +#: templates/admin/components/datepicker.php:58 +msgid "Datepicker options" +msgstr "" + +#: templates/admin/dashboard/widget/settings.php:27 +msgid "Graph Style" +msgstr "" + +#: templates/admin/dashboard/widget/settings.php:31 +msgid "Bar" +msgstr "" + +#: templates/admin/dashboard/widget/settings.php:35 +msgid "Line" +msgstr "" + +#: templates/admin/dashboard/widget/settings.php:51 +msgid "WordPress" +msgstr "" + +#: templates/admin/empty-states/no-forms.php:15 +#: templates/admin/empty-states/no-user-templates.php:15 +#: templates/admin/empty-states/payments/get-started.php:27 +#: templates/admin/empty-states/payments/no-payments.php:16 +#: templates/admin/payments/single/no-payment.php:17 +#: templates/builder/fullscreen/abort-message.php:18 +#: templates/emails/summary-body-plain.php:23 +#: templates/emails/summary-body.php:36 +msgid "Hi there!" +msgstr "" + +#: templates/admin/empty-states/no-forms.php:17 +msgid "It looks like you haven’t created any forms yet." +msgstr "" + +#. translators: %s - URL to the documentation article. +#: templates/admin/empty-states/no-forms.php:32 +#, php-format +msgid "Need some help? Check out our comprehensive guide." +msgstr "" + +#: templates/admin/empty-states/no-user-templates.php:18 +msgid "Did you know you can save your forms as reusable templates?" +msgstr "" + +#: templates/admin/empty-states/no-user-templates.php:19 +msgid "Save your custom forms to the templates library for quick and easy use." +msgstr "" + +#. translators: %s - URL to the documentation article. +#: templates/admin/empty-states/no-user-templates.php:27 +#, php-format +msgid "Need some help? Check out our documentation." +msgstr "" + +#: templates/admin/empty-states/payments/get-started.php:28 +msgid "Ready to start collecting payments from your customers?" +msgstr "" + +#. translators: %s - URL to the comprehensive guide. +#: templates/admin/empty-states/payments/get-started.php:42 +#: templates/admin/empty-states/payments/no-payments.php:31 +#, php-format +msgid "Need some help? Check out our comprehensive guide." +msgstr "" + +#: templates/admin/empty-states/payments/no-payments.php:17 +msgid "It looks like you haven't received any payments yet." +msgstr "" + +#: templates/admin/empty-states/payments/no-payments.php:18 +msgid "Your payment gateway has been configured and you're ready to go." +msgstr "" + +#: templates/admin/empty-states/payments/no-payments.php:23 +msgid "Go To All Forms" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:20 +msgid "We can help embed your form with just a few clicks!" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:23 +msgid "Would you like to embed your form in an existing page, or create a new one?" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:29 +msgid "Select the page you would like to embed your form in." +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:32 +msgid "What would you like to call the new page?" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:35 +msgid "Select Existing Page" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:36 +msgid "Create New Page" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:40 +msgid "Name Your Page" +msgstr "" + +#. translators: %1$s - video tutorial toggle CSS classes, %2$s - shortcode toggle CSS classes. +#: templates/admin/form-embed-wizard/popup.php:58 +#, php-format +msgid "You can also embed your form manually or use a shortcode" +msgstr "" + +#. translators: %1$s - video tutorial toggle CSS classes, %2$s - shortcode toggle CSS classes. +#: templates/admin/form-embed-wizard/popup.php:69 +#, php-format +msgid "You can embed your form using the WPForms block or a shortcode." +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:82 +msgid "Copy embed code to clipboard" +msgstr "" + +#: templates/admin/form-embed-wizard/popup.php:89 +msgid "Go back" +msgstr "" + +#: templates/admin/forms/bulk-edit-tags.php:34 +msgid "Update" +msgstr "" + +#: templates/admin/forms/search-reset.php:25 +msgid "Clear search and return to All Forms" +msgstr "" + +#: templates/admin/notifications.php:36 +msgid "Previous message" +msgstr "" + +#: templates/admin/notifications.php:40 +msgid "Next message" +msgstr "" + +#: templates/admin/pages/constant-contact.php:15 +msgid "Constant Contact" +msgstr "" + +#: templates/admin/pages/constant-contact.php:17 +msgid "Grow Your Website with WPForms + Email Marketing" +msgstr "" + +#: templates/admin/pages/constant-contact.php:18 +msgid "Wondering if email marketing is really worth your time?" +msgstr "" + +#: templates/admin/pages/constant-contact.php:22 +msgid "Email is hands-down the most effective way to nurture leads and turn them into customers, with a return on investment (ROI) of $44 back for every $1 spent according to DMA." +msgstr "" + +#: templates/admin/pages/constant-contact.php:27 +msgid "Here are 3 big reasons why every smart business in the world has an email list:" +msgstr "" + +#: templates/admin/pages/constant-contact.php:41 +msgid "Email is still #1 - At least 91% of consumers check their email on a daily basis. You get direct access to your subscribers, without having to play by social media's rules and algorithms." +msgstr "" + +#: templates/admin/pages/constant-contact.php:49 +msgid "You own your email list - Unlike with social media, your list is your property and no one can revoke your access to it." +msgstr "" + +#: templates/admin/pages/constant-contact.php:57 +msgid "Email converts - People who buy products marketed through email spend 138% more than those who don't receive email offers." +msgstr "" + +#: templates/admin/pages/constant-contact.php:63 +msgid "That's why it's crucial to start collecting email addresses and building your list as soon as possible." +msgstr "" + +#. translators: %s - WPBeginners.com Guide to Email Lists URL. +#: templates/admin/pages/constant-contact.php:68 +#, php-format +msgid "For more details, see this guide on why building your email list is so important." +msgstr "" + +#: templates/admin/pages/constant-contact.php:82 +msgid "You've Already Started - Here's the Next Step (It's Easy)" +msgstr "" + +#: templates/admin/pages/constant-contact.php:83 +msgid "Here are the 3 things you need to build an email list:" +msgstr "" + +#: templates/admin/pages/constant-contact.php:85 +msgid "A Website or Blog" +msgstr "" + +#: templates/admin/pages/constant-contact.php:86 +msgid "High-Converting Form Builder" +msgstr "" + +#: templates/admin/pages/constant-contact.php:87 +msgid "The Best Email Marketing Service" +msgstr "" + +#: templates/admin/pages/constant-contact.php:89 +msgid "With a powerful email marketing service like Constant Contact, you can instantly send out mass notifications and beautifully designed newsletters to engage your subscribers." +msgstr "" + +#: templates/admin/pages/constant-contact.php:92 +msgid "Get Started with Constant Contact for Free" +msgstr "" + +#: templates/admin/pages/constant-contact.php:95 +msgid "WPForms plugin makes it fast and easy to capture all kinds of visitor information right from your WordPress site - even if you don't have a Constant Contact account." +msgstr "" + +#: templates/admin/pages/constant-contact.php:96 +msgid "But when you combine WPForms with Constant Contact, you can nurture your contacts and engage with them even after they leave your website. When you use Constant Contact + WPForms together, you can:" +msgstr "" + +#: templates/admin/pages/constant-contact.php:98 +msgid "Seamlessly add new contacts to your email list" +msgstr "" + +#: templates/admin/pages/constant-contact.php:99 +msgid "Create and send professional email newsletters" +msgstr "" + +#: templates/admin/pages/constant-contact.php:100 +msgid "Get expert marketing and support" +msgstr "" + +#: templates/admin/pages/constant-contact.php:104 +msgid "Try Constant Contact Today" +msgstr "" + +#: templates/admin/pages/constant-contact.php:108 +msgid "WPForms Makes List Building Easy" +msgstr "" + +#: templates/admin/pages/constant-contact.php:109 +msgid "When creating WPForms, our goal was to make a WordPress forms plugin that's both EASY and POWERFUL." +msgstr "" + +#: templates/admin/pages/constant-contact.php:110 +msgid "We made the form creation process extremely intuitive, so you can create a form to start capturing emails within 5 minutes or less." +msgstr "" + +#: templates/admin/pages/constant-contact.php:111 +msgid "Here's how it works." +msgstr "" + +#: templates/admin/pages/constant-contact.php:116 +msgid "Select from our pre-built templates, or create a form from scratch." +msgstr "" + +#: templates/admin/pages/constant-contact.php:117 +msgid "Drag and drop any field you want onto your signup form." +msgstr "" + +#: templates/admin/pages/constant-contact.php:118 +msgid "Connect your Constant Contact email list." +msgstr "" + +#: templates/admin/pages/constant-contact.php:119 +msgid "Add your new form to any post, page, or sidebar." +msgstr "" + +#: templates/admin/pages/constant-contact.php:136 +msgid "It doesn't matter what kind of business you run, what kind of website you have, or what industry you are in - you need to start building your email list today." +msgstr "" + +#: templates/admin/pages/constant-contact.php:137 +msgid "With Constant Contact + WPForms, growing your list is easy." +msgstr "" + +#: templates/admin/payments/mode-toggle.php:18 +msgid "Toggle between live and test data" +msgstr "" + +#: templates/admin/payments/mode-toggle.php:20 +msgid "Test Data" +msgstr "" + +#: templates/admin/payments/reports.php:20 +msgid "Payments report indicators" +msgstr "" + +#: templates/admin/payments/reports.php:22 +msgid "List of data points available for filtering. Click a data point for a detailed report." +msgstr "" + +#: templates/admin/payments/reports.php:45 +msgid "Comparison to previous period" +msgstr "" + +#. translators: %d - number of payments found. +#: templates/admin/payments/reset-filter-notice.php:23 +#, php-format +msgid "Found %d payment" +msgid_plural "Found %d payments" +msgstr[0] "" +msgstr[1] "" + +#: templates/admin/payments/reset-filter-notice.php:52 +msgid "Reset search" +msgstr "" + +#: templates/admin/payments/single/advanced-details.php:19 +msgid "Advanced Details" +msgstr "" + +#: templates/admin/payments/single/details.php:25 +msgid "Details" +msgstr "" + +#: templates/admin/payments/single/details.php:35 +msgid "Submitted:" +msgstr "" + +#: templates/admin/payments/single/details.php:43 +msgid "Gateway:" +msgstr "" + +#: templates/admin/payments/single/details.php:50 +msgid "Form:" +msgstr "" + +#: templates/admin/payments/single/details.php:69 +msgid "Payment Mode:" +msgstr "" + +#: templates/admin/payments/single/entry-details.php:24 +msgid "Entry Summary" +msgstr "" + +#: templates/admin/payments/single/entry-details.php:79 +msgid "View Entry" +msgstr "" + +#: templates/admin/payments/single/heading-navigation.php:25 +#: templates/admin/payments/single/no-payment.php:24 +msgid "Back to All Payments" +msgstr "" + +#. translators: %1$d - current number of payment, %2$d - total number of payments. +#: templates/admin/payments/single/heading-navigation.php:32 +#, php-format +msgid "Payment %1$d of %2$d" +msgstr "" + +#: templates/admin/payments/single/heading-navigation.php:41 +msgid "Previous payment" +msgstr "" + +#: templates/admin/payments/single/heading-navigation.php:48 +msgid "Current payment" +msgstr "" + +#: templates/admin/payments/single/heading-navigation.php:53 +msgid "Next payment" +msgstr "" + +#: templates/admin/payments/single/log.php:26 +msgid "No Logs" +msgstr "" + +#: templates/admin/payments/single/payment-details.php:62 +msgid "Status:" +msgstr "" + +#: templates/admin/payments/single/payment-history.php:26 +msgid "Subscription Renewal History Table" +msgstr "" + +#: templates/admin/payments/single/payment-history.php:29 +#: templates/admin/payments/single/payment-history.php:42 +msgid "Payment ID" +msgstr "" + +#: templates/admin/settings/email-heading.php:15 +msgid "Customize your email template and sending preferences." +msgstr "" + +#: templates/admin/settings/hcaptcha-description.php:12 +msgid "hCaptcha is a free and privacy-oriented spam prevention service. Within your forms, hCaptcha will display a checkbox asking users to prove they're human (much like Google's v2 Checkbox reCAPTCHA). This is a simple step for legitimate site visitors, but is extremely effective at blocking spam." +msgstr "" + +#. translators: %s - WPForms.com Setup hCaptcha URL. +#: templates/admin/settings/hcaptcha-description.php:17 +#, php-format +msgid "For more details on how hCaptcha works, as well as a step by step setup guide, please check out our documentation." +msgstr "" + +#: templates/admin/settings/recaptcha-description.php:12 +msgid "reCAPTCHA is a free anti-spam service from Google which helps to protect your website from spam and abuse while letting real people pass through with ease." +msgstr "" + +#: templates/admin/settings/recaptcha-description.php:13 +msgid "Google offers 3 versions of reCAPTCHA (all supported within WPForms):" +msgstr "" + +#: templates/admin/settings/recaptcha-description.php:18 +msgid "v2 Checkbox reCAPTCHA: Prompts users to check a box to prove they're human." +msgstr "" + +#: templates/admin/settings/recaptcha-description.php:26 +msgid "v2 Invisible reCAPTCHA: Uses advanced technology to detect real users without requiring any input." +msgstr "" + +#: templates/admin/settings/recaptcha-description.php:34 +msgid "v3 reCAPTCHA: Uses a behind-the-scenes scoring system to detect abusive traffic, and lets you decide the minimum passing score. Recommended for advanced use only (or if using Google AMP)." +msgstr "" + +#: templates/admin/settings/recaptcha-description.php:40 +msgid "Sites already using one type of reCAPTCHA will need to create new site keys before switching to a different option." +msgstr "" + +#. translators: %s - WPForms.com Setup reCAPTCHA URL. +#: templates/admin/settings/recaptcha-description.php:45 +#, php-format +msgid "Read our walk through to learn more and for step-by-step directions." +msgstr "" + +#: templates/admin/settings/turnstile-description.php:12 +msgid "Cloudflare Turnstile is a free, CAPTCHA-like service for preventing form spam while protecting data privacy. It offers a user-friendly experience by confirming visitors are real humans without requiring them to solve puzzles or math questions." +msgstr "" + +#. translators: %s - WPForms.com Setup Cloudflare Turnstile URL. +#: templates/admin/settings/turnstile-description.php:17 +#, php-format +msgid "For more details on how Turnstile works, as well as a step by step setup guide, please check out our documentation." +msgstr "" + +#: templates/admin/splash/modal.php:34 +msgid "Update WPForms" +msgstr "" + +#: templates/admin/splash/modal.php:35 +msgid "Awesome new features are waiting for you!" +msgstr "" + +#: templates/admin/splash/section.php:31 +msgid "New Feature" +msgstr "" + +#: templates/builder/field-context-menu.php:55 +msgid "Mark as Optional" +msgstr "" + +#: templates/builder/field-context-menu.php:56 +msgid "Mark as Required" +msgstr "" + +#: templates/builder/field-context-menu.php:65 +msgid "Show Label" +msgstr "" + +#: templates/builder/field-context-menu.php:120 +msgid "Edit Smart Logic" +msgstr "" + +#: templates/builder/fullscreen/abort-message.php:27 +#: templates/builder/fullscreen/ie-notice.php:40 +#: templates/builder/fullscreen/mobile-notice.php:22 +msgid "Back to All Forms" +msgstr "" + +#: templates/builder/fullscreen/ie-notice.php:16 +msgid "You are using an outdated browser!" +msgstr "" + +#. translators: %1$s - link to the update Internet Explorer page, %2$s - link to the browse happy page. +#: templates/builder/fullscreen/ie-notice.php:22 +#, php-format +msgid "The Internet Explorer browser no more supported.
            Our form builder is optimized for modern browsers.
            Please install Microsoft Edge or learn
            how to browse happy." +msgstr "" + +#: templates/builder/fullscreen/mobile-notice.php:17 +msgid "Our form builder is optimized for desktop computers." +msgstr "" + +#: templates/builder/fullscreen/mobile-notice.php:18 +msgid "We recommend that you edit your forms on a bigger screen. If you'd like to proceed, please understand that some functionality might not behave as expected." +msgstr "" + +#: templates/builder/help.php:42 +msgid "Ask a question or search the docs..." +msgstr "" + +#: templates/builder/help.php:43 +msgid "Clear" +msgstr "" + +#: templates/builder/help.php:51 +msgid "No docs found" +msgstr "" + +#: templates/builder/help.php:62 +msgid "View Documentation" +msgstr "" + +#: templates/builder/help.php:63 +msgid "Browse documentation, reference material, and tutorials for WPForms." +msgstr "" + +#: templates/builder/help.php:68 +msgid "View All Documentation" +msgstr "" + +#: templates/builder/help.php:74 +msgid "Get Support" +msgstr "" + +#: templates/builder/help.php:77 +msgid "Submit a ticket and our world class support team will be in touch soon." +msgstr "" + +#: templates/builder/help.php:82 +msgid "Submit a Support Ticket" +msgstr "" + +#: templates/builder/help.php:86 +msgid "Upgrade to WPForms Pro to access our world class customer support." +msgstr "" + +#: templates/builder/help.php:132 +msgid "Unfortunately the error occurred while downloading help data." +msgstr "" + +#. translators: %1$s - Opening anchor tag, %2$s - Closing anchor tag. +#: templates/builder/notifications/email-template-link.php:20 +#, php-format +msgid "Select a template to use for this notification or %1$sview templates%2$s." +msgstr "" + +#: templates/builder/notifications/email-template-modal.php:21 +msgid "Choose a Template" +msgstr "" + +#: templates/builder/notifications/email-template-modal.php:24 +msgid "Browse through our collection of email notification templates." +msgstr "" + +#: templates/builder/revisions/list.php:30 +msgid "Current Version" +msgstr "" + +#. translators: %s - form revision author name. +#: templates/builder/revisions/list.php:38 +#: templates/builder/revisions/list.php:68 +#, php-format +msgid "by %s" +msgstr "" + +#: templates/builder/revisions/list.php:39 +#: templates/builder/revisions/list.php:69 +msgid "Unknown user" +msgstr "" + +#: templates/builder/revisions/notice-disabled.php:20 +msgid "Form Revisions Are Disabled" +msgstr "" + +#: templates/builder/revisions/notice-disabled.php:21 +msgid "It appears that revisions are disabled on your WordPress installation. You can enable revisions for WPForms while leaving posts revisions disabled." +msgstr "" + +#: templates/builder/revisions/notice-disabled.php:24 +#: templates/builder/revisions/notice-limited.php:33 +msgid "Learn How" +msgstr "" + +#: templates/builder/revisions/notice-limited.php:22 +msgid "Form Revisions Are Limited" +msgstr "" + +#. translators: %d - maximum number of revisions to keep. +#: templates/builder/revisions/notice-limited.php:26 +#, php-format +msgid "Revisions are enabled, but they’re limited to %d. You can increase this by making a simple change to your WordPress configuration." +msgstr "" + +#: templates/builder/templates-item.php:83 +msgid "Remove from Favorites" +msgstr "" + +#: templates/builder/templates-item.php:84 +msgid "Mark as Favorite" +msgstr "" + +#: templates/builder/templates-item.php:115 +msgid "View Demo" +msgstr "" + +#. translators: %s - WPForms documentation link. +#: templates/builder/themes/notices.php:40 +#, php-format +msgid "

            Want to customize your form styles without editing CSS?

            %1$s

            Go to Settings" +msgstr "" + +#. translators: %s - WPForms documentation link. +#: templates/builder/themes/notices.php:61 +msgid "

            Form styles are disabled because Lead Form Mode is turned on.

            To change the styling for this form, edit the options in the Lead Forms settings.

            " +msgstr "" + +#. translators: %s - WPForms documentation link. +#: templates/builder/themes/notices.php:77 +msgid "

            Form styles are disabled because Conversational Forms addon is turned on.

            To change the styling for this form, edit the options in the Conversational Forms settings.

            " +msgstr "" + +#: templates/builder/themes/notices.php:93 +msgid "Your version of Form Pages is out of date. For the best experience and access to all features, please update to the latest version." +msgstr "" + +#. translators: %s - Plugins page url. +#: templates/builder/themes/notices.php:99 +#, php-format +msgid "

            Update Available

            %1$s

            Update Now" +msgstr "" + +#: templates/education/admin/edit-post/notice.php:17 +msgid "Oh hey, it looks like you're working on a Contact page." +msgstr "" + +#: templates/education/admin/payments/single-page.php:17 +msgid "Get More Out of Payments" +msgstr "" + +#: templates/education/admin/payments/single-page.php:22 +msgid "Unlock conditional logic, coupons, lower Stripe and Square fees, and more." +msgstr "" + +#: templates/education/admin/payments/single-page.php:24 +msgid "Unlock conditional logic, coupons, lower Stripe fee, and more." +msgstr "" + +#. translators: %s - WPForms.com Upgrade page URL. +#: templates/education/admin/payments/single-page.php:29 +#, php-format +msgid "Upgrade to Pro!" +msgstr "" + +#. translators: %1$s - link to WPForms SMTP page. +#: templates/education/admin/settings/smtp-notice.php:20 +#, php-format +msgid "Solve common email deliverability issues for good. Get WP Mail SMTP!" +msgstr "" + +#. translators: %1$s - site URL; %2$s - site title. +#: templates/emails/classic-footer.php:26 +#: templates/emails/compact-footer.php:26 +#, php-format +msgid "Sent from %2$s" +msgstr "" + +#: templates/emails/summary-body-plain.php:25 +#: templates/emails/summary-body.php:37 +msgid "Let’s see how your forms performed in the past week." +msgstr "" + +#: templates/emails/summary-body-plain.php:28 +msgid "Below is the total number of submissions for each form, however actual entries are not stored in WPForms Lite." +msgstr "" + +#: templates/emails/summary-body-plain.php:29 +msgid "To view future entries inside your WordPress dashboard, and get more detailed reports, consider upgrading to Pro:" +msgstr "" + +#. translators: %1$d - number of entries. +#: templates/emails/summary-body-plain.php:38 +#: templates/emails/summary-body.php:126 +#, php-format +msgid "%1$d Total" +msgstr "" + +#: templates/emails/summary-body-plain.php:44 +#: templates/emails/summary-body.php:132 +msgid "Entry This Week" +msgid_plural "Entries This Week" +msgstr[0] "" +msgstr[1] "" + +#: templates/emails/summary-body-plain.php:67 +#: templates/emails/summary-body.php:201 +msgid "It appears you do not have any form entries yet." +msgstr "" + +#: templates/emails/summary-body.php:40 +msgid "Below is the total number of submissions for each form. However, form entries are not stored by WPForms Lite." +msgstr "" + +#: templates/emails/summary-body.php:45 +msgid "We’ve got you covered!" +msgstr "" + +#. translators: %1$s - WPForms.com Upgrade page URL. +#: templates/emails/summary-body.php:49 +#, php-format +msgid "Your entries are being backed up securely in the cloud. When you’re ready to manage your entries inside WordPress, just upgrade to Pro and we’ll automatically import them in seconds!" +msgstr "" + +#: templates/emails/summary-body.php:67 +msgid "Check out what else you’ll get with your Pro license." +msgstr "" + +#: templates/emails/summary-body.php:73 +msgid "Note: Entry backups are not enabled." +msgstr "" + +#: templates/emails/summary-body.php:74 +msgid "We recommend that you enable entry backups to guard against lost entries." +msgstr "" + +#. translators: %1$s - WPForms.com Documentation page URL. +#: templates/emails/summary-body.php:80 +#, php-format +msgid "Backups are completely free, 100%% secure, and you can turn them on in a few clicks! Enable entry backups now." +msgstr "" + +#. translators: %1$s - WPForms.com Upgrade page URL. +#: templates/emails/summary-body.php:97 +#, php-format +msgid "When you’re ready to manage your entries inside WordPress, upgrade to Pro to import your entries." +msgstr "" + +#. translators: %s - link to the site. +#: templates/emails/summary-footer-plain.php:18 +#, php-format +msgid "This email was auto-generated and sent from %s." +msgstr "" + +#. translators: %1$s - link to Settings -> Misc tab in plugin, %2$s - link to the documentation. +#: templates/emails/summary-footer-plain.php:23 +#, php-format +msgid "If you want to disable these weekly emails, open %1$s, or read the guide %2$s." +msgstr "" + +#. translators: %1$s - site URL, %2$s - link to Settings -> Misc tab in plugin, %3$s - link to the documentation. +#: templates/emails/summary-footer.php:23 +#, php-format +msgid "This email was auto-generated and sent from %1$s.
            If you want to disable these weekly emails, click here, or read the guide here." +msgstr "" + +#: templates/fields/total/summary-preview.php:80 +msgid "Item" +msgstr "" + +#: templates/fields/total/summary-preview.php:82 +msgid "Quantity" +msgstr "" + +#: templates/fields/total/summary-preview.php:83 +msgid "Qty" +msgstr "" + +#: templates/fields/total/summary-preview.php:90 +msgid "There are no products selected." +msgstr "" + +#: templates/integrations/constant-contact-v3/builder/connection.php:47 +msgid "Action To Perform" +msgstr "" + +#: templates/integrations/constant-contact-v3/builder/connection.php:55 +msgid "--- Select Action ---" +msgstr "" + +#. translators: %s - URL to the documentation article. +#: templates/integrations/elementor/no-forms.php:32 +#, php-format +msgid "Need some help? Check out our comprehensive guide." +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:22 +msgid "Custom Meta" +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:23 +msgid "Map custom meta to form field values." +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:30 +msgid "Object Type" +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:33 +msgid "Meta Key" +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:36 +msgid "Meta Value" +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:63 +msgid "--- Select Object Type ---" +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:65 +msgid "Customer" +msgstr "" + +#: templates/integrations/stripe/builder/custom-metadata.php:103 +msgid "--- Select Meta Value ---" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:20 +msgid "Please Install WPCode to Use the WPForms Snippet Library" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:21 +msgid "Install + Activate WPCode" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:24 +msgid "Please Update WPCode to Use the WPForms Snippet Library" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:25 +msgid "Update + Activate WPCode" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:29 +msgid "Please Activate WPCode to Use the WPForms Snippet Library" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:30 +msgid "Activate WPCode" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:39 +msgid "Using WPCode, you can install WPForms code snippets with 1 click right from this page or the WPCode Library in the WordPress admin." +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:45 +msgid "Learn more about WPCode" +msgstr "" + +#. translators: %s - WPCode library website URL. +#: templates/integrations/wpcode/code-snippets.php:58 +#, php-format +msgid "Using WPCode, you can install WPForms code snippets with 1 click directly from this page or the WPCode library." +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:75 +msgid "Search Snippets" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:84 +msgid "Edit Snippet" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:84 +msgid "Install Snippet" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:87 +msgid "Installed" +msgstr "" + +#: templates/integrations/wpcode/code-snippets.php:104 +msgid "Sorry, we didn't find any snippets that match your criteria." +msgstr "" + +#. translators: %s - Path to installed plugins. +#: wpforms.php:175 +#, php-format +msgid "Your site already has WPForms Pro activated. If you want to switch to WPForms Lite, please first go to %s and deactivate WPForms. Then, you can activate WPForms Lite." +msgstr "" + +#: wpforms.php:176 +msgid "Network Admin → Plugins → Installed Plugins" +msgstr "" + +#: wpforms.php:176 +msgid "Plugins → Installed Plugins" +msgstr "" + +#: assets/js/integrations/gutenberg/formselector-legacy.es5.js:298 +#: assets/js/integrations/gutenberg/formselector-legacy.js:265 +#: assets/js/integrations/gutenberg/modules/common.js:776 +#: assets/lite/js/integrations/gutenberg/formselector.es5.js:3117 +#: assets/pro/js/integrations/gutenberg/formselector.es5.js:3128 +msgid "You haven’t created a form, yet!" +msgstr "" + +#: assets/js/integrations/gutenberg/formselector-legacy.es5.js:298 +#: assets/js/integrations/gutenberg/formselector-legacy.js:266 +#: assets/js/integrations/gutenberg/modules/common.js:777 +#: assets/lite/js/integrations/gutenberg/formselector.es5.js:3117 +#: assets/pro/js/integrations/gutenberg/formselector.es5.js:3128 +msgid "What are you waiting for?" +msgstr "" + +#: assets/js/integrations/gutenberg/modules/common.js:1019 +#: assets/lite/js/integrations/gutenberg/formselector.es5.js:3324 +#: assets/pro/js/integrations/gutenberg/formselector.es5.js:3335 +msgid "Need some help? Check out our comprehensive guide." +msgstr "" diff --git a/wp-content/plugins/wpforms-lite/assets/lib/chart.min.js b/wp-content/plugins/wpforms-lite/assets/lib/chart.min.js new file mode 100755 index 00000000..0d55b7cd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/chart.min.js @@ -0,0 +1,14 @@ +/*! + * Chart.js v4.4.4 + * https://www.chartjs.org + * (c) 2024 Chart.js Contributors + * Released under the MIT License + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function N(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,l,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class xt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var bt=new xt; +/*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function xe(t,e){return me(t).getPropertyValue(e)}const be=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=be[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=t&&ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};fe()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(t){}return t}();function Pe(t,e){const i=xe(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){const o=i||t;void 0===s&&(s=ti("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e="x"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const xi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,bi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(""+t).match(xi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:"y",right:"x",bottom:"y",left:"x"})}function wi(t){return vi(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(bi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Li(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hb||l(n,x,p)&&0!==r(n,x),v=()=>!b||0===r(o,p)||l(o,x,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==x&&(b=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a]&&t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Xi={evaluateInteractionItems:Hi,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tji(t,ve(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return Yi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Ui(t,ve(e,t),"x",i.intersect,s),y:(t,e,i,s)=>Ui(t,ve(e,t),"y",i.intersect,s)}};const qi=["left","top","right","bottom"];function Ki(t,e){return t.filter((t=>t.pos===e))}function Gi(t,e){return t.filter((t=>-1===qi.indexOf(t.pos)&&t.box.axis===e))}function Zi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ji(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!qi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ss(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Zi(Ki(e,"left"),!0),n=Zi(Ki(e,"right")),o=Zi(Ki(e,"top"),!0),a=Zi(Ki(e,"bottom")),r=Gi(e,"x"),l=Gi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ki(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);ts(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Ji(l.concat(h),d);ss(r.fullSize,g,d,p),ss(l,g,d,p),ss(h,g,d,p)&&ss(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),os(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,os(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class rs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class ls extends rs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const hs="$chartjs",cs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ds=t=>null===t||""===t;const us=!!Se&&{passive:!0};function fs(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,us)}function gs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function ps(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.addedNodes,s),e=e&&!gs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ms(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.removedNodes,s),e=e&&!gs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const xs=new Map;let bs=0;function _s(){const t=window.devicePixelRatio;t!==bs&&(bs=t,xs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ys(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){xs.size||window.addEventListener("resize",_s),xs.set(t,e)}(t,o),a}function vs(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){xs.delete(t),xs.size||window.removeEventListener("resize",_s)}(t)}function Ms(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=cs[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t&&t.addEventListener(e,i,us)}(s,e,n),n}class ws extends rs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[hs]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ds(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(ds(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[hs])return!1;const i=e[hs].initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[hs],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:ps,detach:ms,resize:ys}[e]||Ms;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:vs,detach:vs,resize:vs}[e]||fs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=t&&ge(t);return!(!e||!e.isConnected)}}function ks(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ls:ws}var Ss=Object.freeze({__proto__:null,BasePlatform:rs,BasicPlatform:ls,DomPlatform:ws,_detectPlatform:ks});const Ps="transparent",Ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Ps),n=s.valid&&Qt(e||Ps);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Cs{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Ds[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Cs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(bt.add(this._chart,i),!0):void 0}}function As(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Ts(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function zs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Vs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Bs=t=>"reset"===t||"none"===t,Ws=(t,e)=>e?t:Object.assign({},t);class Ns{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Es(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Vs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Fs(t,"x")),o=e.yAxisID=l(i.yAxisID,Fs(t,"y")),a=e.rAxisID=l(i.rAxisID,Fs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Vs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e)){const t=this._cachedMeta;this._data=function(t,e){const{iScale:i,vScale:s}=e,n="x"===i.axis?"x":"y",o="x"===s.axis?"x":"y",a=Object.keys(t),r=new Array(a.length);let l,h,c;for(l=0,h=a.length;l0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Ts(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ws(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Os(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Bs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Bs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Bs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function js(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for($s(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,Us=(t,e)=>Math.min(e||t,t);function Xs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Ks(t){return t.drawTicks?t.tickLength:0}function Gs(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Zs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class Js extends Hs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ks(t.grid)-e.padding-Gs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Gs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ks(n)+o):(t.height=this.maxHeight,t.width=Ks(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Ks(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,x=function(t){return Ae(i,t,p)};let b,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)b=x(this.bottom),w=this.bottom-u,S=b-m,D=x(t.top)+m,O=t.bottom;else if("bottom"===a)b=x(this.top),D=t.top,O=x(t.bottom)-m,w=b+m,S=this.top+u;else if("left"===a)b=x(this.right),M=this.right-u,k=b-m,P=x(t.left)+m,C=t.right;else if("right"===a)b=x(this.left),P=t.left,C=x(t.right)-m,M=b+m,k=this.left+u;else if("x"===e){if("center"===a)b=x((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];b=x(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=b+m,S=w+u}else if("y"===e){if("center"===a)b=x((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];b=x(this.chart.scales[t].getPixelForValue(e))}M=b-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_0&&(o-=s/2)}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}x.push({label:v,font:P,textOffset:O,options:{rotation:m,color:i,strokeColor:o,strokeWidth:h,textAlign:f,textBaseline:A,translation:[M,w],backdrop:d}})}return x}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-$(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class tn{constructor(){this.controllers=new Qs(Ns,"datasets",!0),this.elements=new Qs(Hs,"elements"),this.plugins=new Qs(Object,"plugins"),this.scales=new Qs(Js,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function nn(t,e){return e||!1!==t?!0===t?{}:t:null}function on(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function an(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function rn(t){if("x"===t||"y"===t||"r"===t)return t}function ln(t,...e){if(rn(t))return t;for(const s of e){const e=s.axis||("top"===(i=s.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&rn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function hn(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function cn(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=an(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=ln(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return hn(t,"x",i[0])||hn(t,"y",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?"_index_":"_value_"}(l,n),c=i.scales||{};a[e]=b(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||an(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),b(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];b(e,[ue.scales[e.type],ue.scale])})),a}function dn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=cn(t,e)}function un(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const fn=new Map,gn=new Set;function pn(t,e){let i=fn.get(t);return i||(i=e(),fn.set(t,i),gn.add(i)),i}const mn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class xn{constructor(t){this._config=function(t){return(t=t||{}).data=un(t.data),dn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=un(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),dn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return pn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return pn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return pn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>mn(r,t,e)))),e.forEach((t=>mn(r,s,t))),e.forEach((t=>mn(r,re[n]||{},t))),e.forEach((t=>mn(r,ue,t))),e.forEach((t=>mn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),gn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=bn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||_n(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=bn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function bn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const _n=t=>o(t)&&Object.getOwnPropertyNames(t).some((e=>S(t[e])));const yn=["top","bottom","left","right","chartArea"];function vn(t,e){return"top"===t||"bottom"===t||-1===yn.indexOf(t)&&"x"===e}function Mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function wn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function kn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Sn(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Pn={},Dn=t=>{const e=Sn(t);return Object.values(Pn).filter((t=>t.canvas===e)).pop()};function Cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}function On(t,e,i){return t.options.clip?t[i]:e[i]}class An{static defaults=ue;static instances=Pn;static overrides=re;static registry=en;static version="4.4.4";static getChart=Dn;static register(...t){en.add(...t),Tn()}static unregister(...t){en.remove(...t),Tn()}constructor(t,e){const s=this.config=new xn(e),n=Sn(t),o=Dn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ks(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new sn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Pn[this.id]=this,r&&l?(bt.listen(this,"complete",wn),bt.listen(this,"progress",kn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return en}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return bt.stop(this),this}resize(t,e){bt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=ln(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=ln(o,n),r=l(n.type,e.dtype);void 0!==n.position&&vn(n.position,a)===vn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(en.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{as.configure(this,t,t.options),as.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Mn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{as.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;as.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t,e){const{xScale:i,yScale:s}=t;return i&&s?{left:On(i,e,"left"),right:On(i,e,"right"),top:On(s,e,"top"),bottom:On(s,e,"bottom")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Ie(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&ze(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Xi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),bt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Tn(){return u(An.instances,(t=>t._plugins.invalidate()))}function Ln(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class En{static override(t){Object.assign(En.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Ln()}parse(){return Ln()}format(){return Ln()}add(){return Ln()}diff(){return Ln()}startOf(){return Ln()}endOf(){return Ln()}}var Rn={_date:En};function In(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Fn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),x=g(C,h,d),b=g(C+E,c,u);s=(p-x)/2,n=(m-b)/2,o=-(p+x)/2,a=-(m+b)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),x=(i.width-o)/f,b=(i.height-o)/g,_=Math.max(Math.min(x,b)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Yn=Object.freeze({__proto__:null,BarController:class extends Ns{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Fn(t,e,i,s)}parseArrayData(t,e,i,s){return Fn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=this._cachedMeta.controller.getParsed(e),l=r&&r[i.axis],h=t=>{const e=t._parsed.find((t=>t[i.axis]===l)),n=e&&e[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!h(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(x-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);x=Math.max(Math.min(x,h),o),d=x+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(x))}if(x===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;x+=t,u-=t}return{size:u,base:x,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=x?g:{};if(i=b){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),x||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jn{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:$n,RadarController:class extends Ns{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>x,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),b||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Un(t,e,i,s){const n=vi(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Xn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function qn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,x=n-p-f,{outerStart:b,outerEnd:_,innerStart:y,innerEnd:v}=Un(e,u,d,x-m),M=d-b,w=d-_,k=m+b/M,S=x-_/w,P=u+y,D=u+v,O=m+y/P,A=x-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Xn(w,S,a,r);t.arc(e.x,e.y,_,S,x+E)}const i=Xn(D,x,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Xn(D,A,a,r);t.arc(e.x,e.y,v,x+E,A+Math.PI)}const s=(x-v/u+(m+y/u))/2;if(t.arc(a,r,u,x-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Xn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Xn(M,m,a,r);if(t.lineTo(n.x,n.y),b>0){const e=Xn(M,k,a,r);t.arc(e.x,e.y,b,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Kn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f="inner"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let g=e.endAngle;if(o){qn(t,e,i,s,g,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(qn(t,e,i,s,g,n),t.stroke())}function Gn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Zn(t,e,i){t.lineTo(i.x,i.y)}function Jn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[b(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[b(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=s,x=0,f=g=i),p=i}_()}function eo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?to:Qn}const io="function"==typeof Path2D;function so(t,e,i,s){io&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Gn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=eo(e);for(const r of n)Gn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class no extends Hs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||"monotone"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a),g=Z(n,a,r)&&a!==r,p=f>=O||g,m=tt(o,h+u,c+u);return p&&m}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){qn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function po(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,x=!s(a),b=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!x&&!b)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),x&&b&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=x?a:M,w=b?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(x&&(u&&M!==a?(i.push({value:a}),Mr)break;i.push({value:t})}return b&&u&&w!==r?i.length&&V(i[i.length-1].value,r,mo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):b&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&j(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class bo extends xo{static id="linear";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const _o=t=>Math.floor(z(t)),yo=(t,e)=>Math.pow(10,_o(t)+e);function vo(t){return 1===t/Math.pow(10,_o(t))}function Mo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function wo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=_o(e);let o=function(t,e){let i=_o(e-t);for(;Mo(t,e,i)>10;)i++;for(;Mo(t,e,i)<10;)i--;return Math.min(i,_o(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:vo(g),significand:u}),s}class ko extends Js{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=xo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===yo(this.min,0)?yo(this.min,-1):yo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(yo(i,-1)),o(yo(s,1)))),i<=0&&n(yo(s,-1)),s<=0&&o(yo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=wo({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function So(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Po(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Do(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Oo(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(h),u=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Ao(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function To(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Lo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(So(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/So(this.options))}generateTickLabels(t){xo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Do(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));To(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),Lo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ro={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Io=Object.keys(Ro);function zo(t,e){return t-e}function Fo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function Vo(t,e,i,s){const n=Io.length;for(let o=Io.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function Wo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class No extends Js{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Rn._date(t.adapters.date);s.init(e),b(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Vo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Io.length-1;o>=Io.indexOf(i);o--){const i=Io[o];if(Ro[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Io[i?Io.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Io.indexOf(t)+1,i=Io.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Vo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var jo=Object.freeze({__proto__:null,CategoryScale:class extends Js{static id="category";static defaults={ticks:{callback:po}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:go(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return po.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:bo,LogarithmicScale:ko,RadialLinearScale:Eo,TimeScale:No,TimeSeriesScale:class extends No{static id="timeseries";static defaults=No.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ho(e,this.min),this._tableRange=Ho(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Ho(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Ho(this._table,i*this._tableRange+this._minPos,!0)}}});const $o=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Yo=$o.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Uo(t){return $o[t%$o.length]}function Xo(t){return Yo[t%Yo.length]}function qo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof jn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Uo(e++))),e}(i,e):n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Uo(e),t.backgroundColor=Xo(e),++e}(i,e))}}function Ko(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Go={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ko(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ko(o)))return;var a;const r=qo(t);s.forEach(r)}};function Zo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Zo(t)}))}var Qo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Zo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const x=[],b=e+i-1,_=t[e].x,y=t[b].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&x.push({...t[e],x:p}),s!==u&&s!==i&&x.push({...t[s],x:p})}o>0&&i!==u&&x.push(t[i]),x.push(a),h=e,m=0,f=g=l,c=d=u=o}}return x}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Jo(t)}};function ta(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ea(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ia(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function sa(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ea(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new no({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function na(t){return t&&!1!==t.fill}function oa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function aa(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ra(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&da(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;na(i)&&da(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;na(s)&&"beforeDatasetDraw"===i.drawTime&&da(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const xa=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class ba extends Hs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=xa(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=_a(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=xa(o,d),x=this.isHorizontal(),b=this._computeTitleHeight();f=x?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+b,line:0}:{x:this.left+c,y:ft(n,this.top+b+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),x?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+b+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,x?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),x)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=_a(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class va extends Hs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var Ma={id:"title",_element:va,start(t,e,i){!function(t,e){const i=new va({ctx:t.ctx,options:e,chart:t});as.configure(t,i,e),as.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;as.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const wa=new WeakMap;var ka={id:"subtitle",start(t,e,i){const s=new va({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s),wa.set(t,s)},stop(t){as.removeBox(t,wa.get(t)),wa.delete(t)},beforeUpdate(t,e,i){const s=wa.get(t);as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Sa={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,o=0;for(e=0,i=t.length;et+e))/s.size,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i-1?t.split("\n"):t}function Ca(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,x=0,b=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){x=Math.max(x,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),x+=p.width,{width:x,height:m}}function Aa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Ta(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Aa(t,e,i,s),yAlign:s}}function La(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ea(t,e,i){const s=ki(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ra(t){return Pa([],Da(t))}function Ia(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const za={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Ia(i,t);Pa(e.before,Da(Fa(n,"beforeLabel",this,t))),Pa(e.lines,Fa(n,"label",this,t)),Pa(e.after,Da(Fa(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ra(Fa(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fa(i,"beforeFooter",this,t),n=Fa(i,"footer",this,t),o=Fa(i,"afterFooter",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ia(t.callbacks,e);s.push(Fa(i,"labelColor",this,e)),n.push(Fa(i,"labelPointStyle",this,e)),o.push(Fa(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Sa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oa(this,i),a=Object.assign({},t,e),r=Ta(this.chart,i,a),l=La(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,b=_+o,y=_-o):(p=d+f,m=p+o,b=_-o,y=_+o),x=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(b=u,_=b-o,p=m-o,x=m+o):(b=u+g,_=b+o,p=m+o,x=m-o),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let x,b,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Ea(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Sa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oa(this,t),a=Object.assign({},i,this._size),r=Ta(e,t,a),l=La(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e.filter((t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index)));const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Sa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Ba={id:"tooltip",_element:Va,positioners:Sa,afterInit(t,e,i){i&&(t.tooltip=new Va({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:za},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return An.register(Yn,jo,fo,t),An.helpers={...Wi},An._adapters=Rn,An.Animation=Cs,An.Animations=Os,An.animator=bt,An.controllers=en.controllers.items,An.DatasetController=Ns,An.Element=Hs,An.elements=fo,An.Interaction=Xi,An.layouts=as,An.platforms=Ss,An.Scale=Js,An.Ticks=ae,Object.assign(An,Yn,jo,fo,t,Ss),An.Chart=An,"undefined"!=typeof window&&(window.Chart=An),An})); diff --git a/wp-content/plugins/wpforms-lite/assets/lib/chartjs-adapter-moment.min.js b/wp-content/plugins/wpforms-lite/assets/lib/chartjs-adapter-moment.min.js new file mode 100755 index 00000000..985a1652 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/chartjs-adapter-moment.min.js @@ -0,0 +1,7 @@ +/*! + * chartjs-adapter-moment v1.0.1 + * https://www.chartjs.org + * (c) 2022 chartjs-adapter-moment Contributors + * Released under the MIT license + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("moment"),require("chart.js")):"function"==typeof define&&define.amd?define(["moment","chart.js"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).moment,e.Chart)}(this,(function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=n(e);const a={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};t._adapters._date.override("function"==typeof f.default?{_id:"moment",formats:function(){return a},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=f.default(e,t):e instanceof f.default||(e=f.default(e)),e.isValid()?e.valueOf():null},format:function(e,t){return f.default(e).format(t)},add:function(e,t,n){return f.default(e).add(t,n).valueOf()},diff:function(e,t,n){return f.default(e).diff(f.default(t),n)},startOf:function(e,t,n){return e=f.default(e),"isoWeek"===t?(n=Math.trunc(Math.min(Math.max(0,n),6)),e.isoWeekday(n).startOf("day").valueOf()):e.startOf(t).valueOf()},endOf:function(e,t){return f.default(e).endOf(t).valueOf()}}:{})})); diff --git a/wp-content/plugins/wpforms-lite/assets/lib/choices.min.js b/wp-content/plugins/wpforms-lite/assets/lib/choices.min.js new file mode 100755 index 00000000..d9014f4f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/choices.min.js @@ -0,0 +1,5 @@ +/*! + * Choices.js - v10.2.0 + * For license information please see choices.min.js.LICENSE.txt + */ +!function(){"use strict";var e={282:function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.clearChoices=t.activateChoices=t.filterChoices=t.addChoice=void 0;var n=i(883);t.addChoice=function(e){var t=e.value,i=e.label,r=e.id,s=e.groupId,o=e.disabled,a=e.elementId,c=e.customProperties,l=e.placeholder,h=e.keyCode;return{type:n.ACTION_TYPES.ADD_CHOICE,value:t,label:i,id:r,groupId:s,disabled:o,elementId:a,customProperties:c,placeholder:l,keyCode:h}},t.filterChoices=function(e){return{type:n.ACTION_TYPES.FILTER_CHOICES,results:e}},t.activateChoices=function(e){return void 0===e&&(e=!0),{type:n.ACTION_TYPES.ACTIVATE_CHOICES,active:e}},t.clearChoices=function(){return{type:n.ACTION_TYPES.CLEAR_CHOICES}}},783:function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.addGroup=void 0;var n=i(883);t.addGroup=function(e){var t=e.value,i=e.id,r=e.active,s=e.disabled;return{type:n.ACTION_TYPES.ADD_GROUP,value:t,id:i,active:r,disabled:s}}},464:function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.highlightItem=t.removeItem=t.addItem=void 0;var n=i(883);t.addItem=function(e){var t=e.value,i=e.label,r=e.id,s=e.choiceId,o=e.groupId,a=e.customProperties,c=e.placeholder,l=e.keyCode;return{type:n.ACTION_TYPES.ADD_ITEM,value:t,label:i,id:r,choiceId:s,groupId:o,customProperties:a,placeholder:c,keyCode:l}},t.removeItem=function(e,t){return{type:n.ACTION_TYPES.REMOVE_ITEM,id:e,choiceId:t}},t.highlightItem=function(e,t){return{type:n.ACTION_TYPES.HIGHLIGHT_ITEM,id:e,highlighted:t}}},137:function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.setIsLoading=t.resetTo=t.clearAll=void 0;var n=i(883);t.clearAll=function(){return{type:n.ACTION_TYPES.CLEAR_ALL}},t.resetTo=function(e){return{type:n.ACTION_TYPES.RESET_TO,state:e}},t.setIsLoading=function(e){return{type:n.ACTION_TYPES.SET_IS_LOADING,isLoading:e}}},373:function(e,t,i){var n=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var n,r=0,s=t.length;r=0?this._store.getGroupById(r):null;return this._store.dispatch((0,l.highlightItem)(i,!0)),t&&this.passedElement.triggerEvent(d.EVENTS.highlightItem,{id:i,value:o,label:c,groupValue:h&&h.value?h.value:null}),this},e.prototype.unhighlightItem=function(e){if(!e||!e.id)return this;var t=e.id,i=e.groupId,n=void 0===i?-1:i,r=e.value,s=void 0===r?"":r,o=e.label,a=void 0===o?"":o,c=n>=0?this._store.getGroupById(n):null;return this._store.dispatch((0,l.highlightItem)(t,!1)),this.passedElement.triggerEvent(d.EVENTS.highlightItem,{id:t,value:s,label:a,groupValue:c&&c.value?c.value:null}),this},e.prototype.highlightAll=function(){var e=this;return this._store.items.forEach((function(t){return e.highlightItem(t)})),this},e.prototype.unhighlightAll=function(){var e=this;return this._store.items.forEach((function(t){return e.unhighlightItem(t)})),this},e.prototype.removeActiveItemsByValue=function(e){var t=this;return this._store.activeItems.filter((function(t){return t.value===e})).forEach((function(e){return t._removeItem(e)})),this},e.prototype.removeActiveItems=function(e){var t=this;return this._store.activeItems.filter((function(t){return t.id!==e})).forEach((function(e){return t._removeItem(e)})),this},e.prototype.removeHighlightedItems=function(e){var t=this;return void 0===e&&(e=!1),this._store.highlightedActiveItems.forEach((function(i){t._removeItem(i),e&&t._triggerChange(i.value)})),this},e.prototype.showDropdown=function(e){var t=this;return this.dropdown.isActive||requestAnimationFrame((function(){t.dropdown.show(),t.containerOuter.open(t.dropdown.distanceFromTopWindow),!e&&t._canSearch&&t.input.focus(),t.passedElement.triggerEvent(d.EVENTS.showDropdown,{})})),this},e.prototype.hideDropdown=function(e){var t=this;return this.dropdown.isActive?(requestAnimationFrame((function(){t.dropdown.hide(),t.containerOuter.close(),!e&&t._canSearch&&(t.input.removeActiveDescendant(),t.input.blur()),t.passedElement.triggerEvent(d.EVENTS.hideDropdown,{})})),this):this},e.prototype.getValue=function(e){void 0===e&&(e=!1);var t=this._store.activeItems.reduce((function(t,i){var n=e?i.value:i;return t.push(n),t}),[]);return this._isSelectOneElement?t[0]:t},e.prototype.setValue=function(e){var t=this;return this.initialised?(e.forEach((function(e){return t._setChoiceOrItem(e)})),this):this},e.prototype.setChoiceByValue=function(e){var t=this;return!this.initialised||this._isTextElement||(Array.isArray(e)?e:[e]).forEach((function(e){return t._findAndSelectChoiceByValue(e)})),this},e.prototype.setChoices=function(e,t,i,n){var r=this;if(void 0===e&&(e=[]),void 0===t&&(t="value"),void 0===i&&(i="label"),void 0===n&&(n=!1),!this.initialised)throw new ReferenceError("setChoices was called on a non-initialized instance of Choices");if(!this._isSelectElement)throw new TypeError("setChoices can't be used with INPUT based Choices");if("string"!=typeof t||!t)throw new TypeError("value parameter must be a name of 'value' field in passed objects");if(n&&this.clearChoices(),"function"==typeof e){var s=e(this);if("function"==typeof Promise&&s instanceof Promise)return new Promise((function(e){return requestAnimationFrame(e)})).then((function(){return r._handleLoadingState(!0)})).then((function(){return s})).then((function(e){return r.setChoices(e,t,i,n)})).catch((function(e){r.config.silent||console.error(e)})).then((function(){return r._handleLoadingState(!1)})).then((function(){return r}));if(!Array.isArray(s))throw new TypeError(".setChoices first argument function must return either array of choices or Promise, got: ".concat(typeof s));return this.setChoices(s,t,i,!1)}if(!Array.isArray(e))throw new TypeError(".setChoices must be called either with array of choices with a function resulting into Promise of array of choices");return this.containerOuter.removeLoadingState(),this._startLoading(),e.forEach((function(e){if(e.choices)r._addGroup({id:e.id?parseInt("".concat(e.id),10):null,group:e,valueKey:t,labelKey:i});else{var n=e;r._addChoice({value:n[t],label:n[i],isSelected:!!n.selected,isDisabled:!!n.disabled,placeholder:!!n.placeholder,customProperties:n.customProperties})}})),this._stopLoading(),this},e.prototype.clearChoices=function(){return this._store.dispatch((0,a.clearChoices)()),this},e.prototype.clearStore=function(){return this._store.dispatch((0,h.clearAll)()),this},e.prototype.clearInput=function(){var e=!this._isSelectOneElement;return this.input.clear(e),!this._isTextElement&&this._canSearch&&(this._isSearching=!1,this._store.dispatch((0,a.activateChoices)(!0))),this},e.prototype._render=function(){if(!this._store.isLoading()){this._currentState=this._store.state;var e=this._currentState.choices!==this._prevState.choices||this._currentState.groups!==this._prevState.groups||this._currentState.items!==this._prevState.items,t=this._isSelectElement,i=this._currentState.items!==this._prevState.items;e&&(t&&this._renderChoices(),i&&this._renderItems(),this._prevState=this._currentState)}},e.prototype._renderChoices=function(){var e=this,t=this._store,i=t.activeGroups,n=t.activeChoices,r=document.createDocumentFragment();if(this.choiceList.clear(),this.config.resetScrollPosition&&requestAnimationFrame((function(){return e.choiceList.scrollToTop()})),i.length>=1&&!this._isSearching){var s=n.filter((function(e){return!0===e.placeholder&&-1===e.groupId}));s.length>=1&&(r=this._createChoicesFragment(s,r)),r=this._createGroupsFragment(i,n,r)}else n.length>=1&&(r=this._createChoicesFragment(n,r));if(r.childNodes&&r.childNodes.length>0){var o=this._store.activeItems,a=this._canAddItem(o,this.input.value);if(a.response)this.choiceList.append(r),this._highlightChoice();else{var c=this._getTemplate("notice",a.notice);this.choiceList.append(c)}}else{var l=void 0;c=void 0,this._isSearching?(c="function"==typeof this.config.noResultsText?this.config.noResultsText():this.config.noResultsText,l=this._getTemplate("notice",c,"no-results")):(c="function"==typeof this.config.noChoicesText?this.config.noChoicesText():this.config.noChoicesText,l=this._getTemplate("notice",c,"no-choices")),this.choiceList.append(l)}},e.prototype._renderItems=function(){var e=this._store.activeItems||[];this.itemList.clear();var t=this._createItemsFragment(e);t.childNodes&&this.itemList.append(t)},e.prototype._createGroupsFragment=function(e,t,i){var n=this;return void 0===i&&(i=document.createDocumentFragment()),this.config.shouldSort&&e.sort(this.config.sorter),e.forEach((function(e){var r=function(e){return t.filter((function(t){return n._isSelectOneElement?t.groupId===e.id:t.groupId===e.id&&("always"===n.config.renderSelectedChoices||!t.selected)}))}(e);if(r.length>=1){var s=n._getTemplate("choiceGroup",e);i.appendChild(s),n._createChoicesFragment(r,i,!0)}})),i},e.prototype._createChoicesFragment=function(e,t,i){var r=this;void 0===t&&(t=document.createDocumentFragment()),void 0===i&&(i=!1);var s=this.config,o=s.renderSelectedChoices,a=s.searchResultLimit,c=s.renderChoiceLimit,l=this._isSearching?f.sortByScore:this.config.sorter,h=function(e){if("auto"!==o||r._isSelectOneElement||!e.selected){var i=r._getTemplate("choice",e,r.config.itemSelectText);t.appendChild(i)}},u=e;"auto"!==o||this._isSelectOneElement||(u=e.filter((function(e){return!e.selected})));var d=u.reduce((function(e,t){return t.placeholder?e.placeholderChoices.push(t):e.normalChoices.push(t),e}),{placeholderChoices:[],normalChoices:[]}),p=d.placeholderChoices,m=d.normalChoices;(this.config.shouldSort||this._isSearching)&&m.sort(l);var v=u.length,g=this._isSelectOneElement?n(n([],p,!0),m,!0):m;this._isSearching?v=a:c&&c>0&&!i&&(v=c);for(var _=0;_=n){var o=r?this._searchChoices(e):0;this.passedElement.triggerEvent(d.EVENTS.search,{value:e,resultCount:o})}else s&&(this._isSearching=!1,this._store.dispatch((0,a.activateChoices)(!0)))}},e.prototype._canAddItem=function(e,t){var i=!0,n="function"==typeof this.config.addItemText?this.config.addItemText(t):this.config.addItemText;if(!this._isSelectOneElement){var r=(0,f.existsInArray)(e,t);this.config.maxItemCount>0&&this.config.maxItemCount<=e.length&&(i=!1,n="function"==typeof this.config.maxItemText?this.config.maxItemText(this.config.maxItemCount):this.config.maxItemText),!this.config.duplicateItemsAllowed&&r&&i&&(i=!1,n="function"==typeof this.config.uniqueItemText?this.config.uniqueItemText(t):this.config.uniqueItemText),this._isTextElement&&this.config.addItems&&i&&"function"==typeof this.config.addItemFilter&&!this.config.addItemFilter(t)&&(i=!1,n="function"==typeof this.config.customAddItemText?this.config.customAddItemText(t):this.config.customAddItemText)}return{response:i,notice:n}},e.prototype._searchChoices=function(e){var t="string"==typeof e?e.trim():e,i="string"==typeof this._currentValue?this._currentValue.trim():this._currentValue;if(t.length<1&&t==="".concat(i," "))return 0;var r=this._store.searchableChoices,s=t,c=Object.assign(this.config.fuseOptions,{keys:n([],this.config.searchFields,!0),includeMatches:!0}),l=new o.default(r,c).search(s);return this._currentValue=t,this._highlightPosition=0,this._isSearching=!0,this._store.dispatch((0,a.filterChoices)(l)),l.length},e.prototype._addEventListeners=function(){var e=document.documentElement;e.addEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.addEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.addEventListener("mousedown",this._onMouseDown,!0),e.addEventListener("click",this._onClick,{passive:!0}),e.addEventListener("touchmove",this._onTouchMove,{passive:!0}),this.dropdown.element.addEventListener("mouseover",this._onMouseOver,{passive:!0}),this._isSelectOneElement&&(this.containerOuter.element.addEventListener("focus",this._onFocus,{passive:!0}),this.containerOuter.element.addEventListener("blur",this._onBlur,{passive:!0})),this.input.element.addEventListener("keyup",this._onKeyUp,{passive:!0}),this.input.element.addEventListener("focus",this._onFocus,{passive:!0}),this.input.element.addEventListener("blur",this._onBlur,{passive:!0}),this.input.element.form&&this.input.element.form.addEventListener("reset",this._onFormReset,{passive:!0}),this.input.addEventListeners()},e.prototype._removeEventListeners=function(){var e=document.documentElement;e.removeEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.removeEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.removeEventListener("mousedown",this._onMouseDown,!0),e.removeEventListener("click",this._onClick),e.removeEventListener("touchmove",this._onTouchMove),this.dropdown.element.removeEventListener("mouseover",this._onMouseOver),this._isSelectOneElement&&(this.containerOuter.element.removeEventListener("focus",this._onFocus),this.containerOuter.element.removeEventListener("blur",this._onBlur)),this.input.element.removeEventListener("keyup",this._onKeyUp),this.input.element.removeEventListener("focus",this._onFocus),this.input.element.removeEventListener("blur",this._onBlur),this.input.element.form&&this.input.element.form.removeEventListener("reset",this._onFormReset),this.input.removeEventListeners()},e.prototype._onKeyDown=function(e){var t=e.keyCode,i=this._store.activeItems,n=this.input.isFocussed,r=this.dropdown.isActive,s=this.itemList.hasChildren(),o=String.fromCharCode(t),a=/[^\x00-\x1F]/.test(o),c=d.KEY_CODES.BACK_KEY,l=d.KEY_CODES.DELETE_KEY,h=d.KEY_CODES.ENTER_KEY,u=d.KEY_CODES.A_KEY,p=d.KEY_CODES.ESC_KEY,f=d.KEY_CODES.UP_KEY,m=d.KEY_CODES.DOWN_KEY,v=d.KEY_CODES.PAGE_UP_KEY,g=d.KEY_CODES.PAGE_DOWN_KEY;switch(this._isTextElement||r||!a||(this.showDropdown(),this.input.isFocussed||(this.input.value+=e.key.toLowerCase())),t){case u:return this._onSelectKey(e,s);case h:return this._onEnterKey(e,i,r);case p:return this._onEscapeKey(r);case f:case v:case m:case g:return this._onDirectionKey(e,r);case l:case c:return this._onDeleteKey(e,i,n)}},e.prototype._onKeyUp=function(e){var t=e.target,i=e.keyCode,n=this.input.value,r=this._store.activeItems,s=this._canAddItem(r,n),o=d.KEY_CODES.BACK_KEY,c=d.KEY_CODES.DELETE_KEY;if(this._isTextElement)if(s.notice&&n){var l=this._getTemplate("notice",s.notice);this.dropdown.element.innerHTML=l.outerHTML,this.showDropdown(!0)}else this.hideDropdown(!0);else{var h=(i===o||i===c)&&t&&!t.value,u=!this._isTextElement&&this._isSearching,p=this._canSearch&&s.response;h&&u?(this._isSearching=!1,this._store.dispatch((0,a.activateChoices)(!0))):p&&this._handleSearch(this.input.rawValue)}this._canSearch=this.config.searchEnabled},e.prototype._onSelectKey=function(e,t){var i=e.ctrlKey,n=e.metaKey;(i||n)&&t&&(this._canSearch=!1,this.config.removeItems&&!this.input.value&&this.input.element===document.activeElement&&this.highlightAll())},e.prototype._onEnterKey=function(e,t,i){var n=e.target,r=d.KEY_CODES.ENTER_KEY,s=n&&n.hasAttribute("data-button");if(this._isTextElement&&n&&n.value){var o=this.input.value;this._canAddItem(t,o).response&&(this.hideDropdown(!0),this._addItem({value:o}),this._triggerChange(o),this.clearInput())}if(s&&(this._handleButtonAction(t,n),e.preventDefault()),i){var a=this.dropdown.getChild(".".concat(this.config.classNames.highlightedState));a&&(t[0]&&(t[0].keyCode=r),this._handleChoiceAction(t,a)),e.preventDefault()}else this._isSelectOneElement&&(this.showDropdown(),e.preventDefault())},e.prototype._onEscapeKey=function(e){e&&(this.hideDropdown(!0),this.containerOuter.focus())},e.prototype._onDirectionKey=function(e,t){var i=e.keyCode,n=e.metaKey,r=d.KEY_CODES.DOWN_KEY,s=d.KEY_CODES.PAGE_UP_KEY,o=d.KEY_CODES.PAGE_DOWN_KEY;if(t||this._isSelectOneElement){this.showDropdown(),this._canSearch=!1;var a=i===r||i===o?1:-1,c="[data-choice-selectable]",l=void 0;if(n||i===o||i===s)l=a>0?this.dropdown.element.querySelector("".concat(c,":last-of-type")):this.dropdown.element.querySelector(c);else{var h=this.dropdown.element.querySelector(".".concat(this.config.classNames.highlightedState));l=h?(0,f.getAdjacentEl)(h,c,a):this.dropdown.element.querySelector(c)}l&&((0,f.isScrolledIntoView)(l,this.choiceList.element,a)||this.choiceList.scrollToChildElement(l,a),this._highlightChoice(l)),e.preventDefault()}},e.prototype._onDeleteKey=function(e,t,i){var n=e.target;this._isSelectOneElement||n.value||!i||(this._handleBackspace(t),e.preventDefault())},e.prototype._onTouchMove=function(){this._wasTap&&(this._wasTap=!1)},e.prototype._onTouchEnd=function(e){var t=(e||e.touches[0]).target;this._wasTap&&this.containerOuter.element.contains(t)&&((t===this.containerOuter.element||t===this.containerInner.element)&&(this._isTextElement?this.input.focus():this._isSelectMultipleElement&&this.showDropdown()),e.stopPropagation()),this._wasTap=!0},e.prototype._onMouseDown=function(e){var t=e.target;if(t instanceof HTMLElement){if(_&&this.choiceList.element.contains(t)){var i=this.choiceList.element.firstElementChild,n="ltr"===this._direction?e.offsetX>=i.offsetWidth:e.offsetX0&&this.unhighlightAll(),this.containerOuter.removeFocusState(),this.hideDropdown(!0))},e.prototype._onFocus=function(e){var t,i=this,n=e.target;n&&this.containerOuter.element.contains(n)&&((t={})[d.TEXT_TYPE]=function(){n===i.input.element&&i.containerOuter.addFocusState()},t[d.SELECT_ONE_TYPE]=function(){i.containerOuter.addFocusState(),n===i.input.element&&i.showDropdown(!0)},t[d.SELECT_MULTIPLE_TYPE]=function(){n===i.input.element&&(i.showDropdown(!0),i.containerOuter.addFocusState())},t)[this.passedElement.element.type]()},e.prototype._onBlur=function(e){var t,i=this,n=e.target;if(n&&this.containerOuter.element.contains(n)&&!this._isScrollingOnIe){var r=this._store.activeItems.some((function(e){return e.highlighted}));((t={})[d.TEXT_TYPE]=function(){n===i.input.element&&(i.containerOuter.removeFocusState(),r&&i.unhighlightAll(),i.hideDropdown(!0))},t[d.SELECT_ONE_TYPE]=function(){i.containerOuter.removeFocusState(),(n===i.input.element||n===i.containerOuter.element&&!i._canSearch)&&i.hideDropdown(!0)},t[d.SELECT_MULTIPLE_TYPE]=function(){n===i.input.element&&(i.containerOuter.removeFocusState(),i.hideDropdown(!0),r&&i.unhighlightAll())},t)[this.passedElement.element.type]()}else this._isScrollingOnIe=!1,this.input.element.focus()},e.prototype._onFormReset=function(){this._store.dispatch((0,h.resetTo)(this._initialState))},e.prototype._highlightChoice=function(e){var t=this;void 0===e&&(e=null);var i=Array.from(this.dropdown.element.querySelectorAll("[data-choice-selectable]"));if(i.length){var n=e;Array.from(this.dropdown.element.querySelectorAll(".".concat(this.config.classNames.highlightedState))).forEach((function(e){e.classList.remove(t.config.classNames.highlightedState),e.setAttribute("aria-selected","false")})),n?this._highlightPosition=i.indexOf(n):(n=i.length>this._highlightPosition?i[this._highlightPosition]:i[i.length-1])||(n=i[0]),n.classList.add(this.config.classNames.highlightedState),n.setAttribute("aria-selected","true"),this.passedElement.triggerEvent(d.EVENTS.highlightChoice,{el:n}),this.dropdown.isActive&&(this.input.setActiveDescendant(n.id),this.containerOuter.setActiveDescendant(n.id))}},e.prototype._addItem=function(e){var t=e.value,i=e.label,n=void 0===i?null:i,r=e.choiceId,s=void 0===r?-1:r,o=e.groupId,a=void 0===o?-1:o,c=e.customProperties,h=void 0===c?{}:c,u=e.placeholder,p=void 0!==u&&u,f=e.keyCode,m=void 0===f?-1:f,v="string"==typeof t?t.trim():t,g=this._store.items,_=n||v,y=s||-1,E=a>=0?this._store.getGroupById(a):null,b=g?g.length+1:1;this.config.prependValue&&(v=this.config.prependValue+v.toString()),this.config.appendValue&&(v+=this.config.appendValue.toString()),this._store.dispatch((0,l.addItem)({value:v,label:_,id:b,choiceId:y,groupId:a,customProperties:h,placeholder:p,keyCode:m})),this._isSelectOneElement&&this.removeActiveItems(b),this.passedElement.triggerEvent(d.EVENTS.addItem,{id:b,value:v,label:_,customProperties:h,groupValue:E&&E.value?E.value:null,keyCode:m})},e.prototype._removeItem=function(e){var t=e.id,i=e.value,n=e.label,r=e.customProperties,s=e.choiceId,o=e.groupId,a=o&&o>=0?this._store.getGroupById(o):null;t&&s&&(this._store.dispatch((0,l.removeItem)(t,s)),this.passedElement.triggerEvent(d.EVENTS.removeItem,{id:t,value:i,label:n,customProperties:r,groupValue:a&&a.value?a.value:null}))},e.prototype._addChoice=function(e){var t=e.value,i=e.label,n=void 0===i?null:i,r=e.isSelected,s=void 0!==r&&r,o=e.isDisabled,c=void 0!==o&&o,l=e.groupId,h=void 0===l?-1:l,u=e.customProperties,d=void 0===u?{}:u,p=e.placeholder,f=void 0!==p&&p,m=e.keyCode,v=void 0===m?-1:m;if(null!=t){var g=this._store.choices,_=n||t,y=g?g.length+1:1,E="".concat(this._baseId,"-").concat(this._idNames.itemChoice,"-").concat(y);this._store.dispatch((0,a.addChoice)({id:y,groupId:h,elementId:E,value:t,label:_,disabled:c,customProperties:d,placeholder:f,keyCode:v})),s&&this._addItem({value:t,label:_,choiceId:y,customProperties:d,placeholder:f,keyCode:v})}},e.prototype._addGroup=function(e){var t=this,i=e.group,n=e.id,r=e.valueKey,s=void 0===r?"value":r,o=e.labelKey,a=void 0===o?"label":o,l=(0,f.isType)("Object",i)?i.choices:Array.from(i.getElementsByTagName("OPTION")),h=n||Math.floor((new Date).valueOf()*Math.random()),u=!!i.disabled&&i.disabled;l?(this._store.dispatch((0,c.addGroup)({value:i.label,id:h,active:!0,disabled:u})),l.forEach((function(e){var i=e.disabled||e.parentNode&&e.parentNode.disabled;t._addChoice({value:e[s],label:(0,f.isType)("Object",e)?e[a]:e.innerHTML,isSelected:e.selected,isDisabled:i,groupId:h,customProperties:e.customProperties,placeholder:e.placeholder})}))):this._store.dispatch((0,c.addGroup)({value:i.label,id:i.id,active:!1,disabled:i.disabled}))},e.prototype._getTemplate=function(e){for(var t,i=[],r=1;r0?this.element.scrollTop+o-r:e.offsetTop;requestAnimationFrame((function(){i._animateScroll(a,t)}))}},e.prototype._scrollDown=function(e,t,i){var n=(i-e)/t,r=n>1?n:1;this.element.scrollTop=e+r},e.prototype._scrollUp=function(e,t,i){var n=(e-i)/t,r=n>1?n:1;this.element.scrollTop=e-r},e.prototype._animateScroll=function(e,t){var i=this,r=n.SCROLLING_SPEED,s=this.element.scrollTop,o=!1;t>0?(this._scrollDown(s,r,e),se&&(o=!0)),o&&requestAnimationFrame((function(){i._animateScroll(e,t)}))},e}();t.default=r},730:function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0});var n=i(799),r=function(){function e(e){var t=e.element,i=e.classNames;if(this.element=t,this.classNames=i,!(t instanceof HTMLInputElement||t instanceof HTMLSelectElement))throw new TypeError("Invalid element passed");this.isDisabled=!1}return Object.defineProperty(e.prototype,"isActive",{get:function(){return"active"===this.element.dataset.choice},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"dir",{get:function(){return this.element.dir},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this.element.value},set:function(e){this.element.value=e},enumerable:!1,configurable:!0}),e.prototype.conceal=function(){this.element.classList.add(this.classNames.input),this.element.hidden=!0,this.element.tabIndex=-1;var e=this.element.getAttribute("style");e&&this.element.setAttribute("data-choice-orig-style",e),this.element.setAttribute("data-choice","active")},e.prototype.reveal=function(){this.element.classList.remove(this.classNames.input),this.element.hidden=!1,this.element.removeAttribute("tabindex");var e=this.element.getAttribute("data-choice-orig-style");e?(this.element.removeAttribute("data-choice-orig-style"),this.element.setAttribute("style",e)):this.element.removeAttribute("style"),this.element.removeAttribute("data-choice"),this.element.value=this.element.value},e.prototype.enable=function(){this.element.removeAttribute("disabled"),this.element.disabled=!1,this.isDisabled=!1},e.prototype.disable=function(){this.element.setAttribute("disabled",""),this.element.disabled=!0,this.isDisabled=!0},e.prototype.triggerEvent=function(e,t){(0,n.dispatchEvent)(this.element,e,t)},e}();t.default=r},541:function(e,t,i){var n,r=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var i=t.element,n=t.classNames,r=t.delimiter,s=e.call(this,{element:i,classNames:n})||this;return s.delimiter=r,s}return r(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.element.value},set:function(e){this.element.setAttribute("value",e),this.element.value=e},enumerable:!1,configurable:!0}),t}(s(i(730)).default);t.default=o},982:function(e,t,i){var n,r=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var i=t.element,n=t.classNames,r=t.template,s=e.call(this,{element:i,classNames:n})||this;return s.template=r,s}return r(t,e),Object.defineProperty(t.prototype,"placeholderOption",{get:function(){return this.element.querySelector('option[value=""]')||this.element.querySelector("option[placeholder]")},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"optionGroups",{get:function(){return Array.from(this.element.getElementsByTagName("OPTGROUP"))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"options",{get:function(){return Array.from(this.element.options)},set:function(e){var t=this,i=document.createDocumentFragment();e.forEach((function(e){return n=e,r=t.template(n),void i.appendChild(r);var n,r})),this.appendDocFragment(i)},enumerable:!1,configurable:!0}),t.prototype.appendDocFragment=function(e){this.element.innerHTML="",this.element.appendChild(e)},t}(s(i(730)).default);t.default=o},883:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SCROLLING_SPEED=t.SELECT_MULTIPLE_TYPE=t.SELECT_ONE_TYPE=t.TEXT_TYPE=t.KEY_CODES=t.ACTION_TYPES=t.EVENTS=void 0,t.EVENTS={showDropdown:"showDropdown",hideDropdown:"hideDropdown",change:"change",choice:"choice",search:"search",addItem:"addItem",removeItem:"removeItem",highlightItem:"highlightItem",highlightChoice:"highlightChoice",unhighlightItem:"unhighlightItem"},t.ACTION_TYPES={ADD_CHOICE:"ADD_CHOICE",FILTER_CHOICES:"FILTER_CHOICES",ACTIVATE_CHOICES:"ACTIVATE_CHOICES",CLEAR_CHOICES:"CLEAR_CHOICES",ADD_GROUP:"ADD_GROUP",ADD_ITEM:"ADD_ITEM",REMOVE_ITEM:"REMOVE_ITEM",HIGHLIGHT_ITEM:"HIGHLIGHT_ITEM",CLEAR_ALL:"CLEAR_ALL",RESET_TO:"RESET_TO",SET_IS_LOADING:"SET_IS_LOADING"},t.KEY_CODES={BACK_KEY:46,DELETE_KEY:8,ENTER_KEY:13,A_KEY:65,ESC_KEY:27,UP_KEY:38,DOWN_KEY:40,PAGE_UP_KEY:33,PAGE_DOWN_KEY:34},t.TEXT_TYPE="text",t.SELECT_ONE_TYPE="select-one",t.SELECT_MULTIPLE_TYPE="select-multiple",t.SCROLLING_SPEED=4},789:function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CONFIG=t.DEFAULT_CLASSNAMES=void 0;var n=i(799);t.DEFAULT_CLASSNAMES={containerOuter:"choices",containerInner:"choices__inner",input:"choices__input",inputCloned:"choices__input--cloned",list:"choices__list",listItems:"choices__list--multiple",listSingle:"choices__list--single",listDropdown:"choices__list--dropdown",item:"choices__item",itemSelectable:"choices__item--selectable",itemDisabled:"choices__item--disabled",itemChoice:"choices__item--choice",placeholder:"choices__placeholder",group:"choices__group",groupHeading:"choices__heading",button:"choices__button",activeState:"is-active",focusState:"is-focused",openState:"is-open",disabledState:"is-disabled",highlightedState:"is-highlighted",selectedState:"is-selected",flippedState:"is-flipped",loadingState:"is-loading",noResults:"has-no-results",noChoices:"has-no-choices"},t.DEFAULT_CONFIG={items:[],choices:[],silent:!1,renderChoiceLimit:-1,maxItemCount:-1,addItems:!0,addItemFilter:null,removeItems:!0,removeItemButton:!1,editItems:!1,allowHTML:!0,duplicateItemsAllowed:!0,delimiter:",",paste:!0,searchEnabled:!0,searchChoices:!0,searchFloor:1,searchResultLimit:4,searchFields:["label","value"],position:"auto",resetScrollPosition:!0,shouldSort:!0,shouldSortItems:!1,sorter:n.sortByAlpha,placeholder:!0,placeholderValue:null,searchPlaceholderValue:null,prependValue:null,appendValue:null,renderSelectedChoices:"auto",loadingText:"Loading...",noResultsText:"No results found",noChoicesText:"No choices to choose from",itemSelectText:"Press to select",uniqueItemText:"Only unique values can be added",customAddItemText:"Only values matching specific conditions can be added",addItemText:function(e){return'Press Enter to add "'.concat((0,n.sanitise)(e),'"')},maxItemText:function(e){return"Only ".concat(e," values can be added")},valueComparer:function(e,t){return e===t},fuseOptions:{includeScore:!0},labelId:"",callbackOnInit:null,callbackOnCreateTemplates:null,classNames:t.DEFAULT_CLASSNAMES}},18:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},978:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},948:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},359:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},285:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},533:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},187:function(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,r)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),r=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),r(i(18),t),r(i(978),t),r(i(948),t),r(i(359),t),r(i(285),t),r(i(533),t),r(i(287),t),r(i(132),t),r(i(837),t),r(i(598),t),r(i(369),t),r(i(37),t),r(i(47),t),r(i(923),t),r(i(876),t)},287:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},132:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},837:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},598:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},37:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},369:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},47:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},923:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},876:function(e,t){Object.defineProperty(t,"__esModule",{value:!0})},799:function(e,t){var i;Object.defineProperty(t,"__esModule",{value:!0}),t.parseCustomProperties=t.diff=t.cloneObject=t.existsInArray=t.dispatchEvent=t.sortByScore=t.sortByAlpha=t.strToEl=t.sanitise=t.isScrolledIntoView=t.getAdjacentEl=t.wrap=t.isType=t.getType=t.generateId=t.generateChars=t.getRandomNumber=void 0,t.getRandomNumber=function(e,t){return Math.floor(Math.random()*(t-e)+e)},t.generateChars=function(e){return Array.from({length:e},(function(){return(0,t.getRandomNumber)(0,36).toString(36)})).join("")},t.generateId=function(e,i){var n=e.id||e.name&&"".concat(e.name,"-").concat((0,t.generateChars)(2))||(0,t.generateChars)(4);return n=n.replace(/(:|\.|\[|\]|,)/g,""),"".concat(i,"-").concat(n)},t.getType=function(e){return Object.prototype.toString.call(e).slice(8,-1)},t.isType=function(e,i){return null!=i&&(0,t.getType)(i)===e},t.wrap=function(e,t){return void 0===t&&(t=document.createElement("div")),e.parentNode&&(e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t)),t.appendChild(e)},t.getAdjacentEl=function(e,t,i){void 0===i&&(i=1);for(var n="".concat(i>0?"next":"previous","ElementSibling"),r=e[n];r;){if(r.matches(t))return r;r=r[n]}return r},t.isScrolledIntoView=function(e,t,i){return void 0===i&&(i=1),!!e&&(i>0?t.scrollTop+t.offsetHeight>=e.offsetTop+e.offsetHeight:e.offsetTop>=t.scrollTop)},t.sanitise=function(e){return"string"!=typeof e?e:e.replace(/&/g,"&").replace(/>/g,">").replace(/-1?e.map((function(e){var t=e;return t.id===parseInt("".concat(o.choiceId),10)&&(t.selected=!0),t})):e;case"REMOVE_ITEM":var a=n;return a.choiceId&&a.choiceId>-1?e.map((function(e){var t=e;return t.id===parseInt("".concat(a.choiceId),10)&&(t.selected=!1),t})):e;case"FILTER_CHOICES":var c=n;return e.map((function(e){var t=e;return t.active=c.results.some((function(e){var i=e.item,n=e.score;return i.id===t.id&&(t.score=n,!0)})),t}));case"ACTIVATE_CHOICES":var l=n;return e.map((function(e){var t=e;return t.active=l.active,t}));case"CLEAR_CHOICES":return t.defaultState;default:return e}}},871:function(e,t){var i=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var n,r=0,s=t.length;r0?"treeitem":"option"),Object.assign(E.dataset,{choice:"",id:d,value:p,selectText:i}),g?(E.classList.add(h),E.dataset.choiceDisabled="",E.setAttribute("aria-disabled","true")):(E.classList.add(c),E.dataset.choiceSelectable=""),E},input:function(e,t){var i=e.classNames,n=i.input,r=i.inputCloned,s=Object.assign(document.createElement("input"),{type:"search",name:"search_terms",className:"".concat(n," ").concat(r),autocomplete:"off",autocapitalize:"off",spellcheck:!1});return s.setAttribute("role","textbox"),s.setAttribute("aria-autocomplete","list"),s.setAttribute("aria-label",t),s},dropdown:function(e){var t=e.classNames,i=t.list,n=t.listDropdown,r=document.createElement("div");return r.classList.add(i,n),r.setAttribute("aria-expanded","false"),r},notice:function(e,t,i){var n,r=e.allowHTML,s=e.classNames,o=s.item,a=s.itemChoice,c=s.noResults,l=s.noChoices;void 0===i&&(i="");var h=[o,a];return"no-choices"===i?h.push(l):"no-results"===i&&h.push(c),Object.assign(document.createElement("div"),((n={})[r?"innerHTML":"innerText"]=t,n.className=h.join(" "),n))},option:function(e){var t=e.label,i=e.value,n=e.customProperties,r=e.active,s=e.disabled,o=new Option(t,i,!1,r);return n&&(o.dataset.customProperties="".concat(n)),o.disabled=!!s,o}};t.default=i},996:function(e){var t=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===i}(e)}(e)},i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a((i=e,Array.isArray(i)?[]:{}),e,t):e;var i}function r(e,t,i){return e.concat(t).map((function(e){return n(e,i)}))}function s(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return e.propertyIsEnumerable(t)})):[]}(e))}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,i,c){(c=c||{}).arrayMerge=c.arrayMerge||r,c.isMergeableObject=c.isMergeableObject||t,c.cloneUnlessOtherwiseSpecified=n;var l=Array.isArray(i);return l===Array.isArray(e)?l?c.arrayMerge(e,i,c):function(e,t,i){var r={};return i.isMergeableObject(e)&&s(e).forEach((function(t){r[t]=n(e[t],i)})),s(t).forEach((function(s){(function(e,t){return o(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,s)||(o(e,s)&&i.isMergeableObject(t[s])?r[s]=function(e,t){if(!t.customMerge)return a;var i=t.customMerge(e);return"function"==typeof i?i:a}(s,i)(e[s],t[s],i):r[s]=n(t[s],i))})),r}(e,i,c):n(i,c)}a.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,i){return a(e,i,t)}),{})};var c=a;e.exports=c},221:function(e,t,i){function n(e){return Array.isArray?Array.isArray(e):"[object Array]"===l(e)}function r(e){return"string"==typeof e}function s(e){return"number"==typeof e}function o(e){return"object"==typeof e}function a(e){return null!=e}function c(e){return!e.trim().length}function l(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}i.r(t),i.d(t,{default:function(){return R}});const h=Object.prototype.hasOwnProperty;class u{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach((e=>{let i=d(e);t+=i.weight,this._keys.push(i),this._keyMap[i.id]=i,t+=i.weight})),this._keys.forEach((e=>{e.weight/=t}))}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function d(e){let t=null,i=null,s=null,o=1,a=null;if(r(e)||n(e))s=e,t=p(e),i=f(e);else{if(!h.call(e,"name"))throw new Error("Missing name property in key");const n=e.name;if(s=n,h.call(e,"weight")&&(o=e.weight,o<=0))throw new Error((e=>`Property 'weight' in key '${e}' must be a positive integer`)(n));t=p(n),i=f(n),a=e.getFn}return{path:t,id:i,weight:o,src:s,getFn:a}}function p(e){return n(e)?e:e.split(".")}function f(e){return n(e)?e.join("."):e}var m={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx{if(a(e))if(t[u]){const d=e[t[u]];if(!a(d))return;if(u===t.length-1&&(r(d)||s(d)||function(e){return!0===e||!1===e||function(e){return o(e)&&null!==e}(e)&&"[object Boolean]"==l(e)}(d)))i.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;let t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(d));else if(n(d)){c=!0;for(let e=0,i=d.length;e{this._keysMap[e.id]=t}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,r(this.docs[0])?this.docs.forEach(((e,t)=>{this._addString(e,t)})):this.docs.forEach(((e,t)=>{this._addObject(e,t)})),this.norm.clear())}add(e){const t=this.size();r(e)?this._addString(e,t):this._addObject(e,t)}removeAt(e){this.records.splice(e,1);for(let t=e,i=this.size();t{let o=t.getFn?t.getFn(e):this.getFn(e,t.path);if(a(o))if(n(o)){let e=[];const t=[{nestedArrIndex:-1,value:o}];for(;t.length;){const{nestedArrIndex:i,value:s}=t.pop();if(a(s))if(r(s)&&!c(s)){let t={v:s,i:i,n:this.norm.get(s)};e.push(t)}else n(s)&&s.forEach(((e,i)=>{t.push({nestedArrIndex:i,value:e})}))}i.$[s]=e}else if(r(o)&&!c(o)){let e={v:o,n:this.norm.get(o)};i.$[s]=e}})),this.records.push(i)}toJSON(){return{keys:this.keys,records:this.records}}}function _(e,t,{getFn:i=m.getFn,fieldNormWeight:n=m.fieldNormWeight}={}){const r=new g({getFn:i,fieldNormWeight:n});return r.setKeys(e.map(d)),r.setSources(t),r.create(),r}function y(e,{errors:t=0,currentLocation:i=0,expectedLocation:n=0,distance:r=m.distance,ignoreLocation:s=m.ignoreLocation}={}){const o=t/e.length;if(s)return o;const a=Math.abs(n-i);return r?o+a/r:a?1:o}const E=32;function b(e){let t={};for(let i=0,n=e.length;i{this.chunks.push({pattern:e,alphabet:b(e),startIndex:t})},h=this.pattern.length;if(h>E){let e=0;const t=h%E,i=h-t;for(;e{const{isMatch:f,score:v,indices:g}=function(e,t,i,{location:n=m.location,distance:r=m.distance,threshold:s=m.threshold,findAllMatches:o=m.findAllMatches,minMatchCharLength:a=m.minMatchCharLength,includeMatches:c=m.includeMatches,ignoreLocation:l=m.ignoreLocation}={}){if(t.length>E)throw new Error("Pattern length exceeds max of 32.");const h=t.length,u=e.length,d=Math.max(0,Math.min(n,u));let p=s,f=d;const v=a>1||c,g=v?Array(u):[];let _;for(;(_=e.indexOf(t,f))>-1;){let e=y(t,{currentLocation:_,expectedLocation:d,distance:r,ignoreLocation:l});if(p=Math.min(e,p),f=_+h,v){let e=0;for(;e=c;s-=1){let o=s-1,a=i[e.charAt(o)];if(v&&(g[o]=+!!a),_[s]=(_[s+1]<<1|1)&a,n&&(_[s]|=(b[s+1]|b[s])<<1|1|b[s+1]),_[s]&I&&(S=y(t,{errors:n,currentLocation:o,expectedLocation:d,distance:r,ignoreLocation:l}),S<=p)){if(p=S,f=o,f<=d)break;c=Math.max(1,2*d-f)}}if(y(t,{errors:n+1,currentLocation:d,expectedLocation:d,distance:r,ignoreLocation:l})>p)break;b=_}const C={isMatch:f>=0,score:Math.max(.001,S)};if(v){const e=function(e=[],t=m.minMatchCharLength){let i=[],n=-1,r=-1,s=0;for(let o=e.length;s=t&&i.push([n,r]),n=-1)}return e[s-1]&&s-n>=t&&i.push([n,s-1]),i}(g,a);e.length?c&&(C.indices=e):C.isMatch=!1}return C}(e,t,d,{location:n+p,distance:r,threshold:s,findAllMatches:o,minMatchCharLength:a,includeMatches:i,ignoreLocation:c});f&&(u=!0),h+=v,f&&g&&(l=[...l,...g])}));let d={isMatch:u,score:u?h/this.chunks.length:1};return u&&i&&(d.indices=l),d}}class O{constructor(e){this.pattern=e}static isMultiMatch(e){return I(e,this.multiRegex)}static isSingleMatch(e){return I(e,this.singleRegex)}search(){}}function I(e,t){const i=e.match(t);return i?i[1]:null}class C extends O{constructor(e,{location:t=m.location,threshold:i=m.threshold,distance:n=m.distance,includeMatches:r=m.includeMatches,findAllMatches:s=m.findAllMatches,minMatchCharLength:o=m.minMatchCharLength,isCaseSensitive:a=m.isCaseSensitive,ignoreLocation:c=m.ignoreLocation}={}){super(e),this._bitapSearch=new S(e,{location:t,threshold:i,distance:n,includeMatches:r,findAllMatches:s,minMatchCharLength:o,isCaseSensitive:a,ignoreLocation:c})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(e){return this._bitapSearch.searchIn(e)}}class T extends O{constructor(e){super(e)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(e){let t,i=0;const n=[],r=this.pattern.length;for(;(t=e.indexOf(this.pattern,i))>-1;)i=t+r,n.push([t,i-1]);const s=!!n.length;return{isMatch:s,score:s?0:1,indices:n}}}const L=[class extends O{constructor(e){super(e)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(e){const t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},T,class extends O{constructor(e){super(e)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(e){const t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},class extends O{constructor(e){super(e)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(e){const t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends O{constructor(e){super(e)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(e){const t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends O{constructor(e){super(e)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(e){const t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}},class extends O{constructor(e){super(e)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(e){const t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},C],w=L.length,A=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,M=new Set([C.type,T.type]);const P=[];function x(e,t){for(let i=0,n=P.length;i!(!e.$and&&!e.$or),j=e=>({[N]:Object.keys(e).map((t=>({[t]:e[t]})))});function F(e,t,{auto:i=!0}={}){const s=e=>{let a=Object.keys(e);const c=(e=>!!e.$path)(e);if(!c&&a.length>1&&!D(e))return s(j(e));if((e=>!n(e)&&o(e)&&!D(e))(e)){const n=c?e.$path:a[0],s=c?e.$val:e[n];if(!r(s))throw new Error((e=>`Invalid value for key ${e}`)(n));const o={keyId:f(n),pattern:s};return i&&(o.searcher=x(s,t)),o}let l={children:[],operator:a[0]};return a.forEach((t=>{const i=e[t];n(i)&&i.forEach((e=>{l.children.push(s(e))}))})),l};return D(e)||(e=j(e)),s(e)}function k(e,t){const i=e.matches;t.matches=[],a(i)&&i.forEach((e=>{if(!a(e.indices)||!e.indices.length)return;const{indices:i,value:n}=e;let r={indices:i,value:n};e.key&&(r.key=e.key.src),e.idx>-1&&(r.refIndex=e.idx),t.matches.push(r)}))}function K(e,t){t.score=e.score}class R{constructor(e,t={},i){this.options={...m,...t},this.options.useExtendedSearch,this._keyStore=new u(this.options.keys),this.setCollection(e,i)}setCollection(e,t){if(this._docs=e,t&&!(t instanceof g))throw new Error("Incorrect 'index' type");this._myIndex=t||_(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){a(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=(()=>!1)){const t=[];for(let i=0,n=this._docs.length;i{let i=1;e.matches.forEach((({key:e,norm:n,score:r})=>{const s=e?e.weight:null;i*=Math.pow(0===r&&s?Number.EPSILON:r,(s||1)*(t?1:n))})),e.score=i}))}(l,{ignoreFieldNorm:c}),o&&l.sort(a),s(t)&&t>-1&&(l=l.slice(0,t)),function(e,t,{includeMatches:i=m.includeMatches,includeScore:n=m.includeScore}={}){const r=[];return i&&r.push(k),n&&r.push(K),e.map((e=>{const{idx:i}=e,n={item:t[i],refIndex:i};return r.length&&r.forEach((t=>{t(e,n)})),n}))}(l,this._docs,{includeMatches:i,includeScore:n})}_searchStringList(e){const t=x(e,this.options),{records:i}=this._myIndex,n=[];return i.forEach((({v:e,i:i,n:r})=>{if(!a(e))return;const{isMatch:s,score:o,indices:c}=t.searchIn(e);s&&n.push({item:e,idx:i,matches:[{score:o,value:e,norm:r,indices:c}]})})),n}_searchLogical(e){const t=F(e,this.options),i=(e,t,n)=>{if(!e.children){const{keyId:i,searcher:r}=e,s=this._findMatches({key:this._keyStore.get(i),value:this._myIndex.getValueForItemAtKeyId(t,i),searcher:r});return s&&s.length?[{idx:n,item:t,matches:s}]:[]}const r=[];for(let s=0,o=e.children.length;s{if(a(e)){let o=i(t,e,n);o.length&&(r[n]||(r[n]={idx:n,item:e,matches:[]},s.push(r[n])),o.forEach((({matches:e})=>{r[n].matches.push(...e)})))}})),s}_searchObjectList(e){const t=x(e,this.options),{keys:i,records:n}=this._myIndex,r=[];return n.forEach((({$:e,i:n})=>{if(!a(e))return;let s=[];i.forEach(((i,n)=>{s.push(...this._findMatches({key:i,value:e[n],searcher:t}))})),s.length&&r.push({idx:n,item:e,matches:s})})),r}_findMatches({key:e,value:t,searcher:i}){if(!a(t))return[];let r=[];if(n(t))t.forEach((({v:t,i:n,n:s})=>{if(!a(t))return;const{isMatch:o,score:c,indices:l}=i.searchIn(t);o&&r.push({score:c,key:e,value:t,idx:n,norm:s,indices:l})}));else{const{v:n,n:s}=t,{isMatch:o,score:a,indices:c}=i.searchIn(n);o&&r.push({score:a,key:e,value:n,norm:s,indices:c})}return r}}R.version="6.6.2",R.createIndex=_,R.parseIndex=function(e,{getFn:t=m.getFn,fieldNormWeight:i=m.fieldNormWeight}={}){const{keys:n,records:r}=e,s=new g({getFn:t,fieldNormWeight:i});return s.setKeys(n),s.setIndexRecords(r),s},R.config=m,R.parseQuery=F,function(...e){P.push(...e)}(class{constructor(e,{isCaseSensitive:t=m.isCaseSensitive,includeMatches:i=m.includeMatches,minMatchCharLength:n=m.minMatchCharLength,ignoreLocation:r=m.ignoreLocation,findAllMatches:s=m.findAllMatches,location:o=m.location,threshold:a=m.threshold,distance:c=m.distance}={}){this.query=null,this.options={isCaseSensitive:t,includeMatches:i,minMatchCharLength:n,findAllMatches:s,ignoreLocation:r,location:o,threshold:a,distance:c},this.pattern=t?e:e.toLowerCase(),this.query=function(e,t={}){return e.split("|").map((e=>{let i=e.trim().split(A).filter((e=>e&&!!e.trim())),n=[];for(let e=0,r=i.length;e",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},i={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var t=e%100;if(t>3&&t<21)return"th";switch(t%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},o=function(e,t){return void 0===t&&(t=2),("000"+e).slice(-1*t)},r=function(e){return!0===e?1:0};function l(e,t){var n;return function(){var a=this;clearTimeout(n),n=setTimeout((function(){return e.apply(a,arguments)}),t)}}var c=function(e){return e instanceof Array?e:[e]};function d(e,t,n){if(!0===n)return e.classList.add(t);e.classList.remove(t)}function s(e,t,n){var a=window.document.createElement(e);return t=t||"",n=n||"",a.className=t,void 0!==n&&(a.textContent=n),a}function u(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function f(e,t){return t(e)?e:e.parentNode?f(e.parentNode,t):void 0}function m(e,t){var n=s("div","numInputWrapper"),a=s("input","numInput "+e),i=s("span","arrowUp"),o=s("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?a.type="number":(a.type="text",a.pattern="\\d*"),void 0!==t)for(var r in t)a.setAttribute(r,t[r]);return n.appendChild(a),n.appendChild(i),n.appendChild(o),n}function g(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(t){return e.target}}var p=function(){},h=function(e,t,n){return n.months[t?"shorthand":"longhand"][e]},v={D:p,F:function(e,t,n){e.setMonth(n.months.longhand.indexOf(t))},G:function(e,t){e.setHours(parseFloat(t))},H:function(e,t){e.setHours(parseFloat(t))},J:function(e,t){e.setDate(parseFloat(t))},K:function(e,t,n){e.setHours(e.getHours()%12+12*r(new RegExp(n.amPM[1],"i").test(t)))},M:function(e,t,n){e.setMonth(n.months.shorthand.indexOf(t))},S:function(e,t){e.setSeconds(parseFloat(t))},U:function(e,t){return new Date(1e3*parseFloat(t))},W:function(e,t,n){var a=parseInt(t),i=new Date(e.getFullYear(),0,2+7*(a-1),0,0,0,0);return i.setDate(i.getDate()-i.getDay()+n.firstDayOfWeek),i},Y:function(e,t){e.setFullYear(parseFloat(t))},Z:function(e,t){return new Date(t)},d:function(e,t){e.setDate(parseFloat(t))},h:function(e,t){e.setHours(parseFloat(t))},i:function(e,t){e.setMinutes(parseFloat(t))},j:function(e,t){e.setDate(parseFloat(t))},l:p,m:function(e,t){e.setMonth(parseFloat(t)-1)},n:function(e,t){e.setMonth(parseFloat(t)-1)},s:function(e,t){e.setSeconds(parseFloat(t))},u:function(e,t){return new Date(parseFloat(t))},w:p,y:function(e,t){e.setFullYear(2e3+parseFloat(t))}},D={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},w={Z:function(e){return e.toISOString()},D:function(e,t,n){return t.weekdays.shorthand[w.w(e,t,n)]},F:function(e,t,n){return h(w.n(e,t,n)-1,!1,t)},G:function(e,t,n){return o(w.h(e,t,n))},H:function(e){return o(e.getHours())},J:function(e,t){return void 0!==t.ordinal?e.getDate()+t.ordinal(e.getDate()):e.getDate()},K:function(e,t){return t.amPM[r(e.getHours()>11)]},M:function(e,t){return h(e.getMonth(),!0,t)},S:function(e){return o(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,t,n){return n.getWeek(e)},Y:function(e){return o(e.getFullYear(),4)},d:function(e){return o(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return o(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,t){return t.weekdays.longhand[e.getDay()]},m:function(e){return o(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var t=e.config,n=void 0===t?a:t,o=e.l10n,r=void 0===o?i:o,l=e.isMobile,c=void 0!==l&&l;return function(e,t,a){var i=a||r;return void 0===n.formatDate||c?t.split("").map((function(t,a,o){return w[t]&&"\\"!==o[a-1]?w[t](e,i,n):"\\"!==t?t:""})).join(""):n.formatDate(e,t,i)}},C=function(e){var t=e.config,n=void 0===t?a:t,o=e.l10n,r=void 0===o?i:o;return function(e,t,i,o){if(0===e||e){var l,c=o||r,d=e;if(e instanceof Date)l=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)l=new Date(e);else if("string"==typeof e){var s=t||(n||a).dateFormat,u=String(e).trim();if("today"===u)l=new Date,i=!0;else if(/Z$/.test(u)||/GMT$/.test(u))l=new Date(e);else if(n&&n.parseDate)l=n.parseDate(e,s);else{l=n&&n.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0);for(var f=void 0,m=[],g=0,p=0,h="";g=0?new Date:new Date(w.config.minDate.getTime()),n=x(w.config);t.setHours(n.hours,n.minutes,n.seconds,t.getMilliseconds()),w.selectedDates=[t],w.latestSelectedDateObj=t}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var t="keydown"===e.type,n=g(e),a=n;void 0!==w.amPM&&n===w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]);var i=parseFloat(a.getAttribute("min")),l=parseFloat(a.getAttribute("max")),c=parseFloat(a.getAttribute("step")),d=parseInt(a.value,10),s=e.delta||(t?38===e.which?1:-1:0),u=d+c*s;if(void 0!==a.value&&2===a.value.length){var f=a===w.hourElement,m=a===w.minuteElement;ul&&(u=a===w.hourElement?u-l-r(!w.amPM):i,m&&j(void 0,1,w.hourElement)),w.amPM&&f&&(1===c?u+d===23:Math.abs(u-d)>c)&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]),a.value=o(u)}}(e);var a=w._input.value;S(),be(),w._input.value!==a&&w._debouncedChange()}function S(){if(void 0!==w.hourElement&&void 0!==w.minuteElement){var e,t,n=(parseInt(w.hourElement.value.slice(-2),10)||0)%24,a=(parseInt(w.minuteElement.value,10)||0)%60,i=void 0!==w.secondElement?(parseInt(w.secondElement.value,10)||0)%60:0;void 0!==w.amPM&&(e=n,t=w.amPM.textContent,n=e%12+12*r(t===w.l10n.amPM[1]));var o=void 0!==w.config.minTime||w.config.minDate&&w.minDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.minDate,!0);if(void 0!==w.config.maxTime||w.config.maxDate&&w.maxDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.maxDate,!0)){var l=void 0!==w.config.maxTime?w.config.maxTime:w.config.maxDate;(n=Math.min(n,l.getHours()))===l.getHours()&&(a=Math.min(a,l.getMinutes())),a===l.getMinutes()&&(i=Math.min(i,l.getSeconds()))}if(o){var c=void 0!==w.config.minTime?w.config.minTime:w.config.minDate;(n=Math.max(n,c.getHours()))===c.getHours()&&a=12)]),void 0!==w.secondElement&&(w.secondElement.value=o(n)))}function F(e){var t=g(e),n=parseInt(t.value)+(e.delta||0);(n/1e3>1||"Enter"===e.key&&!/[^\d]/.test(n.toString()))&&Q(n)}function A(e,t,n,a){return t instanceof Array?t.forEach((function(t){return A(e,t,n,a)})):e instanceof Array?e.forEach((function(e){return A(e,t,n,a)})):(e.addEventListener(t,n,a),void w._handlers.push({remove:function(){return e.removeEventListener(t,n)}}))}function N(){pe("onChange")}function P(e,t){var n=void 0!==e?w.parseDate(e):w.latestSelectedDateObj||(w.config.minDate&&w.config.minDate>w.now?w.config.minDate:w.config.maxDate&&w.config.maxDate=0&&M(e,w.selectedDates[1])<=0)}(t)&&!ve(t)&&o.classList.add("inRange"),w.weekNumbers&&1===w.config.showMonths&&"prevMonthDay"!==e&&n%7==1&&w.weekNumbers.insertAdjacentHTML("beforeend",""+w.config.getWeek(t)+""),pe("onDayCreate",o),o}function L(e){e.focus(),"range"===w.config.mode&&ae(e)}function W(e){for(var t=e>0?0:w.config.showMonths-1,n=e>0?w.config.showMonths:-1,a=t;a!=n;a+=e)for(var i=w.daysContainer.children[a],o=e>0?0:i.children.length-1,r=e>0?i.children.length:-1,l=o;l!=r;l+=e){var c=i.children[l];if(-1===c.className.indexOf("hidden")&&X(c.dateObj))return c}}function R(e,t){var n=ee(document.activeElement||document.body),a=void 0!==e?e:n?document.activeElement:void 0!==w.selectedDateElem&&ee(w.selectedDateElem)?w.selectedDateElem:void 0!==w.todayDateElem&&ee(w.todayDateElem)?w.todayDateElem:W(t>0?1:-1);void 0===a?w._input.focus():n?function(e,t){for(var n=-1===e.className.indexOf("Month")?e.dateObj.getMonth():w.currentMonth,a=t>0?w.config.showMonths:-1,i=t>0?1:-1,o=n-w.currentMonth;o!=a;o+=i)for(var r=w.daysContainer.children[o],l=n-w.currentMonth===o?e.$i+t:t<0?r.children.length-1:0,c=r.children.length,d=l;d>=0&&d0?c:-1);d+=i){var s=r.children[d];if(-1===s.className.indexOf("hidden")&&X(s.dateObj)&&Math.abs(e.$i-d)>=Math.abs(t))return L(s)}w.changeMonth(i),R(W(i),0)}(a,t):L(a)}function B(e,t){for(var n=(new Date(e,t,1).getDay()-w.l10n.firstDayOfWeek+7)%7,a=w.utils.getDaysInMonth((t-1+12)%12,e),i=w.utils.getDaysInMonth(t,e),o=window.document.createDocumentFragment(),r=w.config.showMonths>1,l=r?"prevMonthDay hidden":"prevMonthDay",c=r?"nextMonthDay hidden":"nextMonthDay",d=a+1-n,u=0;d<=a;d++,u++)o.appendChild(H(l,new Date(e,t-1,d),d,u));for(d=1;d<=i;d++,u++)o.appendChild(H("",new Date(e,t,d),d,u));for(var f=i+1;f<=42-n&&(1===w.config.showMonths||u%7!=0);f++,u++)o.appendChild(H(c,new Date(e,t+1,f%i),f,u));var m=s("div","dayContainer");return m.appendChild(o),m}function J(){if(void 0!==w.daysContainer){u(w.daysContainer),w.weekNumbers&&u(w.weekNumbers);for(var e=document.createDocumentFragment(),t=0;t1||"dropdown"!==w.config.monthSelectorType)){var e=function(e){return!(void 0!==w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&ew.config.maxDate.getMonth())};w.monthsDropdownContainer.tabIndex=-1,w.monthsDropdownContainer.innerHTML="";for(var t=0;t<12;t++)if(e(t)){var n=s("option","flatpickr-monthDropdown-month");n.value=new Date(w.currentYear,t).getMonth().toString(),n.textContent=h(t,w.config.shorthandCurrentMonth,w.l10n),n.tabIndex=-1,w.currentMonth===t&&(n.selected=!0),w.monthsDropdownContainer.appendChild(n)}}}function U(){var e,t=s("div","flatpickr-month"),n=window.document.createDocumentFragment();w.config.showMonths>1||"static"===w.config.monthSelectorType?e=s("span","cur-month"):(w.monthsDropdownContainer=s("select","flatpickr-monthDropdown-months"),w.monthsDropdownContainer.setAttribute("aria-label",w.l10n.monthAriaLabel),A(w.monthsDropdownContainer,"change",(function(e){var t=g(e),n=parseInt(t.value,10);w.changeMonth(n-w.currentMonth),pe("onMonthChange")})),K(),e=w.monthsDropdownContainer);var a=m("cur-year",{tabindex:"-1"}),i=a.getElementsByTagName("input")[0];i.setAttribute("aria-label",w.l10n.yearAriaLabel),w.config.minDate&&i.setAttribute("min",w.config.minDate.getFullYear().toString()),w.config.maxDate&&(i.setAttribute("max",w.config.maxDate.getFullYear().toString()),i.disabled=!!w.config.minDate&&w.config.minDate.getFullYear()===w.config.maxDate.getFullYear());var o=s("div","flatpickr-current-month");return o.appendChild(e),o.appendChild(a),n.appendChild(o),t.appendChild(n),{container:t,yearElement:i,monthElement:e}}function q(){u(w.monthNav),w.monthNav.appendChild(w.prevMonthNav),w.config.showMonths&&(w.yearElements=[],w.monthElements=[]);for(var e=w.config.showMonths;e--;){var t=U();w.yearElements.push(t.yearElement),w.monthElements.push(t.monthElement),w.monthNav.appendChild(t.container)}w.monthNav.appendChild(w.nextMonthNav)}function $(){w.weekdayContainer?u(w.weekdayContainer):w.weekdayContainer=s("div","flatpickr-weekdays");for(var e=w.config.showMonths;e--;){var t=s("div","flatpickr-weekdaycontainer");w.weekdayContainer.appendChild(t)}return z(),w.weekdayContainer}function z(){if(w.weekdayContainer){var e=w.l10n.firstDayOfWeek,n=t(w.l10n.weekdays.shorthand);e>0&&e\n "+n.join("")+"\n \n "}}function G(e,t){void 0===t&&(t=!0);var n=t?e:e-w.currentMonth;n<0&&!0===w._hidePrevMonthArrow||n>0&&!0===w._hideNextMonthArrow||(w.currentMonth+=n,(w.currentMonth<0||w.currentMonth>11)&&(w.currentYear+=w.currentMonth>11?1:-1,w.currentMonth=(w.currentMonth+12)%12,pe("onYearChange"),K()),J(),pe("onMonthChange"),De())}function V(e){return!(!w.config.appendTo||!w.config.appendTo.contains(e))||w.calendarContainer.contains(e)}function Z(e){if(w.isOpen&&!w.config.inline){var t=g(e),n=V(t),a=t===w.input||t===w.altInput||w.element.contains(t)||e.path&&e.path.indexOf&&(~e.path.indexOf(w.input)||~e.path.indexOf(w.altInput)),i="blur"===e.type?a&&e.relatedTarget&&!V(e.relatedTarget):!a&&!n&&!V(e.relatedTarget),o=!w.config.ignoredFocusElements.some((function(e){return e.contains(t)}));i&&o&&(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement&&""!==w.input.value&&void 0!==w.input.value&&I(),w.close(),w.config&&"range"===w.config.mode&&1===w.selectedDates.length&&(w.clear(!1),w.redraw()))}}function Q(e){if(!(!e||w.config.minDate&&ew.config.maxDate.getFullYear())){var t=e,n=w.currentYear!==t;w.currentYear=t||w.currentYear,w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth=Math.min(w.config.maxDate.getMonth(),w.currentMonth):w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&(w.currentMonth=Math.max(w.config.minDate.getMonth(),w.currentMonth)),n&&(w.redraw(),pe("onYearChange"),K())}}function X(e,t){var n;void 0===t&&(t=!0);var a=w.parseDate(e,void 0,t);if(w.config.minDate&&a&&M(a,w.config.minDate,void 0!==t?t:!w.minDateHasTime)<0||w.config.maxDate&&a&&M(a,w.config.maxDate,void 0!==t?t:!w.maxDateHasTime)>0)return!1;if(!w.config.enable&&0===w.config.disable.length)return!0;if(void 0===a)return!1;for(var i=!!w.config.enable,o=null!==(n=w.config.enable)&&void 0!==n?n:w.config.disable,r=0,l=void 0;r=l.from.getTime()&&a.getTime()<=l.to.getTime())return i}return!i}function ee(e){return void 0!==w.daysContainer&&(-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&w.daysContainer.contains(e))}function te(e){!(e.target===w._input)||!(w.selectedDates.length>0||w._input.value.length>0)||e.relatedTarget&&V(e.relatedTarget)||w.setDate(w._input.value,!0,e.target===w.altInput?w.config.altFormat:w.config.dateFormat)}function ne(e){var t=g(e),n=w.config.wrap?p.contains(t):t===w._input,a=w.config.allowInput,i=w.isOpen&&(!a||!n),o=w.config.inline&&n&&!a;if(13===e.keyCode&&n){if(a)return w.setDate(w._input.value,!0,t===w.altInput?w.config.altFormat:w.config.dateFormat),t.blur();w.open()}else if(V(t)||i||o){var r=!!w.timeContainer&&w.timeContainer.contains(t);switch(e.keyCode){case 13:r?(e.preventDefault(),I(),se()):ue(e);break;case 27:e.preventDefault(),se();break;case 8:case 46:n&&!w.config.allowInput&&(e.preventDefault(),w.clear());break;case 37:case 39:if(r||n)w.hourElement&&w.hourElement.focus();else if(e.preventDefault(),void 0!==w.daysContainer&&(!1===a||document.activeElement&&ee(document.activeElement))){var l=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),G(l),R(W(1),0)):R(void 0,l)}break;case 38:case 40:e.preventDefault();var c=40===e.keyCode?1:-1;w.daysContainer&&void 0!==t.$i||t===w.input||t===w.altInput?e.ctrlKey?(e.stopPropagation(),Q(w.currentYear-c),R(W(1),0)):r||R(void 0,7*c):t===w.currentYearElement?Q(w.currentYear-c):w.config.enableTime&&(!r&&w.hourElement&&w.hourElement.focus(),I(e),w._debouncedChange());break;case 9:if(r){var d=[w.hourElement,w.minuteElement,w.secondElement,w.amPM].concat(w.pluginElements).filter((function(e){return e})),s=d.indexOf(t);if(-1!==s){var u=d[s+(e.shiftKey?-1:1)];e.preventDefault(),(u||w._input).focus()}}else!w.config.noCalendar&&w.daysContainer&&w.daysContainer.contains(t)&&e.shiftKey&&(e.preventDefault(),w._input.focus())}}if(void 0!==w.amPM&&t===w.amPM)switch(e.key){case w.l10n.amPM[0].charAt(0):case w.l10n.amPM[0].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[0],S(),be();break;case w.l10n.amPM[1].charAt(0):case w.l10n.amPM[1].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[1],S(),be()}(n||V(t))&&pe("onKeyDown",e)}function ae(e){if(1===w.selectedDates.length&&(!e||e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled"))){for(var t=e?e.dateObj.getTime():w.days.firstElementChild.dateObj.getTime(),n=w.parseDate(w.selectedDates[0],void 0,!0).getTime(),a=Math.min(t,w.selectedDates[0].getTime()),i=Math.max(t,w.selectedDates[0].getTime()),o=!1,r=0,l=0,c=a;ca&&cr)?r=c:c>n&&(!l||c0&&m0&&m>l;return g?(f.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach((function(e){f.classList.remove(e)})),"continue"):o&&!g?"continue":(["startRange","inRange","endRange","notAllowed"].forEach((function(e){f.classList.remove(e)})),void(void 0!==e&&(e.classList.add(t<=w.selectedDates[0].getTime()?"startRange":"endRange"),nt&&m===n&&f.classList.add("endRange"),m>=r&&(0===l||m<=l)&&(d=n,u=t,(c=m)>Math.min(d,u)&&c0||n.getMinutes()>0||n.getSeconds()>0),w.selectedDates&&(w.selectedDates=w.selectedDates.filter((function(e){return X(e)})),w.selectedDates.length||"min"!==e||_(n),be()),w.daysContainer&&(de(),void 0!==n?w.currentYearElement[e]=n.getFullYear().toString():w.currentYearElement.removeAttribute(e),w.currentYearElement.disabled=!!a&&void 0!==n&&a.getFullYear()===n.getFullYear())}}function re(){return w.config.wrap?p.querySelector("[data-input]"):p}function le(){"object"!=typeof w.config.locale&&void 0===T.l10ns[w.config.locale]&&w.config.errorHandler(new Error("flatpickr: invalid locale "+w.config.locale)),w.l10n=e(e({},T.l10ns.default),"object"==typeof w.config.locale?w.config.locale:"default"!==w.config.locale?T.l10ns[w.config.locale]:void 0),D.K="("+w.l10n.amPM[0]+"|"+w.l10n.amPM[1]+"|"+w.l10n.amPM[0].toLowerCase()+"|"+w.l10n.amPM[1].toLowerCase()+")",void 0===e(e({},v),JSON.parse(JSON.stringify(p.dataset||{}))).time_24hr&&void 0===T.defaultConfig.time_24hr&&(w.config.time_24hr=w.l10n.time_24hr),w.formatDate=b(w),w.parseDate=C({config:w.config,l10n:w.l10n})}function ce(e){if("function"!=typeof w.config.position){if(void 0!==w.calendarContainer){pe("onPreCalendarPosition");var t=e||w._positionElement,n=Array.prototype.reduce.call(w.calendarContainer.children,(function(e,t){return e+t.offsetHeight}),0),a=w.calendarContainer.offsetWidth,i=w.config.position.split(" "),o=i[0],r=i.length>1?i[1]:null,l=t.getBoundingClientRect(),c=window.innerHeight-l.bottom,s="above"===o||"below"!==o&&cn,u=window.pageYOffset+l.top+(s?-n-2:t.offsetHeight+2);if(d(w.calendarContainer,"arrowTop",!s),d(w.calendarContainer,"arrowBottom",s),!w.config.inline){var f=window.pageXOffset+l.left,m=!1,g=!1;"center"===r?(f-=(a-l.width)/2,m=!0):"right"===r&&(f-=a-l.width,g=!0),d(w.calendarContainer,"arrowLeft",!m&&!g),d(w.calendarContainer,"arrowCenter",m),d(w.calendarContainer,"arrowRight",g);var p=window.document.body.offsetWidth-(window.pageXOffset+l.right),h=f+a>window.document.body.offsetWidth,v=p+a>window.document.body.offsetWidth;if(d(w.calendarContainer,"rightMost",h),!w.config.static)if(w.calendarContainer.style.top=u+"px",h)if(v){var D=function(){for(var e=null,t=0;tw.currentMonth+w.config.showMonths-1)&&"range"!==w.config.mode;if(w.selectedDateElem=n,"single"===w.config.mode)w.selectedDates=[a];else if("multiple"===w.config.mode){var o=ve(a);o?w.selectedDates.splice(parseInt(o),1):w.selectedDates.push(a)}else"range"===w.config.mode&&(2===w.selectedDates.length&&w.clear(!1,!1),w.latestSelectedDateObj=a,w.selectedDates.push(a),0!==M(a,w.selectedDates[0],!0)&&w.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()})));if(S(),i){var r=w.currentYear!==a.getFullYear();w.currentYear=a.getFullYear(),w.currentMonth=a.getMonth(),r&&(pe("onYearChange"),K()),pe("onMonthChange")}if(De(),J(),be(),i||"range"===w.config.mode||1!==w.config.showMonths?void 0!==w.selectedDateElem&&void 0===w.hourElement&&w.selectedDateElem&&w.selectedDateElem.focus():L(n),void 0!==w.hourElement&&void 0!==w.hourElement&&w.hourElement.focus(),w.config.closeOnSelect){var l="single"===w.config.mode&&!w.config.enableTime,c="range"===w.config.mode&&2===w.selectedDates.length&&!w.config.enableTime;(l||c)&&se()}N()}}w.parseDate=C({config:w.config,l10n:w.l10n}),w._handlers=[],w.pluginElements=[],w.loadedPlugins=[],w._bind=A,w._setHoursFromDate=_,w._positionCalendar=ce,w.changeMonth=G,w.changeYear=Q,w.clear=function(e,t){void 0===e&&(e=!0);void 0===t&&(t=!0);w.input.value="",void 0!==w.altInput&&(w.altInput.value="");void 0!==w.mobileInput&&(w.mobileInput.value="");w.selectedDates=[],w.latestSelectedDateObj=void 0,!0===t&&(w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth());if(!0===w.config.enableTime){var n=x(w.config),a=n.hours,i=n.minutes,o=n.seconds;O(a,i,o)}w.redraw(),e&&pe("onChange")},w.close=function(){w.isOpen=!1,w.isMobile||(void 0!==w.calendarContainer&&w.calendarContainer.classList.remove("open"),void 0!==w._input&&w._input.classList.remove("active"));pe("onClose")},w._createElement=s,w.destroy=function(){void 0!==w.config&&pe("onDestroy");for(var e=w._handlers.length;e--;)w._handlers[e].remove();if(w._handlers=[],w.mobileInput)w.mobileInput.parentNode&&w.mobileInput.parentNode.removeChild(w.mobileInput),w.mobileInput=void 0;else if(w.calendarContainer&&w.calendarContainer.parentNode)if(w.config.static&&w.calendarContainer.parentNode){var t=w.calendarContainer.parentNode;if(t.lastChild&&t.removeChild(t.lastChild),t.parentNode){for(;t.firstChild;)t.parentNode.insertBefore(t.firstChild,t);t.parentNode.removeChild(t)}}else w.calendarContainer.parentNode.removeChild(w.calendarContainer);w.altInput&&(w.input.type="text",w.altInput.parentNode&&w.altInput.parentNode.removeChild(w.altInput),delete w.altInput);w.input&&(w.input.type=w.input._type,w.input.classList.remove("flatpickr-input"),w.input.removeAttribute("readonly"));["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete w[e]}catch(e){}}))},w.isEnabled=X,w.jumpToDate=P,w.open=function(e,t){void 0===t&&(t=w._positionElement);if(!0===w.isMobile){if(e){e.preventDefault();var n=g(e);n&&n.blur()}return void 0!==w.mobileInput&&(w.mobileInput.focus(),w.mobileInput.click()),void pe("onOpen")}if(w._input.disabled||w.config.inline)return;var a=w.isOpen;w.isOpen=!0,a||(w.calendarContainer.classList.add("open"),w._input.classList.add("active"),pe("onOpen"),ce(t));!0===w.config.enableTime&&!0===w.config.noCalendar&&(!1!==w.config.allowInput||void 0!==e&&w.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return w.hourElement.select()}),50))},w.redraw=de,w.set=function(e,t){if(null!==e&&"object"==typeof e)for(var a in Object.assign(w.config,e),e)void 0!==fe[a]&&fe[a].forEach((function(e){return e()}));else w.config[e]=t,void 0!==fe[e]?fe[e].forEach((function(e){return e()})):n.indexOf(e)>-1&&(w.config[e]=c(t));w.redraw(),be(!0)},w.setDate=function(e,t,n){void 0===t&&(t=!1);void 0===n&&(n=w.config.dateFormat);if(0!==e&&!e||e instanceof Array&&0===e.length)return w.clear(t);me(e,n),w.latestSelectedDateObj=w.selectedDates[w.selectedDates.length-1],w.redraw(),P(void 0,t),_(),0===w.selectedDates.length&&w.clear(!1);be(t),t&&pe("onChange")},w.toggle=function(e){if(!0===w.isOpen)return w.close();w.open(e)};var fe={locale:[le,z],showMonths:[q,k,$],minDate:[P],maxDate:[P],clickOpens:[function(){!0===w.config.clickOpens?(A(w._input,"focus",w.open),A(w._input,"click",w.open)):(w._input.removeEventListener("focus",w.open),w._input.removeEventListener("click",w.open))}]};function me(e,t){var n=[];if(e instanceof Array)n=e.map((function(e){return w.parseDate(e,t)}));else if(e instanceof Date||"number"==typeof e)n=[w.parseDate(e,t)];else if("string"==typeof e)switch(w.config.mode){case"single":case"time":n=[w.parseDate(e,t)];break;case"multiple":n=e.split(w.config.conjunction).map((function(e){return w.parseDate(e,t)}));break;case"range":n=e.split(w.l10n.rangeSeparator).map((function(e){return w.parseDate(e,t)}))}else w.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));w.selectedDates=w.config.allowInvalidPreload?n:n.filter((function(e){return e instanceof Date&&X(e,!1)})),"range"===w.config.mode&&w.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()}))}function ge(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?w.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:w.parseDate(e.from,void 0),to:w.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function pe(e,t){if(void 0!==w.config){var n=w.config[e];if(void 0!==n&&n.length>0)for(var a=0;n[a]&&a1||"static"===w.config.monthSelectorType?w.monthElements[t].textContent=h(n.getMonth(),w.config.shorthandCurrentMonth,w.l10n)+" ":w.monthsDropdownContainer.value=n.getMonth().toString(),e.value=n.getFullYear().toString()})),w._hidePrevMonthArrow=void 0!==w.config.minDate&&(w.currentYear===w.config.minDate.getFullYear()?w.currentMonth<=w.config.minDate.getMonth():w.currentYearw.config.maxDate.getMonth():w.currentYear>w.config.maxDate.getFullYear()))}function we(e){return w.selectedDates.map((function(t){return w.formatDate(t,e)})).filter((function(e,t,n){return"range"!==w.config.mode||w.config.enableTime||n.indexOf(e)===t})).join("range"!==w.config.mode?w.config.conjunction:w.l10n.rangeSeparator)}function be(e){void 0===e&&(e=!0),void 0!==w.mobileInput&&w.mobileFormatStr&&(w.mobileInput.value=void 0!==w.latestSelectedDateObj?w.formatDate(w.latestSelectedDateObj,w.mobileFormatStr):""),w.input.value=we(w.config.dateFormat),void 0!==w.altInput&&(w.altInput.value=we(w.config.altFormat)),!1!==e&&pe("onValueUpdate")}function Ce(e){var t=g(e),n=w.prevMonthNav.contains(t),a=w.nextMonthNav.contains(t);n||a?G(n?-1:1):w.yearElements.indexOf(t)>=0?t.select():t.classList.contains("arrowUp")?w.changeYear(w.currentYear+1):t.classList.contains("arrowDown")&&w.changeYear(w.currentYear-1)}return function(){w.element=w.input=p,w.isOpen=!1,function(){var t=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],i=e(e({},JSON.parse(JSON.stringify(p.dataset||{}))),v),o={};w.config.parseDate=i.parseDate,w.config.formatDate=i.formatDate,Object.defineProperty(w.config,"enable",{get:function(){return w.config._enable},set:function(e){w.config._enable=ge(e)}}),Object.defineProperty(w.config,"disable",{get:function(){return w.config._disable},set:function(e){w.config._disable=ge(e)}});var r="time"===i.mode;if(!i.dateFormat&&(i.enableTime||r)){var l=T.defaultConfig.dateFormat||a.dateFormat;o.dateFormat=i.noCalendar||r?"H:i"+(i.enableSeconds?":S":""):l+" H:i"+(i.enableSeconds?":S":"")}if(i.altInput&&(i.enableTime||r)&&!i.altFormat){var d=T.defaultConfig.altFormat||a.altFormat;o.altFormat=i.noCalendar||r?"h:i"+(i.enableSeconds?":S K":" K"):d+" h:i"+(i.enableSeconds?":S":"")+" K"}Object.defineProperty(w.config,"minDate",{get:function(){return w.config._minDate},set:oe("min")}),Object.defineProperty(w.config,"maxDate",{get:function(){return w.config._maxDate},set:oe("max")});var s=function(e){return function(t){w.config["min"===e?"_minTime":"_maxTime"]=w.parseDate(t,"H:i:S")}};Object.defineProperty(w.config,"minTime",{get:function(){return w.config._minTime},set:s("min")}),Object.defineProperty(w.config,"maxTime",{get:function(){return w.config._maxTime},set:s("max")}),"time"===i.mode&&(w.config.noCalendar=!0,w.config.enableTime=!0);Object.assign(w.config,o,i);for(var u=0;u-1?w.config[m]=c(f[m]).map(E).concat(w.config[m]):void 0===i[m]&&(w.config[m]=f[m])}i.altInputClass||(w.config.altInputClass=re().className+" "+w.config.altInputClass);pe("onParseConfig")}(),le(),function(){if(w.input=re(),!w.input)return void w.config.errorHandler(new Error("Invalid input element specified"));w.input._type=w.input.type,w.input.type="text",w.input.classList.add("flatpickr-input"),w._input=w.input,w.config.altInput&&(w.altInput=s(w.input.nodeName,w.config.altInputClass),w._input=w.altInput,w.altInput.placeholder=w.input.placeholder,w.altInput.disabled=w.input.disabled,w.altInput.required=w.input.required,w.altInput.tabIndex=w.input.tabIndex,w.altInput.type="text",w.input.setAttribute("type","hidden"),!w.config.static&&w.input.parentNode&&w.input.parentNode.insertBefore(w.altInput,w.input.nextSibling));w.config.allowInput||w._input.setAttribute("readonly","readonly");w._positionElement=w.config.positionElement||w._input}(),function(){w.selectedDates=[],w.now=w.parseDate(w.config.now)||new Date;var e=w.config.defaultDate||("INPUT"!==w.input.nodeName&&"TEXTAREA"!==w.input.nodeName||!w.input.placeholder||w.input.value!==w.input.placeholder?w.input.value:null);e&&me(e,w.config.dateFormat);w._initialDate=w.selectedDates.length>0?w.selectedDates[0]:w.config.minDate&&w.config.minDate.getTime()>w.now.getTime()?w.config.minDate:w.config.maxDate&&w.config.maxDate.getTime()0&&(w.latestSelectedDateObj=w.selectedDates[0]);void 0!==w.config.minTime&&(w.config.minTime=w.parseDate(w.config.minTime,"H:i"));void 0!==w.config.maxTime&&(w.config.maxTime=w.parseDate(w.config.maxTime,"H:i"));w.minDateHasTime=!!w.config.minDate&&(w.config.minDate.getHours()>0||w.config.minDate.getMinutes()>0||w.config.minDate.getSeconds()>0),w.maxDateHasTime=!!w.config.maxDate&&(w.config.maxDate.getHours()>0||w.config.maxDate.getMinutes()>0||w.config.maxDate.getSeconds()>0)}(),w.utils={getDaysInMonth:function(e,t){return void 0===e&&(e=w.currentMonth),void 0===t&&(t=w.currentYear),1===e&&(t%4==0&&t%100!=0||t%400==0)?29:w.l10n.daysInMonth[e]}},w.isMobile||function(){var e=window.document.createDocumentFragment();if(w.calendarContainer=s("div","flatpickr-calendar"),w.calendarContainer.tabIndex=-1,!w.config.noCalendar){if(e.appendChild((w.monthNav=s("div","flatpickr-months"),w.yearElements=[],w.monthElements=[],w.prevMonthNav=s("span","flatpickr-prev-month"),w.prevMonthNav.innerHTML=w.config.prevArrow,w.nextMonthNav=s("span","flatpickr-next-month"),w.nextMonthNav.innerHTML=w.config.nextArrow,q(),Object.defineProperty(w,"_hidePrevMonthArrow",{get:function(){return w.__hidePrevMonthArrow},set:function(e){w.__hidePrevMonthArrow!==e&&(d(w.prevMonthNav,"flatpickr-disabled",e),w.__hidePrevMonthArrow=e)}}),Object.defineProperty(w,"_hideNextMonthArrow",{get:function(){return w.__hideNextMonthArrow},set:function(e){w.__hideNextMonthArrow!==e&&(d(w.nextMonthNav,"flatpickr-disabled",e),w.__hideNextMonthArrow=e)}}),w.currentYearElement=w.yearElements[0],De(),w.monthNav)),w.innerContainer=s("div","flatpickr-innerContainer"),w.config.weekNumbers){var t=function(){w.calendarContainer.classList.add("hasWeeks");var e=s("div","flatpickr-weekwrapper");e.appendChild(s("span","flatpickr-weekday",w.l10n.weekAbbreviation));var t=s("div","flatpickr-weeks");return e.appendChild(t),{weekWrapper:e,weekNumbers:t}}(),n=t.weekWrapper,a=t.weekNumbers;w.innerContainer.appendChild(n),w.weekNumbers=a,w.weekWrapper=n}w.rContainer=s("div","flatpickr-rContainer"),w.rContainer.appendChild($()),w.daysContainer||(w.daysContainer=s("div","flatpickr-days"),w.daysContainer.tabIndex=-1),J(),w.rContainer.appendChild(w.daysContainer),w.innerContainer.appendChild(w.rContainer),e.appendChild(w.innerContainer)}w.config.enableTime&&e.appendChild(function(){w.calendarContainer.classList.add("hasTime"),w.config.noCalendar&&w.calendarContainer.classList.add("noCalendar");var e=x(w.config);w.timeContainer=s("div","flatpickr-time"),w.timeContainer.tabIndex=-1;var t=s("span","flatpickr-time-separator",":"),n=m("flatpickr-hour",{"aria-label":w.l10n.hourAriaLabel});w.hourElement=n.getElementsByTagName("input")[0];var a=m("flatpickr-minute",{"aria-label":w.l10n.minuteAriaLabel});w.minuteElement=a.getElementsByTagName("input")[0],w.hourElement.tabIndex=w.minuteElement.tabIndex=-1,w.hourElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getHours():w.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),w.minuteElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getMinutes():e.minutes),w.hourElement.setAttribute("step",w.config.hourIncrement.toString()),w.minuteElement.setAttribute("step",w.config.minuteIncrement.toString()),w.hourElement.setAttribute("min",w.config.time_24hr?"0":"1"),w.hourElement.setAttribute("max",w.config.time_24hr?"23":"12"),w.hourElement.setAttribute("maxlength","2"),w.minuteElement.setAttribute("min","0"),w.minuteElement.setAttribute("max","59"),w.minuteElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(n),w.timeContainer.appendChild(t),w.timeContainer.appendChild(a),w.config.time_24hr&&w.timeContainer.classList.add("time24hr");if(w.config.enableSeconds){w.timeContainer.classList.add("hasSeconds");var i=m("flatpickr-second");w.secondElement=i.getElementsByTagName("input")[0],w.secondElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getSeconds():e.seconds),w.secondElement.setAttribute("step",w.minuteElement.getAttribute("step")),w.secondElement.setAttribute("min","0"),w.secondElement.setAttribute("max","59"),w.secondElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(s("span","flatpickr-time-separator",":")),w.timeContainer.appendChild(i)}w.config.time_24hr||(w.amPM=s("span","flatpickr-am-pm",w.l10n.amPM[r((w.latestSelectedDateObj?w.hourElement.value:w.config.defaultHour)>11)]),w.amPM.title=w.l10n.toggleTitle,w.amPM.tabIndex=-1,w.timeContainer.appendChild(w.amPM));return w.timeContainer}());d(w.calendarContainer,"rangeMode","range"===w.config.mode),d(w.calendarContainer,"animate",!0===w.config.animate),d(w.calendarContainer,"multiMonth",w.config.showMonths>1),w.calendarContainer.appendChild(e);var i=void 0!==w.config.appendTo&&void 0!==w.config.appendTo.nodeType;if((w.config.inline||w.config.static)&&(w.calendarContainer.classList.add(w.config.inline?"inline":"static"),w.config.inline&&(!i&&w.element.parentNode?w.element.parentNode.insertBefore(w.calendarContainer,w._input.nextSibling):void 0!==w.config.appendTo&&w.config.appendTo.appendChild(w.calendarContainer)),w.config.static)){var l=s("div","flatpickr-wrapper");w.element.parentNode&&w.element.parentNode.insertBefore(l,w.element),l.appendChild(w.element),w.altInput&&l.appendChild(w.altInput),l.appendChild(w.calendarContainer)}w.config.static||w.config.inline||(void 0!==w.config.appendTo?w.config.appendTo:window.document.body).appendChild(w.calendarContainer)}(),function(){w.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(w.element.querySelectorAll("[data-"+e+"]"),(function(t){return A(t,"click",w[e])}))}));if(w.isMobile)return void function(){var e=w.config.enableTime?w.config.noCalendar?"time":"datetime-local":"date";w.mobileInput=s("input",w.input.className+" flatpickr-mobile"),w.mobileInput.tabIndex=1,w.mobileInput.type=e,w.mobileInput.disabled=w.input.disabled,w.mobileInput.required=w.input.required,w.mobileInput.placeholder=w.input.placeholder,w.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",w.selectedDates.length>0&&(w.mobileInput.defaultValue=w.mobileInput.value=w.formatDate(w.selectedDates[0],w.mobileFormatStr));w.config.minDate&&(w.mobileInput.min=w.formatDate(w.config.minDate,"Y-m-d"));w.config.maxDate&&(w.mobileInput.max=w.formatDate(w.config.maxDate,"Y-m-d"));w.input.getAttribute("step")&&(w.mobileInput.step=String(w.input.getAttribute("step")));w.input.type="hidden",void 0!==w.altInput&&(w.altInput.type="hidden");try{w.input.parentNode&&w.input.parentNode.insertBefore(w.mobileInput,w.input.nextSibling)}catch(e){}A(w.mobileInput,"change",(function(e){w.setDate(g(e).value,!1,w.mobileFormatStr),pe("onChange"),pe("onClose")}))}();var e=l(ie,50);w._debouncedChange=l(N,300),w.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&A(w.daysContainer,"mouseover",(function(e){"range"===w.config.mode&&ae(g(e))}));A(window.document.body,"keydown",ne),w.config.inline||w.config.static||A(window,"resize",e);void 0!==window.ontouchstart?A(window.document,"touchstart",Z):A(window.document,"mousedown",Z);A(window.document,"focus",Z,{capture:!0}),!0===w.config.clickOpens&&(A(w._input,"focus",w.open),A(w._input,"click",w.open));void 0!==w.daysContainer&&(A(w.monthNav,"click",Ce),A(w.monthNav,["keyup","increment"],F),A(w.daysContainer,"click",ue));if(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement){var t=function(e){return g(e).select()};A(w.timeContainer,["increment"],I),A(w.timeContainer,"blur",I,{capture:!0}),A(w.timeContainer,"click",Y),A([w.hourElement,w.minuteElement],["focus","click"],t),void 0!==w.secondElement&&A(w.secondElement,"focus",(function(){return w.secondElement&&w.secondElement.select()})),void 0!==w.amPM&&A(w.amPM,"click",(function(e){I(e),N()}))}w.config.allowInput&&A(w._input,"blur",te)}(),(w.selectedDates.length||w.config.noCalendar)&&(w.config.enableTime&&_(w.config.noCalendar?w.latestSelectedDateObj:void 0),be(!1)),k();var t=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!w.isMobile&&t&&ce(),pe("onReady")}(),w}function k(e,t){for(var n=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),a=[],i=0;ili{position:relative}.fa-li{inset-inline-start:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.0625em) var(--fa-border-style,solid) var(--fa-border-color,#eee);box-sizing:var(--fa-border-box-sizing,content-box);padding:var(--fa-border-padding,.1875em .25em)}.fa-pull-left,.fa-pull-start{float:inline-start;margin-inline-end:var(--fa-pull-margin,.3em)}.fa-pull-end,.fa-pull-right{float:inline-end;margin-inline-start:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation:none!important;transition:none!important}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{--fa-width:100%;inset:0;position:absolute;text-align:center;width:var(--fa-width);z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0{--fa:"\30 "}.fa-1{--fa:"\31 "}.fa-2{--fa:"\32 "}.fa-3{--fa:"\33 "}.fa-4{--fa:"\34 "}.fa-5{--fa:"\35 "}.fa-6{--fa:"\36 "}.fa-7{--fa:"\37 "}.fa-8{--fa:"\38 "}.fa-9{--fa:"\39 "}.fa-exclamation{--fa:"\!"}.fa-hashtag{--fa:"\#"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\$"}.fa-percent,.fa-percentage{--fa:"\%"}.fa-asterisk{--fa:"\*"}.fa-add,.fa-plus{--fa:"\+"}.fa-less-than{--fa:"\<"}.fa-equals{--fa:"\="}.fa-greater-than{--fa:"\>"}.fa-question{--fa:"\?"}.fa-at{--fa:"\@"}.fa-a{--fa:"A"}.fa-b{--fa:"B"}.fa-c{--fa:"C"}.fa-d{--fa:"D"}.fa-e{--fa:"E"}.fa-f{--fa:"F"}.fa-g{--fa:"G"}.fa-h{--fa:"H"}.fa-i{--fa:"I"}.fa-j{--fa:"J"}.fa-k{--fa:"K"}.fa-l{--fa:"L"}.fa-m{--fa:"M"}.fa-n{--fa:"N"}.fa-o{--fa:"O"}.fa-p{--fa:"P"}.fa-q{--fa:"Q"}.fa-r{--fa:"R"}.fa-s{--fa:"S"}.fa-t{--fa:"T"}.fa-u{--fa:"U"}.fa-v{--fa:"V"}.fa-w{--fa:"W"}.fa-x{--fa:"X"}.fa-y{--fa:"Y"}.fa-z{--fa:"Z"}.fa-faucet{--fa:"\e005"}.fa-faucet-drip{--fa:"\e006"}.fa-house-chimney-window{--fa:"\e00d"}.fa-house-signal{--fa:"\e012"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-trailer{--fa:"\e041"}.fa-bacteria{--fa:"\e059"}.fa-bacterium{--fa:"\e05a"}.fa-box-tissue{--fa:"\e05b"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-hand-sparkles{--fa:"\e05d"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-handshake-alt-slash,.fa-handshake-simple-slash,.fa-handshake-slash{--fa:"\e060"}.fa-head-side-cough{--fa:"\e061"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-head-side-mask{--fa:"\e063"}.fa-head-side-virus{--fa:"\e064"}.fa-house-chimney-user{--fa:"\e065"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-lungs-virus{--fa:"\e067"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-plane-slash{--fa:"\e069"}.fa-pump-medical{--fa:"\e06a"}.fa-pump-soap{--fa:"\e06b"}.fa-shield-virus{--fa:"\e06c"}.fa-sink{--fa:"\e06d"}.fa-soap{--fa:"\e06e"}.fa-stopwatch-20{--fa:"\e06f"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-store-slash{--fa:"\e071"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-users-slash{--fa:"\e073"}.fa-virus{--fa:"\e074"}.fa-virus-slash{--fa:"\e075"}.fa-viruses{--fa:"\e076"}.fa-vest{--fa:"\e085"}.fa-vest-patches{--fa:"\e086"}.fa-arrow-trend-down{--fa:"\e097"}.fa-arrow-trend-up{--fa:"\e098"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-austral-sign{--fa:"\e0a9"}.fa-baht-sign{--fa:"\e0ac"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-book-bookmark{--fa:"\e0bb"}.fa-camera-rotate{--fa:"\e0d8"}.fa-cedi-sign{--fa:"\e0df"}.fa-chart-column{--fa:"\e0e3"}.fa-chart-gantt{--fa:"\e0e4"}.fa-clapperboard{--fa:"\e131"}.fa-clover{--fa:"\e139"}.fa-code-compare{--fa:"\e13a"}.fa-code-fork{--fa:"\e13b"}.fa-code-pull-request{--fa:"\e13c"}.fa-colon-sign{--fa:"\e140"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-display{--fa:"\e163"}.fa-dong-sign{--fa:"\e169"}.fa-elevator{--fa:"\e16d"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-florin-sign{--fa:"\e184"}.fa-folder-closed{--fa:"\e185"}.fa-franc-sign{--fa:"\e18f"}.fa-guarani-sign{--fa:"\e19a"}.fa-gun{--fa:"\e19b"}.fa-hands-clapping{--fa:"\e1a8"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-kip-sign{--fa:"\e1c4"}.fa-lari-sign{--fa:"\e1c8"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-manat-sign{--fa:"\e1d5"}.fa-mask-face{--fa:"\e1d7"}.fa-mill-sign{--fa:"\e1ed"}.fa-money-bills{--fa:"\e1f3"}.fa-naira-sign{--fa:"\e1f6"}.fa-notdef{--fa:"\e1fe"}.fa-panorama{--fa:"\e209"}.fa-peseta-sign{--fa:"\e221"}.fa-peso-sign{--fa:"\e222"}.fa-plane-up{--fa:"\e22d"}.fa-rupiah-sign{--fa:"\e23d"}.fa-stairs{--fa:"\e289"}.fa-timeline{--fa:"\e29c"}.fa-truck-front{--fa:"\e2b7"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-vault{--fa:"\e2c5"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bowl-rice{--fa:"\e2eb"}.fa-person-pregnant{--fa:"\e31e"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-house-crack{--fa:"\e3b1"}.fa-house-medical{--fa:"\e3b2"}.fa-cent-sign{--fa:"\e3f5"}.fa-plus-minus{--fa:"\e43c"}.fa-sailboat{--fa:"\e445"}.fa-section{--fa:"\e447"}.fa-shrimp{--fa:"\e448"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-chart-simple{--fa:"\e473"}.fa-diagram-next{--fa:"\e476"}.fa-diagram-predecessor{--fa:"\e477"}.fa-diagram-successor{--fa:"\e47a"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-bug-slash{--fa:"\e490"}.fa-file-circle-plus{--fa:"\e494"}.fa-shop-lock{--fa:"\e4a5"}.fa-virus-covid{--fa:"\e4a8"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-anchor-lock{--fa:"\e4ad"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-arrows-spin{--fa:"\e4bb"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-bore-hole{--fa:"\e4c3"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-bottle-water{--fa:"\e4c5"}.fa-bowl-food{--fa:"\e4c6"}.fa-boxes-packing{--fa:"\e4c7"}.fa-bridge{--fa:"\e4c8"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-bridge-water{--fa:"\e4ce"}.fa-bucket{--fa:"\e4cf"}.fa-bugs{--fa:"\e4d0"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-building-circle-check{--fa:"\e4d2"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-building-flag{--fa:"\e4d5"}.fa-building-lock{--fa:"\e4d6"}.fa-building-ngo{--fa:"\e4d7"}.fa-building-shield{--fa:"\e4d8"}.fa-building-un{--fa:"\e4d9"}.fa-building-user{--fa:"\e4da"}.fa-building-wheat{--fa:"\e4db"}.fa-burst{--fa:"\e4dc"}.fa-car-on{--fa:"\e4dd"}.fa-car-tunnel{--fa:"\e4de"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-children{--fa:"\e4e1"}.fa-circle-nodes{--fa:"\e4e2"}.fa-clipboard-question{--fa:"\e4e3"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-computer{--fa:"\e4e5"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-explosion{--fa:"\e4e9"}.fa-ferry{--fa:"\e4ea"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-file-circle-question{--fa:"\e4ef"}.fa-file-shield{--fa:"\e4f0"}.fa-fire-burner{--fa:"\e4f1"}.fa-fish-fins{--fa:"\e4f2"}.fa-flask-vial{--fa:"\e4f3"}.fa-glass-water{--fa:"\e4f4"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-handcuffs{--fa:"\e4f8"}.fa-hands-bound{--fa:"\e4f9"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-heart-circle-plus{--fa:"\e500"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-helicopter-symbol{--fa:"\e502"}.fa-helmet-un{--fa:"\e503"}.fa-hill-avalanche{--fa:"\e507"}.fa-hill-rockslide{--fa:"\e508"}.fa-house-circle-check{--fa:"\e509"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-house-fire{--fa:"\e50c"}.fa-house-flag{--fa:"\e50d"}.fa-house-flood-water{--fa:"\e50e"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-house-lock{--fa:"\e510"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-house-medical-flag{--fa:"\e514"}.fa-house-tsunami{--fa:"\e515"}.fa-jar{--fa:"\e516"}.fa-jar-wheat{--fa:"\e517"}.fa-jet-fighter-up{--fa:"\e518"}.fa-jug-detergent{--fa:"\e519"}.fa-kitchen-set{--fa:"\e51a"}.fa-land-mine-on{--fa:"\e51b"}.fa-landmark-flag{--fa:"\e51c"}.fa-laptop-file{--fa:"\e51d"}.fa-lines-leaning{--fa:"\e51e"}.fa-location-pin-lock{--fa:"\e51f"}.fa-locust{--fa:"\e520"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-mask-ventilator{--fa:"\e524"}.fa-mattress-pillow{--fa:"\e525"}.fa-mobile-retro{--fa:"\e527"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-mosquito{--fa:"\e52b"}.fa-mosquito-net{--fa:"\e52c"}.fa-mound{--fa:"\e52d"}.fa-mountain-city{--fa:"\e52e"}.fa-mountain-sun{--fa:"\e52f"}.fa-oil-well{--fa:"\e532"}.fa-people-group{--fa:"\e533"}.fa-people-line{--fa:"\e534"}.fa-people-pulling{--fa:"\e535"}.fa-people-robbery{--fa:"\e536"}.fa-people-roof{--fa:"\e537"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-person-burst{--fa:"\e53b"}.fa-person-cane{--fa:"\e53c"}.fa-person-chalkboard{--fa:"\e53d"}.fa-person-circle-check{--fa:"\e53e"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-person-circle-minus{--fa:"\e540"}.fa-person-circle-plus{--fa:"\e541"}.fa-person-circle-question{--fa:"\e542"}.fa-person-circle-xmark{--fa:"\e543"}.fa-person-dress-burst{--fa:"\e544"}.fa-person-drowning{--fa:"\e545"}.fa-person-falling{--fa:"\e546"}.fa-person-falling-burst{--fa:"\e547"}.fa-person-half-dress{--fa:"\e548"}.fa-person-harassing{--fa:"\e549"}.fa-person-military-pointing{--fa:"\e54a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-person-military-to-person{--fa:"\e54c"}.fa-person-rays{--fa:"\e54d"}.fa-person-rifle{--fa:"\e54e"}.fa-person-shelter{--fa:"\e54f"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-person-walking-luggage{--fa:"\e554"}.fa-plane-circle-check{--fa:"\e555"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-plane-lock{--fa:"\e558"}.fa-plate-wheat{--fa:"\e55a"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-plug-circle-check{--fa:"\e55c"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-ranking-star{--fa:"\e561"}.fa-road-barrier{--fa:"\e562"}.fa-road-bridge{--fa:"\e563"}.fa-road-circle-check{--fa:"\e564"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-road-circle-xmark{--fa:"\e566"}.fa-road-lock{--fa:"\e567"}.fa-road-spikes{--fa:"\e568"}.fa-rug{--fa:"\e569"}.fa-sack-xmark{--fa:"\e56a"}.fa-school-circle-check{--fa:"\e56b"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-school-flag{--fa:"\e56e"}.fa-school-lock{--fa:"\e56f"}.fa-sheet-plastic{--fa:"\e571"}.fa-shield-cat{--fa:"\e572"}.fa-shield-dog{--fa:"\e573"}.fa-shield-heart{--fa:"\e574"}.fa-square-nfi{--fa:"\e576"}.fa-square-person-confined{--fa:"\e577"}.fa-square-virus{--fa:"\e578"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-tarp{--fa:"\e57b"}.fa-tarp-droplet{--fa:"\e57c"}.fa-tent{--fa:"\e57d"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tent-arrows-down{--fa:"\e581"}.fa-tents{--fa:"\e582"}.fa-toilet-portable{--fa:"\e583"}.fa-toilets-portable{--fa:"\e584"}.fa-tower-cell{--fa:"\e585"}.fa-tower-observation{--fa:"\e586"}.fa-tree-city{--fa:"\e587"}.fa-trowel{--fa:"\e589"}.fa-trowel-bricks{--fa:"\e58a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-truck-droplet{--fa:"\e58c"}.fa-truck-field{--fa:"\e58d"}.fa-truck-field-un{--fa:"\e58e"}.fa-truck-plane{--fa:"\e58f"}.fa-users-between-lines{--fa:"\e591"}.fa-users-line{--fa:"\e592"}.fa-users-rays{--fa:"\e593"}.fa-users-rectangle{--fa:"\e594"}.fa-users-viewfinder{--fa:"\e595"}.fa-vial-circle-check{--fa:"\e596"}.fa-vial-virus{--fa:"\e597"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-worm{--fa:"\e599"}.fa-xmarks-lines{--fa:"\e59a"}.fa-child-dress{--fa:"\e59c"}.fa-child-reaching{--fa:"\e59d"}.fa-file-circle-check{--fa:"\e5a0"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-person-through-window{--fa:"\e5a9"}.fa-plant-wilt{--fa:"\e5aa"}.fa-stapler{--fa:"\e5af"}.fa-train-tram{--fa:"\e5b4"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-chart-diagram{--fa:"\e695"}.fa-comment-nodes{--fa:"\e696"}.fa-file-fragment{--fa:"\e697"}.fa-file-half-dashed{--fa:"\e698"}.fa-hexagon-nodes{--fa:"\e699"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-square-binary{--fa:"\e69b"}.fa-pentagon{--fa:"\e790"}.fa-non-binary{--fa:"\e807"}.fa-spiral{--fa:"\e80a"}.fa-mobile-vibrate{--fa:"\e816"}.fa-single-quote-left{--fa:"\e81b"}.fa-single-quote-right{--fa:"\e81c"}.fa-bus-side{--fa:"\e81d"}.fa-heptagon,.fa-septagon{--fa:"\e820"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-music{--fa:"\f001"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-heart{--fa:"\f004"}.fa-star{--fa:"\f005"}.fa-user,.fa-user-alt,.fa-user-large{--fa:"\f007"}.fa-film,.fa-film-alt,.fa-film-simple{--fa:"\f008"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-check{--fa:"\f00c"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-power-off{--fa:"\f011"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-road{--fa:"\f018"}.fa-download{--fa:"\f019"}.fa-inbox{--fa:"\f01c"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-lock{--fa:"\f023"}.fa-flag{--fa:"\f024"}.fa-headphones,.fa-headphones-alt,.fa-headphones-simple{--fa:"\f025"}.fa-volume-off{--fa:"\f026"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-qrcode{--fa:"\f029"}.fa-barcode{--fa:"\f02a"}.fa-tag{--fa:"\f02b"}.fa-tags{--fa:"\f02c"}.fa-book{--fa:"\f02d"}.fa-bookmark{--fa:"\f02e"}.fa-print{--fa:"\f02f"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-font{--fa:"\f031"}.fa-bold{--fa:"\f032"}.fa-italic{--fa:"\f033"}.fa-text-height{--fa:"\f034"}.fa-text-width{--fa:"\f035"}.fa-align-left{--fa:"\f036"}.fa-align-center{--fa:"\f037"}.fa-align-right{--fa:"\f038"}.fa-align-justify{--fa:"\f039"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-indent{--fa:"\f03c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-image{--fa:"\f03e"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-backward{--fa:"\f04a"}.fa-play{--fa:"\f04b"}.fa-pause{--fa:"\f04c"}.fa-stop{--fa:"\f04d"}.fa-forward{--fa:"\f04e"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-eject{--fa:"\f052"}.fa-chevron-left{--fa:"\f053"}.fa-chevron-right{--fa:"\f054"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-crosshairs{--fa:"\f05b"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-arrow-left{--fa:"\f060"}.fa-arrow-right{--fa:"\f061"}.fa-arrow-up{--fa:"\f062"}.fa-arrow-down{--fa:"\f063"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-expand{--fa:"\f065"}.fa-compress{--fa:"\f066"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-gift{--fa:"\f06b"}.fa-leaf{--fa:"\f06c"}.fa-fire{--fa:"\f06d"}.fa-eye{--fa:"\f06e"}.fa-eye-slash{--fa:"\f070"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-plane{--fa:"\f072"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-comment{--fa:"\f075"}.fa-magnet{--fa:"\f076"}.fa-chevron-up{--fa:"\f077"}.fa-chevron-down{--fa:"\f078"}.fa-retweet{--fa:"\f079"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-folder-open{--fa:"\f07c"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-camera-retro{--fa:"\f083"}.fa-key{--fa:"\f084"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-comments{--fa:"\f086"}.fa-star-half{--fa:"\f089"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-trophy{--fa:"\f091"}.fa-upload{--fa:"\f093"}.fa-lemon{--fa:"\f094"}.fa-phone{--fa:"\f095"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-unlock{--fa:"\f09c"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-bullhorn{--fa:"\f0a1"}.fa-certificate{--fa:"\f0a3"}.fa-hand-point-right{--fa:"\f0a4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-hand-point-up{--fa:"\f0a6"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-globe{--fa:"\f0ac"}.fa-wrench{--fa:"\f0ad"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-filter{--fa:"\f0b0"}.fa-briefcase{--fa:"\f0b1"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-users{--fa:"\f0c0"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-cloud{--fa:"\f0c2"}.fa-flask{--fa:"\f0c3"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-copy{--fa:"\f0c5"}.fa-paperclip{--fa:"\f0c6"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-square{--fa:"\f0c8"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-strikethrough{--fa:"\f0cc"}.fa-underline{--fa:"\f0cd"}.fa-table{--fa:"\f0ce"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-truck{--fa:"\f0d1"}.fa-money-bill{--fa:"\f0d6"}.fa-caret-down{--fa:"\f0d7"}.fa-caret-up{--fa:"\f0d8"}.fa-caret-left{--fa:"\f0d9"}.fa-caret-right{--fa:"\f0da"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-envelope{--fa:"\f0e0"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-sitemap{--fa:"\f0e8"}.fa-umbrella{--fa:"\f0e9"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-lightbulb{--fa:"\f0eb"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-stethoscope{--fa:"\f0f1"}.fa-suitcase{--fa:"\f0f2"}.fa-bell{--fa:"\f0f3"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-angle-left{--fa:"\f104"}.fa-angle-right{--fa:"\f105"}.fa-angle-up{--fa:"\f106"}.fa-angle-down{--fa:"\f107"}.fa-laptop{--fa:"\f109"}.fa-tablet-button{--fa:"\f10a"}.fa-mobile-button{--fa:"\f10b"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-spinner{--fa:"\f110"}.fa-circle{--fa:"\f111"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-gamepad{--fa:"\f11b"}.fa-keyboard{--fa:"\f11c"}.fa-flag-checkered{--fa:"\f11e"}.fa-terminal{--fa:"\f120"}.fa-code{--fa:"\f121"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-location-arrow{--fa:"\f124"}.fa-crop{--fa:"\f125"}.fa-code-branch{--fa:"\f126"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-info{--fa:"\f129"}.fa-superscript{--fa:"\f12b"}.fa-subscript{--fa:"\f12c"}.fa-eraser{--fa:"\f12d"}.fa-puzzle-piece{--fa:"\f12e"}.fa-microphone{--fa:"\f130"}.fa-microphone-slash{--fa:"\f131"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-calendar{--fa:"\f133"}.fa-fire-extinguisher{--fa:"\f134"}.fa-rocket{--fa:"\f135"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-anchor{--fa:"\f13d"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-bullseye{--fa:"\f140"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-ticket{--fa:"\f145"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-file{--fa:"\f15b"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-thumbs-up{--fa:"\f164"}.fa-thumbs-down{--fa:"\f165"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-male,.fa-person{--fa:"\f183"}.fa-sun{--fa:"\f185"}.fa-moon{--fa:"\f186"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-bug{--fa:"\f188"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-wheelchair{--fa:"\f193"}.fa-lira-sign{--fa:"\f195"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-language{--fa:"\f1ab"}.fa-fax{--fa:"\f1ac"}.fa-building{--fa:"\f1ad"}.fa-child{--fa:"\f1ae"}.fa-paw{--fa:"\f1b0"}.fa-cube{--fa:"\f1b2"}.fa-cubes{--fa:"\f1b3"}.fa-recycle{--fa:"\f1b8"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-tree{--fa:"\f1bb"}.fa-database{--fa:"\f1c0"}.fa-file-pdf{--fa:"\f1c1"}.fa-file-word{--fa:"\f1c2"}.fa-file-excel{--fa:"\f1c3"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-file-image{--fa:"\f1c5"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-file-audio{--fa:"\f1c7"}.fa-file-video{--fa:"\f1c8"}.fa-file-code{--fa:"\f1c9"}.fa-life-ring{--fa:"\f1cd"}.fa-circle-notch{--fa:"\f1ce"}.fa-paper-plane{--fa:"\f1d8"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-paragraph{--fa:"\f1dd"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-bomb{--fa:"\f1e2"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-binoculars{--fa:"\f1e5"}.fa-plug{--fa:"\f1e6"}.fa-newspaper{--fa:"\f1ea"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-calculator{--fa:"\f1ec"}.fa-bell-slash{--fa:"\f1f6"}.fa-trash{--fa:"\f1f8"}.fa-copyright{--fa:"\f1f9"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-toggle-off{--fa:"\f204"}.fa-toggle-on{--fa:"\f205"}.fa-bicycle{--fa:"\f206"}.fa-bus{--fa:"\f207"}.fa-closed-captioning{--fa:"\f20a"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-cart-plus{--fa:"\f217"}.fa-cart-arrow-down{--fa:"\f218"}.fa-diamond{--fa:"\f219"}.fa-ship{--fa:"\f21a"}.fa-user-secret{--fa:"\f21b"}.fa-motorcycle{--fa:"\f21c"}.fa-street-view{--fa:"\f21d"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-venus{--fa:"\f221"}.fa-mars{--fa:"\f222"}.fa-mercury{--fa:"\f223"}.fa-mars-and-venus{--fa:"\f224"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-venus-double{--fa:"\f226"}.fa-mars-double{--fa:"\f227"}.fa-venus-mars{--fa:"\f228"}.fa-mars-stroke{--fa:"\f229"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-neuter{--fa:"\f22c"}.fa-genderless{--fa:"\f22d"}.fa-server{--fa:"\f233"}.fa-user-plus{--fa:"\f234"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-bed{--fa:"\f236"}.fa-train{--fa:"\f238"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-i-cursor{--fa:"\f246"}.fa-object-group{--fa:"\f247"}.fa-object-ungroup{--fa:"\f248"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-clone{--fa:"\f24d"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-hand-scissors{--fa:"\f257"}.fa-hand-lizard{--fa:"\f258"}.fa-hand-spock{--fa:"\f259"}.fa-hand-pointer{--fa:"\f25a"}.fa-hand-peace{--fa:"\f25b"}.fa-trademark{--fa:"\f25c"}.fa-registered{--fa:"\f25d"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-calendar-plus{--fa:"\f271"}.fa-calendar-minus{--fa:"\f272"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-calendar-check{--fa:"\f274"}.fa-industry{--fa:"\f275"}.fa-map-pin{--fa:"\f276"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-map{--fa:"\f279"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-universal-access{--fa:"\f29a"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-audio-description{--fa:"\f29e"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-braille{--fa:"\f2a1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-handshake,.fa-handshake-alt,.fa-handshake-simple{--fa:"\f2b5"}.fa-envelope-open{--fa:"\f2b6"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-id-badge{--fa:"\f2c1"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-shower{--fa:"\f2cc"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-podcast{--fa:"\f2ce"}.fa-window-maximize{--fa:"\f2d0"}.fa-window-minimize{--fa:"\f2d1"}.fa-window-restore{--fa:"\f2d2"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-microchip{--fa:"\f2db"}.fa-snowflake{--fa:"\f2dc"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-stopwatch{--fa:"\f2f2"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-poo{--fa:"\f2fe"}.fa-images{--fa:"\f302"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-pen{--fa:"\f304"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-octagon{--fa:"\f306"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-hexagon{--fa:"\f312"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-clipboard{--fa:"\f328"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-alarm-clock{--fa:"\f34e"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-repeat{--fa:"\f363"}.fa-code-commit{--fa:"\f386"}.fa-code-merge{--fa:"\f387"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-gem{--fa:"\f3a5"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"}.fa-lock-open{--fa:"\f3c1"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-phone-slash{--fa:"\f3dd"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-bowling-ball{--fa:"\f436"}.fa-chess{--fa:"\f439"}.fa-chess-bishop{--fa:"\f43a"}.fa-chess-board{--fa:"\f43c"}.fa-chess-king{--fa:"\f43f"}.fa-chess-knight{--fa:"\f441"}.fa-chess-pawn{--fa:"\f443"}.fa-chess-queen{--fa:"\f445"}.fa-chess-rook{--fa:"\f447"}.fa-dumbbell{--fa:"\f44b"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-hockey-puck{--fa:"\f453"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-square-full{--fa:"\f45c"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-box{--fa:"\f466"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-briefcase-medical{--fa:"\f469"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-capsules{--fa:"\f46b"}.fa-clipboard-check{--fa:"\f46c"}.fa-clipboard-list{--fa:"\f46d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-dna{--fa:"\f471"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-file-medical{--fa:"\f477"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-notes-medical{--fa:"\f481"}.fa-pallet{--fa:"\f482"}.fa-pills{--fa:"\f484"}.fa-prescription-bottle{--fa:"\f485"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-smoking{--fa:"\f48d"}.fa-syringe{--fa:"\f48e"}.fa-tablets{--fa:"\f490"}.fa-thermometer{--fa:"\f491"}.fa-vial{--fa:"\f492"}.fa-vials{--fa:"\f493"}.fa-warehouse{--fa:"\f494"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-x-ray{--fa:"\f497"}.fa-box-open{--fa:"\f49e"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-comment-slash{--fa:"\f4b3"}.fa-couch{--fa:"\f4b8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-dove{--fa:"\f4ba"}.fa-hand-holding{--fa:"\f4bd"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-parachute-box{--fa:"\f4cd"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-piggy-bank{--fa:"\f4d3"}.fa-ribbon{--fa:"\f4d6"}.fa-route{--fa:"\f4d7"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-tape{--fa:"\f4db"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-truck-moving{--fa:"\f4df"}.fa-video-slash{--fa:"\f4e2"}.fa-wine-glass{--fa:"\f4e3"}.fa-user-astronaut{--fa:"\f4fb"}.fa-user-check{--fa:"\f4fc"}.fa-user-clock{--fa:"\f4fd"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-user-graduate{--fa:"\f501"}.fa-user-lock{--fa:"\f502"}.fa-user-minus{--fa:"\f503"}.fa-user-ninja{--fa:"\f504"}.fa-user-shield{--fa:"\f505"}.fa-user-alt-slash,.fa-user-large-slash,.fa-user-slash{--fa:"\f506"}.fa-user-tag{--fa:"\f507"}.fa-user-tie{--fa:"\f508"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-blender{--fa:"\f517"}.fa-book-open{--fa:"\f518"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-broom{--fa:"\f51a"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-church{--fa:"\f51d"}.fa-coins{--fa:"\f51e"}.fa-compact-disc{--fa:"\f51f"}.fa-crow{--fa:"\f520"}.fa-crown{--fa:"\f521"}.fa-dice{--fa:"\f522"}.fa-dice-five{--fa:"\f523"}.fa-dice-four{--fa:"\f524"}.fa-dice-one{--fa:"\f525"}.fa-dice-six{--fa:"\f526"}.fa-dice-three{--fa:"\f527"}.fa-dice-two{--fa:"\f528"}.fa-divide{--fa:"\f529"}.fa-door-closed{--fa:"\f52a"}.fa-door-open{--fa:"\f52b"}.fa-feather{--fa:"\f52d"}.fa-frog{--fa:"\f52e"}.fa-gas-pump{--fa:"\f52f"}.fa-glasses{--fa:"\f530"}.fa-greater-than-equal{--fa:"\f532"}.fa-helicopter{--fa:"\f533"}.fa-infinity{--fa:"\f534"}.fa-kiwi-bird{--fa:"\f535"}.fa-less-than-equal{--fa:"\f537"}.fa-memory{--fa:"\f538"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-money-bill-wave{--fa:"\f53a"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-money-check{--fa:"\f53c"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-not-equal{--fa:"\f53e"}.fa-palette{--fa:"\f53f"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-receipt{--fa:"\f543"}.fa-robot{--fa:"\f544"}.fa-ruler{--fa:"\f545"}.fa-ruler-combined{--fa:"\f546"}.fa-ruler-horizontal{--fa:"\f547"}.fa-ruler-vertical{--fa:"\f548"}.fa-school{--fa:"\f549"}.fa-screwdriver{--fa:"\f54a"}.fa-shoe-prints{--fa:"\f54b"}.fa-skull{--fa:"\f54c"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-store{--fa:"\f54e"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-stroopwafel{--fa:"\f551"}.fa-toolbox{--fa:"\f552"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-wallet{--fa:"\f555"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-archway{--fa:"\f557"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-award{--fa:"\f559"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-bezier-curve{--fa:"\f55b"}.fa-bong{--fa:"\f55c"}.fa-brush{--fa:"\f55d"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-cannabis{--fa:"\f55f"}.fa-check-double{--fa:"\f560"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-cookie{--fa:"\f563"}.fa-cookie-bite{--fa:"\f564"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-drum{--fa:"\f569"}.fa-drum-steelpan{--fa:"\f56a"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-file-contract{--fa:"\f56c"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-file-invoice{--fa:"\f570"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-file-prescription{--fa:"\f572"}.fa-file-signature{--fa:"\f573"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-fill{--fa:"\f575"}.fa-fill-drip{--fa:"\f576"}.fa-fingerprint{--fa:"\f577"}.fa-fish{--fa:"\f578"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-grid-horizontal,.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-grid-vertical,.fa-grip-vertical{--fa:"\f58e"}.fa-headset{--fa:"\f590"}.fa-highlighter{--fa:"\f591"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-hotel{--fa:"\f594"}.fa-joint{--fa:"\f595"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-marker{--fa:"\f5a1"}.fa-medal{--fa:"\f5a2"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-monument{--fa:"\f5a6"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-paint-roller{--fa:"\f5aa"}.fa-passport{--fa:"\f5ab"}.fa-pen-fancy{--fa:"\f5ac"}.fa-pen-nib{--fa:"\f5ad"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-plane-arrival{--fa:"\f5af"}.fa-plane-departure{--fa:"\f5b0"}.fa-prescription{--fa:"\f5b1"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-signature{--fa:"\f5b7"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-solar-panel{--fa:"\f5ba"}.fa-spa{--fa:"\f5bb"}.fa-splotch{--fa:"\f5bc"}.fa-spray-can{--fa:"\f5bd"}.fa-stamp{--fa:"\f5bf"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-swatchbook{--fa:"\f5c3"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-tooth{--fa:"\f5c9"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-weight-hanging{--fa:"\f5cd"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-atom{--fa:"\f5d2"}.fa-bone{--fa:"\f5d7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-brain{--fa:"\f5dc"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-car-side{--fa:"\f5e4"}.fa-charging-station{--fa:"\f5e7"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-draw-polygon,.fa-vector-polygon{--fa:"\f5ee"}.fa-laptop-code{--fa:"\f5fc"}.fa-layer-group{--fa:"\f5fd"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-lungs{--fa:"\f604"}.fa-microscope{--fa:"\f610"}.fa-oil-can{--fa:"\f613"}.fa-poop{--fa:"\f619"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-star-of-life{--fa:"\f621"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-teeth{--fa:"\f62e"}.fa-teeth-open{--fa:"\f62f"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-traffic-light{--fa:"\f637"}.fa-truck-monster{--fa:"\f63b"}.fa-truck-pickup{--fa:"\f63c"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-ankh{--fa:"\f644"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-city{--fa:"\f64f"}.fa-comment-dollar{--fa:"\f651"}.fa-comments-dollar{--fa:"\f653"}.fa-cross{--fa:"\f654"}.fa-dharmachakra{--fa:"\f655"}.fa-envelope-open-text{--fa:"\f658"}.fa-folder-minus{--fa:"\f65d"}.fa-folder-plus{--fa:"\f65e"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-gopuram{--fa:"\f664"}.fa-hamsa{--fa:"\f665"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-jedi{--fa:"\f669"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-kaaba{--fa:"\f66b"}.fa-khanda{--fa:"\f66d"}.fa-landmark{--fa:"\f66f"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-menorah{--fa:"\f676"}.fa-mosque{--fa:"\f678"}.fa-om{--fa:"\f679"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-peace{--fa:"\f67c"}.fa-place-of-worship{--fa:"\f67f"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-socks{--fa:"\f696"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-star-and-crescent{--fa:"\f699"}.fa-star-of-david{--fa:"\f69a"}.fa-synagogue{--fa:"\f69b"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-torii-gate{--fa:"\f6a1"}.fa-vihara{--fa:"\f6a7"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-yin-yang{--fa:"\f6ad"}.fa-blender-phone{--fa:"\f6b6"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-campground{--fa:"\f6bb"}.fa-cat{--fa:"\f6be"}.fa-chair{--fa:"\f6c0"}.fa-cloud-moon{--fa:"\f6c3"}.fa-cloud-sun{--fa:"\f6c4"}.fa-cow{--fa:"\f6c8"}.fa-dice-d20{--fa:"\f6cf"}.fa-dice-d6{--fa:"\f6d1"}.fa-dog{--fa:"\f6d3"}.fa-dragon{--fa:"\f6d5"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-dungeon{--fa:"\f6d9"}.fa-file-csv{--fa:"\f6dd"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-ghost{--fa:"\f6e2"}.fa-hammer{--fa:"\f6e3"}.fa-hanukiah{--fa:"\f6e6"}.fa-hat-wizard{--fa:"\f6e8"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-hippo{--fa:"\f6ed"}.fa-horse{--fa:"\f6f0"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-mask{--fa:"\f6fa"}.fa-mountain{--fa:"\f6fc"}.fa-network-wired{--fa:"\f6ff"}.fa-otter{--fa:"\f700"}.fa-ring{--fa:"\f70b"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-scroll{--fa:"\f70e"}.fa-skull-crossbones{--fa:"\f714"}.fa-slash{--fa:"\f715"}.fa-spider{--fa:"\f717"}.fa-toilet-paper,.fa-toilet-paper-alt,.fa-toilet-paper-blank{--fa:"\f71e"}.fa-tractor{--fa:"\f722"}.fa-user-injured{--fa:"\f728"}.fa-vr-cardboard{--fa:"\f729"}.fa-wand-sparkles{--fa:"\f72b"}.fa-wind{--fa:"\f72e"}.fa-wine-bottle{--fa:"\f72f"}.fa-cloud-meatball{--fa:"\f73b"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-cloud-rain{--fa:"\f73d"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-democrat{--fa:"\f747"}.fa-flag-usa{--fa:"\f74d"}.fa-hurricane{--fa:"\f751"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-meteor{--fa:"\f753"}.fa-person-booth{--fa:"\f756"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-rainbow{--fa:"\f75b"}.fa-republican{--fa:"\f75e"}.fa-smog{--fa:"\f75f"}.fa-temperature-high{--fa:"\f769"}.fa-temperature-low{--fa:"\f76b"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-tornado{--fa:"\f76f"}.fa-volcano{--fa:"\f770"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-water{--fa:"\f773"}.fa-baby{--fa:"\f77c"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-biohazard{--fa:"\f780"}.fa-blog{--fa:"\f781"}.fa-calendar-day{--fa:"\f783"}.fa-calendar-week{--fa:"\f784"}.fa-candy-cane{--fa:"\f786"}.fa-carrot{--fa:"\f787"}.fa-cash-register{--fa:"\f788"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-dumpster{--fa:"\f793"}.fa-dumpster-fire{--fa:"\f794"}.fa-ethernet{--fa:"\f796"}.fa-gifts{--fa:"\f79c"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-grip-lines{--fa:"\f7a4"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-guitar{--fa:"\f7a6"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-holly-berry{--fa:"\f7aa"}.fa-horse-head{--fa:"\f7ab"}.fa-icicles{--fa:"\f7ad"}.fa-igloo{--fa:"\f7ae"}.fa-mitten{--fa:"\f7b5"}.fa-mug-hot{--fa:"\f7b6"}.fa-radiation{--fa:"\f7b9"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-restroom{--fa:"\f7bd"}.fa-satellite{--fa:"\f7bf"}.fa-satellite-dish{--fa:"\f7c0"}.fa-sd-card{--fa:"\f7c2"}.fa-sim-card{--fa:"\f7c4"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-sleigh{--fa:"\f7cc"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-snowman{--fa:"\f7d0"}.fa-snowplow{--fa:"\f7d2"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-toilet{--fa:"\f7d8"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-bacon{--fa:"\f7e5"}.fa-book-medical{--fa:"\f7e6"}.fa-bread-slice{--fa:"\f7ec"}.fa-cheese{--fa:"\f7ef"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-clipboard-user{--fa:"\f7f3"}.fa-comment-medical{--fa:"\f7f5"}.fa-crutch{--fa:"\f7f7"}.fa-disease{--fa:"\f7fa"}.fa-egg{--fa:"\f7fb"}.fa-folder-tree{--fa:"\f802"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-hand-middle-finger{--fa:"\f806"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-hospital-user{--fa:"\f80d"}.fa-hotdog{--fa:"\f80f"}.fa-ice-cream{--fa:"\f810"}.fa-laptop-medical{--fa:"\f812"}.fa-pager{--fa:"\f815"}.fa-pepper-hot{--fa:"\f816"}.fa-pizza-slice{--fa:"\f818"}.fa-sack-dollar{--fa:"\f81d"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-user-nurse{--fa:"\f82f"}.fa-wave-square{--fa:"\f83e"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-border-all{--fa:"\f84c"}.fa-border-none{--fa:"\f850"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-fan{--fa:"\f863"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-spell-check{--fa:"\f891"}.fa-voicemail{--fa:"\f897"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-radio{--fa:"\f8d7"}.fa-record-vinyl{--fa:"\f8d9"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-caravan{--fa:"\f8ff"} +:host,:root{--fa-family-brands:"Font Awesome 7 Brands";--fa-font-brands:normal 400 1em/1 var(--fa-family-brands)}@font-face{font-family:"Font Awesome 7 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2)}.fa-brands,.fa-classic.fa-brands,.fab{--fa-family:var(--fa-family-brands);--fa-style:400}.fa-firefox-browser{--fa:"\e007"}.fa-ideal{--fa:"\e013"}.fa-microblog{--fa:"\e01a"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-unity{--fa:"\e049"}.fa-dailymotion{--fa:"\e052"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-mixer{--fa:"\e056"}.fa-shopify{--fa:"\e057"}.fa-deezer{--fa:"\e077"}.fa-edge-legacy{--fa:"\e078"}.fa-google-pay{--fa:"\e079"}.fa-rust{--fa:"\e07a"}.fa-tiktok{--fa:"\e07b"}.fa-unsplash{--fa:"\e07c"}.fa-cloudflare{--fa:"\e07d"}.fa-guilded{--fa:"\e07e"}.fa-hive{--fa:"\e07f"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-instalod{--fa:"\e081"}.fa-octopus-deploy{--fa:"\e082"}.fa-perbyte{--fa:"\e083"}.fa-uncharted{--fa:"\e084"}.fa-watchman-monitoring{--fa:"\e087"}.fa-wodu{--fa:"\e088"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-bots{--fa:"\e340"}.fa-cmplid{--fa:"\e360"}.fa-bilibili{--fa:"\e3d9"}.fa-golang{--fa:"\e40f"}.fa-pix{--fa:"\e43a"}.fa-sitrox{--fa:"\e44a"}.fa-hashnode{--fa:"\e499"}.fa-meta{--fa:"\e49b"}.fa-padlet{--fa:"\e4a0"}.fa-nfc-directional{--fa:"\e530"}.fa-nfc-symbol{--fa:"\e531"}.fa-screenpal{--fa:"\e570"}.fa-space-awesome{--fa:"\e5ac"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-odysee{--fa:"\e5c6"}.fa-stubber{--fa:"\e5c7"}.fa-debian{--fa:"\e60b"}.fa-shoelace{--fa:"\e60c"}.fa-threads{--fa:"\e618"}.fa-square-threads{--fa:"\e619"}.fa-square-x-twitter{--fa:"\e61a"}.fa-x-twitter{--fa:"\e61b"}.fa-opensuse{--fa:"\e62b"}.fa-letterboxd{--fa:"\e62d"}.fa-square-letterboxd{--fa:"\e62e"}.fa-mintbit{--fa:"\e62f"}.fa-google-scholar{--fa:"\e63b"}.fa-brave{--fa:"\e63c"}.fa-brave-reverse{--fa:"\e63d"}.fa-pixiv{--fa:"\e640"}.fa-upwork{--fa:"\e641"}.fa-webflow{--fa:"\e65c"}.fa-signal-messenger{--fa:"\e663"}.fa-bluesky{--fa:"\e671"}.fa-jxl{--fa:"\e67b"}.fa-square-upwork{--fa:"\e67c"}.fa-web-awesome{--fa:"\e682"}.fa-square-web-awesome{--fa:"\e683"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-dart-lang{--fa:"\e693"}.fa-flutter{--fa:"\e694"}.fa-files-pinwheel{--fa:"\e69f"}.fa-css{--fa:"\e6a2"}.fa-square-bluesky{--fa:"\e6a3"}.fa-openai{--fa:"\e7cf"}.fa-square-linkedin{--fa:"\e7d0"}.fa-cash-app{--fa:"\e7d4"}.fa-disqus{--fa:"\e7d5"}.fa-11ty,.fa-eleventy{--fa:"\e7d6"}.fa-kakao-talk{--fa:"\e7d7"}.fa-linktree{--fa:"\e7d8"}.fa-notion{--fa:"\e7d9"}.fa-pandora{--fa:"\e7da"}.fa-pixelfed{--fa:"\e7db"}.fa-tidal{--fa:"\e7dc"}.fa-vsco{--fa:"\e7dd"}.fa-w3c{--fa:"\e7de"}.fa-lumon{--fa:"\e7e2"}.fa-lumon-drop{--fa:"\e7e3"}.fa-square-figma{--fa:"\e7e4"}.fa-tex{--fa:"\e7ff"}.fa-duolingo{--fa:"\e812"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-linkedin{--fa:"\f08c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-twitter{--fa:"\f099"}.fa-facebook{--fa:"\f09a"}.fa-github{--fa:"\f09b"}.fa-pinterest{--fa:"\f0d2"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-google-plus-g{--fa:"\f0d5"}.fa-linkedin-in{--fa:"\f0e1"}.fa-github-alt{--fa:"\f113"}.fa-maxcdn{--fa:"\f136"}.fa-html5{--fa:"\f13b"}.fa-css3{--fa:"\f13c"}.fa-btc{--fa:"\f15a"}.fa-youtube{--fa:"\f167"}.fa-xing{--fa:"\f168"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-dropbox{--fa:"\f16b"}.fa-stack-overflow{--fa:"\f16c"}.fa-instagram{--fa:"\f16d"}.fa-flickr{--fa:"\f16e"}.fa-adn{--fa:"\f170"}.fa-bitbucket{--fa:"\f171"}.fa-tumblr{--fa:"\f173"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-apple{--fa:"\f179"}.fa-windows{--fa:"\f17a"}.fa-android{--fa:"\f17b"}.fa-linux{--fa:"\f17c"}.fa-dribbble{--fa:"\f17d"}.fa-skype{--fa:"\f17e"}.fa-foursquare{--fa:"\f180"}.fa-trello{--fa:"\f181"}.fa-gratipay{--fa:"\f184"}.fa-vk{--fa:"\f189"}.fa-weibo{--fa:"\f18a"}.fa-renren{--fa:"\f18b"}.fa-pagelines{--fa:"\f18c"}.fa-stack-exchange{--fa:"\f18d"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-wordpress{--fa:"\f19a"}.fa-openid{--fa:"\f19b"}.fa-yahoo{--fa:"\f19e"}.fa-google{--fa:"\f1a0"}.fa-reddit{--fa:"\f1a1"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-stumbleupon{--fa:"\f1a4"}.fa-delicious{--fa:"\f1a5"}.fa-digg{--fa:"\f1a6"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-drupal{--fa:"\f1a9"}.fa-joomla{--fa:"\f1aa"}.fa-behance{--fa:"\f1b4"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-steam{--fa:"\f1b6"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-spotify{--fa:"\f1bc"}.fa-deviantart{--fa:"\f1bd"}.fa-soundcloud{--fa:"\f1be"}.fa-vine{--fa:"\f1ca"}.fa-codepen{--fa:"\f1cb"}.fa-jsfiddle{--fa:"\f1cc"}.fa-rebel{--fa:"\f1d0"}.fa-empire{--fa:"\f1d1"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-git{--fa:"\f1d3"}.fa-hacker-news{--fa:"\f1d4"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-qq{--fa:"\f1d6"}.fa-weixin{--fa:"\f1d7"}.fa-slideshare{--fa:"\f1e7"}.fa-twitch{--fa:"\f1e8"}.fa-yelp{--fa:"\f1e9"}.fa-paypal{--fa:"\f1ed"}.fa-google-wallet{--fa:"\f1ee"}.fa-cc-visa{--fa:"\f1f0"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-cc-discover{--fa:"\f1f2"}.fa-cc-amex{--fa:"\f1f3"}.fa-cc-paypal{--fa:"\f1f4"}.fa-cc-stripe{--fa:"\f1f5"}.fa-lastfm{--fa:"\f202"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-ioxhost{--fa:"\f208"}.fa-angellist{--fa:"\f209"}.fa-buysellads{--fa:"\f20d"}.fa-connectdevelop{--fa:"\f20e"}.fa-dashcube{--fa:"\f210"}.fa-forumbee{--fa:"\f211"}.fa-leanpub{--fa:"\f212"}.fa-sellsy{--fa:"\f213"}.fa-shirtsinbulk{--fa:"\f214"}.fa-simplybuilt{--fa:"\f215"}.fa-skyatlas{--fa:"\f216"}.fa-pinterest-p{--fa:"\f231"}.fa-whatsapp{--fa:"\f232"}.fa-viacoin{--fa:"\f237"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-y-combinator{--fa:"\f23b"}.fa-optin-monster{--fa:"\f23c"}.fa-opencart{--fa:"\f23d"}.fa-expeditedssl{--fa:"\f23e"}.fa-cc-jcb{--fa:"\f24b"}.fa-cc-diners-club{--fa:"\f24c"}.fa-creative-commons{--fa:"\f25e"}.fa-gg{--fa:"\f260"}.fa-gg-circle{--fa:"\f261"}.fa-odnoklassniki{--fa:"\f263"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-get-pocket{--fa:"\f265"}.fa-wikipedia-w{--fa:"\f266"}.fa-safari{--fa:"\f267"}.fa-chrome{--fa:"\f268"}.fa-firefox{--fa:"\f269"}.fa-opera{--fa:"\f26a"}.fa-internet-explorer{--fa:"\f26b"}.fa-contao{--fa:"\f26d"}.fa-500px{--fa:"\f26e"}.fa-amazon{--fa:"\f270"}.fa-houzz{--fa:"\f27c"}.fa-vimeo-v{--fa:"\f27d"}.fa-black-tie{--fa:"\f27e"}.fa-fonticons{--fa:"\f280"}.fa-reddit-alien{--fa:"\f281"}.fa-edge{--fa:"\f282"}.fa-codiepie{--fa:"\f284"}.fa-modx{--fa:"\f285"}.fa-fort-awesome{--fa:"\f286"}.fa-usb{--fa:"\f287"}.fa-product-hunt{--fa:"\f288"}.fa-mixcloud{--fa:"\f289"}.fa-scribd{--fa:"\f28a"}.fa-bluetooth{--fa:"\f293"}.fa-bluetooth-b{--fa:"\f294"}.fa-gitlab{--fa:"\f296"}.fa-wpbeginner{--fa:"\f297"}.fa-wpforms{--fa:"\f298"}.fa-envira{--fa:"\f299"}.fa-glide{--fa:"\f2a5"}.fa-glide-g{--fa:"\f2a6"}.fa-viadeo{--fa:"\f2a9"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-pied-piper{--fa:"\f2ae"}.fa-first-order{--fa:"\f2b0"}.fa-yoast{--fa:"\f2b1"}.fa-themeisle{--fa:"\f2b2"}.fa-google-plus{--fa:"\f2b3"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-linode{--fa:"\f2b8"}.fa-quora{--fa:"\f2c4"}.fa-free-code-camp{--fa:"\f2c5"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-bandcamp{--fa:"\f2d5"}.fa-grav{--fa:"\f2d6"}.fa-etsy{--fa:"\f2d7"}.fa-imdb{--fa:"\f2d8"}.fa-ravelry{--fa:"\f2d9"}.fa-sellcast{--fa:"\f2da"}.fa-superpowers{--fa:"\f2dd"}.fa-wpexplorer{--fa:"\f2de"}.fa-meetup{--fa:"\f2e0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-accessible-icon{--fa:"\f368"}.fa-accusoft{--fa:"\f369"}.fa-adversal{--fa:"\f36a"}.fa-affiliatetheme{--fa:"\f36b"}.fa-algolia{--fa:"\f36c"}.fa-amilia{--fa:"\f36d"}.fa-angrycreative{--fa:"\f36e"}.fa-app-store{--fa:"\f36f"}.fa-app-store-ios{--fa:"\f370"}.fa-apper{--fa:"\f371"}.fa-asymmetrik{--fa:"\f372"}.fa-audible{--fa:"\f373"}.fa-avianex{--fa:"\f374"}.fa-aws{--fa:"\f375"}.fa-bimobject{--fa:"\f378"}.fa-bitcoin{--fa:"\f379"}.fa-bity{--fa:"\f37a"}.fa-blackberry{--fa:"\f37b"}.fa-blogger{--fa:"\f37c"}.fa-blogger-b{--fa:"\f37d"}.fa-buromobelexperte{--fa:"\f37f"}.fa-centercode{--fa:"\f380"}.fa-cloudscale{--fa:"\f383"}.fa-cloudsmith{--fa:"\f384"}.fa-cloudversify{--fa:"\f385"}.fa-cpanel{--fa:"\f388"}.fa-css3-alt{--fa:"\f38b"}.fa-cuttlefish{--fa:"\f38c"}.fa-d-and-d{--fa:"\f38d"}.fa-deploydog{--fa:"\f38e"}.fa-deskpro{--fa:"\f38f"}.fa-digital-ocean{--fa:"\f391"}.fa-discord{--fa:"\f392"}.fa-discourse{--fa:"\f393"}.fa-dochub{--fa:"\f394"}.fa-docker{--fa:"\f395"}.fa-draft2digital{--fa:"\f396"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-dyalog{--fa:"\f399"}.fa-earlybirds{--fa:"\f39a"}.fa-erlang{--fa:"\f39d"}.fa-facebook-f{--fa:"\f39e"}.fa-facebook-messenger{--fa:"\f39f"}.fa-firstdraft{--fa:"\f3a1"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-freebsd{--fa:"\f3a4"}.fa-gitkraken{--fa:"\f3a6"}.fa-gofore{--fa:"\f3a7"}.fa-goodreads{--fa:"\f3a8"}.fa-goodreads-g{--fa:"\f3a9"}.fa-google-drive{--fa:"\f3aa"}.fa-google-play{--fa:"\f3ab"}.fa-gripfire{--fa:"\f3ac"}.fa-grunt{--fa:"\f3ad"}.fa-gulp{--fa:"\f3ae"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-hotjar{--fa:"\f3b1"}.fa-hubspot{--fa:"\f3b2"}.fa-itunes{--fa:"\f3b4"}.fa-itunes-note{--fa:"\f3b5"}.fa-jenkins{--fa:"\f3b6"}.fa-joget{--fa:"\f3b7"}.fa-js{--fa:"\f3b8"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-keycdn{--fa:"\f3ba"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-laravel{--fa:"\f3bd"}.fa-line{--fa:"\f3c0"}.fa-lyft{--fa:"\f3c3"}.fa-magento{--fa:"\f3c4"}.fa-medapps{--fa:"\f3c6"}.fa-medrt{--fa:"\f3c8"}.fa-microsoft{--fa:"\f3ca"}.fa-mix{--fa:"\f3cb"}.fa-mizuni{--fa:"\f3cc"}.fa-monero{--fa:"\f3d0"}.fa-napster{--fa:"\f3d2"}.fa-node-js{--fa:"\f3d3"}.fa-npm{--fa:"\f3d4"}.fa-ns8{--fa:"\f3d5"}.fa-nutritionix{--fa:"\f3d6"}.fa-page4{--fa:"\f3d7"}.fa-palfed{--fa:"\f3d8"}.fa-patreon{--fa:"\f3d9"}.fa-periscope{--fa:"\f3da"}.fa-phabricator{--fa:"\f3db"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-playstation{--fa:"\f3df"}.fa-pushed{--fa:"\f3e1"}.fa-python{--fa:"\f3e2"}.fa-red-river{--fa:"\f3e3"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-replyd{--fa:"\f3e6"}.fa-resolving{--fa:"\f3e7"}.fa-rocketchat{--fa:"\f3e8"}.fa-rockrms{--fa:"\f3e9"}.fa-schlix{--fa:"\f3ea"}.fa-searchengin{--fa:"\f3eb"}.fa-servicestack{--fa:"\f3ec"}.fa-sistrix{--fa:"\f3ee"}.fa-speakap{--fa:"\f3f3"}.fa-staylinked{--fa:"\f3f5"}.fa-steam-symbol{--fa:"\f3f6"}.fa-sticker-mule{--fa:"\f3f7"}.fa-studiovinari{--fa:"\f3f8"}.fa-supple{--fa:"\f3f9"}.fa-uber{--fa:"\f402"}.fa-uikit{--fa:"\f403"}.fa-uniregistry{--fa:"\f404"}.fa-untappd{--fa:"\f405"}.fa-ussunnah{--fa:"\f407"}.fa-vaadin{--fa:"\f408"}.fa-viber{--fa:"\f409"}.fa-vimeo{--fa:"\f40a"}.fa-vnv{--fa:"\f40b"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-whmcs{--fa:"\f40d"}.fa-wordpress-simple{--fa:"\f411"}.fa-xbox{--fa:"\f412"}.fa-yandex{--fa:"\f413"}.fa-yandex-international{--fa:"\f414"}.fa-apple-pay{--fa:"\f415"}.fa-cc-apple-pay{--fa:"\f416"}.fa-fly{--fa:"\f417"}.fa-node{--fa:"\f419"}.fa-osi{--fa:"\f41a"}.fa-react{--fa:"\f41b"}.fa-autoprefixer{--fa:"\f41c"}.fa-less{--fa:"\f41d"}.fa-sass{--fa:"\f41e"}.fa-vuejs{--fa:"\f41f"}.fa-angular{--fa:"\f420"}.fa-aviato{--fa:"\f421"}.fa-ember{--fa:"\f423"}.fa-gitter{--fa:"\f426"}.fa-hooli{--fa:"\f427"}.fa-strava{--fa:"\f428"}.fa-stripe{--fa:"\f429"}.fa-stripe-s{--fa:"\f42a"}.fa-typo3{--fa:"\f42b"}.fa-amazon-pay{--fa:"\f42c"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-ethereum{--fa:"\f42e"}.fa-korvue{--fa:"\f42f"}.fa-elementor{--fa:"\f430"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-flipboard{--fa:"\f44d"}.fa-hips{--fa:"\f452"}.fa-php{--fa:"\f457"}.fa-quinscape{--fa:"\f459"}.fa-readme{--fa:"\f4d5"}.fa-java{--fa:"\f4e4"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-ebay{--fa:"\f4f4"}.fa-keybase{--fa:"\f4f5"}.fa-mastodon{--fa:"\f4f6"}.fa-r-project{--fa:"\f4f7"}.fa-researchgate{--fa:"\f4f8"}.fa-teamspeak{--fa:"\f4f9"}.fa-first-order-alt{--fa:"\f50a"}.fa-fulcrum{--fa:"\f50b"}.fa-galactic-republic{--fa:"\f50c"}.fa-galactic-senate{--fa:"\f50d"}.fa-jedi-order{--fa:"\f50e"}.fa-mandalorian{--fa:"\f50f"}.fa-old-republic{--fa:"\f510"}.fa-phoenix-squadron{--fa:"\f511"}.fa-sith{--fa:"\f512"}.fa-trade-federation{--fa:"\f513"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-hornbill{--fa:"\f592"}.fa-mailchimp{--fa:"\f59e"}.fa-megaport{--fa:"\f5a3"}.fa-nimblr{--fa:"\f5a8"}.fa-rev{--fa:"\f5b2"}.fa-shopware{--fa:"\f5b5"}.fa-squarespace{--fa:"\f5be"}.fa-themeco{--fa:"\f5c6"}.fa-weebly{--fa:"\f5cc"}.fa-wix{--fa:"\f5cf"}.fa-ello{--fa:"\f5f1"}.fa-hackerrank{--fa:"\f5f7"}.fa-kaggle{--fa:"\f5fa"}.fa-markdown{--fa:"\f60f"}.fa-neos{--fa:"\f612"}.fa-zhihu{--fa:"\f63f"}.fa-alipay{--fa:"\f642"}.fa-the-red-yeti{--fa:"\f69d"}.fa-critical-role{--fa:"\f6c9"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-dev{--fa:"\f6cc"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-think-peaks{--fa:"\f731"}.fa-reacteurope{--fa:"\f75d"}.fa-artstation{--fa:"\f77a"}.fa-atlassian{--fa:"\f77b"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-centos{--fa:"\f789"}.fa-confluence{--fa:"\f78d"}.fa-dhl{--fa:"\f790"}.fa-diaspora{--fa:"\f791"}.fa-fedex{--fa:"\f797"}.fa-fedora{--fa:"\f798"}.fa-figma{--fa:"\f799"}.fa-intercom{--fa:"\f7af"}.fa-invision{--fa:"\f7b0"}.fa-jira{--fa:"\f7b1"}.fa-mendeley{--fa:"\f7b3"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-redhat{--fa:"\f7bc"}.fa-sketch{--fa:"\f7c6"}.fa-sourcetree{--fa:"\f7d3"}.fa-suse{--fa:"\f7d6"}.fa-ubuntu{--fa:"\f7df"}.fa-ups{--fa:"\f7e0"}.fa-usps{--fa:"\f7e1"}.fa-yarn{--fa:"\f7e3"}.fa-airbnb{--fa:"\f834"}.fa-battle-net{--fa:"\f835"}.fa-bootstrap{--fa:"\f836"}.fa-buffer{--fa:"\f837"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-itch-io{--fa:"\f83a"}.fa-salesforce{--fa:"\f83b"}.fa-speaker-deck{--fa:"\f83c"}.fa-symfony{--fa:"\f83d"}.fa-waze{--fa:"\f83f"}.fa-yammer{--fa:"\f840"}.fa-git-alt{--fa:"\f841"}.fa-stackpath{--fa:"\f842"}.fa-cotton-bureau{--fa:"\f89e"}.fa-buy-n-large{--fa:"\f8a6"}.fa-mdb{--fa:"\f8ca"}.fa-orcid{--fa:"\f8d2"}.fa-swift{--fa:"\f8e1"}.fa-umbraco{--fa:"\f8e8"}:host,:root{--fa-font-regular:normal 400 1em/1 var(--fa-family-classic)}@font-face{font-family:"Font Awesome 7 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2)}.far{--fa-family:var(--fa-family-classic)}.fa-regular,.far{--fa-style:400}:host,:root{--fa-family-classic:"Font Awesome 7 Free";--fa-font-solid:normal 900 1em/1 var(--fa-family-classic);--fa-style-family-classic:var(--fa-family-classic)}@font-face{font-family:"Font Awesome 7 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2)}.fas{--fa-style:900}.fa-classic,.fas{--fa-family:var(--fa-family-classic)}.fa-solid{--fa-style:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/css/v4-shims.min.css b/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/css/v4-shims.min.css new file mode 100755 index 00000000..5b8b8a2c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/css/v4-shims.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2025 Fonticons, Inc. + */ +.fa.fa-glass{--fa:"\f000"}.fa.fa-envelope-o{--fa:"\f0e0"}.fa.fa-envelope-o,.fa.fa-star-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-star-o{--fa:"\f005"}.fa.fa-close,.fa.fa-remove{--fa:"\f00d"}.fa.fa-gear{--fa:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f2ed"}.fa.fa-home{--fa:"\f015"}.fa.fa-file-o{--fa:"\f15b"}.fa.fa-clock-o,.fa.fa-file-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-clock-o{--fa:"\f017"}.fa.fa-arrow-circle-o-down{--fa:"\f358"}.fa.fa-arrow-circle-o-down,.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-arrow-circle-o-up{--fa:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f144"}.fa.fa-repeat,.fa.fa-rotate-right{--fa:"\f01e"}.fa.fa-refresh{--fa:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f022"}.fa.fa-dedent{--fa:"\f03b"}.fa.fa-video-camera{--fa:"\f03d"}.fa.fa-picture-o{--fa:"\f03e"}.fa.fa-photo,.fa.fa-picture-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-photo{--fa:"\f03e"}.fa.fa-image{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f03e"}.fa.fa-map-marker{--fa:"\f3c5"}.fa.fa-pencil-square-o{--fa:"\f044"}.fa.fa-edit,.fa.fa-pencil-square-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-edit{--fa:"\f044"}.fa.fa-share-square-o{--fa:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f14a"}.fa.fa-arrows{--fa:"\f0b2"}.fa.fa-times-circle-o{--fa:"\f057"}.fa.fa-check-circle-o,.fa.fa-times-circle-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-check-circle-o{--fa:"\f058"}.fa.fa-mail-forward{--fa:"\f064"}.fa.fa-expand{--fa:"\f424"}.fa.fa-compress{--fa:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-warning{--fa:"\f071"}.fa.fa-calendar{--fa:"\f073"}.fa.fa-arrows-v{--fa:"\f338"}.fa.fa-arrows-h{--fa:"\f337"}.fa.fa-bar-chart,.fa.fa-bar-chart-o{--fa:"\e0e3"}.fa.fa-twitter-square{--fa:"\f081"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-facebook-square{--fa:"\f082"}.fa.fa-gears{--fa:"\f085"}.fa.fa-thumbs-o-up{--fa:"\f164"}.fa.fa-thumbs-o-down,.fa.fa-thumbs-o-up{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-thumbs-o-down{--fa:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f004"}.fa.fa-sign-out{--fa:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 7 Brands";font-weight:400;--fa:"\f08c"}.fa.fa-thumb-tack{--fa:"\f08d"}.fa.fa-external-link{--fa:"\f35d"}.fa.fa-sign-in{--fa:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 7 Brands";font-weight:400;--fa:"\f092"}.fa.fa-lemon-o{--fa:"\f094"}.fa.fa-lemon-o,.fa.fa-square-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-square-o{--fa:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-facebook{--fa:"\f39e"}.fa.fa-facebook-f{--fa:"\f39e"}.fa.fa-facebook-f,.fa.fa-github{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-feed{--fa:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f0a0"}.fa.fa-hand-o-right{--fa:"\f0a4"}.fa.fa-hand-o-left,.fa.fa-hand-o-right{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hand-o-left{--fa:"\f0a5"}.fa.fa-hand-o-up{--fa:"\f0a6"}.fa.fa-hand-o-down,.fa.fa-hand-o-up{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hand-o-down{--fa:"\f0a7"}.fa.fa-globe{--fa:"\f57d"}.fa.fa-tasks{--fa:"\f828"}.fa.fa-arrows-alt{--fa:"\f31e"}.fa.fa-group{--fa:"\f0c0"}.fa.fa-chain{--fa:"\f0c1"}.fa.fa-cut{--fa:"\f0c4"}.fa.fa-files-o{--fa:"\f0c5"}.fa.fa-files-o,.fa.fa-floppy-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-floppy-o{--fa:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f0c7"}.fa.fa-navicon,.fa.fa-reorder{--fa:"\f0c9"}.fa.fa-magic{--fa:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-pinterest-square{--fa:"\f0d3"}.fa.fa-google-plus-square{--fa:"\f0d4"}.fa.fa-google-plus,.fa.fa-google-plus-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-google-plus{--fa:"\f0d5"}.fa.fa-money{--fa:"\f3d1"}.fa.fa-unsorted{--fa:"\f0dc"}.fa.fa-sort-desc{--fa:"\f0dd"}.fa.fa-sort-asc{--fa:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 7 Brands";font-weight:400;--fa:"\f0e1"}.fa.fa-rotate-left{--fa:"\f0e2"}.fa.fa-legal{--fa:"\f0e3"}.fa.fa-dashboard,.fa.fa-tachometer{--fa:"\f625"}.fa.fa-comment-o{--fa:"\f075"}.fa.fa-comment-o,.fa.fa-comments-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-comments-o{--fa:"\f086"}.fa.fa-flash{--fa:"\f0e7"}.fa.fa-clipboard{--fa:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f0eb"}.fa.fa-exchange{--fa:"\f362"}.fa.fa-cloud-download{--fa:"\f0ed"}.fa.fa-cloud-upload{--fa:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f0f3"}.fa.fa-cutlery{--fa:"\f2e7"}.fa.fa-file-text-o{--fa:"\f15c"}.fa.fa-building-o,.fa.fa-file-text-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-building-o{--fa:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f0f8"}.fa.fa-tablet{--fa:"\f3fa"}.fa.fa-mobile,.fa.fa-mobile-phone{--fa:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f111"}.fa.fa-mail-reply{--fa:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-folder-o{--fa:"\f07b"}.fa.fa-folder-o,.fa.fa-folder-open-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-folder-open-o{--fa:"\f07c"}.fa.fa-smile-o{--fa:"\f118"}.fa.fa-frown-o,.fa.fa-smile-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-frown-o{--fa:"\f119"}.fa.fa-meh-o{--fa:"\f11a"}.fa.fa-keyboard-o,.fa.fa-meh-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-keyboard-o{--fa:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f024"}.fa.fa-mail-reply-all{--fa:"\f122"}.fa.fa-star-half-o{--fa:"\f5c0"}.fa.fa-star-half-empty,.fa.fa-star-half-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-star-half-empty{--fa:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f5c0"}.fa.fa-code-fork{--fa:"\f126"}.fa.fa-chain-broken,.fa.fa-unlink{--fa:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-unlock-alt{--fa:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f146"}.fa.fa-level-up{--fa:"\f3bf"}.fa.fa-level-down{--fa:"\f3be"}.fa.fa-pencil-square{--fa:"\f14b"}.fa.fa-external-link-square{--fa:"\f360"}.fa.fa-compass{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f152"}.fa.fa-eur,.fa.fa-euro{--fa:"\f153"}.fa.fa-gbp{--fa:"\f154"}.fa.fa-dollar,.fa.fa-usd{--fa:"\$"}.fa.fa-inr,.fa.fa-rupee{--fa:"\e1bc"}.fa.fa-cny,.fa.fa-jpy,.fa.fa-rmb,.fa.fa-yen{--fa:"\f157"}.fa.fa-rouble,.fa.fa-rub,.fa.fa-ruble{--fa:"\f158"}.fa.fa-krw,.fa.fa-won{--fa:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-bitcoin{--fa:"\f15a"}.fa.fa-file-text{--fa:"\f15c"}.fa.fa-sort-alpha-asc{--fa:"\f15d"}.fa.fa-sort-alpha-desc{--fa:"\f881"}.fa.fa-sort-amount-asc{--fa:"\f884"}.fa.fa-sort-amount-desc{--fa:"\f160"}.fa.fa-sort-numeric-asc{--fa:"\f162"}.fa.fa-sort-numeric-desc{--fa:"\f886"}.fa.fa-youtube-square{--fa:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-xing-square{--fa:"\f169"}.fa.fa-youtube-play{--fa:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow,.fa.fa-youtube-play{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-bitbucket-square{--fa:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-tumblr-square{--fa:"\f174"}.fa.fa-long-arrow-down{--fa:"\f309"}.fa.fa-long-arrow-up{--fa:"\f30c"}.fa.fa-long-arrow-left{--fa:"\f30a"}.fa.fa-long-arrow-right{--fa:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-gittip{--fa:"\f184"}.fa.fa-sun-o{--fa:"\f185"}.fa.fa-moon-o,.fa.fa-sun-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-moon-o{--fa:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{--fa:"\f35a"}.fa.fa-arrow-circle-o-left,.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-arrow-circle-o-left{--fa:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f191"}.fa.fa-toggle-left{--fa:"\f191"}.fa.fa-dot-circle-o,.fa.fa-toggle-left{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-dot-circle-o{--fa:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 7 Brands";font-weight:400;--fa:"\f194"}.fa.fa-try,.fa.fa-turkish-lira{--fa:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-bank,.fa.fa-institution{--fa:"\f19c"}.fa.fa-mortar-board{--fa:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-reddit-square{--fa:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-behance-square{--fa:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-steam-square{--fa:"\f1b7"}.fa.fa-automobile{--fa:"\f1b9"}.fa.fa-cab{--fa:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-file-pdf-o{--fa:"\f1c1"}.fa.fa-file-pdf-o,.fa.fa-file-word-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-word-o{--fa:"\f1c2"}.fa.fa-file-excel-o{--fa:"\f1c3"}.fa.fa-file-excel-o,.fa.fa-file-powerpoint-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-powerpoint-o{--fa:"\f1c4"}.fa.fa-file-image-o{--fa:"\f1c5"}.fa.fa-file-image-o,.fa.fa-file-photo-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-photo-o{--fa:"\f1c5"}.fa.fa-file-picture-o{--fa:"\f1c5"}.fa.fa-file-archive-o,.fa.fa-file-picture-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-archive-o{--fa:"\f1c6"}.fa.fa-file-zip-o{--fa:"\f1c6"}.fa.fa-file-audio-o,.fa.fa-file-zip-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-audio-o{--fa:"\f1c7"}.fa.fa-file-sound-o{--fa:"\f1c7"}.fa.fa-file-sound-o,.fa.fa-file-video-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-video-o{--fa:"\f1c8"}.fa.fa-file-movie-o{--fa:"\f1c8"}.fa.fa-file-code-o,.fa.fa-file-movie-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-file-code-o{--fa:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-buoy,.fa.fa-life-saver,.fa.fa-support{--fa:"\f1cd"}.fa.fa-circle-o-notch{--fa:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-ra{--fa:"\f1d0"}.fa.fa-resistance{--fa:"\f1d0"}.fa.fa-empire,.fa.fa-ge,.fa.fa-resistance{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-ge{--fa:"\f1d1"}.fa.fa-git-square{--fa:"\f1d2"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-y-combinator-square{--fa:"\f1d4"}.fa.fa-yc-square{--fa:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin,.fa.fa-yc-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-wechat{--fa:"\f1d7"}.fa.fa-send{--fa:"\f1d8"}.fa.fa-paper-plane-o{--fa:"\f1d8"}.fa.fa-paper-plane-o,.fa.fa-send-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-send-o{--fa:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f111"}.fa.fa-header{--fa:"\f1dc"}.fa.fa-futbol-o{--fa:"\f1e3"}.fa.fa-futbol-o,.fa.fa-soccer-ball-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-soccer-ball-o{--fa:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f1f6"}.fa.fa-trash{--fa:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-eyedropper{--fa:"\f1fb"}.fa.fa-area-chart{--fa:"\f1fe"}.fa.fa-pie-chart{--fa:"\f200"}.fa.fa-line-chart{--fa:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-lastfm-square{--fa:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f20a"}.fa.fa-ils,.fa.fa-shekel,.fa.fa-sheqel{--fa:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f3a5"}.fa.fa-intersex,.fa.fa-transgender{--fa:"\f224"}.fa.fa-transgender-alt{--fa:"\f225"}.fa.fa-facebook-official{--fa:"\f09a"}.fa.fa-facebook-official,.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-hotel{--fa:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-yc{--fa:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-battery,.fa.fa-battery-4{--fa:"\f240"}.fa.fa-battery-3{--fa:"\f241"}.fa.fa-battery-2{--fa:"\f242"}.fa.fa-battery-1{--fa:"\f243"}.fa.fa-battery-0{--fa:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-sticky-note-o{--fa:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hourglass-o{--fa:"\f254"}.fa.fa-hourglass-1{--fa:"\f251"}.fa.fa-hourglass-2{--fa:"\f252"}.fa.fa-hourglass-3{--fa:"\f253"}.fa.fa-hand-rock-o{--fa:"\f255"}.fa.fa-hand-grab-o,.fa.fa-hand-rock-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hand-grab-o{--fa:"\f255"}.fa.fa-hand-paper-o{--fa:"\f256"}.fa.fa-hand-paper-o,.fa.fa-hand-stop-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hand-stop-o{--fa:"\f256"}.fa.fa-hand-scissors-o{--fa:"\f257"}.fa.fa-hand-lizard-o,.fa.fa-hand-scissors-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hand-lizard-o{--fa:"\f258"}.fa.fa-hand-spock-o{--fa:"\f259"}.fa.fa-hand-pointer-o,.fa.fa-hand-spock-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-hand-pointer-o{--fa:"\f25a"}.fa.fa-hand-peace-o{--fa:"\f25b"}.fa.fa-hand-peace-o,.fa.fa-registered{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-odnoklassniki-square{--fa:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-television{--fa:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-calendar-plus-o{--fa:"\f271"}.fa.fa-calendar-minus-o,.fa.fa-calendar-plus-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-calendar-minus-o{--fa:"\f272"}.fa.fa-calendar-times-o{--fa:"\f273"}.fa.fa-calendar-check-o,.fa.fa-calendar-times-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-calendar-check-o{--fa:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f279"}.fa.fa-commenting{--fa:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-vimeo{--fa:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-credit-card-alt{--fa:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-pause-circle-o{--fa:"\f28b"}.fa.fa-pause-circle-o,.fa.fa-stop-circle-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-stop-circle-o{--fa:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-wheelchair-alt{--fa:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f059"}.fa.fa-volume-control-phone{--fa:"\f2a0"}.fa.fa-asl-interpreting{--fa:"\f2a3"}.fa.fa-deafness,.fa.fa-hard-of-hearing{--fa:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-signing{--fa:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-viadeo-square{--fa:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-snapchat-ghost{--fa:"\f2ab"}.fa.fa-snapchat-square{--fa:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-google-plus-official{--fa:"\f2b3"}.fa.fa-google-plus-circle{--fa:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome,.fa.fa-google-plus-circle{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-fa{--fa:"\f2b4"}.fa.fa-handshake-o{--fa:"\f2b5"}.fa.fa-envelope-open-o,.fa.fa-handshake-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-envelope-open-o{--fa:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f2b9"}.fa.fa-vcard{--fa:"\f2bb"}.fa.fa-address-card-o{--fa:"\f2bb"}.fa.fa-address-card-o,.fa.fa-vcard-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-vcard-o{--fa:"\f2bb"}.fa.fa-user-circle-o{--fa:"\f2bd"}.fa.fa-user-circle-o,.fa.fa-user-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-user-o{--fa:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-drivers-license{--fa:"\f2c2"}.fa.fa-id-card-o{--fa:"\f2c2"}.fa.fa-drivers-license-o,.fa.fa-id-card-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-drivers-license-o{--fa:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-thermometer,.fa.fa-thermometer-4{--fa:"\f2c7"}.fa.fa-thermometer-3{--fa:"\f2c8"}.fa.fa-thermometer-2{--fa:"\f2c9"}.fa.fa-thermometer-1{--fa:"\f2ca"}.fa.fa-thermometer-0{--fa:"\f2cb"}.fa.fa-bathtub,.fa.fa-s15{--fa:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-times-rectangle{--fa:"\f410"}.fa.fa-window-close-o{--fa:"\f410"}.fa.fa-times-rectangle-o,.fa.fa-window-close-o{font-family:"Font Awesome 7 Free";font-weight:400}.fa.fa-times-rectangle-o{--fa:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 7 Brands";font-weight:400}.fa.fa-eercast{--fa:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 7 Free";font-weight:400;--fa:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 7 Brands";font-weight:400} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-brands-400.woff2 b/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..8bd3453bdb7d47336f4bc9b3fb976247a270ca13 GIT binary patch literal 101180 zcmV(?K-a%_Pew9NR8&s@0gF5U2><{90*a&n0gCejfCB&k00000000000000000000 z00001HUcCB1_odQkO&2c9RQ422OtfJ?nk9jMR5by0=5MezNgznfFD|`R%-U6kXCSB z(lY}#fz<-R|NnnlQW@cDdYUu^VB1aAf27J`XquUrbIgLps8TkAu(seZHW|F|_`J*~ zQwE_xA<#9(;Rin%dSM}N5K17Fz;RmDARjrM*Y2ph;uTKbz=Xhrz=XhFYZN&B!WY&z zV~h1U@ zkRFVxe^uxIE^yd34EhLs5?$Xg2oz9@Q6SDW3p%`Qm~@3;CB9DJ!U72%64ly=!91m0d5mNB3*>|2WW0x>~^&U|Hc<4@*Z=TW*=L=IV>r+H$QlCSs96nE1WEXq z6K_^ENG-L*10R@|TwrV2+m%sP?@#-Wx~hX@@)t$#0|yZy+B=c~QH0hNgMnr95}pr` zn8#qYn3k0YZLj%=hr(?Q#@+Y;1G3d->B*Ud=b!)O{I9H)uleKuS^Hk)73%OPTB?`@ z2q9=hY$nOr-FG|_5hqB{1d~$Q0xeLWMrob;nYT`IUj80col{K*7~iM9z1n}NN?-cZ z{{mvN4&gdRkR^*R(ExRy?g74+MPQ2U*s%lr!V64qcU(30|EZ<^|LCl>2a}$EBDxF- z8(5Nsjm5i)yP%nbmhD)!V>{u?^!Oua;P2P>GmBq2qF1x?{v&Y{m$n%j%9id4;Ab?De&`tAm_>P~4&mZ#P&<_0&0O9-ofB)-i%Xq7!|2p1iQJ_qO z5_6zbs0V&;9;DnAmD~~YW&;C&|Nqb0{%fywzWlrYW@Gd-3L{CAwCEaUfQdarv<0m` zFcOegid8Sr7a8}hb%f{3R{j4cx!DqwQk1XKkUXX%J;Zb2KzCJUfV*#Sh=`1Ys;=&8 zI_DA$5R0RYAdQWL{+GW#|NpHSF$|{+?*m)F-er6TE|3n28aGuf&diat78h@zZdSL% zSLY#seuVt^Ikg3p6An*_S{Ht~v>k9dBn7N`eZRN~GbQII%>MsU^=o@y6+{-O9}1A# zzo?%|9YK2nJ8vmX2yxZ3owG;1R{^LhfIt;UivTH;02K&GG6_Hw2~aXY**Y}sZl?~i zev&=O{+$yEK>89%>01CL+aw)CP;y(O{f{VF|FkH%V^XJV{|PBBLtLiSX0~I=9h^G* zPhQS;-HYWcXBkr14OMiZ_F4^D05te`CQGzD!Vcw9Z#4p02$Ik17TK)Nm~qOOL$QKS zuu4MVZ;)+%;wwN2KB|h3>O& zW+S$7D3s6Aj~-IMH{g5#C1TMIKMuV0#K82cZ6p>E8Tcd{^hZQaW(s)fDf*w+j9%w` zBU%8deo&1w%fKE4bn`grLV2jKDn^j-K+KS1Juno<%d8ymSp<_Xbv?nm@n=ViQuqXI z0;q_5SaF$q@I*ermDw_z7jas;?GAVdAJ^SVC1v2^ypR@k4>~yD3LsEcHaPfY;9ZYfgN@%>64Q5DckIw1rFK!YU&hv;D|~#J zSuIQ9LnJsIZ5ZVvzHFrpv<|BYxt-%_7+nuh3>mR%c3a3T1i_-1l~YL(ns>?lHi_S! zTA2t1;8+mr-pHXuK$(C@qXdF73ruUeP{>sa!pCNzk^ltf>7LLDNhaAmWljp$=Ftu< zbp!#qw^bmlss$E1rcl_rDTvBt3Y8^9aJf4qbjAWF*`dS<5Z`+dU865JJJy#6?Rvd1 zrTN&+!MSm#j2N89#-zS)hPzQ=;GPq2&XjGbtY0~vSH|Cf-M!HZFRRgHG(RD>7ZB(_ z{@rZ0nggtUDz^>9|7cNLb}trxuKjX)VcNLSZbxP<)eMQA9M-Ckr0o&}47=ltI$~|k z=k;pQHCjo~;K=yDmoN>olo#y>|M0&qMfJ4Nr@XeLt!O8-*R?mdtJ^)7*M1AXiod!u zNDSJp6R#VtzrS8{W4>v*8NIpawU-Q19=wH!aHP!;tJP@J)d#O0zZ!h??Y^hZUbx17 zv}bty1$?Y^j36QI%#3V+~C{X^vGrEv;&; zFbP(#>#`L9@Ku(*eexO}sI~DJrpzn%PzzzTMl;t>;nI0biyXngTT~J!5x{1!vJO=*HVTdtagt zmxPAUA2PGwvN{Lz`kf0K(ctreJ{6u_Dd`Wy(d{R6v z?iF{7ibS2Fc2S-vj<`eAh$4|Dx{2vTCht+#ht*Ndm$j{42Pc_6u;lYlK2=#T*YV@|*#>&#%pwr5tKndo# zm@_J+nN%VU8hjqQYgA(+L(H$fTduq8(*N-J4}b5UuzLC8*|Yu`7k`KUao>hDBVN;# z`7x`7mjy}`VJCxBl8M8IhntJVMEL%+qvGVS@S-HPtUvY30f!&-X`12;NVd)D+W&DE z{SdBgI~aHs(6gaWfq^F72~B@0Lm?#}1q8-`1f$pXAUd1^h`#QM|BCRy>PnZ!Y_$=(L3?65Qt@PNp0HKoQZ|5Glt8 zP|s$lD}wt09|KtID)DB(3YSga7$3O;4u~_kB~G09{Fs3P2nhP7)J>k*@w$>d!)@FN zl-7U2H{fW3Aj%Ni-ELvL4>|}R{NS3xqxf-GAyc4ESUK8O_#Si(COk5-zX=QzuIdBv zfk~p8Mam)bqzs|*m^!Uhboc02Ga%e|&tpP2=jqmUUVY57`LxX9(>Z>LpT8&I$ps31 zEMmFH!!H`bb#+nfL~*9Y^IIr^Cz&Jdz4V`#(bff-H)d~dNY?3P$M#Xqz;cUPreK?* z+lt4oRNFaaca)D(<)(VK8t!T(m(+T76E*f~W^3QTLDk`{^Qx|O8&lqGV<&EWbPr8P zH1U~9TTPy@Zhc!!@!VAImEDQHn6_!t1ufl-q;{C;wONrJTo1nm>m|Fe*+I?WY%$Ni z`2l^kVAmGLw#}mS^(VD+iv!whNsOf>Teh|@`!1ucmJj%T*otFTCT$hH!&Wb~w#~ZR z)_<_!l#NGhT4{67wv6xcwr6zSjv02|wX4h^&70(?>=4GU(~wyw?{|!uc$|RgI`@My`AITWbfNI zgp}jM4IlSxSlz~b%ILyAlb!Kj&_?97`BJj4%KrTM|HZO`wW9=eebk)Zqs4-;=ID@5oM&7g27d+C#m7cJ*}S4Re`G ze~w!vL&@A-dco6^7cpaFFL|$H3SmAq-w6$}1YY25!Ho#&Scvu}bw}uNVY3%LtLq|P zEvmHbqQ@0v&-0r#@*j|K|4%%V)Djy+xyp) zzf7HA+J?>W>hxx{_gc^M^&aTWX2(fo;aiR<9R2M(*1zMk z(Mu;H{Mfkj^ZRiZeA~W@@lEuzX}@^3-zCc~SM}MIO|EvjR=?|}HoH-_o7(;~;B@Po zJGHwT^e^t4J}YyT<;zn+hed>e_LKXRaJG_f{k z<9yopf}*4FW9OU7fZz-6sne~K_!{e3^t2|)JGsXO&4Dm1L( zoYdh1nxU;-LBqfTg_qqDD&d*2w7gB&5U;ZJE4`0;V0U)K-|YDLg-0=`4&QI~K3lv7 zFn;joNEc_PtO5ROn{Z9ZuR`TPxOUn??Qy>f-+Zh_*ZAy+QB{-4 zOc?645OJ3{Eu!()8}vfnQ0c~N)nNHdR^m#NW~8b|48$@!qWgt2=UVr81_W8*Q4x+- zmj6A2N@*xEZ?+{I-OI=yMKDc=HsLXB%eK&(Jq;E$Ol;aVtV-IzBrULvil$;8JIuDI zlhpz8hPbn1Kic0E44RctPz;P1O~R;*@mPHjYj)upSQa;lnnaVup^f$ruhMODEJ0iT6Ce) zbmu7e7I;0^HSzs=cn!y(0hA(Kx@kC=e-sP0Lp(YS#I@kP=lQX48M;Fk2rPWgN5F=& z3q9T-|HYj+AXBB~E-=JwSZ2$qBv58qD|H!BLtdpRG+!-v3_j#tiYXe(iD+VoT?gNf zBPYPuZPh?`i#iWTPh~Rombqc~;YN>c&e0q60UDbOED41OrH7?XmJr6IWzEmWYz3uN zZMXw^Vco9awuW)pq2;f_mI%SK5!UX=+pD*zFjDbV!yBkI%ibkB$v;HhxZX#QwOm zn|N$HGypFP!4!dg(`f>Prphq2^!2oF(tn{*L_Y%v@nm{!RZP_)0w6?QqK?pVU&Go}IH9K?_ zHd`1h%}rUsRTW`*Dl1%s7)1>jRy&P^Uy-u3SVaX#uXRnhw6?WFO#X-dLqxZ2ua9>e znH>@5FDRom78J%Bg5V7+1aNm>wZP42CER<5fS>>WL7RB@@F;P0R5gVD(cqI5hMEA3 zrG@M*!ko-d>%gC|mM=8rVn+50F{tTlV@^QD-~Mu!iR8@wz>P#vXc_`2bgJ<6vT`~; zD8rI=x7!U9Y^#oqhf{MNQ%t<3*oZo4s778E1*+xTEKOAPq)aRNk3RXs7ZqT${nd)j z|JhmhPlE4zbKG8Xuc6-x5nd7C`rhdonk)`%LC*Y~Ui<+uu08tn&sK4TPdSO|LjVq1 zS96-IAJ{o4W`Bu4i1emdp{IBELkgK>I#U>FO#Vei{ual;M5DI?56v~70$cfYM%;*f zOOcTulsc4aCyx@cjO17A+fc7AZWlxa$W_<4k+Ol}yTu8V zR|PHCxwCP^T{l;{zf4h;myRw}v>m?uBKvA?gLBB%KO!1! z1ox-iMhA-%kM3+fBj)Q5U;ln8AEX%Q_G1(92eR=x9W`Nn&Tn$XU|KAX{~W#u#>hF~ z+f-47Dxhm+Sym9$d6keeuy^Gp^q8wK!CyJw-ViQpb)(>tx{3uhH>J=udxI>%FT#Ws zAvr2TDAg)t1e8PA!~n!EPw^&4N8A;AVhtDlc8z{-xaL#9Wvd&!hoKwdDWjr)978gT zFv|}xsEZf&^+fn+Rb9X&zOo8jw-qZu70I6agsdQ~iVUJ$COiRDTeuRY>dRQcm&a;J zv@tdP3JR_u;8-3b;2(o^yd6&*eQeaZl#^gNYBUT_H8x14NQG6aRnWF&>EyW8-B@7H z+YHJyj1xamG}tt^snUeeC*wB&*rn+y0{#Ie5Z1W%^BEC$H~Mk8=?yHW+i?d7r}rp^ zPm%;j$)fQJfWL|fgbX-UvT1{jpvvPs0fcSeO?R)aF~kV3{Q+6PpV%>!em9;X{9{Sh zKJdNBg5;CC22d?lxYz`d&Y@P^R&~V5Y8?7t57yOHO+$>7#=-*&bjkQ6fGR(UD>Cao zwTd(OnG&@E$S7eBR9cYenm7fN&S#u*Uj)JJ40|1-)(k*^9aN2nRR9Q6J!MqO%>tEo z7vrP|LXgP-G_yb?pp`dal1Ka_8Yexll)dSQ zADO@k!Z3j{2aduLi~wa-Oiam@tRn9K5R_KhI5Kr+xDNz&yL}A|AOJ#mjj?(t;6KWt z1o~1e3pBA}T$~6jo`*G1gQ>^@TO_Vki*Yp(0Sg|Lai>KISY7R4zu40%fc%zcc_6*I z03!geeCC3H?^NCwX4wazQYk_Ca>X17fJuPNR?O)PrGobrAb`xSaO;!NT9ka-XsucvQUXV~~byTZY z0|*gKY9@HkmH@)8!@)8l$lDbHvrBd^NHL1piVCU|L5ep3RfZtx2tQro*jk1{Go7Ql zLec1G9SSw8aE*W+Lz{r+iF~RbnVnN^#(qGWN}EM&_mqEb0WUqkP(L5!8E3i%3V6@~z*9G(8uzoZ0V*c)peFWEE zt@DkO(06lVS75yJ-mhMMyYciugp0bOu#|c<<&k<&5{eYU7+IO0BXol|yLM`a>d(6~;^B zO`XMA-JN8d6o%$F;%QH9xkKibllgK9eLGmb@z=L#uU}j|T4BBQEIz4#j}BF>h;hl9 zmZrrCqiGnM ze;gCChNQ}J3UWFxQfPH1KEW>1{59DDbe6V!lTqwUOWX+UA0O0l#0WS^3o{Zc)>F|z z^^!QZ{O>;yXet6-3IIbMv@|Jt&1H27NAAnf;0Z$*EThsXa3*d=_DXh$No3?mR`=3VF$5-_Rzgw#D$W#Dq5SunGrya#>=UST}ng1c7W1 zLAArT!^yVOvKd-Ccn8E$PMqB!vqF_Elbo$NP0^S%g2mWsG4M89#a}-o5M)QW)hc!A zMp*$C>)KecS5jO9;3{<;VdAV=7b)vDU}cI3ECd??He9PW$tMDJV0?OQ=!3J9(ehXZ zGK6(N?R33%gtkyKt=G}mm^PyhLaknxUC^#~D{WM@6`FCKrHx_gMJx=to=fULS+JI} zNG!2PT~KWihZW8a68Q)fq+vaV&ehC16$v*} zqhD@&KDS$*>l?fO@C#CzqnnNiGd;6n9nD+5+US^!O?$hXnCNtOgKmNv-=gNlsK_#p z-dE9@aQ3h3M^RI^`fl5I(V9{^8EY6$YW+D!pjrL-g>R!hf3bh?2>bmX{jhup0q5Bj zejBu2X=Dj4v*moOY$tdM=fNU&FowQ^AB2%BpjnMc2gyJ2A~H3_uk-9?{=MfJ&r)*y53kqqPZC7kVp_QOvJ6EoUG#py5$E(R0c4M z)`X{?{-@P!3my7tTaj+4)lA2*E@6j#6m@Iz6Zt~5>#KDWLk}XnnGIv~1j7F4wW&48;_@=T+EGtVx^#h&W-*h1lw^)61@%j=BuI=SWKpDi8_QrnS?}DnDF0(E1PZJ0HO~JypLTNP zEf2U3oKlMhvqJ<7@R!3A|~CqqNlUA(iAV7*l$p2xs;Z75Nds&R;xgr1a55(-e6l1g8+E~aX6+l(I+3$Hj~ z6-f)z=n1hUwM_6$nvyt$ZrYMs8Y5W)S(eywaV|5{_Y;2kn#vYfMCb$70a{ra^n23Z zMU#sCLw*Q4cjGEcRT2BS761Pua5wk|{r}waOwa8k17?2rW1~MIb@I5rEHC`;l|m6F z1c2SM2IOLjP!U&#CfrNQ^nZuP=(_-{eQGrEPalb4b1u^e@Mqtt7Bp^+X7qJ{3wW}m z6$j2eaqN;q%#>*XedQy+V?ncy1wJvzo!3Vkw)0dI6pv{;wgc0oLk9$zktp+ku*l5e z;w!O3hCu17KCSq~Xv<@X4Zv|kx?loHS4?|BoP=pV(yN$21_aY6(yzEoq)%{-A#oZe zgWM0{ahanV?0`KtjE-#!N(MU~=3IO3UMi4YiDS#$P`@&?gzD*AlMs8Qo85Ub zPjSs+AeH5NbxbBub~p#0Fdf4iLP1b8h!&!lL-1ZyC1Wc*p1Vk4pX>vSi)D6eLhdsI zp=fR_cvs|+^*4yI=>tVmg2{B&r25c?4d9Y`3ppTm6ul_cQ$zQkjg?rGtkjKEr`KS8~~Dp-x9{R`|qc1UP-u? z0FSN-8CA^|cv|`p{^orFW8npX=^1a4yG^H7$$S$ND+E%RqCX5W58 zmrUwXFv+Jeha)#dTfx&h-6a@Pxb+aJgBy`H?g?LY#1)Tm_JvpsEpr!g=yGc>dH=%{ z(s2*Ut9|_YLJbK^F(5@*lBd~^nnOuRCOZzxv@V;Y@5Y3g#H#@h#ohcyd?0(Brqy{^ zQpAo;OxSjb@j+1;aWR&y?5*U=gUFDcI5r@BP)wPFJUBx34Gc;m9z=f4&#~Cvz|59` zXQ#(v{@5PuhY~w8tf;Oi12L0s&&*LJE0@3xo2}>v{;x;-G?E|Wv4U@(}%_!bGmTDa<@D)w?L9Fw$hz#w&=9ax+{xy$ovXaTea)} z&$l`{&S`wd`)E}C3Hk1u_zn2}2fDo4(R`*+n`DXkIjlog=vlfs#PJ;p2dd3$Xin-= z3dLFxxysjBRaKB=NwWpXXLXJWuXltBBR~Ti4;yNfC z8mv1v)#XEUgyFdL!HLn8K{_-Z3X&GCFEYE_6b~`b&_I=?@uv_e(i_@8?a6M*C18%A zp}3teXv4dC==+(XB8&M3b+8=^iC!1E2cXu`hc3&F-Wz5x>FA(tzPXv^oL2pZ^%PoW zG|vijl#SiASZXeJ7DA78D^I5^GBe)P)KnR$xV;b!W$mg%G$Kzwjnwo5nNIoCPYNS# zw4+)LpL~M$Tc)g{VyOWZ-BwwnA9|z>`RPXt3_j%iGJbp-rJw-6lI(HeLa6&!G&9qZ z52YQi!r^>au zH~o-*CHg_iwh&7YZZVY!> zQx?Z@i2W<&!hetE%w=Ty$;>_6Ap*@)Afoz7AQe;6d)=*9hEX5hYmn1vGW;Nq~<8a@3l2M z6^4a)$5u9MAM_t{-*oh0ZC-*`&ZGyu&?CIxQ4j-?gLDR*x_L&du}eW{7=G8#^0Mj> zv5qs9B{4!UT50=X?n@pN`1o{V6C}bULs!JonEZLn6>=# z1c$wd;5DrU$w_D}f$?Y9q#=XmW;>oCT&OR22`m>Ei!(G9!>zj{piJTzt*Jtpb+kay z%{Y<(SAwGukeTRWW$#WV;`v&m3d|JRiOKq$=h_h|)maY!4U~0;45JbvcGX&V+)m$M zac*RE^5O&=C-x`t5YE2r;9i6IL*rh{;L-WR%I%IHlICqKUe41iDIoY(5`yuzi6m%lguL9t#a zObmmZIC8Mq%J3s#1I+NI>7kL7ERuVQE}U>Imt^is>0Fqwt&VLH8a5DQgF8Mzr`~Im zj_akxAzk3BD>3Mdd!7MHM}4zJgBxc&0g0PT5Gsv#=UI%%*KS=x z{#M5dzgQD|nTv$a?A>gGHBHlVU05hA_hm$yltihHYD^1wp{Z-wPU~C3MXO?g#8v@1 zJ-PY^m=e5vAa^}P)h-*;fOxKrH7vIYtp(Uj%LnX?@nxZ+>xl=OuidbBI9w2#AKl~_{0(y~JjKkREFg+C zO-E~O?9LzzM>$trzkk|fT>L%zwr~}9`=@sqcSwK7lM|sk%9mEtdmcIprumHMXO{Fj z(4SLD_{jXKSb$kxDhd|MDPk){q_7v;8g(TqKyA;M{355c$z0rOP-AgJ)?N0jgqFJw z>j2baMmaaf(sTb2REx1;A7fd!CI3b=u3#IKUOQaya9H#N+51nq zzJ_VL+SY)>M%SQ@idBSeSD^?9qj8vebZes<99X%^UU+B}g2b(u{A0;q8m#g?8vVt2 zJcG3`?l&vM;`H`EUTF00t?+gUjc)F$#zTtpQA=Kql&2JvNyRQZffhh37vsI0fZP^?ox1=SLz36Q zII_-IeElHqm;!|WQmf5Z>|3+t~+f2oW0R)V{r8A>0AI98bZKNx$piwS`YsE6YmW!uODH##4>0M-d2;h8k~A<9ZW`V9FjHRz_~Y0gBes*D4df( zcH^BzI^k#qq#wmvIw2)y_(^AI@JmF$@_tX^N_)K5j}e~E@?SsXk&5^6@)bbkw`C#_ z6VB0tJEm1NC|6D!7}O}Mz%^Uy63EP{O#|5Hdymc z^Vqu!ic~L-AOr_w-6Jwjv;1LfKITKlyIz_TrTUa`ot~UPsCm>^M-*lRIB-?BICI2X zUn^rI4zA8qp0O5m39QaC-ZWqEd)08rKvS7UCKDn|@y~^$<`LQlL7EcLb^ji`WKSKq z<)JC?KB%iwGnUi&xaPedbh*ryqoOuujRB^Q+ks9(Fz3T!I1@UNeirpr&I#8A)hsT^ zVGxpOaZikH(Z#0RoxH%FJF#F7tB7S|f|zOKkL&*FTk0iStTEWxc4TR1sYnRve0jNi z1PG8ITysAm^g7L+asFKCR3=E!;qiLCAQE!wy;Q`7&FZ_$%LyPP?WGl*TYM`-S-cyL zf@hJeblS8jKnQ5MIff^3rQ??uJ}&l@;S^e0qzgb8{3cHW6h+OLydG`7B?JlvTrjcg zgor_EJs_8SNIy7!-XGd9qeY()XGx7T^O;M55P;z3^ZVl??8LGI1dr_PHG;z;y4+<) zz$TCVfLbzw_}n*mpcs&4tWu&_8 zFVBAtupZMuT-qhgND+rL00h_M*=KAU>cYhYa1b_06B5kKVKFNWMoKZ_e2Ovi+SJLS zu_nYk7hYR)F5djl=uvN_0|`I?Lg?Cg>vWqBPt&s|_VQ{-@Tfbk^<&LXMwHGA@ZijMIBgyr;Z+Ms9rCRZ%#vg3ugPPZsHUy#G zYOuuI+C1z;>)bS9Tt4OvtGP0@^V4u9HGNuV8Xfm(1rl6JO^u5;{+Pc0oHGOrYyM+l z00Kmd8IoJqS74__EAIY`)@h0pP&IJ~+0T!FK1m8-E}Iku z?QAsaVX-%k7sL{JN_!8zTH?7TAPS0FR8Aq*%e5kJxYstuPeU_wnjVNr$MpaRVB5Bh z%?-)wxnkL#=b#yfH8y~@QY$2E1X19Uvv4cnF3Xk5rvsG2C`-_+cJoOE7lqmFo{nxN z(VYo6JJ<~XN#S?`O~|NmwcP|vO)r%pN~%_rn|NvtjM`4HM7KiOqwI(YF~wb@fkGDh zIhZC50~8}3q|~w)!w}zuUe-}CJy$Cda$Ux(b7Cn5sk74{)@`f`V@f9SdG>&?9EHs0 zz=^CZ2_Px9$t;;GuHvHN_=!{JiDguSI7)ri?bOLg6>^%Gg}`AsUs+Uv$;=!ESShW_ z`@|W{f_{pnxZTJ)@Y`X-X?9^&JxvYf6aT5%>$R?%8fc98jPT-LgQih`?>pZoD{`$OeNHEB&I9~Ryf-$=>_cj`MA;iW1hu>X;GO>_xm0 z*r;u^aCj5h0@2*h4Gb8a5d?|n069J@K1={KZIatDk>o zcMXq2)QnmzN3#+s)o!K-UL!LGuTZyI~&D zcC*KYm6?Hx%0MT|Cu@ zv&9x*GT44``o0B+q(xR9!^^v;Lo`Y=hc=L{-7x?ql0V&dT0#Ojf^Kk&qi)R>XY=JU z%jLyFDQ6pZSO&>=V(0fsNfy$;#QYD7-&r_|+h%jU@2c{hUQl;?+nCbR?d8pJPri+R zV;@gm{Q*LEcp1GcZG$nP5H-{@WYTQ_C+G=B@GA#NGe-V8(tnncf*`0ZqgNMnE^WfuD7bKK7hUjJ3f zJl21kr$VRStG40sIj-Zu7xKd(K=1IK?i<7i^TIGdO?6a>%JAF$im$-qv<*iGNKb1n z>FyTy74i-4yfnSXXKzdTQ(~YRpIwMI@XWY&cC6W$j1f3VT3cu>tVa}7q@i(#z*nD# zj?ac|w-Q}(nV!GhujZI>BFRFPqoT^kV}atsP3t^CQR)Be!L-Zt_PS9#fusGa=b&jl}2J1lrY?pemE=hsWa zyaC#07w>8PP4V8bH9-M#8n83M!!$>$(D%o5MMNo8Lg$ zx)!+e;ts|*hoX<|TnSRFIAeG(7g5uUJg{pLh+mgkNlWQ$K~NQArp4v@2-WLDUBJf( zF0?bQEyC_~nwg4O4aw8T%vTGULH+Ru?VQfO98OA4w|#r0Tg|t4hC^_}vgTR+*WWk3 zbSFg`#&rFYe_j;eUrc9)#i1S>Uc|FAwMsJs80@~%D@|4@-7!a_!N1sv0sNESF9|S> z^CcoZ#HMflpbXk4674$215Cjd^XoQ7ceX4}POmRR&fMwKi>;vjYA8EQLI%unN2E@# zJ85wAvRn|gRcXn?a?uSMUd1eupe}~j=&1mNshz}?;1uK+yq7F>6)A5Y#*mOJ0^;j%xBL__TGbDc0Va2?P;56 z>up>|0+n1$oJTN%^Q4LLKo+mc(UD@ufeK^-8<}LpJS?5U!*owIa{1!M&jLqprJ{l%r@C0Jg|H`|0&RBwZ~p{XN7yv9g!;z;H=0&x+HspUB7JajxHCrO z7F6cl?aPFu^2$~Gs`MC&=jm}`S)XGSqL*Yg%>K@|7EaB_m<)dIslos5lV!n_)}h$) z+;1DJ?s<7mbsZ0|=_MijEiQ)s?>5bf|MZhRC;4KUF!f)AF@MLYABe^JDvwc5PKvTn z%MXXD)1>e1WCQKTYpbOA?ra^2R^~Hiet0Z9I=tzZ&LVw0RVS$W;8gNAKF`byuUu!y ztNDOdr+=LlQkOUi6}?u~lzr_hXW_m32EYAV<%B6d8I}EE%-hdQQS93Ki;zj^%oE7IgS0{qEu?S@2ea2YJKcy(m1Xe`hfh! zlX|0Rr)D>>{LdUrW2WY=+^}CHHr1V=l`tI_H zAR%`u%D01bq&wOO508zdV3_fUe9vAVkFqDDUzZU!s1o`Q9D(!*k7N*hxkEIuWEsuT zX~>hdreSqVTp{*3-U7=%zk5@dhZ}}5*(Vr82LnBZ+Y7l;`dw+5mQ>KN>^^0IQ{zb_ zhsR|dbw8Y6eSV^+VooQq-u>}Dhs*yv*{K~`|`u`J`|Z%?_h{o>mCc^FplIg z5VhXD;V|vWdP5!E8LQ-2aF@h=y%4@fD7ACVEF{Xz74fYB#=+Ksk|Rb4G7b_mP5F1^>Awd6(*GAYsyCg4+3z z59PpBk13K;vELPyo-rZi|JA@w9jTR?v@#O%)J};Asg;BGH z4J$KqEa}2yJ7WgKR%T|%=$K4R3>p$IB!ggttOGSucJdzmsa&CnS}_d$gw28s+U-`O zhfl_i7V1uEX>>BO;tt|ohQ_WugAewNmaHg< zBFdIb$Z)c<3$D`g5qcIqU^SRi#PWeU{o)Jd`Sr<}hS_tFjk zJV3+0@-gbU!ccxE@>XOVUR>{dT&I_U_ zi~)Bn>TiEggEjvs?@P#rx#}VHt~f z#tV;Mr(wfucyui&C&~~ zG7Rb#{#&--umy|NgjwvTtjDb%Nawe zL6b4rj93~n!&_hDJF%C4CM{wpg-nCKWH_pTXh%HYbr%JVs3VAk4sA3V?4StOw$t#w zZIP^JVC=K%&?ESLC6h|Xf|-l&5NZ*l^3P^8{8C;C7&6>-us z2NH6F!{Pj7kouZQ?Twc4A<;woHdT8EjEQ( zZe(NEi~cjDIoou*%YE9v0p4bmwF-Xk)Ss_a6v|rC1^xa0l<23wMit1Ce$OzhT)A;5 zro-a)nLd3`pClPkPf}zal$Y{6xn4Q4R}||!`2;8@549BQgrjnbgxTs49F}J2n6}BO zqp0+$RVHW+dm~9aR<&H#k?eQFCy&XV1TQP9C9NN!g<6fRm$mHGg6)^5C`0?JCI=eWK)YOWr|!yJ2(2-m`bibFD~}@-$r`9@M0AB=3Gz;uN0T+>$ zm)x+D>lF;3bb}$~H?kL*I2$A4EGt|BKxKIjDXqX4r{QEStgCS96FzA=b&aeL$a3Z! z4~U4*HiVUy9Y~?GP`m%Q2CghyaN;}FjEuG*9+i?U{2XlVycmoECm2MCzNdN(3kDHRRgZ3RhNZul5$EX*8~XxU{K z&ycrq19JDHkYrf@^y~gr{xG^(@%9M*eztW#pEkPg(jKF)Jg04>dJ9Z=t2N|+YmHQB zt}J9>gDgh(cB}L1Un`jMkK7s}>P3VP5nuxf8RCR%Vl)O13_5G)ukKK-w9B)Fm|3cx zW3L`RySR*=w!3wH5!lp!YGknPej)D#e9t=m+Uq^O^``pYT(iIw!)w`Oa|MHg7XMdd zSLI#(;<~pbas2&*Z#HtDy_w`EaMh_l;2=10cX#ArJmchHO@&2rvmCxI_#D@B@Z(uD zgc@FhxP1}}2>BjrQ?5)rh z<`Xuh3p$$3F40bFn+_zVcEZ0AcUy}KWD@i1)WF}_Oz0{gT}-5=soPo-?=$>0-Umw4 zI|RJLm7MpCKDE&?VrGXNo{%at;&5nHm|5v=lsc+%m|%ca>?yKPli790CAzA5yuXQL z??>oy5TUoG+pUff>LM6m6*E&AKxymDO3Q-VFlag`Z+5E=nN3ubT~MCZhZP*Rb#HS7 zc3qh4F6mgBa;&CF>;f(f*Y*(Tm8_s!&sqq}u!Fu1^a--2s4>5vjs@McQ?@{TIlL5b zW1Z8HCD^~1KJ?)47SCxeF@gA~gQcv_kal~skR2$Y63bm>myX)9>K?_^R4 zM4&$85aU~H0fe2`?WS@saU}OK)>qQeG=VZ!*Bf?e?%AdSAiH&?0MT<=sHM;vYMB=R zMAlNhFfbq$Qorf}kR-rJ5`gJZfezH9X8>H=*Z^jSx}hcedjYkhSz5v)0*Gq}JI?}C z+!RArv+o(+aUG|9g5K1iwr)&^hh-x1T1E8Wc$2|;onx*!?&$KKh1dwjS73C>%@P?f zgW4)=r2gtkEHWKidk@nJE)q+Sbb2J2Mth`G-ZpJ0ffP1aZrXz6D{U&brd0%*sdQyx z4~n3X4v{zwkh%zgsms9>S6Tgk5Vqh{05RztmRdjdNIRRx!kTzVptDpJ4877N0mw9v zk=xutWx1b|ge&T*O?OqVMvzz&gEmiGR1OH#d;)|>I2Mb65oil+Mi;=i%R90V5l3YyG|n%HH`NM$t(YMICYYm8+bJ-Fq4T>1T0{P_g=YmHVD zpeqH{@$yop+Y&K3Q|QWVRIdihA&VB5zt?K8Ts4U8jTtljU2$6sVy0y=x}F8$YNnv5 zRS1Hx!G-!Cv{e<2PcA)e_IDY?*Opu!jdv@JW}oY;;$x=Tzw>Y6Z_sU~hW7{Gdq-93(;!G-g} zBhGjL1y!F%@;9m^O9{p(;>_T$9>= zu2dSP<{B7Jm!_3D>NZgt&YOfBx?Y-0CuRm@i>T9sq6IyBKCFhWvH;n4Vb1Te%4G{> zZlL9=u;+S-C}rsvYnUxsp-T1J1-QK?eAfxL&xu1D&3-|WmE(asK;l!eKZ~cnf6V%{4H*M(O>lusr_j)3W#|Dano&y4*(fVQkAa zU>`=m;VgIm0GP7$CakrExJV&&R=kv?gx+A#=UC!?f1zPybfq-BxwdeSI6T}Ru8c5) zQhUU9NDbvupn)hHip+2<+r+Mbgsqn@@NG7;>U4VF?M!9+5rYFRsPF9V6`}0u&1OwBi2bkW?`1RO%{uV zK^>Tljkb?|aafEAKvpq||6=3&9g-2pNE54*MR}kNE#Uv8jL?mJW_KcyzrwB-8X<}M zWtk29euV6^N?Rr>{bD~J=2(1Iie8k&8IK-Cvgh$!tsdqjG+RIzg1BKAw4wY^q^j$4mwDaN;v9=$jhWb1Cz z$EC~Ci1T`-iCr1o;NCVWmy2;B<)tIi?bW(TACD{{ee$u`MK6c~xaB0w5^SH5O1Bu8 zW9$Wz-OiEOqO}undt92$xEVF!cDrXvaP64NB|WfwJON=V$)M53#2F;j zCo1h?VmSt`LugNLDJ{sIQgg4yiE;d_RNS%`*nZFsbX6ObhEtM3`p*LLykg=OHlEIi z*GcMWhNG8}{CuQD^(2nMr1Qe!UN=ZNdIYKFiP6I51gWs1M5VOA?Fs3%2g%3=u1R}; zZj}y-tsR`%mRc0YVaSr_d!9|~mv{U|o-WwCp3h51r4=`lb{)9ON$|d-UAbAT<#G9v z6nb{uNSND+&)woCwKV&L#X{P4!)+4yKWX2e>!4}WwHi}B>sh{O6Za3-!U_Kb`;EX9z5o1CB9_O03@<~^-^gXX zcC9>tZA2!KOIo3$;;s54QFug%*buDDVY6vAXi{&SK}T85`v_sNc4-2WnQ`EnPHrO~FXT{URC z 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

            #=>qMNT^$KE+l|WLY(JYE!Ab*+2CR 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-regular-400.woff2 b/wp-content/plugins/wpforms-lite/assets/lib/font-awesome/webfonts/fa-regular-400.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..c3fba9e7b4522938911ff6a6f71f9a8de46aa88c GIT binary patch literal 19000 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 KX>zv900RIdsjx`^ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wpforms-lite/assets/lib/htmx.min.js b/wp-content/plugins/wpforms-lite/assets/lib/htmx.min.js new file mode 100755 index 00000000..423cf011 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/htmx.min.js @@ -0,0 +1 @@ +var htmx=function(){"use strict";const Q={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){const n=cn(e,t||"post");return n.values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:true,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null,disableInheritance:false,responseHandling:[{code:"204",swap:false},{code:"[23]..",swap:true},{code:"[45]..",swap:false,error:true}],allowNestedOobSwaps:true},parseInterval:null,_:null,version:"2.0.3"};Q.onLoad=j;Q.process=kt;Q.on=ye;Q.off=be;Q.trigger=de;Q.ajax=Rn;Q.find=r;Q.findAll=x;Q.closest=g;Q.remove=z;Q.addClass=K;Q.removeClass=G;Q.toggleClass=W;Q.takeClass=Z;Q.swap=$e;Q.defineExtension=Fn;Q.removeExtension=Bn;Q.logAll=V;Q.logNone=_;Q.parseInterval=h;Q._=e;const n={addTriggerHandler:St,bodyContains:le,canAccessLocalStorage:B,findThisElement:Se,filterValues:dn,swap:$e,hasAttribute:s,getAttributeValue:te,getClosestAttributeValue:re,getClosestMatch:i,getExpressionVars:En,getHeaders:fn,getInputValues:cn,getInternalData:ie,getSwapSpecification:gn,getTriggerSpecs:st,getTarget:Ee,makeFragment:P,mergeObjects:ce,makeSettleInfo:xn,oobSwap:He,querySelectorExt:ae,settleImmediately:Kt,shouldCancel:dt,triggerEvent:de,triggerErrorEvent:fe,withExtensions:Ft};const o=["get","post","put","delete","patch"];const R=o.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function h(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e instanceof Element&&e.getAttribute(t)}function s(e,t){return!!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function c(e){const t=e.parentElement;if(!t&&e.parentNode instanceof ShadowRoot)return e.parentNode;return t}function ne(){return document}function m(e,t){return e.getRootNode?e.getRootNode({composed:t}):ne()}function i(e,t){while(e&&!t(e)){e=c(e)}return e||null}function H(e,t,n){const r=te(t,n);const o=te(t,"hx-disinherit");var i=te(t,"hx-inherit");if(e!==t){if(Q.config.disableInheritance){if(i&&(i==="*"||i.split(" ").indexOf(n)>=0)){return r}else{return null}}if(o&&(o==="*"||o.split(" ").indexOf(n)>=0)){return"unset"}}return r}function re(t,n){let r=null;i(t,function(e){return!!(r=H(t,ue(e),n))});if(r!=="unset"){return r}}function d(e,t){const n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return!!n&&n.call(e,t)}function T(e){const t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;const n=t.exec(e);if(n){return n[1].toLowerCase()}else{return""}}function q(e){const t=new DOMParser;return t.parseFromString(e,"text/html")}function L(e,t){while(t.childNodes.length>0){e.append(t.childNodes[0])}}function N(e){const t=ne().createElement("script");se(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}return t}function A(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function I(e){Array.from(e.querySelectorAll("script")).forEach(e=>{if(A(e)){const t=N(e);const n=e.parentNode;try{n.insertBefore(t,e)}catch(e){C(e)}finally{e.remove()}}})}function P(e){const t=e.replace(/]*)?>[\s\S]*?<\/head>/i,"");const n=T(t);let r;if(n==="html"){r=new DocumentFragment;const i=q(e);L(r,i.body);r.title=i.title}else if(n==="body"){r=new DocumentFragment;const i=q(t);L(r,i.body);r.title=i.title}else{const i=q('");r=i.querySelector("template").content;r.title=i.title;var o=r.querySelector("title");if(o&&o.parentNode===r){o.remove();r.title=o.innerText}}if(r){if(Q.config.allowScriptTags){I(r)}else{r.querySelectorAll("script").forEach(e=>e.remove())}}return r}function oe(e){if(e){e()}}function t(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return typeof e==="function"}function D(e){return t(e,"Object")}function ie(e){const t="htmx-internal-data";let n=e[t];if(!n){n=e[t]={}}return n}function M(t){const n=[];if(t){for(let e=0;e=0}function le(e){const t=e.getRootNode&&e.getRootNode();if(t&&t instanceof window.ShadowRoot){return ne().body.contains(t.host)}else{return ne().body.contains(e)}}function F(e){return e.trim().split(/\s+/)}function ce(e,t){for(const n in t){if(t.hasOwnProperty(n)){e[n]=t[n]}}return e}function S(e){try{return JSON.parse(e)}catch(e){C(e);return null}}function B(){const e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function U(t){try{const e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function e(e){return vn(ne().body,function(){return eval(e)})}function j(t){const e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,n){if(console){console.log(t,e,n)}}}function _(){Q.logger=null}function r(e,t){if(typeof e!=="string"){return e.querySelector(t)}else{return r(ne(),e)}}function x(e,t){if(typeof e!=="string"){return e.querySelectorAll(t)}else{return x(ne(),e)}}function E(){return window}function z(e,t){e=y(e);if(t){E().setTimeout(function(){z(e);e=null},t)}else{c(e).removeChild(e)}}function ue(e){return e instanceof Element?e:null}function $(e){return e instanceof HTMLElement?e:null}function J(e){return typeof e==="string"?e:null}function f(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function K(e,t,n){e=ue(y(e));if(!e){return}if(n){E().setTimeout(function(){K(e,t);e=null},n)}else{e.classList&&e.classList.add(t)}}function G(e,t,n){let r=ue(y(e));if(!r){return}if(n){E().setTimeout(function(){G(r,t);r=null},n)}else{if(r.classList){r.classList.remove(t);if(r.classList.length===0){r.removeAttribute("class")}}}}function W(e,t){e=y(e);e.classList.toggle(t)}function Z(e,t){e=y(e);se(e.parentElement.children,function(e){G(e,t)});K(ue(e),t)}function g(e,t){e=ue(y(e));if(e&&e.closest){return e.closest(t)}else{do{if(e==null||d(e,t)){return e}}while(e=e&&ue(c(e)));return null}}function l(e,t){return e.substring(0,t.length)===t}function Y(e,t){return e.substring(e.length-t.length)===t}function ge(e){const t=e.trim();if(l(t,"<")&&Y(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function p(e,t,n){e=y(e);if(t.indexOf("closest ")===0){return[g(ue(e),ge(t.substr(8)))]}else if(t.indexOf("find ")===0){return[r(f(e),ge(t.substr(5)))]}else if(t==="next"){return[ue(e).nextElementSibling]}else if(t.indexOf("next ")===0){return[pe(e,ge(t.substr(5)),!!n)]}else if(t==="previous"){return[ue(e).previousElementSibling]}else if(t.indexOf("previous ")===0){return[me(e,ge(t.substr(9)),!!n)]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else if(t==="root"){return[m(e,!!n)]}else if(t==="host"){return[e.getRootNode().host]}else if(t.indexOf("global ")===0){return p(e,t.slice(7),true)}else{return M(f(m(e,!!n)).querySelectorAll(ge(t)))}}var pe=function(t,e,n){const r=f(m(t,n)).querySelectorAll(e);for(let e=0;e=0;e--){const o=r[e];if(o.compareDocumentPosition(t)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}};function ae(e,t){if(typeof e!=="string"){return p(e,t)[0]}else{return p(ne().body,e)[0]}}function y(e,t){if(typeof e==="string"){return r(f(t)||document,e)}else{return e}}function xe(e,t,n,r){if(k(t)){return{target:ne().body,event:J(e),listener:t,options:n}}else{return{target:y(e),event:J(t),listener:n,options:r}}}function ye(t,n,r,o){Vn(function(){const e=xe(t,n,r,o);e.target.addEventListener(e.event,e.listener,e.options)});const e=k(n);return e?n:r}function be(t,n,r){Vn(function(){const e=xe(t,n,r);e.target.removeEventListener(e.event,e.listener)});return k(n)?n:r}const ve=ne().createElement("output");function we(e,t){const n=re(e,t);if(n){if(n==="this"){return[Se(e,t)]}else{const r=p(e,n);if(r.length===0){C('The selector "'+n+'" on '+t+" returned no matches!");return[ve]}else{return r}}}}function Se(e,t){return ue(i(e,function(e){return te(ue(e),t)!=null}))}function Ee(e){const t=re(e,"hx-target");if(t){if(t==="this"){return Se(e,"hx-target")}else{return ae(e,t)}}else{const n=ie(e);if(n.boosted){return ne().body}else{return e}}}function Ce(t){const n=Q.config.attributesToSettle;for(let e=0;e0){s=e.substr(0,e.indexOf(":"));n=e.substr(e.indexOf(":")+1,e.length)}else{s=e}o.removeAttribute("hx-swap-oob");o.removeAttribute("data-hx-swap-oob");const r=p(t,n,false);if(r){se(r,function(e){let t;const n=o.cloneNode(true);t=ne().createDocumentFragment();t.appendChild(n);if(!Re(s,e)){t=f(n)}const r={shouldSwap:true,target:e,fragment:t};if(!de(e,"htmx:oobBeforeSwap",r))return;e=r.target;if(r.shouldSwap){qe(t);_e(s,e,e,t,i);Te()}se(i.elts,function(e){de(e,"htmx:oobAfterSwap",r)})});o.parentNode.removeChild(o)}else{o.parentNode.removeChild(o);fe(ne().body,"htmx:oobErrorNoTarget",{content:o})}return e}function Te(){const e=r("#--htmx-preserve-pantry--");if(e){for(const t of[...e.children]){const n=r("#"+t.id);n.parentNode.moveBefore(t,n);n.remove()}e.remove()}}function qe(e){se(x(e,"[hx-preserve], [data-hx-preserve]"),function(e){const t=te(e,"id");const n=ne().getElementById(t);if(n!=null){if(e.moveBefore){let e=r("#--htmx-preserve-pantry--");if(e==null){ne().body.insertAdjacentHTML("afterend","
            ");e=r("#--htmx-preserve-pantry--")}e.moveBefore(n,null)}else{e.parentNode.replaceChild(n,e)}}})}function Le(l,e,c){se(e.querySelectorAll("[id]"),function(t){const n=ee(t,"id");if(n&&n.length>0){const r=n.replace("'","\\'");const o=t.tagName.replace(":","\\:");const e=f(l);const i=e&&e.querySelector(o+"[id='"+r+"']");if(i&&i!==e){const s=t.cloneNode();Oe(t,i);c.tasks.push(function(){Oe(t,s)})}}})}function Ne(e){return function(){G(e,Q.config.addedClass);kt(ue(e));Ae(f(e));de(e,"htmx:load")}}function Ae(e){const t="[autofocus]";const n=$(d(e,t)?e:e.querySelector(t));if(n!=null){n.focus()}}function u(e,t,n,r){Le(e,n,r);while(n.childNodes.length>0){const o=n.firstChild;K(ue(o),Q.config.addedClass);e.insertBefore(o,t);if(o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE){r.tasks.push(Ne(o))}}}function Ie(e,t){let n=0;while(n0}function $e(e,t,r,o){if(!o){o={}}e=y(e);const i=o.contextElement?m(o.contextElement,false):ne();const n=document.activeElement;let s={};try{s={elt:n,start:n?n.selectionStart:null,end:n?n.selectionEnd:null}}catch(e){}const l=xn(e);if(r.swapStyle==="textContent"){e.textContent=t}else{let n=P(t);l.title=n.title;if(o.selectOOB){const u=o.selectOOB.split(",");for(let t=0;t0){E().setTimeout(c,r.settleDelay)}else{c()}}function Je(e,t,n){const r=e.getResponseHeader(t);if(r.indexOf("{")===0){const o=S(r);for(const i in o){if(o.hasOwnProperty(i)){let e=o[i];if(D(e)){n=e.target!==undefined?e.target:n}else{e={value:e}}de(n,i,e)}}}else{const s=r.split(",");for(let e=0;e0){const s=o[0];if(s==="]"){e--;if(e===0){if(n===null){t=t+"true"}o.shift();t+=")})";try{const l=vn(r,function(){return Function(t)()},function(){return true});l.source=t;return l}catch(e){fe(ne().body,"htmx:syntax:error",{error:e,source:t});return null}}}else if(s==="["){e++}if(tt(s,n,i)){t+="(("+i+"."+s+") ? ("+i+"."+s+") : (window."+s+"))"}else{t=t+s}n=o.shift()}}}function w(e,t){let n="";while(e.length>0&&!t.test(e[0])){n+=e.shift()}return n}function rt(e){let t;if(e.length>0&&Ye.test(e[0])){e.shift();t=w(e,Qe).trim();e.shift()}else{t=w(e,b)}return t}const ot="input, textarea, select";function it(e,t,n){const r=[];const o=et(t);do{w(o,v);const l=o.length;const c=w(o,/[,\[\s]/);if(c!==""){if(c==="every"){const u={trigger:"every"};w(o,v);u.pollInterval=h(w(o,/[,\[\s]/));w(o,v);var i=nt(e,o,"event");if(i){u.eventFilter=i}r.push(u)}else{const a={trigger:c};var i=nt(e,o,"event");if(i){a.eventFilter=i}w(o,v);while(o.length>0&&o[0]!==","){const f=o.shift();if(f==="changed"){a.changed=true}else if(f==="once"){a.once=true}else if(f==="consume"){a.consume=true}else if(f==="delay"&&o[0]===":"){o.shift();a.delay=h(w(o,b))}else if(f==="from"&&o[0]===":"){o.shift();if(Ye.test(o[0])){var s=rt(o)}else{var s=w(o,b);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();const d=rt(o);if(d.length>0){s+=" "+d}}}a.from=s}else if(f==="target"&&o[0]===":"){o.shift();a.target=rt(o)}else if(f==="throttle"&&o[0]===":"){o.shift();a.throttle=h(w(o,b))}else if(f==="queue"&&o[0]===":"){o.shift();a.queue=w(o,b)}else if(f==="root"&&o[0]===":"){o.shift();a[f]=rt(o)}else if(f==="threshold"&&o[0]===":"){o.shift();a[f]=w(o,b)}else{fe(e,"htmx:syntax:error",{token:o.shift()})}w(o,v)}r.push(a)}}if(o.length===l){fe(e,"htmx:syntax:error",{token:o.shift()})}w(o,v)}while(o[0]===","&&o.shift());if(n){n[t]=r}return r}function st(e){const t=te(e,"hx-trigger");let n=[];if(t){const r=Q.config.triggerSpecsCache;n=r&&r[t]||it(e,t,r)}if(n.length>0){return n}else if(d(e,"form")){return[{trigger:"submit"}]}else if(d(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(d(e,ot)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function lt(e){ie(e).cancelled=true}function ct(e,t,n){const r=ie(e);r.timeout=E().setTimeout(function(){if(le(e)&&r.cancelled!==true){if(!gt(n,e,Mt("hx:poll:trigger",{triggerSpec:n,target:e}))){t(e)}ct(e,t,n)}},n.pollInterval)}function ut(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function at(e){return g(e,Q.config.disableSelector)}function ft(t,n,e){if(t instanceof HTMLAnchorElement&&ut(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"&&String(ee(t,"method")).toLowerCase()!=="dialog"){n.boosted=true;let r,o;if(t.tagName==="A"){r="get";o=ee(t,"href")}else{const i=ee(t,"method");r=i?i.toLowerCase():"get";o=ee(t,"action");if(r==="get"&&o.includes("?")){o=o.replace(/\?[^#]+/,"")}}e.forEach(function(e){pt(t,function(e,t){const n=ue(e);if(at(n)){a(n);return}he(r,o,n,t)},n,e,true)})}}function dt(e,t){const n=ue(t);if(!n){return false}if(e.type==="submit"||e.type==="click"){if(n.tagName==="FORM"){return true}if(d(n,'input[type="submit"], button')&&g(n,"form")!==null){return true}if(n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ht(e,t){return ie(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function gt(e,t,n){const r=e.eventFilter;if(r){try{return r.call(t,n)!==true}catch(e){const o=r.source;fe(ne().body,"htmx:eventFilter:error",{error:e,source:o});return true}}return false}function pt(l,c,e,u,a){const f=ie(l);let t;if(u.from){t=p(l,u.from)}else{t=[l]}if(u.changed){if(!("lastValue"in f)){f.lastValue=new WeakMap}t.forEach(function(e){if(!f.lastValue.has(u)){f.lastValue.set(u,new WeakMap)}f.lastValue.get(u).set(e,e.value)})}se(t,function(i){const s=function(e){if(!le(l)){i.removeEventListener(u.trigger,s);return}if(ht(l,e)){return}if(a||dt(e,l)){e.preventDefault()}if(gt(u,l,e)){return}const t=ie(e);t.triggerSpec=u;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(l)<0){t.handledFor.push(l);if(u.consume){e.stopPropagation()}if(u.target&&e.target){if(!d(ue(e.target),u.target)){return}}if(u.once){if(f.triggeredOnce){return}else{f.triggeredOnce=true}}if(u.changed){const n=event.target;const r=n.value;const o=f.lastValue.get(u);if(o.has(n)&&o.get(n)===r){return}o.set(n,r)}if(f.delayed){clearTimeout(f.delayed)}if(f.throttle){return}if(u.throttle>0){if(!f.throttle){de(l,"htmx:trigger");c(l,e);f.throttle=E().setTimeout(function(){f.throttle=null},u.throttle)}}else if(u.delay>0){f.delayed=E().setTimeout(function(){de(l,"htmx:trigger");c(l,e)},u.delay)}else{de(l,"htmx:trigger");c(l,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:u.trigger,listener:s,on:i});i.addEventListener(u.trigger,s)})}let mt=false;let xt=null;function yt(){if(!xt){xt=function(){mt=true};window.addEventListener("scroll",xt);window.addEventListener("resize",xt);setInterval(function(){if(mt){mt=false;se(ne().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){bt(e)})}},200)}}function bt(e){if(!s(e,"data-hx-revealed")&&X(e)){e.setAttribute("data-hx-revealed","true");const t=ie(e);if(t.initHash){de(e,"revealed")}else{e.addEventListener("htmx:afterProcessNode",function(){de(e,"revealed")},{once:true})}}}function vt(e,t,n,r){const o=function(){if(!n.loaded){n.loaded=true;t(e)}};if(r>0){E().setTimeout(o,r)}else{o()}}function wt(t,n,e){let i=false;se(o,function(r){if(s(t,"hx-"+r)){const o=te(t,"hx-"+r);i=true;n.path=o;n.verb=r;e.forEach(function(e){St(t,e,n,function(e,t){const n=ue(e);if(g(n,Q.config.disableSelector)){a(n);return}he(r,o,n,t)})})}});return i}function St(r,e,t,n){if(e.trigger==="revealed"){yt();pt(r,n,t,e);bt(ue(r))}else if(e.trigger==="intersect"){const o={};if(e.root){o.root=ae(r,e.root)}if(e.threshold){o.threshold=parseFloat(e.threshold)}const i=new IntersectionObserver(function(t){for(let e=0;e0){t.polling=true;ct(ue(r),n,e)}else{pt(r,n,t,e)}}function Et(e){const t=ue(e);if(!t){return false}const n=t.attributes;for(let e=0;e", "+e).join(""));return o}else{return[]}}function Tt(e){const t=g(ue(e.target),"button, input[type='submit']");const n=Lt(e);if(n){n.lastButtonClicked=t}}function qt(e){const t=Lt(e);if(t){t.lastButtonClicked=null}}function Lt(e){const t=g(ue(e.target),"button, input[type='submit']");if(!t){return}const n=y("#"+ee(t,"form"),t.getRootNode())||g(t,"form");if(!n){return}return ie(n)}function Nt(e){e.addEventListener("click",Tt);e.addEventListener("focusin",Tt);e.addEventListener("focusout",qt)}function At(t,e,n){const r=ie(t);if(!Array.isArray(r.onHandlers)){r.onHandlers=[]}let o;const i=function(e){vn(t,function(){if(at(t)){return}if(!o){o=new Function("event",n)}o.call(t,e)})};t.addEventListener(e,i);r.onHandlers.push({event:e,listener:i})}function It(t){ke(t);for(let e=0;eQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(ne().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Vt(t){if(!B()){return null}t=U(t);const n=S(localStorage.getItem("htmx-history-cache"))||[];for(let e=0;e=200&&this.status<400){de(ne().body,"htmx:historyCacheMissLoad",i);const e=P(this.response);const t=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;const n=Ut();const r=xn(n);kn(e.title);qe(e);Ve(n,t,r);Te();Kt(r.tasks);Bt=o;de(ne().body,"htmx:historyRestore",{path:o,cacheMiss:true,serverResponse:this.response})}else{fe(ne().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function Wt(e){zt();e=e||location.pathname+location.search;const t=Vt(e);if(t){const n=P(t.content);const r=Ut();const o=xn(r);kn(t.title);qe(n);Ve(r,n,o);Te();Kt(o.tasks);E().setTimeout(function(){window.scrollTo(0,t.scroll)},0);Bt=e;de(ne().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{Gt(e)}}}function Zt(e){let t=we(e,"hx-indicator");if(t==null){t=[e]}se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)+1;e.classList.add.call(e.classList,Q.config.requestClass)});return t}function Yt(e){let t=we(e,"hx-disabled-elt");if(t==null){t=[]}se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","");e.setAttribute("data-disabled-by-htmx","")});return t}function Qt(e,t){se(e.concat(t),function(e){const t=ie(e);t.requestCount=(t.requestCount||1)-1});se(e,function(e){const t=ie(e);if(t.requestCount===0){e.classList.remove.call(e.classList,Q.config.requestClass)}});se(t,function(e){const t=ie(e);if(t.requestCount===0){e.removeAttribute("disabled");e.removeAttribute("data-disabled-by-htmx")}})}function en(t,n){for(let e=0;en.indexOf(e)<0)}else{e=e.filter(e=>e!==n)}r.delete(t);se(e,e=>r.append(t,e))}}function on(t,n,r,o,i){if(o==null||en(t,o)){return}else{t.push(o)}if(tn(o)){const s=ee(o,"name");let e=o.value;if(o instanceof HTMLSelectElement&&o.multiple){e=M(o.querySelectorAll("option:checked")).map(function(e){return e.value})}if(o instanceof HTMLInputElement&&o.files){e=M(o.files)}nn(s,e,n);if(i){sn(o,r)}}if(o instanceof HTMLFormElement){se(o.elements,function(e){if(t.indexOf(e)>=0){rn(e.name,e.value,n)}else{t.push(e)}if(i){sn(e,r)}});new FormData(o).forEach(function(e,t){if(e instanceof File&&e.name===""){return}nn(t,e,n)})}}function sn(e,t){const n=e;if(n.willValidate){de(n,"htmx:validation:validate");if(!n.checkValidity()){t.push({elt:n,message:n.validationMessage,validity:n.validity});de(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})}}}function ln(n,e){for(const t of e.keys()){n.delete(t)}e.forEach(function(e,t){n.append(t,e)});return n}function cn(e,t){const n=[];const r=new FormData;const o=new FormData;const i=[];const s=ie(e);if(s.lastButtonClicked&&!le(s.lastButtonClicked)){s.lastButtonClicked=null}let l=e instanceof HTMLFormElement&&e.noValidate!==true||te(e,"hx-validate")==="true";if(s.lastButtonClicked){l=l&&s.lastButtonClicked.formNoValidate!==true}if(t!=="get"){on(n,o,i,g(e,"form"),l)}on(n,r,i,e,l);if(s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&ee(e,"type")==="submit"){const u=s.lastButtonClicked||e;const a=ee(u,"name");nn(a,u.value,o)}const c=we(e,"hx-include");se(c,function(e){on(n,r,i,ue(e),l);if(!d(e,"form")){se(f(e).querySelectorAll(ot),function(e){on(n,r,i,e,l)})}});ln(r,o);return{errors:i,formData:r,values:Nn(r)}}function un(e,t,n){if(e!==""){e+="&"}if(String(n)==="[object Object]"){n=JSON.stringify(n)}const r=encodeURIComponent(n);e+=encodeURIComponent(t)+"="+r;return e}function an(e){e=qn(e);let n="";e.forEach(function(e,t){n=un(n,t,e)});return n}function fn(e,t,n){const r={"HX-Request":"true","HX-Trigger":ee(e,"id"),"HX-Trigger-Name":ee(e,"name"),"HX-Target":te(t,"id"),"HX-Current-URL":ne().location.href};bn(e,"hx-headers",false,r);if(n!==undefined){r["HX-Prompt"]=n}if(ie(e).boosted){r["HX-Boosted"]="true"}return r}function dn(n,e){const t=re(e,"hx-params");if(t){if(t==="none"){return new FormData}else if(t==="*"){return n}else if(t.indexOf("not ")===0){se(t.substr(4).split(","),function(e){e=e.trim();n.delete(e)});return n}else{const r=new FormData;se(t.split(","),function(t){t=t.trim();if(n.has(t)){n.getAll(t).forEach(function(e){r.append(t,e)})}});return r}}else{return n}}function hn(e){return!!ee(e,"href")&&ee(e,"href").indexOf("#")>=0}function gn(e,t){const n=t||re(e,"hx-swap");const r={swapStyle:ie(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ie(e).boosted&&!hn(e)){r.show="top"}if(n){const s=F(n);if(s.length>0){for(let e=0;e0?o.join(":"):null;r.scroll=u;r.scrollTarget=i}else if(l.indexOf("show:")===0){const a=l.substr(5);var o=a.split(":");const f=o.pop();var i=o.length>0?o.join(":"):null;r.show=f;r.showTarget=i}else if(l.indexOf("focus-scroll:")===0){const d=l.substr("focus-scroll:".length);r.focusScroll=d=="true"}else if(e==0){r.swapStyle=l}else{C("Unknown modifier in hx-swap: "+l)}}}}return r}function pn(e){return re(e,"hx-encoding")==="multipart/form-data"||d(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function mn(t,n,r){let o=null;Ft(n,function(e){if(o==null){o=e.encodeParameters(t,r,n)}});if(o!=null){return o}else{if(pn(n)){return ln(new FormData,qn(r))}else{return an(r)}}}function xn(e){return{tasks:[],elts:[e]}}function yn(e,t){const n=e[0];const r=e[e.length-1];if(t.scroll){var o=null;if(t.scrollTarget){o=ue(ae(n,t.scrollTarget))}if(t.scroll==="top"&&(n||o)){o=o||n;o.scrollTop=0}if(t.scroll==="bottom"&&(r||o)){o=o||r;o.scrollTop=o.scrollHeight}}if(t.show){var o=null;if(t.showTarget){let e=t.showTarget;if(t.showTarget==="window"){e="body"}o=ue(ae(n,e))}if(t.show==="top"&&(n||o)){o=o||n;o.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(r||o)){o=o||r;o.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function bn(r,e,o,i){if(i==null){i={}}if(r==null){return i}const s=te(r,e);if(s){let e=s.trim();let t=o;if(e==="unset"){return null}if(e.indexOf("javascript:")===0){e=e.substr(11);t=true}else if(e.indexOf("js:")===0){e=e.substr(3);t=true}if(e.indexOf("{")!==0){e="{"+e+"}"}let n;if(t){n=vn(r,function(){return Function("return ("+e+")")()},{})}else{n=S(e)}for(const l in n){if(n.hasOwnProperty(l)){if(i[l]==null){i[l]=n[l]}}}}return bn(ue(c(r)),e,o,i)}function vn(e,t,n){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return n}}function wn(e,t){return bn(e,"hx-vars",true,t)}function Sn(e,t){return bn(e,"hx-vals",false,t)}function En(e){return ce(wn(e),Sn(e))}function Cn(t,n,r){if(r!==null){try{t.setRequestHeader(n,r)}catch(e){t.setRequestHeader(n,encodeURIComponent(r));t.setRequestHeader(n+"-URI-AutoEncoded","true")}}}function On(t){if(t.responseURL&&typeof URL!=="undefined"){try{const e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(ne().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Rn(t,n,r){t=t.toLowerCase();if(r){if(r instanceof Element||typeof r==="string"){return he(t,n,null,null,{targetOverride:y(r)||ve,returnPromise:true})}else{let e=y(r.target);if(r.target&&!e||!e&&!y(r.source)){e=ve}return he(t,n,y(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:e,swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(t,n,null,null,{returnPromise:true})}}function Hn(e){const t=[];while(e){t.push(e);e=e.parentElement}return t}function Tn(e,t,n){let r;let o;if(typeof URL==="function"){o=new URL(t,document.location.href);const i=document.location.origin;r=i===o.origin}else{o=t;r=l(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!r){return false}}return de(e,"htmx:validateUrl",ce({url:o,sameHost:r},n))}function qn(e){if(e instanceof FormData)return e;const t=new FormData;for(const n in e){if(e.hasOwnProperty(n)){if(e[n]&&typeof e[n].forEach==="function"){e[n].forEach(function(e){t.append(n,e)})}else if(typeof e[n]==="object"&&!(e[n]instanceof Blob)){t.append(n,JSON.stringify(e[n]))}else{t.append(n,e[n])}}}return t}function Ln(r,o,e){return new Proxy(e,{get:function(t,e){if(typeof e==="number")return t[e];if(e==="length")return t.length;if(e==="push"){return function(e){t.push(e);r.append(o,e)}}if(typeof t[e]==="function"){return function(){t[e].apply(t,arguments);r.delete(o);t.forEach(function(e){r.append(o,e)})}}if(t[e]&&t[e].length===1){return t[e][0]}else{return t[e]}},set:function(e,t,n){e[t]=n;r.delete(o);e.forEach(function(e){r.append(o,e)});return true}})}function Nn(r){return new Proxy(r,{get:function(e,t){if(typeof t==="symbol"){return Reflect.get(e,t)}if(t==="toJSON"){return()=>Object.fromEntries(r)}if(t in e){if(typeof e[t]==="function"){return function(){return r[t].apply(r,arguments)}}else{return e[t]}}const n=r.getAll(t);if(n.length===0){return undefined}else if(n.length===1){return n[0]}else{return Ln(e,t,n)}},set:function(t,n,e){if(typeof n!=="string"){return false}t.delete(n);if(e&&typeof e.forEach==="function"){e.forEach(function(e){t.append(n,e)})}else if(typeof e==="object"&&!(e instanceof Blob)){t.append(n,JSON.stringify(e))}else{t.append(n,e)}return true},deleteProperty:function(e,t){if(typeof t==="string"){e.delete(t)}return true},ownKeys:function(e){return Reflect.ownKeys(Object.fromEntries(e))},getOwnPropertyDescriptor:function(e,t){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e),t)}})}function he(t,n,r,o,i,D){let s=null;let l=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var e=new Promise(function(e,t){s=e;l=t})}if(r==null){r=ne().body}const M=i.handler||Dn;const X=i.select||null;if(!le(r)){oe(s);return e}const c=i.targetOverride||ue(Ee(r));if(c==null||c==ve){fe(r,"htmx:targetError",{target:te(r,"hx-target")});oe(l);return e}let u=ie(r);const a=u.lastButtonClicked;if(a){const L=ee(a,"formaction");if(L!=null){n=L}const N=ee(a,"formmethod");if(N!=null){if(N.toLowerCase()!=="dialog"){t=N}}}const f=re(r,"hx-confirm");if(D===undefined){const K=function(e){return he(t,n,r,o,i,!!e)};const G={target:c,elt:r,path:n,verb:t,triggeringEvent:o,etc:i,issueRequest:K,question:f};if(de(r,"htmx:confirm",G)===false){oe(s);return e}}let d=r;let h=re(r,"hx-sync");let g=null;let F=false;if(h){const A=h.split(":");const I=A[0].trim();if(I==="this"){d=Se(r,"hx-sync")}else{d=ue(ae(r,I))}h=(A[1]||"drop").trim();u=ie(d);if(h==="drop"&&u.xhr&&u.abortable!==true){oe(s);return e}else if(h==="abort"){if(u.xhr){oe(s);return e}else{F=true}}else if(h==="replace"){de(d,"htmx:abort")}else if(h.indexOf("queue")===0){const W=h.split(" ");g=(W[1]||"last").trim()}}if(u.xhr){if(u.abortable){de(d,"htmx:abort")}else{if(g==null){if(o){const P=ie(o);if(P&&P.triggerSpec&&P.triggerSpec.queue){g=P.triggerSpec.queue}}if(g==null){g="last"}}if(u.queuedRequests==null){u.queuedRequests=[]}if(g==="first"&&u.queuedRequests.length===0){u.queuedRequests.push(function(){he(t,n,r,o,i)})}else if(g==="all"){u.queuedRequests.push(function(){he(t,n,r,o,i)})}else if(g==="last"){u.queuedRequests=[];u.queuedRequests.push(function(){he(t,n,r,o,i)})}oe(s);return e}}const p=new XMLHttpRequest;u.xhr=p;u.abortable=F;const m=function(){u.xhr=null;u.abortable=false;if(u.queuedRequests!=null&&u.queuedRequests.length>0){const e=u.queuedRequests.shift();e()}};const B=re(r,"hx-prompt");if(B){var x=prompt(B);if(x===null||!de(r,"htmx:prompt",{prompt:x,target:c})){oe(s);m();return e}}if(f&&!D){if(!confirm(f)){oe(s);m();return e}}let y=fn(r,c,x);if(t!=="get"&&!pn(r)){y["Content-Type"]="application/x-www-form-urlencoded"}if(i.headers){y=ce(y,i.headers)}const U=cn(r,t);let b=U.errors;const j=U.formData;if(i.values){ln(j,qn(i.values))}const V=qn(En(r));const v=ln(j,V);let w=dn(v,r);if(Q.config.getCacheBusterParam&&t==="get"){w.set("org.htmx.cache-buster",ee(c,"id")||"true")}if(n==null||n===""){n=ne().location.href}const S=bn(r,"hx-request");const _=ie(r).boosted;let E=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;const C={boosted:_,useUrlParams:E,formData:w,parameters:Nn(w),unfilteredFormData:v,unfilteredParameters:Nn(v),headers:y,target:c,verb:t,errors:b,withCredentials:i.credentials||S.credentials||Q.config.withCredentials,timeout:i.timeout||S.timeout||Q.config.timeout,path:n,triggeringEvent:o};if(!de(r,"htmx:configRequest",C)){oe(s);m();return e}n=C.path;t=C.verb;y=C.headers;w=qn(C.parameters);b=C.errors;E=C.useUrlParams;if(b&&b.length>0){de(r,"htmx:validation:halted",C);oe(s);m();return e}const z=n.split("#");const $=z[0];const O=z[1];let R=n;if(E){R=$;const Z=!w.keys().next().done;if(Z){if(R.indexOf("?")<0){R+="?"}else{R+="&"}R+=an(w);if(O){R+="#"+O}}}if(!Tn(r,R,C)){fe(r,"htmx:invalidPath",C);oe(l);return e}p.open(t.toUpperCase(),R,true);p.overrideMimeType("text/html");p.withCredentials=C.withCredentials;p.timeout=C.timeout;if(S.noHeaders){}else{for(const k in y){if(y.hasOwnProperty(k)){const Y=y[k];Cn(p,k,Y)}}}const H={xhr:p,target:c,requestConfig:C,etc:i,boosted:_,select:X,pathInfo:{requestPath:n,finalRequestPath:R,responsePath:null,anchor:O}};p.onload=function(){try{const t=Hn(r);H.pathInfo.responsePath=On(p);M(r,H);if(H.keepIndicators!==true){Qt(T,q)}de(r,"htmx:afterRequest",H);de(r,"htmx:afterOnLoad",H);if(!le(r)){let e=null;while(t.length>0&&e==null){const n=t.shift();if(le(n)){e=n}}if(e){de(e,"htmx:afterRequest",H);de(e,"htmx:afterOnLoad",H)}}oe(s);m()}catch(e){fe(r,"htmx:onLoadError",ce({error:e},H));throw e}};p.onerror=function(){Qt(T,q);fe(r,"htmx:afterRequest",H);fe(r,"htmx:sendError",H);oe(l);m()};p.onabort=function(){Qt(T,q);fe(r,"htmx:afterRequest",H);fe(r,"htmx:sendAbort",H);oe(l);m()};p.ontimeout=function(){Qt(T,q);fe(r,"htmx:afterRequest",H);fe(r,"htmx:timeout",H);oe(l);m()};if(!de(r,"htmx:beforeRequest",H)){oe(s);m();return e}var T=Zt(r);var q=Yt(r);se(["loadstart","loadend","progress","abort"],function(t){se([p,p.upload],function(e){e.addEventListener(t,function(e){de(r,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});de(r,"htmx:beforeSend",H);const J=E?null:mn(p,r,w);p.send(J);return e}function An(e,t){const n=t.xhr;let r=null;let o=null;if(O(n,/HX-Push:/i)){r=n.getResponseHeader("HX-Push");o="push"}else if(O(n,/HX-Push-Url:/i)){r=n.getResponseHeader("HX-Push-Url");o="push"}else if(O(n,/HX-Replace-Url:/i)){r=n.getResponseHeader("HX-Replace-Url");o="replace"}if(r){if(r==="false"){return{}}else{return{type:o,path:r}}}const i=t.pathInfo.finalRequestPath;const s=t.pathInfo.responsePath;const l=re(e,"hx-push-url");const c=re(e,"hx-replace-url");const u=ie(e).boosted;let a=null;let f=null;if(l){a="push";f=l}else if(c){a="replace";f=c}else if(u){a="push";f=s||i}if(f){if(f==="false"){return{}}if(f==="true"){f=s||i}if(t.pathInfo.anchor&&f.indexOf("#")===-1){f=f+"#"+t.pathInfo.anchor}return{type:a,path:f}}else{return{}}}function In(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function Pn(e){for(var t=0;t0){E().setTimeout(e,x.swapDelay)}else{e()}}if(f){fe(o,"htmx:responseError",ce({error:"Response Status Error Code "+s.status+" from "+i.pathInfo.requestPath},i))}}const Mn={};function Xn(){return{init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,n,r){return false},encodeParameters:function(e,t,n){return null}}}function Fn(e,t){if(t.init){t.init(n)}Mn[e]=ce(Xn(),t)}function Bn(e){delete Mn[e]}function Un(e,n,r){if(n==undefined){n=[]}if(e==undefined){return n}if(r==undefined){r=[]}const t=te(e,"hx-ext");if(t){se(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){r.push(e.slice(7));return}if(r.indexOf(e)<0){const t=Mn[e];if(t&&n.indexOf(t)<0){n.push(t)}}})}return Un(ue(c(e)),n,r)}var jn=false;ne().addEventListener("DOMContentLoaded",function(){jn=true});function Vn(e){if(jn||ne().readyState==="complete"){e()}else{ne().addEventListener("DOMContentLoaded",e)}}function _n(){if(Q.config.includeIndicatorStyles!==false){const e=Q.config.inlineStyleNonce?` nonce="${Q.config.inlineStyleNonce}"`:"";ne().head.insertAdjacentHTML("beforeend"," ."+Q.config.indicatorClass+"{opacity:0} ."+Q.config.requestClass+" ."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+Q.config.requestClass+"."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ")}}function zn(){const e=ne().querySelector('meta[name="htmx-config"]');if(e){return S(e.content)}else{return null}}function $n(){const e=zn();if(e){Q.config=ce(Q.config,e)}}Vn(function(){$n();_n();let e=ne().body;kt(e);const t=ne().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){const t=e.target;const n=ie(t);if(n&&n.xhr){n.xhr.abort()}});const n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){Wt();se(t,function(e){de(e,"htmx:restored",{document:ne(),triggerEvent:de})})}else{if(n){n(e)}}};E().setTimeout(function(){de(e,"htmx:load",{});e=null},0)});return Q}(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.css b/wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.css new file mode 100755 index 00000000..37ce60f2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.css @@ -0,0 +1,6 @@ +/*! + * jQuery.Confirm Reloaded v1.0.0 + * + * https://github.com/awesomemotive/jquery-confirm-reloaded/ + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */@keyframes jconfirm-adjust-hue{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}body[class*=jconfirm-no-scroll-]{overflow:hidden !important}.jconfirm{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999999;font-family:inherit;overflow:hidden}.jconfirm .jconfirm-bg{position:fixed;top:0;left:0;right:0;bottom:0;transition:opacity .4s}.jconfirm .jconfirm-bg.jconfirm-bg-h{opacity:0 !important}.jconfirm .jconfirm-scrollpane{perspective:500px;perspective-origin:center;display:table;width:100%;height:100%}.jconfirm .jconfirm-row{display:table-row;width:100%}.jconfirm .jconfirm-cell{display:table-cell;vertical-align:middle}.jconfirm .jconfirm-holder{max-height:100%;padding:50px 0}.jconfirm .jconfirm-box-container{transition:transform}.jconfirm .jconfirm-box-container.jconfirm-no-transition{transition:none !important}.jconfirm .jconfirm-box{box-sizing:border-box;width:90%;background:#fff;border-radius:4px;position:relative;outline:none;padding:15px 15px 0;overflow:hidden;margin-left:auto;margin-right:auto}@keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46637f}}.jconfirm .jconfirm-box.jconfirm-type-animated{animation-duration:2s;animation-iteration-count:infinite}.jconfirm .jconfirm-box.jconfirm-type-blue{border-top:solid 7px #3498db;animation-name:type-blue}.jconfirm .jconfirm-box.jconfirm-type-green{border-top:solid 7px #2ecc71;animation-name:type-green}.jconfirm .jconfirm-box.jconfirm-type-red{border-top:solid 7px #e74c3c;animation-name:type-red}.jconfirm .jconfirm-box.jconfirm-type-orange{border-top:solid 7px #f1c40f;animation-name:type-orange}.jconfirm .jconfirm-box.jconfirm-type-purple{border-top:solid 7px #9b59b6;animation-name:type-purple}.jconfirm .jconfirm-box.jconfirm-type-dark{border-top:solid 7px #34495e;animation-name:type-dark}.jconfirm .jconfirm-box.loading{height:120px}.jconfirm .jconfirm-box.loading:before{content:"";position:absolute;left:0;background:#fff;right:0;top:0;bottom:0;border-radius:10px;z-index:1}.jconfirm .jconfirm-box.loading:after{opacity:.6;content:"";height:30px;width:30px;border:solid 3px rgba(0,0,0,0);position:absolute;left:50%;margin-left:-15px;border-radius:50%;animation:jconfirm-adjust-hue 1s infinite linear;border-bottom-color:#1e90ff;top:50%;margin-top:-15px;z-index:2}.jconfirm .jconfirm-box div.jconfirm-closeIcon{height:20px;width:20px;position:absolute;top:10px;right:10px;cursor:pointer;opacity:.6;text-align:center;font-size:27px !important;line-height:14px !important;display:none;z-index:1}.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{opacity:1}.jconfirm .jconfirm-box div.jconfirm-title-c{display:block;font-size:22px;line-height:20px;user-select:none;cursor:default;padding-bottom:15px}.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand{cursor:move}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{font-size:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i{vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{user-select:none;font-size:inherit;font-family:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-content-pane{margin-bottom:15px;height:auto;transition:height .4s ease-in;display:inline-block;width:100%;position:relative;overflow-x:hidden;overflow-y:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll{overflow-y:hidden}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar{width:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track{background:rgba(0,0,0,.1)}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb{background:#666;border-radius:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img{max-width:100%;height:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty{display:none}.jconfirm .jconfirm-box .jconfirm-buttons{padding-bottom:11px}.jconfirm .jconfirm-box .jconfirm-buttons>button{margin-bottom:4px;margin-left:2px;margin-right:2px}.jconfirm .jconfirm-box .jconfirm-buttons button{display:inline-block;padding:6px 12px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;-webkit-tap-highlight-color:rgba(0,0,0,0);border:none;background-image:none}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue{background-color:#3498db;color:#fff;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover{background-color:#2980b9;color:#fff}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green{background-color:#2ecc71;color:#fff;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover{background-color:#27ae60;color:#fff}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red{background-color:#e74c3c;color:#fff;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover{background-color:#c0392b;color:#fff}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange{background-color:#f1c40f;color:#fff;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover{background-color:#f39c12;color:#fff}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default{background-color:#ecf0f1;color:#000;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover{background-color:#bdc3c7;color:#000}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple{background-color:#9b59b6;color:#fff;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover{background-color:#8e44ad;color:#fff}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark{background-color:#34495e;color:#fff;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover{background-color:#2c3e50;color:#fff}.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#e74c3c !important}.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:#3498db !important}.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#2ecc71 !important}.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c{color:#9b59b6 !important}.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#f1c40f !important}.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c{color:#34495e !important}.jconfirm .jconfirm-clear{clear:both}.jconfirm.jconfirm-rtl{direction:rtl}.jconfirm.jconfirm-rtl div.jconfirm-closeIcon{left:5px;right:auto}.jconfirm.jconfirm-white .jconfirm-bg,.jconfirm.jconfirm-light .jconfirm-bg{background-color:#444;opacity:.2}.jconfirm.jconfirm-white .jconfirm-box,.jconfirm.jconfirm-light .jconfirm-box{box-shadow:0 2px 6px rgba(0,0,0,.2);border-radius:5px}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default{box-shadow:none;color:#333}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#ddd}.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-black .jconfirm-bg,.jconfirm.jconfirm-dark .jconfirm-bg{background-color:#2f4f4f;opacity:.4}.jconfirm.jconfirm-black .jconfirm-box,.jconfirm.jconfirm-dark .jconfirm-box{box-shadow:0 2px 6px rgba(0,0,0,.2);background:#444;border-radius:5px;color:#fff}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button{border:none;background-image:none;text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none;transition:background .1s;color:#fff}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default{box-shadow:none;color:#fff;background:none}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#666}.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake{animation:shake .82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;transform:translate3d(0, 0, 0)}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow{animation:glow .82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;transform:translate3d(0, 0, 0)}@keyframes shake{10%,90%{transform:translate3d(-2px, 0, 0)}20%,80%{transform:translate3d(4px, 0, 0)}30%,50%,70%{transform:translate3d(-8px, 0, 0)}40%,60%{transform:translate3d(8px, 0, 0)}}@keyframes glow{0%,100%{box-shadow:0 0 0 red}50%{box-shadow:0 0 30px red}}.jconfirm{perspective:400px}.jconfirm .jconfirm-box{opacity:1;transition-property:all}.jconfirm .jconfirm-box.jconfirm-animation-top,.jconfirm .jconfirm-box.jconfirm-animation-left,.jconfirm .jconfirm-box.jconfirm-animation-right,.jconfirm .jconfirm-box.jconfirm-animation-bottom,.jconfirm .jconfirm-box.jconfirm-animation-opacity,.jconfirm .jconfirm-box.jconfirm-animation-zoom,.jconfirm .jconfirm-box.jconfirm-animation-scale,.jconfirm .jconfirm-box.jconfirm-animation-none,.jconfirm .jconfirm-box.jconfirm-animation-rotate,.jconfirm .jconfirm-box.jconfirm-animation-rotatex,.jconfirm .jconfirm-box.jconfirm-animation-rotatey,.jconfirm .jconfirm-box.jconfirm-animation-scaley,.jconfirm .jconfirm-box.jconfirm-animation-scalex{opacity:0}.jconfirm .jconfirm-box.jconfirm-animation-rotate{transform:rotate(90deg)}.jconfirm .jconfirm-box.jconfirm-animation-rotatex{transform:rotateX(90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatexr{transform:rotateX(-90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatey{transform:rotatey(90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotateyr{transform:rotatey(-90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scaley{transform:scaley(1.5);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scalex{transform:scalex(1.5);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-top{transform:translate(0px, -100px)}.jconfirm .jconfirm-box.jconfirm-animation-left{transform:translate(-100px, 0px)}.jconfirm .jconfirm-box.jconfirm-animation-right{transform:translate(100px, 0px)}.jconfirm .jconfirm-box.jconfirm-animation-bottom{transform:translate(0px, 100px)}.jconfirm .jconfirm-box.jconfirm-animation-zoom{transform:scale(1.2)}.jconfirm .jconfirm-box.jconfirm-animation-scale{transform:scale(0.5)}.jconfirm .jconfirm-box.jconfirm-animation-none{visibility:hidden}.jconfirm.jconfirm-supervan .jconfirm-bg{background-color:rgba(54,70,93,.95)}.jconfirm.jconfirm-supervan .jconfirm-box{background-color:rgba(0,0,0,0)}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue{border:none}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green{border:none}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red{border:none}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange{border:none}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple{border:none}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark{border:none}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon{color:#fff}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c{text-align:center;color:#fff;font-size:28px;font-weight:normal}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c>*{padding-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane{margin-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content{text-align:center;color:#fff}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button{font-size:16px;border-radius:2px;background:#303f53;text-shadow:none;border:none;color:#fff;padding:10px;min-width:100px}.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-material .jconfirm-bg{background-color:rgba(0,0,0,.67)}.jconfirm.jconfirm-material .jconfirm-box{background-color:#fff;box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);padding:30px 25px 10px 25px}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,.87)}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,.87);font-size:22px;font-weight:bold}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,.87)}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons{text-align:right}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-weight:500}.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-bootstrap .jconfirm-bg{background-color:rgba(0,0,0,.21)}.jconfirm.jconfirm-bootstrap .jconfirm-box{background-color:#fff;box-shadow:0 3px 8px 0 rgba(0,0,0,.2);border:solid 1px rgba(0,0,0,.4);padding:15px 0 0}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,.87)}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,.87);font-size:22px;font-weight:bold;padding-left:15px;padding-right:15px}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,.87);padding:0 15px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons{text-align:right;padding:10px;margin:-5px 0 0px;border-top:solid 1px #ddd;overflow:hidden;border-radius:0 0 4px 4px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button{font-weight:500}.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-modern .jconfirm-bg{background-color:#708090;opacity:.6}.jconfirm.jconfirm-modern .jconfirm-box{background-color:#fff;box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);padding:30px 30px 15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,.87);top:15px;right:15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,.87);font-size:24px;font-weight:bold;text-align:center;margin-bottom:10px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{transition:transform .5s;transform:scale(0);display:block;margin-right:0;margin-left:0;margin-bottom:10px;font-size:69px;color:#aaa}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content{text-align:center;font-size:15px;color:#777;margin-bottom:25px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button{font-weight:bold;text-transform:uppercase;transition:background .1s;padding:10px 20px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button+button{margin-left:4px}.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{transform:scale(1)} \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.js b/wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.js new file mode 100755 index 00000000..87231ebb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.confirm/jquery-confirm.min.js @@ -0,0 +1,7 @@ +/*! + * jQuery.Confirm Reloaded v1.0.0 + * + * https://github.com/awesomemotive/jquery-confirm-reloaded/ + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */ +!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=function(n,i){return void 0===i&&(i="undefined"!=typeof window?require("jquery"):require("jquery")(n)),t(i),i}:t(jQuery)}((function(t){"use strict";var n=window;t.fn.confirm=function(i,o){return void 0===i&&(i={}),"string"==typeof i&&(i={content:i,title:o||!1}),t(this).each((function(){var o=t(this);o.attr("jc-attached")?console.warn("jConfirm has already been attached to this element ",o[0]):(o.on("click",(function(e){e.preventDefault();var s=t.extend({},i);if(o.attr("data-title")&&(s.title=o.attr("data-title")),o.attr("data-content")&&(s.content=o.attr("data-content")),void 0===s.buttons&&(s.buttons={}),s.$target=o,o.attr("href")&&0===Object.keys(s.buttons).length){var a=t.extend(!0,{},n.jconfirm.pluginDefaults.defaultButtons,(n.jconfirm.defaults||{}).defaultButtons||{}),c=Object.keys(a)[0];s.buttons=a,s.buttons[c].action=function(){location.href=o.attr("href")}}s.closeIcon=!1;t.confirm(s)})),o.attr("jc-attached",!0))})),t(this)},t.confirm=function(i,o){void 0===i&&(i={}),"string"==typeof i&&(i={content:i,title:o||!1});var e=!(!1===i.buttons);if("object"!=typeof i.buttons&&(i.buttons={}),0===Object.keys(i.buttons).length&&e){var s=t.extend(!0,{},n.jconfirm.pluginDefaults.defaultButtons,(n.jconfirm.defaults||{}).defaultButtons||{});i.buttons=s}return n.jconfirm(i)},t.alert=function(i,o){void 0===i&&(i={}),"string"==typeof i&&(i={content:i,title:o||!1});var e=!(!1===i.buttons);if("object"!=typeof i.buttons&&(i.buttons={}),0===Object.keys(i.buttons).length&&e){var s=t.extend(!0,{},n.jconfirm.pluginDefaults.defaultButtons,(n.jconfirm.defaults||{}).defaultButtons||{}),a=Object.keys(s)[0];i.buttons[a]=s[a]}return n.jconfirm(i)},t.dialog=function(t,i){return void 0===t&&(t={}),"string"==typeof t&&(t={content:t,title:i||!1,closeIcon:function(){}}),t.buttons={},void 0===t.closeIcon&&(t.closeIcon=function(){}),t.confirmKeys=[13],n.jconfirm(t)},n.jconfirm=function(i){void 0===i&&(i={});var o=t.extend(!0,{},n.jconfirm.pluginDefaults);n.jconfirm.defaults&&(o=t.extend(!0,o,n.jconfirm.defaults)),o=t.extend(!0,{},o,i);var e=new n.Jconfirm(o);return n.jconfirm.instances.push(e),e},n.Jconfirm=function(n){t.extend(this,n),this._init()},n.Jconfirm.prototype={_init:function(){var i=this;n.jconfirm.instances.length||(n.jconfirm.lastFocused=t("body").find(":focus")),this._id=Math.round(99999*Math.random()),this.contentParsed=t(document.createElement("div")),this.lazyOpen||setTimeout((function(){i.open()}),0)},_buildHTML:function(){var n=this;this._parseAnimation(this.animation,"o"),this._parseAnimation(this.closeAnimation,"c"),this._parseBgDismissAnimation(this.backgroundDismissAnimation),this._parseColumnClass(this.columnClass),this._parseTheme(this.theme),this._parseType(this.type);var i=t(this.template);i.find(".jconfirm-box").addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed),this.typeAnimated&&i.find(".jconfirm-box").addClass("jconfirm-type-animated"),this.useBootstrap?(i.find(".jc-bs3-row").addClass(this.bootstrapClasses.row),i.find(".jc-bs3-row").addClass("justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center"),i.find(".jconfirm-box-container").addClass(this.columnClassParsed),this.containerFluid?i.find(".jc-bs3-container").addClass(this.bootstrapClasses.containerFluid):i.find(".jc-bs3-container").addClass(this.bootstrapClasses.container)):i.find(".jconfirm-box").css("max-width",this.boxWidth),this.titleClass&&i.find(".jconfirm-title-c").addClass(this.titleClass),i.addClass(this.themeParsed);var o="jconfirm-box"+this._id;i.find(".jconfirm-box").attr("aria-labelledby",o).attr("tabindex",-1),i.find(".jconfirm-content").attr("id",o),null!==this.bgOpacity&&i.find(".jconfirm-bg").css("opacity",this.bgOpacity),this.rtl&&i.addClass("jconfirm-rtl"),this.$el=i.appendTo(this.container),this.$jconfirmBoxContainer=this.$el.find(".jconfirm-box-container"),this.$jconfirmBox=this.$body=this.$el.find(".jconfirm-box"),this.$jconfirmBg=this.$el.find(".jconfirm-bg"),this.$title=this.$el.find(".jconfirm-title"),this.$titleContainer=this.$el.find(".jconfirm-title-c"),this.$content=this.$el.find("div.jconfirm-content"),this.$contentPane=this.$el.find(".jconfirm-content-pane"),this.$icon=this.$el.find(".jconfirm-icon-c"),this.$closeIcon=this.$el.find(".jconfirm-closeIcon"),this.$holder=this.$el.find(".jconfirm-holder"),this.$btnc=this.$el.find(".jconfirm-buttons"),this.$scrollPane=this.$el.find(".jconfirm-scrollpane"),n.setStartingPoint(),this._contentReady=t.Deferred(),this._modalReady=t.Deferred(),this.$holder.css({"padding-top":this.offsetTop,"padding-bottom":this.offsetBottom}),this.setTitle(),this.setIcon(),this._setButtons(),this._parseContent(),this.initDraggable(),this.isAjax&&this.showLoading(!1),t.when(this._contentReady,this._modalReady).then((function(){n.isAjaxLoading?setTimeout((function(){n.isAjaxLoading=!1,n.setContent(),n.setTitle(),n.setIcon(),setTimeout((function(){n.hideLoading(!1),n._updateContentMaxHeight()}),100),"function"==typeof n.onContentReady&&n.onContentReady()}),50):(n._updateContentMaxHeight(),n.setTitle(),n.setIcon(),"function"==typeof n.onContentReady&&n.onContentReady()),n.autoClose&&n._startCountDown()})).then((function(){n._watchContent()})),"none"===this.animation&&(this.animationSpeed=1,this.animationBounce=1),this.$body.css(this._getCSS(this.animationSpeed,this.animationBounce)),this.$contentPane.css(this._getCSS(this.animationSpeed,1)),this.$jconfirmBg.css(this._getCSS(this.animationSpeed,1)),this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed,1))},_typePrefix:"jconfirm-type-",typeParsed:"",_parseType:function(t){this.typeParsed=this._typePrefix+t},setType:function(t){var n=this.typeParsed;this._parseType(t),this.$jconfirmBox.removeClass(n).addClass(this.typeParsed)},themeParsed:"",_themePrefix:"jconfirm-",setTheme:function(t){var n=this.theme;this.theme=t||this.theme,this._parseTheme(this.theme),n&&this.$el.removeClass(n),this.$el.addClass(this.themeParsed),this.theme=t},_parseTheme:function(n){var i=this;n=n.split(","),t.each(n,(function(o,e){-1===e.indexOf(i._themePrefix)&&(n[o]=i._themePrefix+t.trim(e))})),this.themeParsed=n.join(" ").toLowerCase()},backgroundDismissAnimationParsed:"",_bgDismissPrefix:"jconfirm-hilight-",_parseBgDismissAnimation:function(n){var i=n.split(","),o=this;t.each(i,(function(n,e){-1===e.indexOf(o._bgDismissPrefix)&&(i[n]=o._bgDismissPrefix+t.trim(e))})),this.backgroundDismissAnimationParsed=i.join(" ").toLowerCase()},animationParsed:"",closeAnimationParsed:"",_animationPrefix:"jconfirm-animation-",setAnimation:function(t){this.animation=t||this.animation,this._parseAnimation(this.animation,"o")},_parseAnimation:function(n,i){i=i||"o";var o=n.split(","),e=this;t.each(o,(function(n,i){-1===i.indexOf(e._animationPrefix)&&(o[n]=e._animationPrefix+t.trim(i))}));var s=o.join(" ").toLowerCase();return"o"===i?this.animationParsed=s:this.closeAnimationParsed=s,s},setCloseAnimation:function(t){this.closeAnimation=t||this.closeAnimation,this._parseAnimation(this.closeAnimation,"c")},setAnimationSpeed:function(t){this.animationSpeed=t||this.animationSpeed},columnClassParsed:"",setColumnClass:function(t){this.useBootstrap?(this.columnClass=t||this.columnClass,this._parseColumnClass(this.columnClass),this.$jconfirmBoxContainer.addClass(this.columnClassParsed)):console.warn("cannot set columnClass, useBootstrap is set to false")},_updateContentMaxHeight:function(){var n=t(window).height()-(this.$jconfirmBox.outerHeight()-this.$contentPane.outerHeight())-(this.offsetTop+this.offsetBottom);this.$contentPane.css({"max-height":n+"px"})},setBoxWidth:function(t){this.useBootstrap?console.warn("cannot set boxWidth, useBootstrap is set to true"):(this.boxWidth=t,this.$jconfirmBox.css("max-width",t))},_parseColumnClass:function(t){var n;switch(t=t.toLowerCase()){case"xl":case"xlarge":n="col-md-12";break;case"l":case"large":n="col-md-8 col-md-offset-2";break;case"m":case"medium":n="col-md-6 col-md-offset-3";break;case"s":case"small":n="col-md-4 col-md-offset-4";break;case"xs":case"xsmall":n="col-md-2 col-md-offset-5";break;default:n=t}this.columnClassParsed=n},initDraggable:function(){var n=this,i=this.$titleContainer;this.resetDrag(),this.draggable&&(i.on("mousedown",(function(t){i.addClass("jconfirm-hand"),n.mouseX=t.clientX,n.mouseY=t.clientY,n.isDrag=!0})),t(window).on("mousemove."+this._id,(function(t){n.isDrag&&(n.movingX=t.clientX-n.mouseX+n.initialX,n.movingY=t.clientY-n.mouseY+n.initialY,n.setDrag())})),t(window).on("mouseup."+this._id,(function(){i.removeClass("jconfirm-hand"),n.isDrag&&(n.isDrag=!1,n.initialX=n.movingX,n.initialY=n.movingY)})))},resetDrag:function(){this.isDrag=!1,this.initialX=0,this.initialY=0,this.movingX=0,this.movingY=0,this.mouseX=0,this.mouseY=0,this.$jconfirmBoxContainer.css("transform","translate(0px, 0px)")},setDrag:function(){if(this.draggable){this.alignMiddle=!1;var n=this.$jconfirmBox.outerWidth(),i=this.$jconfirmBox.outerHeight(),o=t(window).width(),e=t(window).height(),s=this;if(s.movingX%1==0||s.movingY%1==0){if(s.dragWindowBorder){var a=o/2-n/2,c=e/2-i/2;c-=s.dragWindowGap,(a-=s.dragWindowGap)+s.movingX<0?s.movingX=-a:a-s.movingX<0&&(s.movingX=a),c+s.movingY<0?s.movingY=-c:c-s.movingY<0&&(s.movingY=c)}s.$jconfirmBoxContainer.css("transform","translate("+s.movingX+"px, "+s.movingY+"px)")}}},_scrollTop:function(){if("undefined"!=typeof pageYOffset)return pageYOffset;var t=document.body,n=document.documentElement;return(n=n.clientHeight?n:t).scrollTop},_watchContent:function(){var n=this;this._timer&&clearInterval(this._timer);var i=0;this._timer=setInterval((function(){if(n.smoothContent){var o=n.$content.outerHeight()||0;o!==i&&(i=o);var e=t(window).height();n.offsetTop+n.offsetBottom+n.$jconfirmBox.outerHeight()-n.$contentPane.outerHeight()+n.$content.outerHeight()').html(n.buttons[o].text).addClass(n.buttons[o].btnClass).prop("disabled",n.buttons[o].isDisabled).css("display",n.buttons[o].isHidden?"none":"").click((function(t){t.preventDefault();var i=n.buttons[o].action.apply(n,[n.buttons[o]]);n.onAction.apply(n,[o,n.buttons[o]]),n._stopCountDown(),(void 0===i||i)&&n.close()}));n.buttons[o].el=s,n.buttons[o].setText=function(t){s.html(t)},n.buttons[o].addClass=function(t){s.addClass(t)},n.buttons[o].removeClass=function(t){s.removeClass(t)},n.buttons[o].disable=function(){n.buttons[o].isDisabled=!0,s.prop("disabled",!0)},n.buttons[o].enable=function(){n.buttons[o].isDisabled=!1,s.prop("disabled",!1)},n.buttons[o].show=function(){n.buttons[o].isHidden=!1,s.css("display","")},n.buttons[o].hide=function(){n.buttons[o].isHidden=!0,s.css("display","none")},n["$_"+o]=n["$$"+o]=s,n.$btnc.append(s)})),0===i&&this.$btnc.hide(),null===this.closeIcon&&0===i&&(this.closeIcon=!0),this.closeIcon){if(this.closeIconClass){var o='';this.$closeIcon.html(o)}this.$closeIcon.click((function(t){t.preventDefault();var i,o=!1,e=!1;if("string"==typeof(i="function"==typeof n.closeIcon?n.closeIcon():n.closeIcon)&&void 0!==n.buttons[i]?(o=i,e=!1):e=void 0===i||!0==!!i,o){var s=n.buttons[o].action.apply(n);e=void 0===s||!!s}e&&n.close()})),this.$closeIcon.show()}else this.$closeIcon.hide()},setTitle:function(t,n){if(n=n||!1,void 0!==t)if("string"==typeof t)this.title=t;else if("function"==typeof t){"function"==typeof t.promise&&console.error("Promise was returned from title function, this is not supported.");var i=t();this.title="string"==typeof i&&i}else this.title=!1;this.isAjaxLoading&&!n||(this.$title.html(this.title||""),this.updateTitleContainer())},setIcon:function(t,n){if(n=n||!1,void 0!==t)if("string"==typeof t)this.icon=t;else if("function"==typeof t){var i=t();this.icon="string"==typeof i&&i}else this.icon=!1;this.isAjaxLoading&&!n||(this.$icon.html(this.icon?'':""),this.updateTitleContainer())},updateTitleContainer:function(){this.title||this.icon?this.$titleContainer.show():this.$titleContainer.hide()},setContentPrepend:function(t,n){t&&this.contentParsed.prepend(t)},setContentAppend:function(t){t&&this.contentParsed.append(t)},setContent:function(t,n){n=!!n;var i=this;t&&this.contentParsed.html("").append(t),this.isAjaxLoading&&!n||(this.$content.html(""),this.$content.append(this.contentParsed),setTimeout((function(){i.$body.find("input[autofocus]:visible:first").focus()}),100))},loadingSpinner:!1,showLoading:function(t){this.loadingSpinner=!0,this.$jconfirmBox.addClass("loading"),t&&this.$btnc.find("button").prop("disabled",!0)},hideLoading:function(t){this.loadingSpinner=!1,this.$jconfirmBox.removeClass("loading"),t&&this.$btnc.find("button").prop("disabled",!1)},ajaxResponse:!1,contentParsed:"",isAjax:!1,isAjaxLoading:!1,_parseContent:function(){var n=this,i=" ";if("function"==typeof this.content){var o=this.content.apply(this);"string"==typeof o?this.content=o:"object"==typeof o&&"function"==typeof o.always?(this.isAjax=!0,this.isAjaxLoading=!0,o.always((function(t,i,o){n.ajaxResponse={data:t,status:i,xhr:o},n._contentReady.resolve(t,i,o),"function"==typeof n.contentLoaded&&n.contentLoaded(t,i,o)})),this.content=i):this.content=i}if("string"==typeof this.content&&"url:"===this.content.substr(0,4).toLowerCase()){this.isAjax=!0,this.isAjaxLoading=!0;var e=this.content.substring(4,this.content.length);t.get(e).done((function(t){n.contentParsed.html(t)})).always((function(t,i,o){n.ajaxResponse={data:t,status:i,xhr:o},n._contentReady.resolve(t,i,o),"function"==typeof n.contentLoaded&&n.contentLoaded(t,i,o)}))}this.content||(this.content=i),this.isAjax||(this.contentParsed.html(this.content),this.setContent(),n._contentReady.resolve())},_stopCountDown:function(){clearInterval(this.autoCloseInterval),this.$cd&&this.$cd.remove()},_startCountDown:function(){var n=this,i=this.autoClose.split("|");if(2!==i.length)return console.error("Invalid option for autoClose. example 'close|10000'"),!1;var o=i[0],e=parseInt(i[1]);if(void 0===this.buttons[o])return console.error("Invalid button key '"+o+"' for autoClose"),!1;var s=Math.ceil(e/1e3);this.$cd=t(' ('+s+")").appendTo(this["$_"+o]),this.autoCloseInterval=setInterval((function(){n.$cd.html(" ("+(s-=1)+") "),s<=0&&(n["$$"+o].trigger("click"),n._stopCountDown())}),1e3)},_getKey:function(t){switch(t){case 192:return"tilde";case 13:return"enter";case 16:return"shift";case 9:return"tab";case 20:return"capslock";case 17:return"ctrl";case 91:return"win";case 18:return"alt";case 27:return"esc";case 32:return"space"}var n=String.fromCharCode(t);return!!/^[A-z0-9]+$/.test(n)&&n.toLowerCase()},reactOnKey:function(n){var i=this,o=t(".jconfirm");if(o.eq(o.length-1)[0]!==this.$el[0])return!1;var e=n.which;if(this.$content.find(":input").is(":focus")&&/13|32/.test(e))return!1;var s=this._getKey(e);if("esc"===s&&this.escapeKey)if(!0===this.escapeKey)this.$scrollPane.trigger("click");else if("string"==typeof this.escapeKey||"function"==typeof this.escapeKey){var a;(a="function"==typeof this.escapeKey?this.escapeKey():this.escapeKey)&&(void 0===this.buttons[a]?console.warn("Invalid escapeKey, no buttons found with key "+a):this["$_"+a].trigger("click"))}t.each(this.buttons,(function(t,n){-1!==n.keys.indexOf(s)&&i["$_"+t].trigger("click")}))},setDialogCenter:function(){console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables")},_unwatchContent:function(){clearInterval(this._timer)},close:function(i){var o=this;return"function"==typeof this.onClose&&this.onClose(i),this._unwatchContent(),t(window).unbind("resize."+this._id),t(window).unbind("keyup."+this._id),t(window).unbind("jcKeyDown."+this._id),this.draggable&&(t(window).unbind("mousemove."+this._id),t(window).unbind("mouseup."+this._id),this.$titleContainer.unbind("mousedown")),o.$el.removeClass(o.loadedClass),t("body").removeClass("jconfirm-no-scroll-"+o._id),o.$jconfirmBoxContainer.removeClass("jconfirm-no-transition"),setTimeout((function(){o.$body.addClass(o.closeAnimationParsed),o.$jconfirmBg.addClass("jconfirm-bg-h");var i="none"===o.closeAnimation?1:o.animationSpeed;setTimeout((function(){o.$el.remove();n.jconfirm.instances;for(var i=n.jconfirm.instances.length-1;i>=0;i--)n.jconfirm.instances[i]._id===o._id&&n.jconfirm.instances.splice(i,1);if(!n.jconfirm.instances.length&&o.scrollToPreviousElement&&n.jconfirm.lastFocused&&n.jconfirm.lastFocused.length&&t.contains(document,n.jconfirm.lastFocused[0])){var e=n.jconfirm.lastFocused;if(o.scrollToPreviousElementAnimate){var s=t(window).scrollTop(),a=n.jconfirm.lastFocused.offset().top,c=t(window).height();if(a>s&&ar||Math.abs(c)>l)return!1;this.$jconfirmBoxContainer.css("transform","translate("+c+"px, "+a+"px)")},_open:function(){var t=this;"function"==typeof t.onOpenBefore&&t.onOpenBefore(),this.$body.removeClass(this.animationParsed),this.$jconfirmBg.removeClass("jconfirm-bg-h"),this.$body.focus(),t.$jconfirmBoxContainer.css("transform","translate(0px, 0px)"),setTimeout((function(){t.$body.css(t._getCSS(t.animationSpeed,1)),t.$body.css({"transition-property":t.$body.css("transition-property")+", margin"}),t.$jconfirmBoxContainer.addClass("jconfirm-no-transition"),t._modalReady.resolve(),"function"==typeof t.onOpen&&t.onOpen(),t.$el.addClass(t.loadedClass)}),this.animationSpeed)},loadedClass:"jconfirm-open",isClosed:function(){return!this.$el||0===this.$el.parent().length},isOpen:function(){return!this.isClosed()},toggle:function(){this.isOpen()?this.close():this.open()}},n.jconfirm.instances=[],n.jconfirm.lastFocused=!1,n.jconfirm.pluginDefaults={template:'
            ',title:"Hello",titleClass:"",type:"default",typeAnimated:!0,draggable:!0,dragWindowGap:15,dragWindowBorder:!0,animateFromElement:!0,alignMiddle:!0,smoothContent:!0,content:"Are you sure to continue?",buttons:{},defaultButtons:{ok:{action:function(){}},close:{action:function(){}}},contentLoaded:function(){},icon:"",lazyOpen:!1,bgOpacity:null,theme:"light",animation:"scale",closeAnimation:"scale",animationSpeed:400,animationBounce:1,escapeKey:!0,rtl:!1,container:"body",containerFluid:!1,backgroundDismiss:!1,backgroundDismissAnimation:"shake",autoClose:!1,closeIcon:null,closeIconClass:!1,watchInterval:100,columnClass:"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",boxWidth:"50%",scrollToPreviousElement:!0,scrollToPreviousElementAnimate:!0,useBootstrap:!0,offsetTop:40,offsetBottom:40,bootstrapClasses:{container:"container",containerFluid:"container-fluid",row:"row"},onContentReady:function(){},onOpenBefore:function(){},onOpen:function(){},onClose:function(){},onDestroy:function(){},onAction:function(){}};let i=!1;t(window).on("keydown",(function(n){if(!i){let o=!1;t(n.target).closest(".jconfirm-box").length&&(o=!0),o&&t(window).trigger("jcKeyDown"),i=!0}})),t(window).on("keyup",(function(){i=!1})),n.jconfirm.lastClicked=!1,t(document).on("mousedown","button, a, [jc-source]",(function(){n.jconfirm.lastClicked=t(this)}))})); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.inputmask.min.js b/wp-content/plugins/wpforms-lite/assets/lib/jquery.inputmask.min.js new file mode 100755 index 00000000..2cd433c8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.inputmask.min.js @@ -0,0 +1,8 @@ +/*! + * dist/jquery.inputmask.min + * https://github.com/RobinHerbots/Inputmask + * Copyright (c) 2010 - 2024 Robin Herbots + * Licensed under the MIT license + * Version: 5.0.9 + */ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("jquery"));else if("function"==typeof define&&define.amd)define(["jquery"],t);else{var n="object"==typeof exports?t(require("jquery")):t(e.jQuery);for(var i in n)("object"==typeof exports?exports:e)[i]=n[i]}}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={3046:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,n(7149),n(3194),n(9302),n(4013),n(3851),n(219),n(207),n(5296);var i,a=(i=n(2394))&&i.__esModule?i:{default:i};t.default=a.default},3976:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={_maxTestPos:500,placeholder:"_",optionalmarker:["[","]"],quantifiermarker:["{","}"],groupmarker:["(",")"],alternatormarker:"|",escapeChar:"\\",mask:null,regex:null,oncomplete:function(){},onincomplete:function(){},oncleared:function(){},repeat:0,greedy:!1,autoUnmask:!1,removeMaskOnSubmit:!1,clearMaskOnLostFocus:!0,insertMode:!0,insertModeVisual:!0,clearIncomplete:!1,alias:null,onKeyDown:function(){},onBeforeMask:null,onBeforePaste:function(e,t){return"function"==typeof t.onBeforeMask?t.onBeforeMask.call(this,e,t):e},onBeforeWrite:null,onUnMask:null,showMaskOnFocus:!0,showMaskOnHover:!0,onKeyValidation:function(){},skipOptionalPartCharacter:" ",numericInput:!1,rightAlign:!1,undoOnEscape:!0,radixPoint:"",_radixDance:!1,groupSeparator:"",keepStatic:null,positionCaretOnTab:!0,tabThrough:!1,supportsInputType:["text","tel","url","password","search"],isComplete:null,preValidation:null,postValidation:null,staticDefinitionSymbol:void 0,jitMasking:!1,nullable:!0,inputEventOnly:!1,noValuePatching:!1,positionCaretOnClick:"lvp",casing:null,inputmode:"text",importDataAttributes:!0,shiftPositions:!0,usePrototypeDefinitions:!0,validationEventTimeOut:3e3,substitutes:{}}},7392:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={9:{validator:"[0-9\uff10-\uff19]",definitionSymbol:"*"},a:{validator:"[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",definitionSymbol:"*"},"*":{validator:"[0-9\uff10-\uff19A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]"}}},3287:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i,a=(i=n(7957))&&i.__esModule?i:{default:i};if(void 0===a.default)throw new Error("jQuery not loaded!");t.default=a.default},9845:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.mobile=t.iphone=t.ie=void 0;var i,a=(i=n(9380))&&i.__esModule?i:{default:i};var r=a.default.navigator&&a.default.navigator.userAgent||"";t.ie=r.indexOf("MSIE ")>0||r.indexOf("Trident/")>0,t.mobile=a.default.navigator&&a.default.navigator.userAgentData&&a.default.navigator.userAgentData.mobile||a.default.navigator&&a.default.navigator.maxTouchPoints||"ontouchstart"in a.default,t.iphone=/iphone/i.test(r)},7184:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.replace(n,"\\$1")};var n=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^"].join("|\\")+")","gim")},6030:function(e,t,n){function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.EventHandlers=void 0;var a,r=n(9845),o=(a=n(9380))&&a.__esModule?a:{default:a},s=n(7760),l=n(2839),c=n(8711),u=n(7215),f=n(4713);function p(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */p=function(){return t};var e,t={},n=Object.prototype,a=n.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},o="function"==typeof Symbol?Symbol:{},s=o.iterator||"@@iterator",l=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function f(e,t,n,i){var a=t&&t.prototype instanceof k?t:k,o=Object.create(a.prototype),s=new D(i||[]);return r(o,"_invoke",{value:E(e,n,s)}),o}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=f;var h="suspendedStart",m="suspendedYield",v="executing",g="completed",y={};function k(){}function b(){}function x(){}var w={};u(w,s,(function(){return this}));var P=Object.getPrototypeOf,S=P&&P(P(L([])));S&&S!==n&&a.call(S,s)&&(w=S);var O=x.prototype=k.prototype=Object.create(w);function M(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function _(e,t){function n(r,o,s,l){var c=d(e[r],e,o);if("throw"!==c.type){var u=c.arg,f=u.value;return f&&"object"==i(f)&&a.call(f,"__await")?t.resolve(f.__await).then((function(e){n("next",e,s,l)}),(function(e){n("throw",e,s,l)})):t.resolve(f).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,l)}))}l(c.arg)}var o;r(this,"_invoke",{value:function(e,i){function a(){return new t((function(t,a){n(e,i,t,a)}))}return o=o?o.then(a,a):a()}})}function E(t,n,i){var a=h;return function(r,o){if(a===v)throw new Error("Generator is already running");if(a===g){if("throw"===r)throw o;return{value:e,done:!0}}for(i.method=r,i.arg=o;;){var s=i.delegate;if(s){var l=j(s,i);if(l){if(l===y)continue;return l}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if(a===h)throw a=g,i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);a=v;var c=d(t,n,i);if("normal"===c.type){if(a=i.done?g:m,c.arg===y)continue;return{value:c.arg,done:i.done}}"throw"===c.type&&(a=g,i.method="throw",i.arg=c.arg)}}}function j(t,n){var i=n.method,a=t.iterator[i];if(a===e)return n.delegate=null,"throw"===i&&t.iterator.return&&(n.method="return",n.arg=e,j(t,n),"throw"===n.method)||"return"!==i&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+i+"' method")),y;var r=d(a,t.iterator,n.arg);if("throw"===r.type)return n.method="throw",n.arg=r.arg,n.delegate=null,y;var o=r.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,y):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,y)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function D(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function L(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,o=function n(){for(;++r=0;--r){var o=this.tryEntries[r],s=o.completion;if("root"===o.tryLoc)return i("end");if(o.tryLoc<=this.prev){var l=a.call(o,"catchLoc"),c=a.call(o,"finallyLoc");if(l&&c){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&a.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var a=i.arg;A(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,i){return this.delegate={iterator:L(t),resultName:n,nextLoc:i},"next"===this.method&&(this.arg=e),y}},t}function d(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return h(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return h(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,a=function(){};return{s:a,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,r=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw r}}}}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n=0&&k.end>0&&(e.preventDefault(),c.caret.call(o,m,k.begin,k.end))):(k.begin=c.seekNext.call(o,k.begin,!0),k.end=c.seekNext.call(o,k.begin,!0),k.end1&&!("textarea"===m.tagName.toLowerCase()&&g==l.keys.Enter),y.keypressEvent.call(this,e,t,n,i,a)},keypressEvent:function(e,t,n,i,a){var r=this.inputmask||this,o=r.opts,f=r.dependencyLib,p=r.maskset,d=r.el,h=f(d),m=e.key;if(!0===t||e.ctrlKey&&e.altKey&&!r.ignorable||!(e.ctrlKey||e.metaKey||r.ignorable)){if(m){var v,g=t?{begin:a,end:a}:c.caret.call(r,d);t||(m=o.substitutes[m]||m),p.writeOutBuffer=!0;var y=u.isValid.call(r,g,m,i,void 0,void 0,void 0,t);if(!1!==y&&(c.resetMaskSet.call(r,!0),v=void 0!==y.caret?y.caret:c.seekNext.call(r,y.pos.begin?y.pos.begin:y.pos),p.p=v),v=o.numericInput&&void 0===y.caret?c.seekPrevious.call(r,v):v,!1!==n&&(setTimeout((function(){o.onKeyValidation.call(d,m,y)}),0),p.writeOutBuffer&&!1!==y)){var k=c.getBuffer.call(r);(0,s.writeBuffer)(d,k,v,e,!0!==t)}if(e.preventDefault(),t)return!1!==y&&(y.forwardPosition=v),y}}else m===l.keys.Enter&&r.undoValue!==r._valueGet(!0)&&(r.undoValue=r._valueGet(!0),setTimeout((function(){h.trigger("change")}),0))},pasteEvent:(v=p().mark((function e(t){var n,i,a,r,l,u;return p().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=function(e,n,i,a,o){var l=c.caret.call(e,n,void 0,void 0,!0),u=i.substr(0,l.begin),f=i.substr(l.end,i.length);if(u==(e.isRTL?c.getBufferTemplate.call(e).slice().reverse():c.getBufferTemplate.call(e)).slice(0,l.begin).join("")&&(u=""),f==(e.isRTL?c.getBufferTemplate.call(e).slice().reverse():c.getBufferTemplate.call(e)).slice(l.end).join("")&&(f=""),a=u+a+f,e.isRTL&&!0!==r.numericInput){a=a.split("");var p,h=d(c.getBufferTemplate.call(e));try{for(h.s();!(p=h.n()).done;){var m=p.value;a[0]===m&&a.shift()}}catch(e){h.e(e)}finally{h.f()}a=a.reverse().join("")}var v=a;if("function"==typeof o){if(!1===(v=o.call(e,v,r)))return!1;v||(v=i)}(0,s.checkVal)(n,!0,!1,v.toString().split(""),t)},i=this,a=this.inputmask,r=a.opts,l=a._valueGet(!0),a.skipInputEvent=!0,t.clipboardData&&t.clipboardData.getData?u=t.clipboardData.getData("text/plain"):o.default.clipboardData&&o.default.clipboardData.getData&&(u=o.default.clipboardData.getData("Text")),n(a,i,l,u,r.onBeforePaste),t.preventDefault();case 7:case"end":return e.stop()}}),e,this)})),g=function(){var e=this,t=arguments;return new Promise((function(n,i){var a=v.apply(e,t);function r(e){m(a,n,i,r,o,"next",e)}function o(e){m(a,n,i,r,o,"throw",e)}r(void 0)}))},function(e){return g.apply(this,arguments)}),inputFallBackEvent:function(e){var t=this.inputmask,n=t.opts,i=t.dependencyLib;var a,o=this,u=o.inputmask._valueGet(!0),p=(t.isRTL?c.getBuffer.call(t).slice().reverse():c.getBuffer.call(t)).join(""),d=c.caret.call(t,o,void 0,void 0,!0);if(p!==u){if(a=function(e,i,a){for(var r,o,s,l=e.substr(0,a.begin).split(""),u=e.substr(a.begin).split(""),p=i.substr(0,a.begin).split(""),d=i.substr(a.begin).split(""),h=l.length>=p.length?l.length:p.length,m=u.length>=d.length?u.length:d.length,v="",g=[],y="~";l.length0)&&(t.undoValue=o,a.trigger("change"))}},mouseenterEvent:function(){var e=this.inputmask,t=e.opts.showMaskOnHover,n=this;if(e.mouseEnter=!0,(n.inputmask.shadowRoot||n.ownerDocument).activeElement!==n){var i=(e.isRTL?c.getBufferTemplate.call(e).slice().reverse():c.getBufferTemplate.call(e)).join("");t&&(0,s.HandleNativePlaceholder)(n,i)}},submitEvent:function(){var e=this.inputmask,t=e.opts;e.undoValue!==e._valueGet(!0)&&e.$el.trigger("change"),-1===c.getLastValidPosition.call(e)&&e._valueGet&&e._valueGet()===c.getBufferTemplate.call(e).join("")&&e._valueSet(""),t.clearIncomplete&&!1===u.isComplete.call(e,c.getBuffer.call(e))&&e._valueSet(""),t.removeMaskOnSubmit&&(e._valueSet(e.unmaskedvalue(),!0),setTimeout((function(){(0,s.writeBuffer)(e.el,c.getBuffer.call(e))}),0))},resetEvent:function(){var e=this.inputmask;e.refreshValue=!0,setTimeout((function(){(0,s.applyInputValue)(e.el,e._valueGet(!0))}),0)}}},9716:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.EventRuler=void 0;var i,a=n(7760),r=(i=n(2394))&&i.__esModule?i:{default:i},o=n(2839),s=n(8711);t.EventRuler={on:function(e,t,n){var i=e.inputmask.dependencyLib,l=function(t){t.originalEvent&&(t=t.originalEvent||t,arguments[0]=t);var l,c=this,u=c.inputmask,f=u?u.opts:void 0;if(void 0===u&&"FORM"!==this.nodeName){var p=i.data(c,"_inputmask_opts");i(c).off(),p&&new r.default(p).mask(c)}else{if(["submit","reset","setvalue"].includes(t.type)||"FORM"===this.nodeName||!(c.disabled||c.readOnly&&!("keydown"===t.type&&t.ctrlKey&&t.key===o.keys.c||!1===f.tabThrough&&t.key===o.keys.Tab))){switch(t.type){case"input":if(!0===u.skipInputEvent)return u.skipInputEvent=!1,t.preventDefault();break;case"click":case"focus":return u.validationEvent?(u.validationEvent=!1,e.blur(),(0,a.HandleNativePlaceholder)(e,(u.isRTL?s.getBufferTemplate.call(u).slice().reverse():s.getBufferTemplate.call(u)).join("")),setTimeout((function(){e.focus()}),f.validationEventTimeOut),!1):(l=arguments,void setTimeout((function(){e.inputmask&&n.apply(c,l)}),0))}var d=n.apply(c,arguments);return!1===d&&(t.preventDefault(),t.stopPropagation()),d}t.preventDefault()}};["submit","reset"].includes(t)?(l=l.bind(e),null!==e.form&&i(e.form).on(t,l)):i(e).on(t,l),e.inputmask.events[t]=e.inputmask.events[t]||[],e.inputmask.events[t].push(l)},off:function(e,t){if(e.inputmask&&e.inputmask.events){var n=e.inputmask.dependencyLib,i=e.inputmask.events;for(var a in t&&((i=[])[t]=e.inputmask.events[t]),i){for(var r=i[a];r.length>0;){var o=r.pop();["submit","reset"].includes(a)?null!==e.form&&n(e.form).off(a,o):n(e).off(a,o)}delete e.inputmask.events[a]}}}}},219:function(e,t,n){var i=p(n(7184)),a=p(n(2394)),r=n(2839),o=n(8711),s=n(4713);function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i,a,r,o,s=[],l=!0,c=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(s.push(i.value),s.length!==t);l=!0);}catch(e){c=!0,a=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return s}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&t--,Date.prototype.setMonth.call(this,t)},"month",function(){return Date.prototype.getMonth.call(this)+1}],mm:["0[1-9]|1[012]",function(e){var t=e?parseInt(e):0;return t>0&&t--,Date.prototype.setMonth.call(this,t)},"month",function(){return M(Date.prototype.getMonth.call(this)+1,2)}],mmm:[v.monthNames.slice(0,12).join("|"),function(e){var t=v.monthNames.slice(0,12).findIndex((function(t){return e.toLowerCase()===t.toLowerCase()}));return-1!==t&&Date.prototype.setMonth.call(this,t)},"month",function(){return v.monthNames.slice(0,12)[Date.prototype.getMonth.call(this)]}],mmmm:[v.monthNames.slice(12,24).join("|"),function(e){var t=v.monthNames.slice(12,24).findIndex((function(t){return e.toLowerCase()===t.toLowerCase()}));return-1!==t&&Date.prototype.setMonth.call(this,t)},"month",function(){return v.monthNames.slice(12,24)[Date.prototype.getMonth.call(this)]}],yy:["[0-9]{2}",function(e){var t=(new Date).getFullYear().toString().slice(0,2);Date.prototype.setFullYear.call(this,"".concat(t).concat(e))},"year",function(){return M(Date.prototype.getFullYear.call(this),2)},2],yyyy:["[0-9]{4}",Date.prototype.setFullYear,"year",function(){return M(Date.prototype.getFullYear.call(this),4)},4],h:["[1-9]|1[0-2]",Date.prototype.setHours,"hours",Date.prototype.getHours],hh:["0[1-9]|1[0-2]",Date.prototype.setHours,"hours",function(){return M(Date.prototype.getHours.call(this),2)}],hx:[function(e){return"[0-9]{".concat(e,"}")},Date.prototype.setHours,"hours",function(e){return Date.prototype.getHours}],H:["1?[0-9]|2[0-3]",Date.prototype.setHours,"hours",Date.prototype.getHours],HH:["0[0-9]|1[0-9]|2[0-3]",Date.prototype.setHours,"hours",function(){return M(Date.prototype.getHours.call(this),2)}],Hx:[function(e){return"[0-9]{".concat(e,"}")},Date.prototype.setHours,"hours",function(e){return function(){return M(Date.prototype.getHours.call(this),e)}}],M:["[1-5]?[0-9]",Date.prototype.setMinutes,"minutes",Date.prototype.getMinutes],MM:["0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]",Date.prototype.setMinutes,"minutes",function(){return M(Date.prototype.getMinutes.call(this),2)}],s:["[1-5]?[0-9]",Date.prototype.setSeconds,"seconds",Date.prototype.getSeconds],ss:["0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]",Date.prototype.setSeconds,"seconds",function(){return M(Date.prototype.getSeconds.call(this),2)}],l:["[0-9]{3}",Date.prototype.setMilliseconds,"milliseconds",function(){return M(Date.prototype.getMilliseconds.call(this),3)},3],L:["[0-9]{2}",Date.prototype.setMilliseconds,"milliseconds",function(){return M(Date.prototype.getMilliseconds.call(this),2)},2],t:["[ap]",b,"ampm",x,1],tt:["[ap]m",b,"ampm",x,2],T:["[AP]",b,"ampm",x,1],TT:["[AP]M",b,"ampm",x,2],Z:[".*",void 0,"Z",function(){var e=this.toString().match(/\((.+)\)/)[1];e.includes(" ")&&(e=(e=e.replace("-"," ").toUpperCase()).split(" ").map((function(e){return l(e,1)[0]})).join(""));return e}],o:[""],S:[""]},k={isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:ss",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"};function b(e){var t=this.getHours();e.toLowerCase().includes("p")?this.setHours(t+12):e.toLowerCase().includes("a")&&t>=12&&this.setHours(t-12)}function x(){var e=this.getHours();return(e=e||12)>=12?"PM":"AM"}function w(e){var t=/\d+$/.exec(e[0]);if(t&&void 0!==t[0]){var n=y[e[0][0]+"x"].slice("");return n[0]=n[0](t[0]),n[3]=n[3](t[0]),n}if(y[e[0]])return y[e[0]]}function P(e){if(!e.tokenizer){var t=[],n=[];for(var i in y)if(/\.*x$/.test(i)){var a=i[0]+"\\d+";-1===n.indexOf(a)&&n.push(a)}else-1===t.indexOf(i[0])&&t.push(i[0]);e.tokenizer="("+(n.length>0?n.join("|")+"|":"")+t.join("+|")+")+?|.",e.tokenizer=new RegExp(e.tokenizer,"g")}return e.tokenizer}function S(e,t,n){if(!g)return!0;if(void 0===e.rawday||!isFinite(e.rawday)&&new Date(e.date.getFullYear(),isFinite(e.rawmonth)?e.month:e.date.getMonth()+1,0).getDate()>=e.day||"29"==e.day&&(!isFinite(e.rawyear)||void 0===e.rawyear||""===e.rawyear)||new Date(e.date.getFullYear(),isFinite(e.rawmonth)?e.month:e.date.getMonth()+1,0).getDate()>=e.day)return t;if("29"==e.day){var i=j.call(this,t.pos,n,this.maskset);if(i.targetMatch&&"yyyy"===i.targetMatch[0]&&t.pos-i.targetMatchIndex==2)return t.remove=t.pos+1,t}else if(2==e.date.getMonth()&&"30"==e.day&&void 0!==t.c)return e.day="03",e.date.setDate(3),e.date.setMonth(1),t.insert=[{pos:t.pos,c:"0"},{pos:t.pos+1,c:t.c}],t.caret=o.seekNext.call(this,t.pos+1),t;return!1}function O(e,t,n,a){var r,o,s="",l=0,c={};for(P(n).lastIndex=0;r=P(n).exec(e);){if(void 0===t)if(o=w(r))s+="("+o[0]+")",n.placeholder&&""!==n.placeholder?(c[l]=n.placeholder[r.index%n.placeholder.length],c[n.placeholder[r.index%n.placeholder.length]]=r[0].charAt(0)):c[l]=r[0].charAt(0);else switch(r[0]){case"[":s+="(";break;case"]":s+=")?";break;default:s+=(0,i.default)(r[0]),c[l]=r[0].charAt(0)}else if(o=w(r))if(!0!==a&&o[3])s+=o[3].call(t.date);else o[2]?s+=t["raw"+o[2]]:s+=r[0];else s+=r[0];l++}return void 0===t&&(n.placeholder=c),s}function M(e,t,n){for(e=String(e),t=t||2;e.length=e+1){i=a,a=P(t).exec(t.inputFormat);break}}return{targetMatchIndex:l-c,nextMatch:a,targetMatch:i}}a.default.extendAliases({datetime:{mask:function(e){return e.numericInput=!1,y.S=v.ordinalSuffix.join("|"),e.inputFormat=k[e.inputFormat]||e.inputFormat,e.displayFormat=k[e.displayFormat]||e.displayFormat||e.inputFormat,e.outputFormat=k[e.outputFormat]||e.outputFormat||e.inputFormat,e.regex=O(e.inputFormat,void 0,e),e.min=_(e.min,e.inputFormat,e),e.max=_(e.max,e.inputFormat,e),null},placeholder:"",inputFormat:"isoDateTime",displayFormat:null,outputFormat:null,min:null,max:null,skipOptionalPartCharacter:"",preValidation:function(e,t,n,i,a,r,o,s){if(s)return!0;if(isNaN(n)&&e[t]!==n){var l=j.call(this,t,a,r);if(l.nextMatch&&l.nextMatch[0]===n&&l.targetMatch[0].length>1){var c=w(l.targetMatch)[0];if(new RegExp(c).test("0"+e[t-1]))return e[t]=e[t-1],e[t-1]="0",{fuzzy:!0,buffer:e,refreshFromBuffer:{start:t-1,end:t+1},pos:t+1}}}return!0},postValidation:function(e,t,n,i,a,r,o,l){var c,u,f=this;if(o)return!0;if(!1===i&&(((c=j.call(f,t+1,a,r)).targetMatch&&c.targetMatchIndex===t&&c.targetMatch[0].length>1&&void 0!==y[c.targetMatch[0]]||(c=j.call(f,t+2,a,r)).targetMatch&&c.targetMatchIndex===t+1&&c.targetMatch[0].length>1&&void 0!==y[c.targetMatch[0]])&&(u=w(c.targetMatch)[0]),void 0!==u&&(void 0!==r.validPositions[t+1]&&new RegExp(u).test(n+"0")?(e[t]=n,e[t+1]="0",i={pos:t+2,caret:t}):new RegExp(u).test("0"+n)&&(e[t]="0",e[t+1]=n,i={pos:t+2})),!1===i))return i;if(i.fuzzy&&(e=i.buffer,t=i.pos),(c=j.call(f,t,a,r)).targetMatch&&c.targetMatch[0]&&void 0!==y[c.targetMatch[0]]){var p=w(c.targetMatch);u=p[0];var d=e.slice(c.targetMatchIndex,c.targetMatchIndex+c.targetMatch[0].length);if(!1===new RegExp(u).test(d.join(""))&&2===c.targetMatch[0].length&&r.validPositions[c.targetMatchIndex]&&r.validPositions[c.targetMatchIndex+1]&&(r.validPositions[c.targetMatchIndex+1].input="0"),"year"==p[2])for(var h=s.getMaskTemplate.call(f,!1,1,void 0,!0),v=t+1;v=s.getTime())&&(e.date.setFullYear(m),e.year=i,t.insert=[{pos:t.pos+1,c:o[0]},{pos:t.pos+2,c:o[1]}])}}return t}(k,g,a)),g=function(e,t,n,i,a){if(!t)return t;if(t&&n.min&&!isNaN(n.min.date.getTime())){var r;for(e.reset(),P(n).lastIndex=0;r=P(n).exec(n.inputFormat);){var o;if((o=w(r))&&o[3]){for(var s=o[1],l=e[o[2]],c=n.min[o[2]],u=n.max?n.max[o[2]]:c+1,f=[],p=!1,d=0;dc[d]):(d+r.index==0&&l[d]e.date.getTime()&&(f[d]=u[d]));s.call(e._date,f.join(""))}}t=n.min.date.getTime()<=e.date.getTime(),e.reInit()}return t&&n.max&&(isNaN(n.max.date.getTime())||(t=n.max.date.getTime()>=e.date.getTime())),t}(k,g=S.call(f,k,g,a),a,r)),void 0!==t&&g&&i.pos!==t?{buffer:O(a.inputFormat,k,a).split(""),refreshFromBuffer:{start:t,end:i.pos},pos:i.caret||i.pos}:g},onKeyDown:function(e,t,n,i){e.ctrlKey&&e.key===r.keys.ArrowRight&&(this.inputmask._valueSet(E(new Date,i)),d(this).trigger("setvalue"))},onUnMask:function(e,t,n){return t?O(n.outputFormat,_.call(this,e,n.inputFormat,n),n,!0):t},casing:function(e,t,n,i){if(0==t.nativeDef.indexOf("[ap]"))return e.toLowerCase();if(0==t.nativeDef.indexOf("[AP]"))return e.toUpperCase();var a=s.getTest.call(this,[n-1]);return 0==a.match.def.indexOf("[AP]")||0===n||a&&a.input===String.fromCharCode(r.keyCode.Space)||a&&a.match.def===String.fromCharCode(r.keyCode.Space)?e.toUpperCase():e.toLowerCase()},onBeforeMask:function(e,t){return"[object Date]"===Object.prototype.toString.call(e)&&(e=E(e,t)),e},insertMode:!1,insertModeVisual:!1,shiftPositions:!1,keepStatic:!1,inputmode:"numeric",prefillYear:!0}})},1313:function(e,t,n){var i,a=(i=n(2394))&&i.__esModule?i:{default:i};a.default.dependencyLib.extend(!0,a.default.prototype.i18n,{dayNames:["Mon","Tue","Wed","Thu","Fri","Sat","Sun","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],ordinalSuffix:["st","nd","rd","th"]})},3851:function(e,t,n){var i,a=(i=n(2394))&&i.__esModule?i:{default:i},r=n(8711),o=n(4713);function s(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n-1&&"."!==t.buffer[n-1]?(e=t.buffer[n-1]+e,e=n-2>-1&&"."!==t.buffer[n-2]?t.buffer[n-2]+e:"0"+e):e="00"+e,a.greedy&&parseInt(e)>255&&c.test("00"+e.charAt(2))){var r=[].concat(s(t.buffer.slice(0,n)),[".",e.charAt(2)]);if(r.join("").match(/\./g).length<4)return{refreshFromBuffer:!0,buffer:r,caret:n+2}}return c.test(e)}a.default.extendAliases({cssunit:{regex:"[+-]?[0-9]+\\.?([0-9]+)?(px|em|rem|ex|%|in|cm|mm|pt|pc)"},url:{regex:"(https?|ftp)://.*",autoUnmask:!1,keepStatic:!1,tabThrough:!0},ip:{mask:"i{1,3}.j{1,3}.k{1,3}.l{1,3}",definitions:{i:{validator:u},j:{validator:u},k:{validator:u},l:{validator:u}},onUnMask:function(e,t,n){return e},inputmode:"decimal",substitutes:{",":"."}},email:{mask:function(e){var t=e.separator,n=e.quantifier,i="*{1,64}[.*{1,64}][.*{1,64}][.*{1,63}]@-{1,63}.-{1,63}[.-{1,63}][.-{1,63}]",a=i;if(t)for(var r=0;r0&&t>0&&(!n.digitsOptional||i)){var a=e.indexOf(n.radixPoint),r=!1;n.negationSymbol.back===e[e.length-1]&&(r=!0,e.length--),-1===a&&(e.push(n.radixPoint),a=e.length-1);for(var o=1;o<=t;o++)isFinite(e[a+o])||(e[a+o]="0")}return r&&e.push(n.negationSymbol.back),e}function f(e,t){var n=0;for(var i in"+"===e&&(n=o.seekNext.call(this,t.validPositions.length-1)),t.tests)if((i=parseInt(i))>=n)for(var a=0,r=t.tests[i].length;a1&&(e.placeholder=e.placeholder.charAt(0)),"radixFocus"===e.positionCaretOnClick&&""===e.placeholder&&(e.positionCaretOnClick="lvp");var t="0",n=e.radixPoint;!0===e.numericInput&&void 0===e.__financeInput?(t="1",e.positionCaretOnClick="radixFocus"===e.positionCaretOnClick?"lvp":e.positionCaretOnClick,e.digitsOptional=!1,isNaN(e.digits)&&(e.digits=2),e._radixDance=!1,n=","===e.radixPoint?"?":"!",""!==e.radixPoint&&void 0===e.definitions[n]&&(e.definitions[n]={},e.definitions[n].validator="["+e.radixPoint+"]",e.definitions[n].placeholder=e.radixPoint,e.definitions[n].static=!0,e.definitions[n].generated=!0)):(e.__financeInput=!1,e.numericInput=!0);var a,r="[+]";if(r+=c(e.prefix,e),""!==e.groupSeparator?(void 0===e.definitions[e.groupSeparator]&&(e.definitions[e.groupSeparator]={},e.definitions[e.groupSeparator].validator="["+e.groupSeparator+"]",e.definitions[e.groupSeparator].placeholder=e.groupSeparator,e.definitions[e.groupSeparator].static=!0,e.definitions[e.groupSeparator].generated=!0),r+=e._mask(e)):r+="9{+}",void 0!==e.digits&&0!==e.digits){var o=e.digits.toString().split(",");isFinite(o[0])&&o[1]&&isFinite(o[1])?r+=n+t+"{"+e.digits+"}":(isNaN(e.digits)||parseInt(e.digits)>0)&&(e.digitsOptional||e.jitMasking?(a=r+n+t+"{0,"+e.digits+"}",e.keepStatic=!0):r+=n+t+"{"+e.digits+"}")}else e.inputmode="numeric";return r+=c(e.suffix,e),r+="[-]",a&&(r=[a+c(e.suffix,e)+"[-]",r]),e.greedy=!1,function(e){void 0===e.parseMinMaxOptions&&(null!==e.min&&(e.min=e.min.toString().replace(new RegExp((0,i.default)(e.groupSeparator),"g"),""),","===e.radixPoint&&(e.min=e.min.replace(e.radixPoint,".")),e.min=isFinite(e.min)?parseFloat(e.min):NaN,isNaN(e.min)&&(e.min=Number.MIN_VALUE)),null!==e.max&&(e.max=e.max.toString().replace(new RegExp((0,i.default)(e.groupSeparator),"g"),""),","===e.radixPoint&&(e.max=e.max.replace(e.radixPoint,".")),e.max=isFinite(e.max)?parseFloat(e.max):NaN,isNaN(e.max)&&(e.max=Number.MAX_VALUE)),e.parseMinMaxOptions="done")}(e),""!==e.radixPoint&&e.substituteRadixPoint&&(e.substitutes["."==e.radixPoint?",":"."]=e.radixPoint),r},_mask:function(e){return"("+e.groupSeparator+"999){+|1}"},digits:"*",digitsOptional:!0,enforceDigitsOnBlur:!1,radixPoint:".",positionCaretOnClick:"radixFocus",_radixDance:!0,groupSeparator:"",allowMinus:!0,negationSymbol:{front:"-",back:""},prefix:"",suffix:"",min:null,max:null,SetMaxOnOverflow:!1,step:1,inputType:"text",unmaskAsNumber:!1,roundingFN:Math.round,inputmode:"decimal",shortcuts:{k:"1000",m:"1000000"},placeholder:"0",greedy:!1,rightAlign:!0,insertMode:!0,autoUnmask:!1,skipOptionalPartCharacter:"",usePrototypeDefinitions:!1,stripLeadingZeroes:!0,substituteRadixPoint:!0,definitions:{0:{validator:d},1:{validator:d,definitionSymbol:"9"},9:{validator:"[0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]",definitionSymbol:"*"},"+":{validator:function(e,t,n,i,a){return a.allowMinus&&("-"===e||e===a.negationSymbol.front)}},"-":{validator:function(e,t,n,i,a){return a.allowMinus&&e===a.negationSymbol.back}}},preValidation:function(e,t,n,i,a,r,o,s){var l=this;if(!1!==a.__financeInput&&n===a.radixPoint)return!1;var c=e.indexOf(a.radixPoint),u=t;if(t=function(e,t,n,i,a){return a._radixDance&&a.numericInput&&t!==a.negationSymbol.back&&e<=n&&(n>0||t==a.radixPoint)&&(void 0===i.validPositions[e-1]||i.validPositions[e-1].input!==a.negationSymbol.back)&&(e-=1),e}(t,n,c,r,a),"-"===n||n===a.negationSymbol.front){if(!0!==a.allowMinus)return!1;var d=!1,h=p("+",r),m=p("-",r);return-1!==h&&(d=[h],-1!==m&&d.push(m)),!1!==d?{remove:d,caret:u-a.negationSymbol.back.length}:{insert:[{pos:f.call(l,"+",r),c:a.negationSymbol.front,fromIsValid:!0},{pos:f.call(l,"-",r),c:a.negationSymbol.back,fromIsValid:void 0}],caret:u+a.negationSymbol.back.length}}if(n===a.groupSeparator)return{caret:u};if(s)return!0;if(-1!==c&&!0===a._radixDance&&!1===i&&n===a.radixPoint&&void 0!==a.digits&&(isNaN(a.digits)||parseInt(a.digits)>0)&&c!==t){var v=f.call(l,a.radixPoint,r);return r.validPositions[v]&&(r.validPositions[v].generatedInput=r.validPositions[v].generated||!1),{caret:a._radixDance&&t===c-1?c+1:c}}if(!1===a.__financeInput)if(i){if(a.digitsOptional)return{rewritePosition:o.end};if(!a.digitsOptional){if(o.begin>c&&o.end<=c)return n===a.radixPoint?{insert:{pos:c+1,c:"0",fromIsValid:!0},rewritePosition:c}:{rewritePosition:c+1};if(o.begin0&&""===this.__valueGet.call(this.el))return{rewritePosition:c};return{rewritePosition:t}},postValidation:function(e,t,n,i,a,r,o){if(!1===i)return i;if(o)return!0;if(null!==a.min||null!==a.max){var s=a.onUnMask(e.slice().reverse().join(""),void 0,l.extend({},a,{unmaskAsNumber:!0}));if(null!==a.min&&sa.min.toString().length||s<0))return!1;if(null!==a.max&&s>a.max)return!!a.SetMaxOnOverflow&&{refreshFromBuffer:!0,buffer:u(a.max.toString().replace(".",a.radixPoint).split(""),a.digits,a).reverse()}}return i},onUnMask:function(e,t,n){if(""===t&&!0===n.nullable)return t;var a=e.replace(n.prefix,"");return a=(a=a.replace(n.suffix,"")).replace(new RegExp((0,i.default)(n.groupSeparator),"g"),""),""!==n.placeholder.charAt(0)&&(a=a.replace(new RegExp(n.placeholder.charAt(0),"g"),"0")),n.unmaskAsNumber?(""!==n.radixPoint&&-1!==a.indexOf(n.radixPoint)&&(a=a.replace(i.default.call(this,n.radixPoint),".")),a=(a=a.replace(new RegExp("^"+(0,i.default)(n.negationSymbol.front)),"-")).replace(new RegExp((0,i.default)(n.negationSymbol.back)+"$"),""),Number(a)):a},isComplete:function(e,t){var n=(t.numericInput?e.slice().reverse():e).join("");return n=(n=(n=(n=(n=n.replace(new RegExp("^"+(0,i.default)(t.negationSymbol.front)),"-")).replace(new RegExp((0,i.default)(t.negationSymbol.back)+"$"),"")).replace(t.prefix,"")).replace(t.suffix,"")).replace(new RegExp((0,i.default)(t.groupSeparator)+"([0-9]{3})","g"),"$1"),","===t.radixPoint&&(n=n.replace((0,i.default)(t.radixPoint),".")),isFinite(n)},onBeforeMask:function(e,t){var n;e=null!==(n=e)&&void 0!==n?n:"";var a=t.radixPoint||",";isFinite(t.digits)&&(t.digits=parseInt(t.digits)),"number"!=typeof e&&"number"!==t.inputType||""===a||(e=e.toString().replace(".",a));var r="-"===e.charAt(0)||e.charAt(0)===t.negationSymbol.front,o=e.split(a),s=o[0].replace(/[^\-0-9]/g,""),l=o.length>1?o[1].replace(/[^0-9]/g,""):"",c=o.length>1;e=s+(""!==l?a+l:l);var f=0;if(""!==a&&(f=t.digitsOptional?t.digitst.max&&(e=t.max.toString().replace(".",a))}return r&&"-"!==e.charAt(0)&&(e="-"+e),u(e.toString().split(""),f,t,c).join("")},onBeforeWrite:function(e,t,n,a){function r(e,t){if(!1!==a.__financeInput||t){var n=e.indexOf(a.radixPoint);-1!==n&&e.splice(n,1)}if(""!==a.groupSeparator)for(;-1!==(n=e.indexOf(a.groupSeparator));)e.splice(n,1);return e}var o,s;if(a.stripLeadingZeroes&&(s=function(e,t){var n=new RegExp("(^"+(""!==t.negationSymbol.front?(0,i.default)(t.negationSymbol.front)+"?":"")+(0,i.default)(t.prefix)+")(.*)("+(0,i.default)(t.suffix)+(""!=t.negationSymbol.back?(0,i.default)(t.negationSymbol.back)+"?":"")+"$)").exec(e.slice().reverse().join("")),a=n?n[2]:"",r=!1;return a&&(a=a.split(t.radixPoint.charAt(0))[0],r=new RegExp("^[0"+t.groupSeparator+"]*").exec(a)),!(!r||!(r[0].length>1||r[0].length>0&&r[0].length0;p--)this.maskset.validPositions.splice(c+p,1),delete t[c+p];if(e)switch(e.type){case"blur":case"checkval":if(null!==a.min){var d=a.onUnMask(t.slice().reverse().join(""),void 0,l.extend({},a,{unmaskAsNumber:!0}));if(null!==a.min&&d1)return this.inputmask.__valueSet.call(this,parseFloat(this.inputmask.unmaskedvalue())*parseInt(s)),o.trigger("setvalue"),!1}if(e.ctrlKey)switch(e.key){case r.keys.ArrowUp:return this.inputmask.__valueSet.call(this,parseFloat(this.inputmask.unmaskedvalue())+parseInt(i.step)),o.trigger("setvalue"),!1;case r.keys.ArrowDown:return this.inputmask.__valueSet.call(this,parseFloat(this.inputmask.unmaskedvalue())-parseInt(i.step)),o.trigger("setvalue"),!1}if(!e.shiftKey&&(e.key===r.keys.Delete||e.key===r.keys.Backspace||e.key===r.keys.BACKSPACE_SAFARI)&&n.begin!==t.length){if(t[e.key===r.keys.Delete?n.begin-1:n.end]===i.negationSymbol.front)return a=t.slice().reverse(),""!==i.negationSymbol.front&&a.shift(),""!==i.negationSymbol.back&&a.pop(),o.trigger("setvalue",[a.join(""),n.begin]),!1;if(!0===i._radixDance){var f,p=t.indexOf(i.radixPoint);if(i.digitsOptional){if(0===p)return(a=t.slice().reverse()).pop(),o.trigger("setvalue",[a.join(""),n.begin>=a.length?a.length:n.begin]),!1}else if(-1!==p&&(n.begin=a.length?p+1:n.begin]),!1}}}},currency:{prefix:"",groupSeparator:",",alias:"numeric",digits:2,digitsOptional:!1},decimal:{alias:"numeric"},integer:{alias:"numeric",inputmode:"numeric",digits:0},percentage:{alias:"numeric",min:0,max:100,suffix:" %",digits:0,allowMinus:!1},indianns:{alias:"numeric",_mask:function(e){return"("+e.groupSeparator+"99){*|1}("+e.groupSeparator+"999){1|1}"},groupSeparator:",",radixPoint:".",placeholder:"0",digits:2,digitsOptional:!1}})},9380:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=!("undefined"==typeof window||!window.document||!window.document.createElement);t.default=n?window:{}},7760:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.HandleNativePlaceholder=function(e,t){var n=e?e.inputmask:this;if(i.ie){if(e.inputmask._valueGet()!==t&&(e.placeholder!==t||""===e.placeholder)){var a=o.getBuffer.call(n).slice(),r=e.inputmask._valueGet();if(r!==t){var s=o.getLastValidPosition.call(n);-1===s&&r===o.getBufferTemplate.call(n).join("")?a=[]:-1!==s&&u.call(n,a),p(e,a)}}}else e.placeholder!==t&&(e.placeholder=t,""===e.placeholder&&e.removeAttribute("placeholder"))},t.applyInputValue=c,t.checkVal=f,t.clearOptionalTail=u,t.unmaskedvalue=function(e){var t=e?e.inputmask:this,n=t.opts,i=t.maskset;if(e){if(void 0===e.inputmask)return e.value;e.inputmask&&e.inputmask.refreshValue&&c(e,e.inputmask._valueGet(!0))}for(var a=[],r=i.validPositions,s=0,l=r.length;s0&&" "===n[i-1];)i--;var a=0===i&&!o.isMask.call(u,e)&&(l.getTest.call(u,e).match.nativeDef===t.charAt(0)||!0===l.getTest.call(u,e).match.static&&l.getTest.call(u,e).match.nativeDef==="'"+t.charAt(0)||" "===l.getTest.call(u,e).match.nativeDef&&(l.getTest.call(u,e+1).match.nativeDef===t.charAt(0)||!0===l.getTest.call(u,e+1).match.static&&l.getTest.call(u,e+1).match.nativeDef==="'"+t.charAt(0)));if(!a&&i>0&&!o.isMask.call(u,e,!1,!0)){var r=o.seekNext.call(u,e);u.caretPos.begin0){var x,w,P=o.seekNext.call(u,-1,void 0,!1);if(!s.isComplete.call(u,o.getBuffer.call(u))&&k.length<=P||s.isComplete.call(u,o.getBuffer.call(u))&&k.length>0&&k.length!==P&&0===k[0])for(var S=P;void 0!==(x=k.shift());)if(xi&&!f.isMask.call(this,a);a--);return n.splice(i,a+1-i),p.isComplete.call(this,n)&&e===(this.isRTL?f.getBuffer.call(this).slice().reverse().join(""):f.getBuffer.call(this).join(""))},format:function(e,t){this.maskset=this.maskset||(0,u.generateMaskSet)(this.opts,this.noMasksCache);var n=("function"==typeof this.opts.onBeforeMask&&this.opts.onBeforeMask.call(this,e,this.opts)||e).split("");l.checkVal.call(this,void 0,!0,!1,n);var i=this.isRTL?f.getBuffer.call(this).slice().reverse().join(""):f.getBuffer.call(this).join("");return t?{value:i,metadata:this.getmetadata()}:i},setValue:function(e){this.el&&(0,r.default)(this.el).trigger("setvalue",[e])},analyseMask:u.analyseMask},y.extendDefaults=function(e){r.default.extend(!0,y.prototype.defaults,e)},y.extendDefinitions=function(e){r.default.extend(!0,y.prototype.definitions,e)},y.extendAliases=function(e){r.default.extend(!0,y.prototype.aliases,e)},y.format=function(e,t,n){return y(t).format(e,n)},y.unmask=function(e,t){return y(t).unmaskedvalue(e)},y.isValid=function(e,t){return y(t).isValid(e)},y.remove=function(e){"string"==typeof e&&(e=v.getElementById(e)||v.querySelectorAll(e)),(e=e.nodeName?[e]:e).forEach((function(e){e.inputmask&&e.inputmask.remove()}))},y.setValue=function(e,t){"string"==typeof e&&(e=v.getElementById(e)||v.querySelectorAll(e)),(e=e.nodeName?[e]:e).forEach((function(e){e.inputmask?e.inputmask.setValue(t):(0,r.default)(e).trigger("setvalue",[t])}))},y.dependencyLib=r.default,s.default.Inputmask=y;t.default=y},5296:function(e,t,n){function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}var a=d(n(9380)),r=d(n(2394));function o(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n0){if(k(c=v[v.length-1],a),c.isAlternator){u=v.pop();for(var e=0;e0?(c=v[v.length-1]).matches.push(u):m.matches.push(u)}}else k(m,a)}function x(e){var t=new o.default(!0);return t.openGroup=!1,t.matches=e,t}function w(){if((l=v.pop()).openGroup=!1,void 0!==l)if(v.length>0){if((c=v[v.length-1]).matches.push(l),c.isAlternator){u=v.pop();for(var e=0;e0?(c=v[v.length-1]).matches.push(u):m.matches.push(u)}}else m.matches.push(l);else b()}function P(e){var t=e.pop();return t.isQuantifier&&(t=x([e.pop(),t])),t}t&&(n.optionalmarker[0]=void 0,n.optionalmarker[1]=void 0);for(;i=t?d.exec(e):p.exec(e);){if(a=i[0],t){switch(a.charAt(0)){case"?":a="{0,1}";break;case"+":case"*":a="{"+a+"}";break;case"|":if(0===v.length){var S=x(m.matches);S.openGroup=!0,v.push(S),m.matches=[],y=!0}}switch(a){case"\\d":a="[0-9]";break;case"\\p":a+=d.exec(e)[0],a+=d.exec(e)[0]}}if(h)b();else switch(a.charAt(0)){case"$":case"^":t||b();break;case n.escapeChar:h=!0,t&&b();break;case n.optionalmarker[1]:case n.groupmarker[1]:w();break;case n.optionalmarker[0]:v.push(new o.default(!1,!0));break;case n.groupmarker[0]:v.push(new o.default(!0));break;case n.quantifiermarker[0]:var O=new o.default(!1,!1,!0),M=(a=a.replace(/[{}?]/g,"")).split("|"),_=M[0].split(","),E=isNaN(_[0])?_[0]:parseInt(_[0]),j=1===_.length?E:isNaN(_[1])?_[1]:parseInt(_[1]),T=isNaN(M[1])?M[1]:parseInt(M[1]);"*"!==E&&"+"!==E||(E="*"===j?0:1),O.quantifier={min:E,max:j,jit:T};var A=v.length>0?v[v.length-1].matches:m.matches;(i=A.pop()).isGroup||(i=x([i])),A.push(i),A.push(O);break;case n.alternatormarker:if(v.length>0){var D=(c=v[v.length-1]).matches[c.matches.length-1];f=c.openGroup&&(void 0===D.matches||!1===D.isGroup&&!1===D.isAlternator)?v.pop():P(c.matches)}else f=P(m.matches);if(f.isAlternator)v.push(f);else if(f.alternatorGroup?(u=v.pop(),f.alternatorGroup=!1):u=new o.default(!1,!1,!1,!0),u.matches.push(f),v.push(u),f.openGroup){f.openGroup=!1;var L=new o.default(!0);L.alternatorGroup=!0,v.push(L)}break;default:b()}}y&&w();for(;v.length>0;)l=v.pop(),m.matches.push(l);m.matches.length>0&&(!function e(i){i&&i.matches&&i.matches.forEach((function(a,r){var o=i.matches[r+1];(void 0===o||void 0===o.matches||!1===o.isQuantifier)&&a&&a.isGroup&&(a.isGroup=!1,t||(k(a,n.groupmarker[0],0),!0!==a.openGroup&&k(a,n.groupmarker[1]))),e(a)}))}(m),g.push(m));(n.numericInput||n.isRTL)&&function e(t){for(var i in t.matches=t.matches.reverse(),t.matches)if(Object.prototype.hasOwnProperty.call(t.matches,i)){var a=parseInt(i);if(t.matches[i].isQuantifier&&t.matches[a+1]&&t.matches[a+1].isGroup){var r=t.matches[i];t.matches.splice(i,1),t.matches.splice(a+1,0,r)}void 0!==t.matches[i].matches?t.matches[i]=e(t.matches[i]):t.matches[i]=((o=t.matches[i])===n.optionalmarker[0]?o=n.optionalmarker[1]:o===n.optionalmarker[1]?o=n.optionalmarker[0]:o===n.groupmarker[0]?o=n.groupmarker[1]:o===n.groupmarker[1]&&(o=n.groupmarker[0]),o)}var o;return t}(g[0]);return g},t.generateMaskSet=function(e,t){var n;function o(e,t){var n=t.repeat,i=t.groupmarker,r=t.quantifiermarker,o=t.keepStatic;if(n>0||"*"===n||"+"===n){var s="*"===n?0:"+"===n?1:n;if(s!=n)e=i[0]+e+i[1]+r[0]+s+","+n+r[1];else for(var c=e,u=1;u1){null===e.keepStatic&&(e.keepStatic=!0);var u=e.groupmarker[0];return(e.isRTL?e.mask.reverse():e.mask).forEach((function(t){u.length>1&&(u+=e.alternatormarker),void 0!==t.mask&&"function"!=typeof t.mask?u+=t.mask:u+=t})),c(u+=e.groupmarker[1],e.mask,e)}e.mask=e.mask.pop()}n=e.mask&&void 0!==e.mask.mask&&"function"!=typeof e.mask.mask?c(e.mask.mask,e.mask,e):c(e.mask,e.mask,e);null===e.keepStatic&&(e.keepStatic=!1);return n};var i=c(n(3287)),a=c(n(7184)),r=c(n(2394)),o=c(n(9695));function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n>>0;if(0===i)return!1;for(var a=0|t,r=Math.max(a>=0?a:i-Math.abs(a),0);rthis.length)&&-1!==this.indexOf(e,t)})},8711:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.caret=function(e,t,n,i,r){var o,s=this,l=this.opts;if(void 0===t)return"selectionStart"in e&&"selectionEnd"in e?(t=e.selectionStart,n=e.selectionEnd):a.default.getSelection?(o=a.default.getSelection().getRangeAt(0)).commonAncestorContainer.parentNode!==e&&o.commonAncestorContainer!==e||(t=o.startOffset,n=o.endOffset):document.selection&&document.selection.createRange&&(n=(t=0-(o=document.selection.createRange()).duplicate().moveStart("character",-e.inputmask._valueGet().length))+o.text.length),{begin:i?t:f.call(s,t),end:i?n:f.call(s,n)};if(Array.isArray(t)&&(n=s.isRTL?t[0]:t[1],t=s.isRTL?t[1]:t[0]),void 0!==t.begin&&(n=s.isRTL?t.begin:t.end,t=s.isRTL?t.end:t.begin),"number"==typeof t){t=i?t:f.call(s,t),n="number"==typeof(n=i?n:f.call(s,n))?n:t;var c=parseInt(((e.ownerDocument.defaultView||a.default).getComputedStyle?(e.ownerDocument.defaultView||a.default).getComputedStyle(e,null):e.currentStyle).fontSize)*n;if(e.scrollLeft=c>e.scrollWidth?c:0,e.inputmask.caretPos={begin:t,end:n},l.insertModeVisual&&!1===l.insertMode&&t===n&&(r||n++),e===(e.inputmask.shadowRoot||e.ownerDocument).activeElement){if("setSelectionRange"in e)e.setSelectionRange(t,n);else if(a.default.getSelection){if(o=document.createRange(),void 0===e.firstChild||null===e.firstChild){var u=document.createTextNode("");e.appendChild(u)}o.setStart(e.firstChild,tc&&(((n=u[t]).match.optionality||n.match.optionalQuantifier&&n.match.newBlockMarker||m&&(m!==u[t].locator[f.alternation]&&!0!==n.match.static||!0===n.match.static&&n.locator[f.alternation]&&r.checkAlternationMatch.call(i,n.locator[f.alternation].toString().split(","),m.toString().split(","))&&""!==o.getTests.call(i,t)[0].def))&&p[t]===o.getPlaceholder.call(i,t,n.match));t--)d--;return e?{l:d,def:u[d]?u[d].match:void 0}:d},t.determineNewCaretPosition=function(e,t,n){var i,a,r,f=this,p=f.maskset,d=f.opts;t&&(f.isRTL?e.end=e.begin:e.begin=e.end);if(e.begin===e.end){switch(n=n||d.positionCaretOnClick){case"none":break;case"select":e={begin:0,end:s.call(f).length};break;case"ignore":e.end=e.begin=u.call(f,l.call(f));break;case"radixFocus":if(f.clicked>1&&0===p.validPositions.length)break;if(function(e){if(""!==d.radixPoint&&0!==d.digits){var t=p.validPositions;if(void 0===t[e]||void 0===t[e].input){if(e=y||i===r)&&(r=y)}e.end=e.begin=r}}return e}},t.getBuffer=s,t.getBufferTemplate=function(){var e=this.maskset;void 0===e._buffer&&(e._buffer=o.getMaskTemplate.call(this,!1,1),void 0===e.buffer&&(e.buffer=e._buffer.slice()));return e._buffer},t.getLastValidPosition=l,t.isMask=c,t.resetMaskSet=function(e){var t=this.maskset;t.buffer=void 0,!0!==e&&(t.validPositions=[],t.p=0);!1===e&&(t.tests={},t.jitOffset={})},t.seekNext=u,t.seekPrevious=function(e,t){var n=this,i=e-1;if(e<=0)return 0;for(;i>0&&(!0===t&&(!0!==o.getTest.call(n,i).match.newBlockMarker||!c.call(n,i,void 0,!0))||!0!==t&&!c.call(n,i,void 0,!0));)i--;return i},t.translatePosition=f;var i,a=(i=n(9380))&&i.__esModule?i:{default:i},r=n(7215),o=n(4713);function s(e){var t=this,n=t.maskset;return void 0!==n.buffer&&!0!==e||(n.buffer=o.getMaskTemplate.call(t,!0,l.call(t),!0),void 0===n._buffer&&(n._buffer=n.buffer.slice())),n.buffer}function l(e,t,n){var i=this.maskset,a=-1,r=-1,o=n||i.validPositions;void 0===e&&(e=-1);for(var s=0,l=o.length;s=e&&(r=s));return-1===a||a===e?r:-1===r||e-a-1){if(n){var s=o.getTests.call(i,e);return s.length>1+(""===s[s.length-1].match.def?1:0)}var l=o.determineTestTemplate.call(i,e,o.getTests.call(i,e)),c=o.getPlaceholder.call(i,e,l.match);return l.match.def!==c}return!1}function u(e,t,n){var i=this;void 0===n&&(n=!0);for(var a=e+1;""!==o.getTest.call(i,a).match.def&&(!0===t&&(!0!==o.getTest.call(i,a).match.newBlockMarker||!c.call(i,a,void 0,!0))||!0!==t&&!c.call(i,a,void 0,n));)a++;return a}function f(e){var t=this.opts,n=this.el;return!this.isRTL||"number"!=typeof e||t.greedy&&""===t.placeholder||!n||(e=this._valueGet().length-e)<0&&(e=0),e}},4713:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.determineTestTemplate=f,t.getDecisionTaker=l,t.getMaskTemplate=function(e,t,n,i,a){var r=this,o=this.opts,s=this.maskset,l=o.greedy;a&&o.greedy&&(o.greedy=!1,r.maskset.tests={});t=t||0;var p,d,m,v,g=[],y=0;do{if(!0===e&&s.validPositions[y])d=(m=a&&s.validPositions[y].match.optionality&&void 0===s.validPositions[y+1]&&(!0===s.validPositions[y].generatedInput||s.validPositions[y].input==o.skipOptionalPartCharacter&&y>0)?f.call(r,y,h.call(r,y,p,y-1)):s.validPositions[y]).match,p=m.locator.slice(),g.push(!0===n?m.input:!1===n?d.nativeDef:c.call(r,y,d));else{d=(m=u.call(r,y,p,y-1)).match,p=m.locator.slice();var k=!0!==i&&(!1!==o.jitMasking?o.jitMasking:d.jit);(v=(v||s.validPositions[y-1])&&d.static&&d.def!==o.groupSeparator&&null===d.fn)||!1===k||void 0===k||"number"==typeof k&&isFinite(k)&&k>y?g.push(!1===n?d.nativeDef:c.call(r,g.length,d)):v=!1}y++}while(!0!==d.static||""!==d.def||t>y);""===g[g.length-1]&&g.pop();!1===n&&void 0!==s.maskLength||(s.maskLength=y-1);return o.greedy=l,g},t.getPlaceholder=c,t.getTest=p,t.getTestTemplate=u,t.getTests=h,t.isSubsetOf=d;var i,a=(i=n(2394))&&i.__esModule?i:{default:i},r=n(8711);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function s(e,t){var n=(null!=e.alternation?e.mloc[l(e)]:e.locator).join("");if(""!==n)for(n=n.split(":")[0];n.length0&&(t=t.split(",")[0]),void 0!==t?t.toString():""}function c(e,t,n){var i=this,a=this.opts,s=this.maskset;if(void 0!==(t=t||p.call(i,e).match).placeholder||!0===n){if(""!==t.placeholder&&!0===t.static&&!0!==t.generated){var l=r.getLastValidPosition.call(i,e),c=r.seekNext.call(i,l);return(n?e<=c:e-1&&void 0===s.validPositions[e]){var u,f=h.call(i,e),d=[];if("string"==typeof a.placeholder&&f.length>1+(""===f[f.length-1].match.def?1:0))for(var m=0;m1&&/[0-9a-bA-Z]/.test(d[0].match.def)))return a.placeholder.charAt(e%a.placeholder.length)}return t.def}return"object"===o(a.placeholder)?t.def:a.placeholder.charAt(e%a.placeholder.length)}function u(e,t,n){return this.maskset.validPositions[e]||f.call(this,e,h.call(this,e,t?t.slice():t,n))}function f(e,t){var n=this.opts,i=0,a=function(e,t){var n=0,i=!1;t.forEach((function(e){e.match.optionality&&(0!==n&&n!==e.match.optionality&&(i=!0),(0===n||n>e.match.optionality)&&(n=e.match.optionality))})),n&&(0==e||1==t.length?n=0:i||(n=0));return n}(e,t);e=e>0?e-1:0;var r,o,l,c=s(p.call(this,e));n.greedy&&t.length>1&&""===t[t.length-1].match.def&&(i=1);for(var u=0;u0&&"master"===l.match.newBlockMarker&&(!f.match.optionality||f.match.optionality-a<1||!f.match.newBlockMarker)||l&&!n.greedy&&l.match.optionalQuantifier&&!f.match.optionalQuantifier)&&(o=d,l=f)}return l}function p(e,t){var n=this.maskset;return n.validPositions[e]?n.validPositions[e]:(t||h.call(this,e))[0]}function d(e,t,n){function i(e){for(var t,n=[],i=-1,a=0,r=e.length;at.alternation)for(var a=0;an&&(e.alternation=n),!0}return e.alternation=void 0,!1}(n)}function O(e,t){if(e.locator.length!==t.locator.length)return!1;for(var n=e.alternation+1;ne+c._maxTestPos)throw new Error("Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. ".concat(l.mask));if(h===e&&void 0===r.matches){if(v.push({match:r,locator:s.reverse(),cd:y,mloc:{}}),!r.optionality||void 0!==p||!(c.definitions&&c.definitions[r.nativeDef]&&c.definitions[r.nativeDef].optional||a.default.prototype.definitions[r.nativeDef]&&a.default.prototype.definitions[r.nativeDef].optional))return!0;g=!0,h=e}else if(void 0!==r.matches){if(r.isGroup&&p!==r)return function(){if(r=f(t.matches[t.matches.indexOf(r)+1],s,p))return!0}();if(r.isOptional)return function(){var t=r,a=v.length;if(r=b(r,n,s,p),v.length>0){if(v.forEach((function(e,t){t>=a&&(e.match.optionality=e.match.optionality?e.match.optionality+1:1)})),i=v[v.length-1].match,void 0!==p||!m(i,t))return r;g=!0,h=e}}();if(r.isAlternator)return function(){function i(e){for(var t,n=e.matches[0].matches?e.matches[0].matches.length:1,i=0;i0?n.shift():-1;if(-1===M||"string"==typeof M){var _,E=h,j=n.slice(),T=[];if("string"==typeof M)T=M.split(",");else for(_=0;_=c.keepStatic)&&(T=T.slice(0,1));for(var B=0;Bm.matches[0].matches.length)break;a=v.slice(),h=E,v=[];for(var R=0;R0&&k,r=y.length>0&&!k,k&&g&&!r&&v.forEach((function(e,t){e.unMatchedAlternationStopped=!0})),n=j.slice()}else r=f(m.matches[M]||t.matches[M],[M].concat(s),p);if(r)return!0}();if(r.isQuantifier&&p!==t.matches[t.matches.indexOf(r)-1])return function(){for(var a=r,o=!1,u=n.length>0?n.shift():0;u<(isNaN(a.quantifier.max)?u+1:a.quantifier.max)&&h<=e;u++){var p=t.matches[t.matches.indexOf(a)-1];if(r=f(p,[u].concat(s),p)){if(v.forEach((function(t,n){(i=x(p,t.match)?t.match:v[v.length-1].match).optionalQuantifier=u>=a.quantifier.min,i.jit=(u+1)*(p.matches.indexOf(i)+1)>a.quantifier.jit,i.optionalQuantifier&&m(i,p)&&(g=!0,h=e,c.greedy&&null==l.validPositions[e-1]&&u>a.quantifier.min&&-1!=["*","+"].indexOf(a.quantifier.max)&&(v.pop(),y=void 0),o=!0,r=!1),!o&&i.jit&&(l.jitOffset[e]=p.matches.length-p.matches.indexOf(i))})),o)break;return!0}}}();if(r=b(r,n,s,p))return!0}else h++}for(var p=n.length>0?n.shift():0;pe)break}}function x(e,t){var n=-1!=e.matches.indexOf(t);return n||e.matches.forEach((function(e,i){void 0===e.matches||n||(n=x(e,t))})),n}if(e>-1){if(void 0===t){for(var w,P=e-1;void 0===(w=l.validPositions[P]||l.tests[P])&&P>-1;)P--;void 0!==w&&P>-1&&(m=function(e,t){var n,i=[];return Array.isArray(t)||(t=[t]),t.length>0&&(void 0===t[0].alternation||!0===c.keepStatic?0===(i=f.call(o,e,t.slice()).locator.slice()).length&&(i=t[0].locator.slice()):t.forEach((function(e){""!==e.def&&(0===i.length?(n=e.alternation,i=e.locator.slice()):e.locator[n]&&-1===i[n].toString().indexOf(e.locator[n])&&(i[n]+=","+e.locator[n]))}))),i}(P,w),y=m.join(""),h=P)}if(l.tests[e]&&l.tests[e][0].cd===y)return l.tests[e];for(var S=m.shift();Se)break}}return(0===v.length||g)&&v.push({match:{fn:null,static:!0,optionality:!1,casing:null,def:"",placeholder:""},locator:k&&0===v.filter((function(e){return!0!==e.unMatchedAlternationStopped})).length?[0]:[],mloc:{},cd:y}),void 0!==t&&l.tests[e]?r=s.extend(!0,[],v):(l.tests[e]=s.extend(!0,[],v),r=l.tests[e]),v.forEach((function(e){e.match.optionality=e.match.defOptionality||!1})),r}},7215:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.alternate=s,t.checkAlternationMatch=function(e,t,n){for(var i,a=this.opts.greedy?t:t.slice(0,1),r=!1,o=void 0!==n?n.split(","):[],s=0;s=r.getBuffer.call(c).length&&h>=n.end&&(n.end=h+1);t===a.keys.Backspace?n.end-n.begin<1&&(n.begin=r.seekPrevious.call(c,n.begin)):t===a.keys.Delete&&n.begin===n.end&&(n.end=r.isMask.call(c,n.end,!0,!0)?n.end+1:r.seekNext.call(c,n.end)+1);!1!==(d=m.call(c,n))&&((!0!==i&&!1!==f.keepStatic||null!==f.regex&&-1!==o.getTest.call(c,n.begin).match.def.indexOf("|"))&&s.call(c,!0),!0!==i&&(u.p=t===a.keys.Delete?n.begin+d:n.begin,u.p=r.determineNewCaretPosition.call(c,{begin:u.p,end:u.p},!1,!1===f.insertMode&&t===a.keys.Backspace?"none":void 0).begin))},t.isComplete=c,t.isSelection=u,t.isValid=f,t.refreshFromBuffer=d,t.revalidateMask=m;var i=n(6030),a=n(2839),r=n(8711),o=n(4713);function s(e,t,n,i,a,l){var c=this,u=this.dependencyLib,p=this.opts,d=c.maskset;if(!c.hasAlternator)return!1;var h,m,v,g,y,k,b,x,w,P,S,O=u.extend(!0,[],d.validPositions),M=u.extend(!0,{},d.tests),_=!1,E=!1,j=void 0!==a?a:r.getLastValidPosition.call(c);if(l&&(P=l.begin,S=l.end,l.begin>l.end&&(P=l.end,S=l.begin)),-1===j&&void 0===a)h=0,m=(g=o.getTest.call(c,h)).alternation;else for(;j>=0;j--)if((v=d.validPositions[j])&&void 0!==v.alternation){if(j<=(e||0)&&g&&g.locator[v.alternation]!==v.locator[v.alternation])break;h=j,m=d.validPositions[h].alternation,g=v}if(void 0!==m){b=parseInt(h),d.excludes[b]=d.excludes[b]||[],!0!==e&&d.excludes[b].push((0,o.getDecisionTaker)(g)+":"+g.alternation);var T=[],A=-1;for(y=b;b=S)&&T.push(k.input),d.validPositions.splice(b,1);for(-1===A&&void 0!==t&&(T.push(t),A=T.length-1);void 0!==d.excludes[b]&&d.excludes[b].length<10;){for(d.tests={},r.resetMaskSet.call(c,!0),_=!0,y=0;yt:e.end-e.begin>t}function f(e,t,n,i,a,p,v){var g=this,y=this.dependencyLib,k=this.opts,b=g.maskset;n=!0===n;var x=e;function w(e){if(void 0!==e){if(void 0!==e.remove&&(Array.isArray(e.remove)||(e.remove=[e.remove]),e.remove.sort((function(e,t){return g.isRTL?e.pos-t.pos:t.pos-e.pos})).forEach((function(e){m.call(g,{begin:e,end:e+1})})),e.remove=void 0),void 0!==e.insert&&(Array.isArray(e.insert)||(e.insert=[e.insert]),e.insert.sort((function(e,t){return g.isRTL?t.pos-e.pos:e.pos-t.pos})).forEach((function(e){""!==e.c&&f.call(g,e.pos,e.c,void 0===e.strict||e.strict,void 0!==e.fromIsValid?e.fromIsValid:i)})),e.insert=void 0),e.refreshFromBuffer&&e.buffer){var t=e.refreshFromBuffer;d.call(g,!0===t?t:t.start,t.end,e.buffer),e.refreshFromBuffer=void 0}void 0!==e.rewritePosition&&(x=e.rewritePosition,e=!0)}return e}function P(t,n,a){var s=!1;return o.getTests.call(g,t).every((function(c,f){var p=c.match;if(r.getBuffer.call(g,!0),!1!==(s=(!p.jit||void 0!==b.validPositions[r.seekPrevious.call(g,t)])&&(null!=p.fn?p.fn.test(n,b,t,a,k,u.call(g,e)):(n===p.def||n===k.skipOptionalPartCharacter)&&""!==p.def&&{c:o.getPlaceholder.call(g,t,p,!0)||p.def,pos:t}))){var d=void 0!==s.c?s.c:n,h=t;return d=d===k.skipOptionalPartCharacter&&!0===p.static?o.getPlaceholder.call(g,t,p,!0)||p.def:d,!0!==(s=w(s))&&void 0!==s.pos&&s.pos!==t&&(h=s.pos),!0!==s&&void 0===s.pos&&void 0===s.c?!1:(!1===m.call(g,e,y.extend({},c,{input:l.call(g,d,p,h)}),i,h)&&(s=!1),!1)}return!0})),s}void 0!==e.begin&&(x=g.isRTL?e.end:e.begin);var S=!0,O=y.extend(!0,[],b.validPositions);if(!1===k.keepStatic&&void 0!==b.excludes[x]&&!0!==a&&!0!==i)for(var M=x;M<(g.isRTL?e.begin:e.end);M++)void 0!==b.excludes[M]&&(b.excludes[M]=void 0,delete b.tests[M]);if("function"==typeof k.preValidation&&!0!==i&&!0!==p&&(S=w(S=k.preValidation.call(g,r.getBuffer.call(g),x,t,u.call(g,e),k,b,e,n||a))),!0===S){if(S=P(x,t,n),(!n||!0===i)&&!1===S&&!0!==p){var _=b.validPositions[x];if(!_||!0!==_.match.static||_.match.def!==t&&t!==k.skipOptionalPartCharacter){if(k.insertMode||void 0===b.validPositions[r.seekNext.call(g,x)]||e.end>x){var E=!1;if(b.jitOffset[x]&&void 0===b.validPositions[r.seekNext.call(g,x)]&&!1!==(S=f.call(g,x+b.jitOffset[x],t,!0,!0))&&(!0!==a&&(S.caret=x),E=!0),e.end>x&&(b.validPositions[x]=void 0),!E&&!r.isMask.call(g,x,k.keepStatic&&0===x))for(var j=x+1,T=r.seekNext.call(g,x,!1,0!==x);j<=T;j++)if(!1!==(S=P(j,t,n))){S=h.call(g,x,void 0!==S.pos?S.pos:j)||S,x=j;break}}}else S={caret:r.seekNext.call(g,x)}}g.hasAlternator&&!0!==a&&!n&&(a=!0,!1===S&&k.keepStatic&&(c.call(g,r.getBuffer.call(g))||0===x)?S=s.call(g,x,t,n,i,void 0,e):(u.call(g,e)&&b.tests[x]&&b.tests[x].length>1&&k.keepStatic||1==S&&!0!==k.numericInput&&b.tests[x]&&b.tests[x].length>1&&r.getLastValidPosition.call(g,void 0,!0)>x)&&(S=s.call(g,!0))),!0===S&&(S={pos:x})}if("function"==typeof k.postValidation&&!0!==i&&!0!==p){var A=k.postValidation.call(g,r.getBuffer.call(g,!0),void 0!==e.begin?g.isRTL?e.end:e.begin:e,t,S,k,b,n,v);void 0!==A&&(S=!0===A?S:A)}S&&void 0===S.pos&&(S.pos=x),!1===S||!0===p?(r.resetMaskSet.call(g,!0),b.validPositions=y.extend(!0,[],O)):h.call(g,void 0,x,!0);var D=w(S);void 0!==g.maxLength&&(r.getBuffer.call(g).length>g.maxLength&&!i&&(r.resetMaskSet.call(g,!0),b.validPositions=y.extend(!0,[],O),D=!1));return D}function p(e,t,n){for(var i=this.maskset,a=!1,r=o.getTests.call(this,e),s=0;s0&&!a.validPositions[e];e--);for(var l=e;le+1?t[e+1]&&!0===t[e+1].match.static&&t[e+1]:t[e+1];return a&&r}return!1}var h=0,m=void 0!==e.begin?e.begin:e,v=void 0!==e.end?e.end:e,g=!0;if(e.begin>e.end&&(m=e.end,v=e.begin),i=void 0!==i?i:m,void 0===n&&(m!==v||l.insertMode&&void 0!==s.validPositions[i]||void 0===t||t.match.optionalQuantifier||t.match.optionality)){var y,k=c.extend(!0,[],s.validPositions),b=r.getLastValidPosition.call(a,void 0,!0);s.p=m;var x=u.call(a,e)?m:i;for(y=b;y>=x;y--)s.validPositions.splice(y,1),void 0===t&&delete s.tests[y+1];var w,P,S=i,O=S;for(t&&(s.validPositions[i]=c.extend(!0,{},t),O++,S++),null==k[v]&&s.jitOffset[v]&&(v+=s.jitOffset[v]+1),y=t?v:v-1;y<=b;y++){if(void 0!==(w=k[y])&&!0!==w.generatedInput&&(y>=v||y>=m&&d(y,k,{begin:m,end:v}))){for(;""!==o.getTest.call(a,O).match.def;){if(!1!==(P=p.call(a,O,w,l))||"+"===w.match.def){"+"===w.match.def&&r.getBuffer.call(a,!0);var M=f.call(a,O,w.input,"+"!==w.match.def,!0);if(g=!1!==M,S=(M.pos||O)+1,!g&&P)break}else g=!1;if(g){void 0===t&&w.match.static&&y===e.begin&&h++;break}if(!g&&r.getBuffer.call(a),O>s.maskLength)break;O++}""==o.getTest.call(a,O).match.def&&(g=!1),O=S}if(!g)break}if(!g)return s.validPositions=c.extend(!0,[],k),r.resetMaskSet.call(a,!0),!1}else t&&o.getTest.call(a,i).match.cd===t.match.cd&&(s.validPositions[i]=c.extend(!0,{},t));return r.resetMaskSet.call(a,!0),h}},7957:function(t){t.exports=e}},n={};function i(e){var a=n[e];if(void 0!==a)return a.exports;var r=n[e]={exports:{}};return t[e](r,r.exports,i),r.exports}var a={};return function(){var e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t,n=(t=i(3046))&&t.__esModule?t:{default:t};i(443);e.default=n.default}(),a}()})); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.insert-at-caret.min.js b/wp-content/plugins/wpforms-lite/assets/lib/jquery.insert-at-caret.min.js new file mode 100755 index 00000000..2c09bf67 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.insert-at-caret.min.js @@ -0,0 +1,13 @@ +/*! + * jQuery insertAtCaret 1.1.4 + * http://www.karalamalar.net/ + * + * Copyright (c) 2013 İzzet Emre Erkan + * Licensed under GPLv2 or later. + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * Contributors: + * [@kittsville](https://github.com/kittsville) + * + */ +!function(e,t){e.fn.insertAtCaret=function(e){return this.each(function(){var a,n,r,o,c=this,l=0,s="selectionStart"in c&&"selectionEnd"in c;(c.tagName&&"textarea"===c.tagName.toLowerCase()||c.tagName&&"input"===c.tagName.toLowerCase()&&"text"===c.type.toLowerCase())&&(a=c.scrollTop,s?l=c.selectionStart:(c.focus(),o=t.selection.createRange(),o.moveStart("character",-c.value.length),l=o.text.length),n=c.value.substring(0,l),r=c.value.substring(l,c.value.length),c.value=n+e+r,l+=e.length,s?(c.selectionStart=l,c.selectionEnd=l):(o=t.selection.createRange(),o.moveStart("character",l),o.moveEnd("character",0),o.select()),c.scrollTop=a)})}}(jQuery,document,window); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.css b/wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.css new file mode 100755 index 00000000..f15abea0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.css @@ -0,0 +1 @@ +.minicolors{position:relative}.minicolors-sprite{background-image:url(../../images/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;cursor:text;padding:0;margin:0;display:inline-block}.minicolors-swatch::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);border-radius:2px}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0}.minicolors input[type=hidden]+.minicolors-swatch{width:28px;position:static;cursor:pointer}.minicolors input[type=hidden][disabled]+.minicolors-swatch{cursor:default}.minicolors-panel{position:absolute;width:173px;background:#fff;border-radius:2px;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;box-sizing:content-box;display:none;touch-action:none}.minicolors-panel.minicolors-visible,.minicolors-with-opacity .minicolors-opacity-slider{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel,[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch,[dir=rtl] .minicolors-theme-default .minicolors-swatches .minicolors-swatch,[dir=rtl] .minicolors-theme-semanticui .minicolors-swatch{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:relative;top:1px;left:1px;width:150px;height:150px;margin-bottom:2px;background-position:-120px 0;cursor:crosshair}[dir=rtl] .minicolors .minicolors-grid{right:1px}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}[dir=rtl] .minicolors-opacity-slider,[dir=rtl] .minicolors-slider{right:152px}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider,.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}[dir=rtl] .minicolors-opacity-slider{right:173px}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;box-shadow:0 0 0 1px rgba(0,0,0,.25);border-radius:10px;margin-top:-6px;margin-left:-6px;background:0 0}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:2px solid #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:3px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.25);border-radius:2px;margin-top:-2px;margin-left:1px;box-sizing:content-box}.minicolors-swatches,.minicolors-swatches li{margin:5px 0 3px 5px;padding:0;list-style:none;overflow:hidden}[dir=rtl] .minicolors-swatches,[dir=rtl] .minicolors-swatches li{margin:5px 5px 3px 0}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0}[dir=rtl] .minicolors-swatches .minicolors-swatch{float:right;margin:0 0 0 4px}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}[dir=rtl] .minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:0;margin-left:7px}.minicolors-swatch.selected{border-color:#000}.minicolors-inline{display:inline-block}.minicolors-inline .minicolors-input{display:none!important}.minicolors-inline .minicolors-panel{position:relative;top:auto;left:auto;box-shadow:none;z-index:auto;display:inline-block}[dir=rtl] .minicolors-inline .minicolors-panel{right:auto}.minicolors-theme-default .minicolors-swatch{top:5px;left:5px;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatch{right:5px}.minicolors-theme-default .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:18px;height:18px}.minicolors-theme-default.minicolors-position-right .minicolors-swatch{left:auto;right:5px}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-swatch{right:auto;left:5px}.minicolors-theme-default.minicolors{width:auto;display:inline-block}.minicolors-theme-default .minicolors-input{height:20px;width:auto;display:inline-block;padding-left:26px}[dir=rtl] .minicolors-theme-default .minicolors-input{text-align:right;unicode-bidi:plaintext;padding-left:1px;padding-right:26px}.minicolors-theme-default.minicolors-position-right .minicolors-input{padding-right:26px;padding-left:inherit}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-input{padding-right:inherit;padding-left:26px}.minicolors-theme-bootstrap .minicolors-swatch{z-index:2;top:3px;left:3px;width:28px;height:28px;border-radius:2px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatch{right:3px}.minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:20px;height:20px}.minicolors-theme-bootstrap .minicolors-swatch-color{border-radius:inherit}.minicolors-theme-bootstrap.minicolors-position-right>.minicolors-swatch{left:auto;right:3px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left>.minicolors-swatch{right:auto;left:3px}.minicolors-theme-bootstrap .minicolors-input{float:none;padding-left:44px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input{text-align:right;unicode-bidi:plaintext;padding-left:12px;padding-right:44px}.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input{padding-right:44px;padding-left:12px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left .minicolors-input{padding-right:12px;padding-left:44px}.minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{top:4px;left:4px;width:37px;height:37px;border-radius:5px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{right:4px}.minicolors-theme-bootstrap .minicolors-input.input-sm+.minicolors-swatch{width:24px;height:24px}.minicolors-theme-bootstrap .minicolors-input.input-xs+.minicolors-swatch{width:18px;height:18px}.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input,[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:last-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap .minicolors-input{border-radius:4px}[dir=rtl] .input-group .form-control:last-child,[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input,[dir=rtl] .input-group-addon:last-child,[dir=rtl] .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,[dir=rtl] .input-group-btn:first-child>.btn:not(:first-child),[dir=rtl] .input-group-btn:last-child>.btn,[dir=rtl] .input-group-btn:last-child>.btn-group>.btn,[dir=rtl] .input-group-btn:last-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group .form-control,[dir=rtl] .input-group-addon,[dir=rtl] .input-group-btn>.btn,[dir=rtl] .input-group-btn>.btn-group>.btn,[dir=rtl] .input-group-btn>.dropdown-toggle{border:1px solid #ccc;border-radius:4px}[dir=rtl] .input-group .form-control:first-child,[dir=rtl] .input-group-addon:first-child,[dir=rtl] .input-group-btn:first-child>.btn,[dir=rtl] .input-group-btn:first-child>.btn-group>.btn,[dir=rtl] .input-group-btn:first-child>.dropdown-toggle,[dir=rtl] .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,[dir=rtl] .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}.minicolors-theme-semanticui .minicolors-swatch{top:0;left:0;padding:18px}.minicolors-theme-semanticui input{text-indent:30px} diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.js b/wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.js new file mode 100755 index 00000000..5ce98222 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.minicolors/jquery.minicolors.min.js @@ -0,0 +1,8 @@ +// +// jQuery MiniColors: A tiny color picker built on jQuery +// +// Developed by Cory LaViska for A Beautiful Site, LLC +// +// Licensed under the MIT license: http://opensource.org/licenses/MIT +// +!function(i){"function"==typeof define&&define.amd?define(["jquery"],i):"object"==typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(C){"use strict";function o(i){var t=i.parent();i.removeData("minicolors-initialized").removeData("minicolors-settings").removeProp("size").removeClass("minicolors-input"),t.before(i).remove()}function s(i){var t=i.parent(),o=t.find(".minicolors-panel"),s=i.data("minicolors-settings");!i.data("minicolors-initialized")||i.prop("disabled")||t.hasClass("minicolors-inline")||t.hasClass("minicolors-focus")||(a(),t.addClass("minicolors-focus"),o.animate?o.stop(!0,!0).fadeIn(s.showSpeed,function(){s.show&&s.show.call(i.get(0))}):(o.show(),s.show&&s.show.call(i.get(0))))}function a(){C(".minicolors-focus").each(function(){var i=C(this),t=i.find(".minicolors-input"),o=i.find(".minicolors-panel"),s=t.data("minicolors-settings");o.animate?o.fadeOut(s.hideSpeed,function(){s.hide&&s.hide.call(t.get(0)),i.removeClass("minicolors-focus")}):(o.hide(),s.hide&&s.hide.call(t.get(0)),i.removeClass("minicolors-focus"))})}function n(i,t,o){var s,a,n,r,e,c=i.parents(".minicolors").find(".minicolors-input"),l=c.data("minicolors-settings"),h=i.find("[class$=-picker]"),d=i.offset().left,p=i.offset().top,u=Math.round(t.pageX-d),g=Math.round(t.pageY-p),m=o?l.animationSpeed:0;t.originalEvent.changedTouches&&(u=t.originalEvent.changedTouches[0].pageX-d,g=t.originalEvent.changedTouches[0].pageY-p),u<0&&(u=0),g<0&&(g=0),u>i.width()&&(u=i.width()),g>i.height()&&(g=i.height()),i.parent().is(".minicolors-slider-wheel")&&h.parent().is(".minicolors-grid")&&(s=75-u,a=75-g,n=Math.sqrt(s*s+a*a),(r=Math.atan2(a,s))<0&&(r+=2*Math.PI),75>16,g:(65280&i)>>8,b:255&i}}C.minicolors={defaults:{animationSpeed:50,animationEasing:"swing",change:null,changeDelay:0,control:"hue",defaultValue:"",format:"hex",hide:null,hideSpeed:100,inline:!1,keywords:"",letterCase:"lowercase",opacity:!1,position:"bottom",show:null,showSpeed:100,theme:"default",swatches:[]}},C.extend(C.fn,{minicolors:function(i,t){switch(i){case"destroy":return C(this).each(function(){o(C(this))}),C(this);case"hide":return a(),C(this);case"opacity":return void 0===t?C(this).attr("data-opacity"):(C(this).each(function(){d(C(this).attr("data-opacity",t))}),C(this));case"rgbObject":return function(i){var t,o=C(i).attr("data-opacity");{var s;t=T(C(i).val())?I(C(i).val(),!0):(s=M(C(i).val(),!0),L(s))}if(!t)return null;void 0!==o&&C.extend(t,{a:parseFloat(o)});return t}(C(this));case"rgbString":case"rgbaString":return function(i,t){var o,s=C(i).attr("data-opacity");{var a;o=T(C(i).val())?I(C(i).val(),!0):(a=M(C(i).val(),!0),L(a))}if(!o)return null;void 0===s&&(s=1);return t?"rgba("+o.r+", "+o.g+", "+o.b+", "+parseFloat(s)+")":"rgb("+o.r+", "+o.g+", "+o.b+")"}(C(this),"rgbaString"===i);case"settings":return void 0===t?C(this).data("minicolors-settings"):(C(this).each(function(){var i=C(this).data("minicolors-settings")||{};o(C(this)),C(this).minicolors(C.extend(!0,i,t))}),C(this));case"show":return s(C(this).eq(0)),C(this);case"value":return void 0===t?C(this).val():(C(this).each(function(){"object"==typeof t&&null!==t?(void 0!==t.opacity&&C(this).attr("data-opacity",F(t.opacity,0,1)),t.color&&C(this).val(t.color)):C(this).val(t),d(C(this))}),C(this));default:return"create"!==i&&(t=i),C(this).each(function(){!function(t,i){var o,s,a,n,r,e,c,l=C('
            + + + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/emails/classic-header.php b/wp-content/plugins/wpforms-lite/templates/emails/classic-header.php new file mode 100755 index 00000000..3f6dc56c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/emails/classic-header.php @@ -0,0 +1,57 @@ + + + +> + + + + + + <?php echo esc_html( $title ); ?> + +="0" marginwidth="0" topmargin="0" marginheight="0" offset="0" bgcolor="#e9eaec" class=""> + + + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/emails/compact-header.php b/wp-content/plugins/wpforms-lite/templates/emails/compact-header.php new file mode 100755 index 00000000..3a6ed4c1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/emails/compact-header.php @@ -0,0 +1,57 @@ + + + +> + + + + + + <?php echo esc_html( $title ); ?> + +="0" marginwidth="0" topmargin="0" marginheight="0" offset="0" bgcolor="#e9eaec" class=""> + + + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/emails/summary-header.php b/wp-content/plugins/wpforms-lite/templates/emails/summary-header.php new file mode 100755 index 00000000..b44e995d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/emails/summary-header.php @@ -0,0 +1,57 @@ + + + +> + + + + + + <?php echo esc_html( $title ); ?> + +="0" marginwidth="0" topmargin="0" marginheight="0" offset="0" bgcolor="#f8f8f8" class=""> + + + +
            '),h=C.minicolors.defaults;if(t.data("minicolors-initialized"))return;i=C.extend(!0,{},h,i),l.addClass("minicolors-theme-"+i.theme).toggleClass("minicolors-with-opacity",i.opacity),void 0!==i.position&&C.each(i.position.split(" "),function(){l.addClass("minicolors-position-"+this)});s="rgb"===i.format?i.opacity?"25":"20":i.keywords?"11":"7";t.addClass("minicolors-input").data("minicolors-initialized",!1).data("minicolors-settings",i).prop("size",s).wrap(l).after('
            '),i.inline||(t.after(''),t.next(".minicolors-input-swatch").on("click",function(i){i.preventDefault(),t.trigger("focus")}));if((e=t.parent().find(".minicolors-panel")).on("selectstart",function(){return!1}).end(),i.swatches&&0!==i.swatches.length)for(e.addClass("minicolors-with-swatches"),a=C('
              ').appendTo(e),c=0;c').attr("title",o).appendTo(a).data("swatch-color",r).find(".minicolors-swatch-color").css({backgroundColor:"transparent"!==r?p(n):"transparent",opacity:String(n.a)}),i.swatches[c]=n;i.inline&&t.parent().addClass("minicolors-inline");d(t,!1),t.data("minicolors-initialized",!0)}(C(this),t)}),C(this)}}}),C([document]).on("mousedown.minicolors touchstart.minicolors",function(i){C(i.target).parents().add(i.target).hasClass("minicolors")||a()}).on("mousedown.minicolors touchstart.minicolors",".minicolors-grid, .minicolors-slider, .minicolors-opacity-slider",function(i){var t=C(this);i.preventDefault(),C(i.delegateTarget).data("minicolors-target",t),n(t,i,!0)}).on("mousemove.minicolors touchmove.minicolors",function(i){var t=C(i.delegateTarget).data("minicolors-target");t&&n(t,i)}).on("mouseup.minicolors touchend.minicolors",function(){C(this).removeData("minicolors-target")}).on("click.minicolors",".minicolors-swatches li",function(i){i.preventDefault();var t=C(this),o=t.parents(".minicolors").find(".minicolors-input"),s=t.data("swatch-color");x(o,s,D(s)),d(o)}).on("mousedown.minicolors touchstart.minicolors",".minicolors-input-swatch",function(i){var t=C(this).parent().find(".minicolors-input");i.preventDefault(),s(t)}).on("focus.minicolors",".minicolors-input",function(){var i=C(this);i.data("minicolors-initialized")&&s(i)}).on("blur.minicolors",".minicolors-input",function(){var i,t,o,s,a,n=C(this),r=n.data("minicolors-settings");n.data("minicolors-initialized")&&(i=r.keywords?C.map(r.keywords.split(","),function(i){return i.toLowerCase().trim()}):[],a=""!==n.val()&&-1 span").css("opacity",String(s)),n.val(a),""===n.val()&&n.val(z(r.defaultValue,!0)),n.val(k(n.val(),r.letterCase)))}).on("keydown.minicolors",".minicolors-input",function(i){var t=C(this);if(t.data("minicolors-initialized"))switch(i.which){case 9:a();break;case 13:case 27:a(),t.blur()}}).on("keyup.minicolors",".minicolors-input",function(){var i=C(this);i.data("minicolors-initialized")&&d(i,!0)}).on("paste.minicolors",".minicolors-input",function(){var i=C(this);i.data("minicolors-initialized")&&setTimeout(function(){d(i,!0)},1)})}); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.css b/wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.css new file mode 100755 index 00000000..25b6b41d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.css @@ -0,0 +1 @@ +.ui-timepicker-wrapper{overflow-y:auto;height:142px;width:6.5em;background:#fff;border:1px solid #e6e6e6;border-radius:3px;outline:none;z-index:10001;margin:0}.ui-timepicker-wrapper.ui-timepicker-with-duration{width:13em}.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60{width:11em}.ui-timepicker-list{margin:0;padding:0;list-style:none}.ui-timepicker-duration{margin-left:5px;color:#888}.ui-timepicker-list:hover .ui-timepicker-duration{color:#888}.ui-timepicker-list li{padding:3px 0 3px 5px;cursor:pointer;white-space:nowrap;color:#393939;list-style:none;margin:0;font-size:14px}.ui-timepicker-list:hover .ui-timepicker-selected{background:#fff;color:#393939}li.ui-timepicker-selected,.ui-timepicker-list li:hover,.ui-timepicker-list .ui-timepicker-selected:hover{background:#446cb3;color:#fff}li.ui-timepicker-selected .ui-timepicker-duration,.ui-timepicker-list li:hover .ui-timepicker-duration{color:#ccc}.ui-timepicker-list li.ui-timepicker-disabled,.ui-timepicker-list li.ui-timepicker-disabled:hover,.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{color:#888;cursor:default}.ui-timepicker-list li.ui-timepicker-disabled:hover,.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{background:#f2f2f2} diff --git a/wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.js b/wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.js new file mode 100755 index 00000000..3f5d1867 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/jquery.timepicker/jquery.timepicker.min.js @@ -0,0 +1,7 @@ +/*! + * jquery-timepicker v1.11.5 - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation. + * Copyright (c) 2016 Jon Thornton - http://jonthornton.github.com/jquery-timepicker/ + * License: MIT + */ + +!function(a){"object"==typeof exports&&exports&&"object"==typeof module&&module&&module.exports===exports?a(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){function b(a){var b=a[0];return b.offsetWidth>0&&b.offsetHeight>0}function c(b){if(b.minTime&&(b.minTime=t(b.minTime)),b.maxTime&&(b.maxTime=t(b.maxTime)),b.durationTime&&"function"!=typeof b.durationTime&&(b.durationTime=t(b.durationTime)),"now"==b.scrollDefault)b.scrollDefault=function(){return b.roundingFunction(t(new Date),b)};else if(b.scrollDefault&&"function"!=typeof b.scrollDefault){var c=b.scrollDefault;b.scrollDefault=function(){return b.roundingFunction(t(c),b)}}else b.minTime&&(b.scrollDefault=function(){return b.roundingFunction(b.minTime,b)});if("string"===a.type(b.timeFormat)&&b.timeFormat.match(/[gh]/)&&(b._twelveHourTime=!0),b.showOnFocus===!1&&-1!=b.showOn.indexOf("focus")&&b.showOn.splice(b.showOn.indexOf("focus"),1),b.disableTimeRanges.length>0){for(var d in b.disableTimeRanges)b.disableTimeRanges[d]=[t(b.disableTimeRanges[d][0]),t(b.disableTimeRanges[d][1])];b.disableTimeRanges=b.disableTimeRanges.sort(function(a,b){return a[0]-b[0]});for(var d=b.disableTimeRanges.length-1;d>0;d--)b.disableTimeRanges[d][0]<=b.disableTimeRanges[d-1][1]&&(b.disableTimeRanges[d-1]=[Math.min(b.disableTimeRanges[d][0],b.disableTimeRanges[d-1][0]),Math.max(b.disableTimeRanges[d][1],b.disableTimeRanges[d-1][1])],b.disableTimeRanges.splice(d,1))}return b}function d(b){var c=b.data("timepicker-settings"),d=b.data("timepicker-list");if(d&&d.length&&(d.remove(),b.data("timepicker-list",!1)),c.useSelect){d=a("").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,customElements:[],onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)});var f=[":text","[type='password']","[type='file']","select","textarea","[type='number']","[type='search']","[type='tel']","[type='url']","[type='email']","[type='datetime']","[type='date']","[type='month']","[type='week']","[type='time']","[type='datetime-local']","[type='range']","[type='color']","[type='radio']","[type='checkbox']","[contenteditable]","[type='button']"],g=["select","option","[type='radio']","[type='checkbox']"];a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",f.concat(this.settings.customElements).join(", "),b).on("click.validate",g.concat(this.settings.customElements).join(", "),b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={},d=["input","select","textarea","[contenteditable]"];return a(this.currentForm).find(d.concat(this.settings.customElements).join(", ")).not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);this.abortRequest(b),"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+"
              "),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||"")):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?"":a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},elementAjaxPort:function(a){return"validate"+a.name},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger("submit"),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},abortRequest:function(b){var c;this.pending[b.name]&&(c=this.elementAjaxPort(b),a.ajaxAbort(c),this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass))},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a["date"===b?"dateISO":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:-?\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),null!==i.valid&&i.old===h?i.valid:(i.old=h,i.valid=null,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:this.elementAjaxPort(c),dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(b,c,e){var f=b.port;"abort"===b.mode&&(a.ajaxAbort(f),d[f]=e)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(a.ajaxAbort(f),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a.ajaxAbort=function(a){d[a]&&(d[a].abort(),delete d[a])},a}); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lib/list.min.js b/wp-content/plugins/wpforms-lite/assets/lib/list.min.js new file mode 100755 index 00000000..1b7ff95c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lib/list.min.js @@ -0,0 +1,2 @@ +/*! List.js v2.3.0 (http://listjs.com) by Jonny Strömberg (http://javve.com) */ +var List;List=function(){var t={"./src/add-async.js":function(t){t.exports=function(t){return function e(r,n,s){var i=r.splice(0,50);s=(s=s||[]).concat(t.add(i)),r.length>0?setTimeout((function(){e(r,n,s)}),1):(t.update(),n(s))}}},"./src/filter.js":function(t){t.exports=function(t){return t.handlers.filterStart=t.handlers.filterStart||[],t.handlers.filterComplete=t.handlers.filterComplete||[],function(e){if(t.trigger("filterStart"),t.i=1,t.reset.filter(),void 0===e)t.filtered=!1;else{t.filtered=!0;for(var r=t.items,n=0,s=r.length;nv.page,a=new g(t[s],void 0,n),v.items.push(a),r.push(a)}return v.update(),r}m(t.slice(0),e)}},this.show=function(t,e){return this.i=t,this.page=e,v.update(),v},this.remove=function(t,e,r){for(var n=0,s=0,i=v.items.length;s-1&&r.splice(n,1),v},this.trigger=function(t){for(var e=v.handlers[t].length;e--;)v.handlers[t][e](v);return v},this.reset={filter:function(){for(var t=v.items,e=t.length;e--;)t[e].filtered=!1;return v},search:function(){for(var t=v.items,e=t.length;e--;)t[e].found=!1;return v}},this.update=function(){var t=v.items,e=t.length;v.visibleItems=[],v.matchingItems=[],v.templater.clear();for(var r=0;r=v.i&&v.visibleItems.lengthe},innerWindow:function(t,e,r){return t>=e-r&&t<=e+r},dotted:function(t,e,r,n,s,i,a){return this.dottedLeft(t,e,r,n,s,i)||this.dottedRight(t,e,r,n,s,i,a)},dottedLeft:function(t,e,r,n,s,i){return e==r+1&&!this.innerWindow(e,s,i)&&!this.right(e,n)},dottedRight:function(t,e,r,n,s,i,a){return!t.items[a-1].values().dotted&&(e==n&&!this.innerWindow(e,s,i)&&!this.right(e,n))}};return function(e){var n=new i(t.listContainer.id,{listClass:e.paginationClass||"pagination",item:e.item||"
            • ",valueNames:["page","dotted"],searchClass:"pagination-search-that-is-not-supposed-to-exist",sortClass:"pagination-sort-that-is-not-supposed-to-exist"});s.bind(n.listContainer,"click",(function(e){var r=e.target||e.srcElement,n=t.utils.getAttribute(r,"data-page"),s=t.utils.getAttribute(r,"data-i");s&&t.show((s-1)*n+1,n)})),t.on("updated",(function(){r(n,e)})),r(n,e)}}},"./src/parse.js":function(t,e,r){t.exports=function(t){var e=r("./src/item.js")(t),n=function(r,n){for(var s=0,i=r.length;s0?setTimeout((function(){e(r,s)}),1):(t.update(),t.trigger("parseComplete"))};return t.handlers.parseComplete=t.handlers.parseComplete||[],function(){var e=function(t){for(var e=t.childNodes,r=[],n=0,s=e.length;n]/g.exec(t)){var e=document.createElement("tbody");return e.innerHTML=t,e.firstElementChild}if(-1!==t.indexOf("<")){var r=document.createElement("div");return r.innerHTML=t,r.firstElementChild}}},a=function(e,r,n){var s=void 0,i=function(e){for(var r=0,n=t.valueNames.length;r=1;)t.list.removeChild(t.list.firstChild)},function(){var r;if("function"!=typeof t.item){if(!(r="string"==typeof t.item?-1===t.item.indexOf("<")?document.getElementById(t.item):i(t.item):s()))throw new Error("The list needs to have at least one item on init otherwise you'll have to add a template.");r=n(r,t.valueNames),e=function(){return r.cloneNode(!0)}}else e=function(e){var r=t.item(e);return i(r)}}()};t.exports=function(t){return new e(t)}},"./src/utils/classes.js":function(t,e,r){var n=r("./src/utils/index-of.js"),s=/\s+/;Object.prototype.toString;function i(t){if(!t||!t.nodeType)throw new Error("A DOM element reference is required");this.el=t,this.list=t.classList}t.exports=function(t){return new i(t)},i.prototype.add=function(t){if(this.list)return this.list.add(t),this;var e=this.array();return~n(e,t)||e.push(t),this.el.className=e.join(" "),this},i.prototype.remove=function(t){if(this.list)return this.list.remove(t),this;var e=this.array(),r=n(e,t);return~r&&e.splice(r,1),this.el.className=e.join(" "),this},i.prototype.toggle=function(t,e){return this.list?(void 0!==e?e!==this.list.toggle(t,e)&&this.list.toggle(t):this.list.toggle(t),this):(void 0!==e?e?this.add(t):this.remove(t):this.has(t)?this.remove(t):this.add(t),this)},i.prototype.array=function(){var t=(this.el.getAttribute("class")||"").replace(/^\s+|\s+$/g,"").split(s);return""===t[0]&&t.shift(),t},i.prototype.has=i.prototype.contains=function(t){return this.list?this.list.contains(t):!!~n(this.array(),t)}},"./src/utils/events.js":function(t,e,r){var n=window.addEventListener?"addEventListener":"attachEvent",s=window.removeEventListener?"removeEventListener":"detachEvent",i="addEventListener"!==n?"on":"",a=r("./src/utils/to-array.js");e.bind=function(t,e,r,s){for(var o=0,l=(t=a(t)).length;o32)return!1;var a=n,o=function(){var t,r={};for(t=0;t=p;b--){var j=o[t.charAt(b-1)];if(C[b]=0===m?(C[b+1]<<1|1)&j:(C[b+1]<<1|1)&j|(v[b+1]|v[b])<<1|1|v[b+1],C[b]&d){var x=l(m,b-1);if(x<=u){if(u=x,!((c=b-1)>a))break;p=Math.max(1,2*a-c)}}}if(l(m+1,a)>u)break;v=C}return!(c<0)}},"./src/utils/get-attribute.js":function(t){t.exports=function(t,e){var r=t.getAttribute&&t.getAttribute(e)||null;if(!r)for(var n=t.attributes,s=n.length,i=0;i=48&&t<=57}function i(t,e){for(var i=(t+="").length,a=(e+="").length,o=0,l=0;o=i&&l=a?-1:l>=a&&o=i?1:i-a}i.caseInsensitive=i.i=function(t,e){return i((""+t).toLowerCase(),(""+e).toLowerCase())},Object.defineProperties(i,{alphabet:{get:function(){return e},set:function(t){r=[];var s=0;if(e=t)for(;s-1&&(a=a.substr(b+1));for(var c,d=decodeURI(a.split("#")[0]).split("&"),e={},f=0,g=d.length;f-1){var d=a.split("?");a=d.shift(),c=b.extend({},e(d[0]),c)}return a+"?"+b.param(c)}function g(a,b){var c=a.indexOf("#");return-1===c?b:(c>0&&(a=a.substr(c)),b+a)}function h(a,b,c,d){return b&&b.element().addClass("lity-iframe"),c&&(a=f(a,c)),d&&(a=g(d,a)),'
              ' : ''; + + this.$btnc.after( '
              ' + wpforms_education.upgrade_bonus + '
              ' ); + this.$btnc.after( wpforms_education.upgrade[ type ].doc.replace( /%25name%25/g, feature ) ); + this.$btnc.after( videoHtml ); + + this.$body.find( '.jconfirm-content' ).addClass( 'lite-upgrade' ); + }, + buttons: { + confirm: { + text: wpforms_education.upgrade[ type ].button, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action: () => { + window.open( WPFormsEducation.core.getUpgradeURL( utmContent, type ), '_blank' ); + WPFormsEducation.core.upgradeModalThankYou( type ); + }, + }, + }, + } ); + + $( window ).on( 'resize', function() { + modalWidth = WPFormsEducation.core.getUpgradeModalWidth( isVideoModal ); + + if ( modal.isOpen() ) { + modal.setBoxWidth( modalWidth ); + } + } ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsEducation.liteCore.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/core.min.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/core.min.js new file mode 100755 index 00000000..4c856fbe --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/core.min.js @@ -0,0 +1 @@ +var WPFormsEducation=window.WPFormsEducation||{};WPFormsEducation.liteCore=window.WPFormsEducation.liteCore||((e,l,c)=>{let a={init(){c(a.ready)},ready(){a.events()},events(){a.openModalButtonClick()},openModalButtonClick(){c(e).on("click",".education-modal:not(.wpforms-add-fields-button)",a.openModalButtonHandler).on("mousedown",".education-modal.wpforms-add-fields-button",a.openModalButtonHandler)},openModalButtonHandler(o){var t=c(this);if(!t.data("action")||!["activate","install"].includes(t.data("action"))){o.preventDefault(),o.stopImmediatePropagation();let e=t.data("name");t.hasClass("wpforms-add-fields-button")&&(e=t.text(),e+=e.indexOf(wpforms_builder.field)<0?" "+wpforms_builder.field:"");o=WPFormsEducation.core.getUTMContentValue(t);a.upgradeModal(e,o,t.data("license"),t.data("video"),t.data("plural"))}},upgradeModal(a,n,d,i,r){if(void 0!==d&&0!==d.length||(d="pro"),!(c.inArray(d,["pro","elite"])<0)){var s=wpforms_education.upgrade[d].message.replace(/%name%/g,a);let o=Boolean(i);r=r?wpforms_education.upgrade[d].title_plural:wpforms_education.upgrade[d].title;let e=WPFormsEducation.core.getUpgradeModalWidth(o),t=c.alert({backgroundDismiss:!0,title:a+" "+r,icon:"fa fa-lock",content:s,boxWidth:e,theme:"modern,wpforms-education",closeIcon:!0,onOpenBefore(){o&&this.$el.addClass("has-video");var e=o?'':"";this.$btnc.after('
              '+wpforms_education.upgrade_bonus+"
              "),this.$btnc.after(wpforms_education.upgrade[d].doc.replace(/%25name%25/g,a)),this.$btnc.after(e),this.$body.find(".jconfirm-content").addClass("lite-upgrade")},buttons:{confirm:{text:wpforms_education.upgrade[d].button,btnClass:"btn-confirm",keys:["enter"],action:()=>{l.open(WPFormsEducation.core.getUpgradeURL(n,d),"_blank"),WPFormsEducation.core.upgradeModalThankYou(d)}}}});c(l).on("resize",function(){e=WPFormsEducation.core.getUpgradeModalWidth(o),t.isOpen()&&t.setBoxWidth(e)})}}};return a})(document,window,jQuery),WPFormsEducation.liteCore.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.js new file mode 100755 index 00000000..3626ae61 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.js @@ -0,0 +1,565 @@ +/* global wpforms_education_lite_connect, WPFormsChallenge */ +/** + * WPForms Education for Lite. + * + * Lite Connect feature. + * + * @since 1.7.4 + */ + +// eslint-disable-next-line no-var +var WPFormsEducation = window.WPFormsEducation || {}; + +WPFormsEducation.liteConnect = window.WPFormsEducation.liteConnect || ( function( document, window, $ ) { + /** + * Public functions and properties. + * + * @since 1.7.4 + * + * @type {Object} + */ + const app = { + + /** + * Start the engine. + * + * @since 1.7.4 + */ + init() { + $( app.ready ); + + // Page load. + $( window ).on( 'load', function() { + // In the case of jQuery 3.+, we need to wait for a ready event first. + if ( typeof $.ready.then === 'function' ) { + $.ready.then( app.load ); + } else { + app.load(); + } + } ); + }, + + /** + * Document ready. + * + * @since 1.7.4 + */ + ready() { + + }, + + /** + * Page load. + * + * @since 1.7.4 + */ + load() { + app.events(); + app.initLiteConnectToggle(); + app.maybeRevealBuilderTopBar(); + }, + + /** + * Register JS events. + * + * @since 1.7.4 + */ + events() { + app.enableLiteConnectToggleClick(); + app.enableLiteConnectButtonClick(); + app.dismissBuilderTopBarClick(); + app.autoSaveToggleChange(); + app.enableLiteConnectAIButtonClick(); + }, + + /** + * Init Lite Connect toggle. + * + * @since 1.7.5 + */ + initLiteConnectToggle() { + $( '.wpforms-toggle-control.wpforms-setting-lite-connect-auto-save-toggle input' ).prop( 'disabled', false ); + }, + + /** + * Enable Lite Connect toggle mousedown handler. + * + * @since 1.7.4 + */ + enableLiteConnectToggleClick() { + $( document ).on( + 'mousedown touchstart', + '#wpforms-setting-row-lite-connect-enabled label, .wpforms-setting-lite-connect-auto-save-toggle label', + function( event ) { + const isTouchDevice = 'ontouchstart' in document.documentElement; + + if ( ! isTouchDevice ) { + event.preventDefault(); + } + + const wrapper = $( this ).closest( '#wpforms-setting-row-lite-connect-enabled, .wpforms-setting-lite-connect-auto-save-toggle' ); + + const $input = wrapper.find( '#wpforms-setting-lite-connect-enabled' ); + + if ( $input.prop( 'disabled' ) ) { + return; + } + + const isEnabled = $input.is( ':checked' ); + + app.openSettingsLiteConnectModal( isEnabled, function() { + $input + .trigger( 'click' ) + .prop( 'disabled', true ); + } ); + } + ); + }, + + /** + * Enable Lite Connect button click handler. + * + * @since 1.7.4 + */ + enableLiteConnectButtonClick() { + $( document ).on( + 'click', + '.wpforms-dyk-lite-connect .button-primary', + function( event ) { + event.preventDefault(); + + const $button = $( this ); + + if ( $button.hasClass( 'wpforms-is-enabled' ) ) { + window.open( $button.attr( 'href' ) ); + + return; + } + + app.openSettingsLiteConnectModal( + false, + app.enableLiteConnectButtonModalConfirm + ); + } + ); + }, + + /** + * Enable Lite Connect button click handler. + * + * @since 1.9.1 + */ + enableLiteConnectAIButtonClick() { + $( document ).on( + 'click', + '.enable-lite-connect-modal', + app.handleLiteConnectModalClick, + ); + }, + + /** + * Finalize the Lite Connect keys setup. + * + * @since 1.9.1 + * + * @return {jQuery} AJAX request deferred object. + */ + finalizeLiteConnectSetup() { + return $.get( wpforms_education_lite_connect.ajax_url, { + action: 'wpforms_lite_connect_finalize', + nonce: wpforms_education_lite_connect.nonce, + } ); + }, + + /** + * Handle Lite Connect modal click. + * + * @since 1.9.1 + * + * @param {Event} event Event object. + */ + handleLiteConnectModalClick( event ) { + event.preventDefault(); + + app.openAILiteConnectEnableModal( + function() { + app.saveSettingAjaxPost( true, $(), function() { + app.switchSettingView( true, $( '#wpforms-builder-lite-connect-top-bar .wpforms-toggle-control' ) ); + + // Finalize the Lite Connect keys setup. + app.finalizeLiteConnectSetup() + .done( () => { + app.removeLiteConnectModalOnAIButtons(); + } ); + } ); + } + ); + }, + + /** + * Remove Lite Connect modal on AI buttons. + * + * @since 1.9.1 + */ + removeLiteConnectModalOnAIButtons() { + $( '.enable-lite-connect-modal.wpforms-prevent-default' ).each( function() { + const $button = $( this ); + + // Update button class. + $button.removeClass( 'enable-lite-connect-modal wpforms-prevent-default' ); + + // Open AI Form Generator. + if ( $button.hasClass( 'wpforms-template-generate' ) ) { + $button.trigger( 'click' ); + } + + // Close the top bar in the form builder. + if ( $( '#wpforms-builder-lite-connect-top-bar' ).length ) { + app.toggleBuilderTopBar( false ); + } + } ); + }, + + /** + * Enable Lite Connect button modal confirm Callback. + * + * @since 1.7.4 + */ + enableLiteConnectButtonModalConfirm() { + const $toggle = $( '.wpforms-dyk-lite-connect .button-primary' ); + + app.saveSettingAjaxPost( true, $toggle, function() { + app.switchSettingView( true, $toggle ); + } ); + }, + + /** + * Form Entry Backups information modal. + * + * @since 1.7.4 + * + * @param {boolean} isEnabled Current setting state. + * @param {Function} confirmCallback Confirm button action. + */ + openSettingsLiteConnectModal( isEnabled, confirmCallback ) { + if ( isEnabled ) { + app.openSettingsLiteConnectDisableModal( confirmCallback ); + } else { + app.openSettingsLiteConnectEnableModal( confirmCallback ); + } + }, + + /** + * Form Entry Backups enable information modal. + * + * @since 1.7.4 + * + * @param {Function} confirmCallback Confirm button action. + */ + openSettingsLiteConnectEnableModal( confirmCallback ) { + const $args = { + content: wp.template( 'wpforms-settings-lite-connect-modal-content' )(), + confirm: { + text: wpforms_education_lite_connect.enable_modal.confirm, + callback: confirmCallback, + }, + }; + + app.enableModal( $args ); + }, + + /** + * AI features enable information modal. + * + * @since 1.9.1 + * + * @param {Function} confirmCallback Confirm button action. + */ + openAILiteConnectEnableModal( confirmCallback ) { + const $args = { + content: wp.template( 'wpforms-builder-ai-lite-connect-modal-content' )(), + confirm: { + text: wpforms_education_lite_connect.enable_ai.confirm, + callback: confirmCallback, + }, + theme: 'modern, ai-modal', + }; + + // eslint-disable-next-line camelcase + wpforms_education_lite_connect.update_result.enabled_title = wpforms_education_lite_connect.enable_ai.enabled_title; + + app.enableModal( $args ); + }, + + /** + * Render Enable modal. + * + * @param {Object} $args Modal arguments. + */ + enableModal( $args ) { + $.alert( { + title: false, + content: $args.content, + icon: false, + type: 'orange', + boxWidth: 550, + theme: $args.theme || 'modern', + useBootstrap: false, + scrollToPreviousElement: false, + buttons: { + confirm: { + text: $args.confirm.text, + btnClass: 'btn-confirm', + keys: [ 'enter' ], + action() { + if ( typeof $args.confirm.callback === 'function' ) { + $args.confirm.callback(); + } + + // Maybe close Challenge popup. + if ( window.WPFormsChallenge ) { + // eslint-disable-next-line no-var + var completeChallenge = WPFormsChallenge.embed && WPFormsChallenge.embed.completeChallenge; + } + + if ( typeof completeChallenge === 'function' ) { + completeChallenge(); + } + }, + }, + cancel: { + text: wpforms_education_lite_connect.enable_modal.cancel, + action() { + $( '.wpforms-challenge-popup-container' ).removeClass( 'wpforms-invisible' ); + }, + }, + }, + onOpenBefore() { + $( 'body' ).addClass( 'wpforms-setting-lite-connect-modal' ); + $( '.wpforms-challenge-popup-container' ).addClass( 'wpforms-invisible' ); + }, + onDestroy() { + $( 'body' ).removeClass( 'wpforms-setting-lite-connect-modal' ); + }, + } ); + }, + + /** + * Form Entry Backups disable information modal. + * + * @since 1.7.4 + * + * @param {Function} confirmCallback Confirm button action. + */ + openSettingsLiteConnectDisableModal( confirmCallback ) { + $.alert( { + title: wpforms_education_lite_connect.disable_modal.title, + content: wpforms_education_lite_connect.disable_modal.content, + icon: 'fa fa-exclamation-circle', + type: 'red', + boxWidth: '400px', + theme: 'modern', + useBootstrap: false, + animateFromElement: false, + scrollToPreviousElement: false, + buttons: { + cancel: { + text: wpforms_education_lite_connect.disable_modal.cancel, + keys: [ 'enter' ], + btnClass: 'btn-confirm', + }, + confirm: { + text: wpforms_education_lite_connect.disable_modal.confirm, + action() { + if ( typeof confirmCallback === 'function' ) { + confirmCallback(); + } + }, + }, + }, + } ); + }, + + /** + * Save Lite Connect Enabled setting AJAX post call. + * + * @since 1.7.4 + * + * @param {boolean} isEnabled Lite Connect setting flag. + * @param {jQuery|undefined} $toggle Toggle control outer element. + * @param {Function} successCallback Success result callback. + */ + saveSettingAjaxPost( isEnabled, $toggle, successCallback ) { + $toggle = $toggle || $(); + + const $input = $toggle.find( 'input' ); + + // Perform AJAX request. + $.post( + wpforms_education_lite_connect.ajax_url, + { + action: 'wpforms_update_lite_connect_enabled_setting', + value: isEnabled ? 1 : 0, + nonce: wpforms_education_lite_connect.nonce, + } + ).done( function( res ) { + if ( ! res.success ) { + $input.prop( 'checked', ! isEnabled ); + app.updateResultModal( 'error' ); + + return; + } + + app.updateResultModal( isEnabled ? 'enabled' : 'disabled' ); + + if ( typeof successCallback === 'function' ) { + successCallback(); + } + } ).fail( function() { + $input.prop( 'checked', ! isEnabled ); + app.updateResultModal( 'error' ); + } ).always( function() { + $input.prop( 'disabled', false ); + } ); + }, + + /** + * Lite Connect toggle `change` event handler with "auto save" feature. + * + * @since 1.7.4 + */ + autoSaveToggleChange() { + $( document ).on( + 'change', + '.wpforms-toggle-control.wpforms-setting-lite-connect-auto-save-toggle input', + function() { + const $input = $( this ), + $toggle = $input.closest( '.wpforms-toggle-control' ), + isEnabled = $input.is( ':checked' ); + + app.saveSettingAjaxPost( isEnabled, $toggle, function() { + app.switchSettingView( isEnabled, $toggle ); + app.removeLiteConnectModalOnAIButtons(); + + // Finalize the Lite Connect keys setup. + app.finalizeLiteConnectSetup(); + } ); + } + ); + }, + + /** + * After updating setting via AJAX we should hide toggle container and show info container. + * + * @since 1.7.4 + * + * @param {boolean} isEnabled Toggle state. + * @param {jQuery} $toggle Toggle control. + */ + switchSettingView( isEnabled, $toggle ) { + const $wrapper = $toggle.closest( '.wpforms-education-lite-connect-wrapper' ), + $setting = $wrapper.find( '.wpforms-education-lite-connect-setting' ), + $enabledInfo = $wrapper.find( '.wpforms-education-lite-connect-enabled-info' ); + + $setting.toggleClass( 'wpforms-hidden', isEnabled ); + $enabledInfo.toggleClass( 'wpforms-hidden', ! isEnabled ); + }, + + /** + * Update result message modal. + * + * @since 1.7.4 + * + * @param {string} msg Message slug. + */ + updateResultModal( msg ) { + if ( ! wpforms_education_lite_connect.update_result[ msg ] ) { + return; + } + + $.alert( { + title: wpforms_education_lite_connect.update_result[ msg + '_title' ], + content: wpforms_education_lite_connect.update_result[ msg ], + icon: 'fa fa-check-circle', + type: msg === 'error' ? 'red' : 'green', + theme: 'modern', + boxWidth: '400px', + useBootstrap: false, + animation: 'scale', + closeAnimation: 'scale', + animateFromElement: false, + scrollToPreviousElement: false, + buttons: { + confirm: { + text : wpforms_education_lite_connect.update_result.close, + btnClass: 'btn-confirm', + keys : [ 'enter' ], + }, + }, + } ); + }, + + /** + * Reveal top bar in the Form Builder. + * + * @since 1.7.4 + */ + maybeRevealBuilderTopBar() { + // Skip it is not Form Builder or Entry Backups is already enabled or top bar is dismissed. + if ( + ! window.wpforms_builder || + wpforms_education_lite_connect.is_enabled === '1' || + $( '#wpforms-builder-lite-connect-top-bar' ).length === 0 + ) { + return; + } + + setTimeout( function() { + app.toggleBuilderTopBar( true ); + }, 3000 ); + }, + + /** + * Toggle top bar in the Form Builder. + * + * @since 1.7.4 + * + * @param {boolean} open True for open, false for close. + */ + toggleBuilderTopBar( open ) { + const cssVar = '--wpforms-admin-bar-height'; + const root = document.documentElement; + const topBarHeight = 45; + + let adminBarHeight = parseInt( getComputedStyle( root ).getPropertyValue( cssVar ), 10 ); + + adminBarHeight += open ? topBarHeight : -topBarHeight; + + root.setAttribute( + 'style', + cssVar + ': ' + ( adminBarHeight ) + 'px!important;' + ); + }, + + /** + * Dismiss top bar in the Form Builder. + * + * @since 1.7.4 + */ + dismissBuilderTopBarClick() { + $( document ).on( + 'click', + '#wpforms-builder-lite-connect-top-bar .wpforms-dismiss-button', + function() { + app.toggleBuilderTopBar( false ); + } + ); + }, + }; + + // Provide access to public functions/properties. + return app; +}( document, window, jQuery ) ); + +// Initialize. +WPFormsEducation.liteConnect.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.min.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.min.js new file mode 100755 index 00000000..49f0746d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/education/lite-connect.min.js @@ -0,0 +1 @@ +var WPFormsEducation=window.WPFormsEducation||{};WPFormsEducation.liteConnect=window.WPFormsEducation.liteConnect||((i,n,l)=>{let c={init(){l(c.ready),l(n).on("load",function(){"function"==typeof l.ready.then?l.ready.then(c.load):c.load()})},ready(){},load(){c.events(),c.initLiteConnectToggle(),c.maybeRevealBuilderTopBar()},events(){c.enableLiteConnectToggleClick(),c.enableLiteConnectButtonClick(),c.dismissBuilderTopBarClick(),c.autoSaveToggleChange(),c.enableLiteConnectAIButtonClick()},initLiteConnectToggle(){l(".wpforms-toggle-control.wpforms-setting-lite-connect-auto-save-toggle input").prop("disabled",!1)},enableLiteConnectToggleClick(){l(i).on("mousedown touchstart","#wpforms-setting-row-lite-connect-enabled label, .wpforms-setting-lite-connect-auto-save-toggle label",function(e){"ontouchstart"in i.documentElement||e.preventDefault();let t=l(this).closest("#wpforms-setting-row-lite-connect-enabled, .wpforms-setting-lite-connect-auto-save-toggle").find("#wpforms-setting-lite-connect-enabled");t.prop("disabled")||(e=t.is(":checked"),c.openSettingsLiteConnectModal(e,function(){t.trigger("click").prop("disabled",!0)}))})},enableLiteConnectButtonClick(){l(i).on("click",".wpforms-dyk-lite-connect .button-primary",function(e){e.preventDefault();e=l(this);e.hasClass("wpforms-is-enabled")?n.open(e.attr("href")):c.openSettingsLiteConnectModal(!1,c.enableLiteConnectButtonModalConfirm)})},enableLiteConnectAIButtonClick(){l(i).on("click",".enable-lite-connect-modal",c.handleLiteConnectModalClick)},finalizeLiteConnectSetup(){return l.get(wpforms_education_lite_connect.ajax_url,{action:"wpforms_lite_connect_finalize",nonce:wpforms_education_lite_connect.nonce})},handleLiteConnectModalClick(e){e.preventDefault(),c.openAILiteConnectEnableModal(function(){c.saveSettingAjaxPost(!0,l(),function(){c.switchSettingView(!0,l("#wpforms-builder-lite-connect-top-bar .wpforms-toggle-control")),c.finalizeLiteConnectSetup().done(()=>{c.removeLiteConnectModalOnAIButtons()})})})},removeLiteConnectModalOnAIButtons(){l(".enable-lite-connect-modal.wpforms-prevent-default").each(function(){var e=l(this);e.removeClass("enable-lite-connect-modal wpforms-prevent-default"),e.hasClass("wpforms-template-generate")&&e.trigger("click"),l("#wpforms-builder-lite-connect-top-bar").length&&c.toggleBuilderTopBar(!1)})},enableLiteConnectButtonModalConfirm(){let e=l(".wpforms-dyk-lite-connect .button-primary");c.saveSettingAjaxPost(!0,e,function(){c.switchSettingView(!0,e)})},openSettingsLiteConnectModal(e,t){e?c.openSettingsLiteConnectDisableModal(t):c.openSettingsLiteConnectEnableModal(t)},openSettingsLiteConnectEnableModal(e){e={content:wp.template("wpforms-settings-lite-connect-modal-content")(),confirm:{text:wpforms_education_lite_connect.enable_modal.confirm,callback:e}};c.enableModal(e)},openAILiteConnectEnableModal(e){e={content:wp.template("wpforms-builder-ai-lite-connect-modal-content")(),confirm:{text:wpforms_education_lite_connect.enable_ai.confirm,callback:e},theme:"modern, ai-modal"};wpforms_education_lite_connect.update_result.enabled_title=wpforms_education_lite_connect.enable_ai.enabled_title,c.enableModal(e)},enableModal(t){l.alert({title:!1,content:t.content,icon:!1,type:"orange",boxWidth:550,theme:t.theme||"modern",useBootstrap:!1,scrollToPreviousElement:!1,buttons:{confirm:{text:t.confirm.text,btnClass:"btn-confirm",keys:["enter"],action(){var e;"function"==typeof t.confirm.callback&&t.confirm.callback(),"function"==typeof(e=n.WPFormsChallenge?WPFormsChallenge.embed&&WPFormsChallenge.embed.completeChallenge:e)&&e()}},cancel:{text:wpforms_education_lite_connect.enable_modal.cancel,action(){l(".wpforms-challenge-popup-container").removeClass("wpforms-invisible")}}},onOpenBefore(){l("body").addClass("wpforms-setting-lite-connect-modal"),l(".wpforms-challenge-popup-container").addClass("wpforms-invisible")},onDestroy(){l("body").removeClass("wpforms-setting-lite-connect-modal")}})},openSettingsLiteConnectDisableModal(e){l.alert({title:wpforms_education_lite_connect.disable_modal.title,content:wpforms_education_lite_connect.disable_modal.content,icon:"fa fa-exclamation-circle",type:"red",boxWidth:"400px",theme:"modern",useBootstrap:!1,animateFromElement:!1,scrollToPreviousElement:!1,buttons:{cancel:{text:wpforms_education_lite_connect.disable_modal.cancel,keys:["enter"],btnClass:"btn-confirm"},confirm:{text:wpforms_education_lite_connect.disable_modal.confirm,action(){"function"==typeof e&&e()}}}})},saveSettingAjaxPost(t,e,n){let o=(e=e||l()).find("input");l.post(wpforms_education_lite_connect.ajax_url,{action:"wpforms_update_lite_connect_enabled_setting",value:t?1:0,nonce:wpforms_education_lite_connect.nonce}).done(function(e){e.success?(c.updateResultModal(t?"enabled":"disabled"),"function"==typeof n&&n()):(o.prop("checked",!t),c.updateResultModal("error"))}).fail(function(){o.prop("checked",!t),c.updateResultModal("error")}).always(function(){o.prop("disabled",!1)})},autoSaveToggleChange(){l(i).on("change",".wpforms-toggle-control.wpforms-setting-lite-connect-auto-save-toggle input",function(){let e=l(this),t=e.closest(".wpforms-toggle-control"),n=e.is(":checked");c.saveSettingAjaxPost(n,t,function(){c.switchSettingView(n,t),c.removeLiteConnectModalOnAIButtons(),c.finalizeLiteConnectSetup()})})},switchSettingView(e,t){var t=t.closest(".wpforms-education-lite-connect-wrapper"),n=t.find(".wpforms-education-lite-connect-setting"),t=t.find(".wpforms-education-lite-connect-enabled-info");n.toggleClass("wpforms-hidden",e),t.toggleClass("wpforms-hidden",!e)},updateResultModal(e){wpforms_education_lite_connect.update_result[e]&&l.alert({title:wpforms_education_lite_connect.update_result[e+"_title"],content:wpforms_education_lite_connect.update_result[e],icon:"fa fa-check-circle",type:"error"===e?"red":"green",theme:"modern",boxWidth:"400px",useBootstrap:!1,animation:"scale",closeAnimation:"scale",animateFromElement:!1,scrollToPreviousElement:!1,buttons:{confirm:{text:wpforms_education_lite_connect.update_result.close,btnClass:"btn-confirm",keys:["enter"]}}})},maybeRevealBuilderTopBar(){n.wpforms_builder&&"1"!==wpforms_education_lite_connect.is_enabled&&0!==l("#wpforms-builder-lite-connect-top-bar").length&&setTimeout(function(){c.toggleBuilderTopBar(!0)},3e3)},toggleBuilderTopBar(e){var t="--wpforms-admin-bar-height",n=i.documentElement,o=parseInt(getComputedStyle(n).getPropertyValue(t),10);n.setAttribute("style",t+": "+(o+=e?45:-45)+"px!important;")},dismissBuilderTopBarClick(){l(i).on("click","#wpforms-builder-lite-connect-top-bar .wpforms-dismiss-button",function(){c.toggleBuilderTopBar(!1)})}};return c})(document,window,jQuery),WPFormsEducation.liteConnect.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.js new file mode 100755 index 00000000..21f3108e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.js @@ -0,0 +1,120 @@ +/* global wpCookies */ + +/** + * Entries list page. + */ +const WPFormsEntryList = window.WPFormsEntryList || ( function( document, window, $ ) { + /** + * Public functions and properties. + * + * @since 1.8.9 + * + * @type {Object} + */ + const app = { + + /** + * Initialize the engine. + * + * @since 1.8.9 + */ + init() { + $( app.ready ); + }, + + /** + * Ready. + * + * @since 1.8.9 + */ + ready() { + app.events(); + }, + + /** + * Events. + * + * @since 1.8.9 + */ + events() { + // Show sample data for entries when the Explore Entries is clicked. + $( '#wpforms-entries-explore' ).on( 'click', app.showEntries ); + + // Hide sample data for entries when the Hide Sample Data is clicked. + $( '#wpforms-hide-sample-data' ).on( 'click', app.hideEntries ); + + // Toggle the action dropdown. + $( '#wpforms-list-table-ext-edit-columns-cog' ).on( 'click', app.toggleActionDropdown ); + $( '#wpcontent' ).on( 'click', app.hideActionDropdown ); + }, + + /** + * Show entries. + * + * @since 1.8.9 + * + * @param {Object} e Event object. + */ + showEntries( e ) { + e.preventDefault(); + + $( '.entries-modal' ).fadeOut( 500, function() { + $( '#wpforms-sample-entry-main-notice' ).slideDown( 250 ); + $( '#wpforms-entries-list' ).addClass( 'wpforms-entires-sample-view' ); + } ); + wpCookies.set( 'wpforms_sample_entries', 'true', 2592000 ); // 1 month + }, + + /** + * Hide entries. + * + * @since 1.8.9 + * + * @param {Object} e Event object. + */ + hideEntries( e ) { + e.preventDefault(); + + // Bypass animation as this is causing fade in/out issues. + $( '#wpforms-sample-entry-main-notice' ).fadeOut( 250, function() { + $( '#wpforms-entries-list' ).removeClass( 'wpforms-entires-sample-view' ); + $( '.wpforms-sample-entry-notice' ).removeClass( 'wpf-no-animate' ); + $( '.entries-modal' ).fadeIn( 500 ); + } ); + + wpCookies.remove( 'wpforms_sample_entries' ); + }, + + /** + * Toggle the action dropdown. + * + * @since 1.8.9 + * + * @param {Object} e Event object. + */ + toggleActionDropdown( e ) { + e.preventDefault(); + e.stopPropagation(); + + $( this ).parent().toggleClass( 'is_active' ); + }, + + /** + * Hide the action dropdown. + * + * @since 1.8.9 + */ + hideActionDropdown() { + const actionColumn = $( '#wpforms-list-table-ext-edit-columns-cog' ).parent(); + + if ( actionColumn.hasClass( 'is_active' ) ) { + actionColumn.removeClass( 'is_active' ); + } + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize the engine. +WPFormsEntryList.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.min.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.min.js new file mode 100755 index 00000000..916ca99f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/entry-list.min.js @@ -0,0 +1 @@ +let WPFormsEntryList=window.WPFormsEntryList||(t=>{let e={init(){t(e.ready)},ready(){e.events()},events(){t("#wpforms-entries-explore").on("click",e.showEntries),t("#wpforms-hide-sample-data").on("click",e.hideEntries),t("#wpforms-list-table-ext-edit-columns-cog").on("click",e.toggleActionDropdown),t("#wpcontent").on("click",e.hideActionDropdown)},showEntries(e){e.preventDefault(),t(".entries-modal").fadeOut(500,function(){t("#wpforms-sample-entry-main-notice").slideDown(250),t("#wpforms-entries-list").addClass("wpforms-entires-sample-view")}),wpCookies.set("wpforms_sample_entries","true",2592e3)},hideEntries(e){e.preventDefault(),t("#wpforms-sample-entry-main-notice").fadeOut(250,function(){t("#wpforms-entries-list").removeClass("wpforms-entires-sample-view"),t(".wpforms-sample-entry-notice").removeClass("wpf-no-animate"),t(".entries-modal").fadeIn(500)}),wpCookies.remove("wpforms_sample_entries")},toggleActionDropdown(e){e.preventDefault(),e.stopPropagation(),t(this).parent().toggleClass("is_active")},hideActionDropdown(){var e=t("#wpforms-list-table-ext-edit-columns-cog").parent();e.hasClass("is_active")&&e.removeClass("is_active")}};return e})((document,window,jQuery));WPFormsEntryList.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.js new file mode 100755 index 00000000..d48c0391 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.js @@ -0,0 +1,105 @@ +/** + * View single entry page. + * + * @since 1.8.9 + */ +const WPFormsViewEntry = window.WPFormsViewEntry || ( function( document, window, $ ) { + /** + * Elements holder. + * + * @since 1.8.9 + * + * @type {Object} + */ + let el = {}; + + /** + * Public functions and properties. + * + * @since 1.8.9 + * + * @type {Object} + */ + const app = { + + /** + * Initialize the engine. + * + * @since 1.8.9 + */ + init() { + $( app.ready ); + }, + + /** + * Document ready. + * + * @since 1.8.9 + */ + ready() { + app.setup(); + app.events(); + }, + + /** + * Setup. Prepare some variables. + * + * @since 1.8.9 + */ + setup() { + // Cache DOM elements. + el = { + menuClass: '.wpforms-entries-settings-menu', + }; + }, + + /** + * Events. + * + * @since 1.8.9 + */ + events() { + $( '#wpforms-entries-settings-button' ).on( 'click', app.menuToggle ); + $( '#wpcontent' ).on( 'click', app.menuHide ); + }, + + /** + * Handler for the menu toggle behavior. + * + * @since 1.8.9 + * + * @param {Object} event Event object. + */ + menuToggle( event ) { + event.preventDefault(); + event.stopPropagation(); + + // Toggle the visibility of the matched element. + $( el.menuClass ).toggle( 0, function() { + const $menu = $( this ); + + // When the menu is open, aria-expended="true". + $menu.attr( 'aria-expanded', $menu.is( ':visible' ) ); + } ); + }, + + /** + * Handler for hiding the menu when a click is outside of it. + * + * @since 1.8.9 + * + * @param {Object} event Event object. + */ + menuHide( event ) { + // Check if the clicked element is not the menu container or a child of it. + if ( ! $( event.target ).closest( `${ el.menuClass }:visible` ).length ) { + $( el.menuClass ).attr( 'aria-expanded', 'false' ).hide(); + } + }, + }; + + return app; +}( document, window, jQuery ) ); + +// Initialize the engine. +WPFormsViewEntry.init(); diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.min.js b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.min.js new file mode 100755 index 00000000..b17316da --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/admin/entries/view-entry.min.js @@ -0,0 +1 @@ +let WPFormsViewEntry=window.WPFormsViewEntry||(t=>{let n={},e={init(){t(e.ready)},ready(){e.setup(),e.events()},setup(){n={menuClass:".wpforms-entries-settings-menu"}},events(){t("#wpforms-entries-settings-button").on("click",e.menuToggle),t("#wpcontent").on("click",e.menuHide)},menuToggle(e){e.preventDefault(),e.stopPropagation(),t(n.menuClass).toggle(0,function(){var e=t(this);e.attr("aria-expanded",e.is(":visible"))})},menuHide(e){t(e.target).closest(n.menuClass+":visible").length||t(n.menuClass).attr("aria-expanded","false").hide()}};return e})((document,window,jQuery));WPFormsViewEntry.init(); \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/integrations/elementor/themes.json b/wp-content/plugins/wpforms-lite/assets/lite/js/integrations/elementor/themes.json new file mode 100755 index 00000000..8e24219f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/integrations/elementor/themes.json @@ -0,0 +1,452 @@ +{ + "classic": { + "name": "Classic", + "settings": { + "fieldSize": "medium", + "fieldBorderRadius": "0px", + "fieldBorderStyle": "solid", + "fieldBorderSize": "1px", + "fieldBackgroundColor": "#ffffff", + "fieldBorderColor": "#cccccc", + "fieldTextColor": "#444444", + "fieldMenuColor": "#ffffff", + "labelSize": "small", + "labelColor": "#262626", + "labelSublabelColor": "#7f7f7f", + "labelErrorColor": "#ff0000", + "buttonSize": "medium", + "buttonBorderStyle": "solid", + "buttonBorderSize": "1px", + "buttonBorderRadius": "0px", + "buttonBorderColor": "#cccccc", + "buttonBackgroundColor": "#dddddd", + "buttonTextColor": "#666666", + "pageBreakColor": "#dddddd" + } + }, + "default": { + "name": "Default", + "settings": { + "fieldSize": "medium", + "fieldBorderRadius": "3px", + "fieldBorderStyle": "solid", + "fieldBorderSize": "1px", + "fieldBackgroundColor": "#ffffff", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )", + "fieldTextColor": "rgba( 0, 0, 0, 0.7 )", + "fieldMenuColor": "#ffffff", + "labelSize": "medium", + "labelColor": "rgba( 0, 0, 0, 0.85 )", + "labelSublabelColor": "rgba( 0, 0, 0, 0.55 )", + "labelErrorColor": "#d63637", + "buttonSize": "medium", + "buttonBorderStyle": "none", + "buttonBorderSize": "1px", + "buttonBorderRadius": "3px", + "buttonBorderColor": "#066aab", + "buttonBackgroundColor": "#066aab", + "buttonTextColor": "#ffffff", + "pageBreakColor": "#066aab" + } + }, + "cerulean": { + "name": "Cerulean", + "settings": { + "buttonBackgroundColor": "#0090bf", + "buttonTextColor": "#e5f4f9", + "labelColor": "#262c2e", + "labelSublabelColor": "#4c585d", + "fieldBorderColor": "#afb6b9" + } + }, + "ocean": { + "name": "Ocean", + "settings": { + "buttonBackgroundColor": "#348180", + "buttonTextColor": "#ebf2f2", + "labelColor": "#181c1c", + "labelSublabelColor": "#636c6c", + "fieldBorderColor": "#9ea3a3" + } + }, + "fern": { + "name": "Fern", + "settings": { + "buttonBackgroundColor": "#58bb5d", + "buttonTextColor": "#eef8ef", + "labelColor": "#383c39", + "labelSublabelColor": "#707971", + "fieldBorderColor": "#c6cbc6" + } + }, + "lilac": { + "name": "Lilac", + "settings": { + "buttonBackgroundColor": "#9864c0", + "buttonTextColor": "#f5eff9", + "labelColor": "#333135", + "labelSublabelColor": "#807b84", + "fieldBorderColor": "#bfbdc1" + } + }, + "taffy": { + "name": "Taffy", + "settings": { + "buttonBackgroundColor": "#f785c0", + "buttonTextColor": "#fef3f9", + "labelColor": "#484446", + "labelSublabelColor": "#b5aab0", + "fieldBorderColor": "#dad4d7" + } + }, + "tangerine": { + "name": "Tangerine", + "settings": { + "buttonBackgroundColor": "#e27730", + "buttonTextColor": "#fcf1ea", + "labelColor": "#3d3835", + "labelSublabelColor": "#79716b", + "fieldBorderColor": "#cbc6c2" + } + }, + "slate": { + "name": "Slate", + "settings": { + "buttonBackgroundColor": "#67687d", + "buttonTextColor": "#f0f0f2", + "labelColor": "#3a3a41", + "labelSublabelColor": "#686974", + "fieldBorderColor": "#c3c3c7" + } + }, + "iron": { + "name": "Iron", + "settings": { + "buttonBackgroundColor": "#2e2c2f", + "buttonTextColor": "#eaeaea", + "labelColor": "#2e2c2e", + "labelSublabelColor": "#969596", + "fieldBorderColor": "#cbcacb" + } + }, + "aero": { + "name": "Aero", + "settings": { + "buttonBackgroundColor": "#3961FF", + "buttonTextColor": "#FFFFFF", + "labelColor": "#000000", + "labelSublabelColor": "#6A6A6A", + "fieldBorderColor": "#D2D2D2" + } + }, + "blossom": { + "name": "Blossom", + "settings": { + "buttonBackgroundColor": "#d75e42", + "buttonTextColor": "#ffffff", + "labelColor": "#32261b", + "labelSublabelColor": "#634d36", + "fieldBorderColor": "rgba( 51, 26, 0, 0.15 )" + } + }, + "bokeh": { + "name": "Bokeh", + "settings": { + "buttonBackgroundColor": "#272633", + "buttonTextColor": "#FFFFFF", + "labelColor": "#272633", + "labelSublabelColor": "#625E53", + "fieldBorderColor": "#FCF5F3" + } + }, + "concrete": { + "name": "Concrete", + "settings": { + "buttonBackgroundColor": "#f04970", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "rgba(255, 255, 255, 0.50)", + "fieldBorderColor": "rgba(255, 255, 255, 0.25)" + } + }, + "cottoncandy": { + "name": "Cotton Candy", + "settings": { + "buttonBackgroundColor": "#952653", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "rgba(255, 255, 255, 0.75)", + "fieldBorderColor": "rgba(255, 255, 255, 0.5)" + } + }, + "craft": { + "name": "Craft", + "settings": { + "buttonBackgroundColor": "rgba(0 ,0 ,0 ,0)", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "#e0c5c5", + "fieldBorderColor": "rgba(255, 255, 255, 0.50)" + } + }, + "elegance": { + "name": "Elegance", + "settings": { + "buttonBackgroundColor": "#7d7d7d", + "buttonTextColor": "#ffffff", + "labelColor": "#7d7d7d", + "labelSublabelColor": "#7d7d7d", + "fieldBorderColor": "#e6e6e4" + } + }, + "feathered": { + "name": "Feathered", + "settings": { + "buttonBackgroundColor": "#46443a", + "buttonTextColor": "#ffffff", + "labelColor": "#46443a", + "labelSublabelColor": "#625e53", + "fieldBorderColor": "rgba(0, 0, 0, 0.15)" + } + }, + "flynn": { + "name": "Flynn", + "settings": { + "buttonBackgroundColor": "f0f0ff", + "buttonTextColor": "#4b49e0", + "labelColor": "#4b49e0", + "labelSublabelColor": "#4b49e0", + "fieldBorderColor": "#4b49e0" + } + }, + "fresh": { + "name": "Fresh", + "settings": { + "buttonBackgroundColor": "#2da314", + "buttonTextColor": "#ffffff", + "labelColor": "#000000", + "labelSublabelColor": "#404040", + "fieldBorderColor": "rgba(0, 0, 0, 0.30)" + } + }, + "frost": { + "name": "Frost", + "settings": { + "buttonBackgroundColor": "#e03f79", + "buttonTextColor": "#ffffff", + "labelColor": "#09598d", + "labelSublabelColor": "#578bad", + "fieldBorderColor": "#6e9fbe" + } + }, + "gloom": { + "name": "Gloom", + "settings": { + "buttonBackgroundColor": "#258c60", + "buttonTextColor": "#ffffff", + "labelColor": "#a9abad", + "labelSublabelColor": "rgba(255, 255, 255, .7)", + "fieldBorderColor": "#4a4b4f" + } + }, + "greenery": { + "name": "Greenery", + "settings": { + "buttonBackgroundColor": "#1e1f19", + "buttonTextColor": "#ffffff", + "labelColor": "#262c1e", + "labelSublabelColor": "rgba(38, 44, 30, 0.5)", + "fieldBorderColor": "rgba(0, 0, 0, 0.10)" + } + }, + "hallway": { + "name": "Hallway", + "settings": { + "buttonBackgroundColor": "#000000", + "buttonTextColor": "#ffffff", + "labelColor": "#000000", + "labelSublabelColor": "#000000", + "fieldBorderColor": "#cbcbcb" + } + }, + "harvest": { + "name": "Harvest", + "settings": { + "buttonBackgroundColor": "#984628", + "buttonTextColor": "#ffffff", + "labelColor": "#481f10", + "labelSublabelColor": "#984628", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )" + } + }, + "jungle": { + "name": "Jungle", + "settings": { + "buttonBackgroundColor": "rgba(14, 143, 28, 0.5)", + "buttonTextColor": "#ffffff", + "labelColor": "rgba(255, 255, 255, 0.7)", + "labelSublabelColor": "rgba(255, 255, 255, 0.6)", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )" + } + }, + "lush": { + "name": "Lush", + "settings": { + "buttonBackgroundColor": "#962d3c", + "buttonTextColor": "#ffffff", + "labelColor": "#312425", + "labelSublabelColor": "rgba(49, 36, 37, 0.5)", + "fieldBorderColor": "rgba(0, 0, 0, 0.10)" + } + }, + "manhattan": { + "name": "Manhattan", + "settings": { + "buttonBackgroundColor": "rgba(0, 0, 0, 0.32)", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "rgba(255, 255, 255, 0.75)", + "fieldBorderColor": "rgba(255, 255, 255, 0.15)" + } + }, + "matrix": { + "name": "Matrix", + "settings": { + "buttonBackgroundColor": "#8ee8d6", + "buttonTextColor": "#111a12", + "labelColor": "#d8fff7", + "labelSublabelColor": "#d8fff7", + "fieldBorderColor": "#8ee8d6" + } + }, + "monstera": { + "name": "Monstera", + "settings": { + "buttonBackgroundColor": "#2f590f", + "buttonTextColor": "#ffffff", + "labelColor": "#000000", + "labelSublabelColor": "#6a6a6a", + "fieldBorderColor": "#a3a9c2" + } + }, + "negative": { + "name": "Negative", + "settings": { + "buttonBackgroundColor": "#ff4d24", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "#999999", + "fieldBorderColor": "#616265" + } + }, + "palm": { + "name": "Palm", + "settings": { + "buttonBackgroundColor": "#000000", + "buttonTextColor": "#ffffff", + "labelColor": "#000000", + "labelSublabelColor": "#6a6a6a", + "fieldBorderColor": "#636363" + } + }, + "plaster": { + "name": "Plaster", + "settings": { + "buttonBackgroundColor": "#494848", + "buttonTextColor": "#ffffff", + "labelColor": "#494848", + "labelSublabelColor": "#afafaf", + "fieldBorderColor": "#afafaf" + } + }, + "range": { + "name": "Range", + "settings": { + "buttonBackgroundColor": "#ae0120", + "buttonTextColor": "#ffffff", + "labelColor": "#000000", + "labelSublabelColor": "#6a6a6a", + "fieldBorderColor": "rgba(61, 0, 0, 0.15)" + } + }, + "rustic": { + "name": "Rustic", + "settings": { + "buttonBackgroundColor": "rgba(0, 0, 0, 0.5)", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "rgba(255, 255, 255, 0.75)", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )" + } + }, + "scrap": { + "name": "Scrap", + "settings": { + "buttonBackgroundColor": "#2f3133", + "buttonTextColor": "#ffffff", + "labelColor": "#2f3133", + "labelSublabelColor": "#2f3133", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )" + } + }, + "solitude": { + "name": "Solitude", + "settings": { + "buttonBackgroundColor": "#0e0f32", + "buttonTextColor": "#ffffff", + "labelColor": "#0e0f32", + "labelSublabelColor": "#64647f", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )" + } + }, + "sonic": { + "name": "Sonic", + "settings": { + "buttonBackgroundColor": "#073eff", + "buttonTextColor": "#ffffff", + "labelColor": "#666666", + "labelSublabelColor": "#666666", + "fieldBorderColor": "#073eff" + } + }, + "tidal": { + "name": "Tidal", + "settings": { + "buttonBackgroundColor": "#474e54", + "buttonTextColor": "#ffffff", + "labelColor": "#ffffff", + "labelSublabelColor": "#a7b3be", + "fieldBorderColor": "#474e54" + } + }, + "tranquil": { + "name": "Tranquil", + "settings": { + "buttonBackgroundColor": "#366ce3", + "buttonTextColor": "#ffffff", + "labelColor": "#373d4a", + "labelSublabelColor": "#606775", + "fieldBorderColor": "rgba( 0, 0, 0, 0.25 )" + } + }, + "vintage": { + "name": "Vintage", + "settings": { + "buttonBackgroundColor": "#f2cd52", + "buttonTextColor": "#1a1a1a", + "labelColor": "#1a1a1a", + "labelSublabelColor": "#4d4d4d", + "fieldBorderColor": "#bababa" + } + }, + "western": { + "name": "Western", + "settings": { + "buttonBackgroundColor": "rgba(255, 255, 255, 0.05)", + "buttonTextColor": "#e0b495", + "labelColor": "#ffffff", + "labelSublabelColor": "#e0b495", + "fieldBorderColor": "#e0b495" + } + } +} diff --git a/wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/formselector.es5.js b/wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/formselector.es5.js new file mode 100755 index 00000000..d1311f15 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/assets/lite/js/integrations/gutenberg/formselector.es5.js @@ -0,0 +1,5739 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { + var fn = queue.shift(); + fn(); + } + } + }, true); + + return function nextTick(fn) { + queue.push(fn); + window.postMessage('process-tick', '*'); + }; + } + + return function nextTick(fn) { + setTimeout(fn, 0); + }; +})(); + +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +} + +// TODO(shtylman) +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; + +},{}],2:[function(require,module,exports){ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +'use strict'; +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; + +},{}],3:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var printWarning = function() {}; + +if (process.env.NODE_ENV !== 'production') { + var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); + var loggedTypeFailures = {}; + var has = require('./lib/has'); + + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) { /**/ } + }; +} + +/** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ +function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + if (process.env.NODE_ENV !== 'production') { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error( + (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.' + ); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning( + (componentName || 'React class') + ': type specification of ' + + location + ' `' + typeSpecName + '` is invalid; the type checker ' + + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + + 'You may have forgotten to pass an argument to the type checker ' + + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + + 'shape all require an argument).' + ); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var stack = getStack ? getStack() : ''; + + printWarning( + 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') + ); + } + } + } + } +} + +/** + * Resets warning cache when testing. + * + * @private + */ +checkPropTypes.resetWarningCache = function() { + if (process.env.NODE_ENV !== 'production') { + loggedTypeFailures = {}; + } +} + +module.exports = checkPropTypes; + +}).call(this,require("hmr7eR")) +},{"./lib/ReactPropTypesSecret":7,"./lib/has":8,"hmr7eR":1}],4:[function(require,module,exports){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); + +function emptyFunction() {} +function emptyFunctionWithReset() {} +emptyFunctionWithReset.resetWarningCache = emptyFunction; + +module.exports = function() { + function shim(props, propName, componentName, location, propFullName, secret) { + if (secret === ReactPropTypesSecret) { + // It is still safe when called from React. + return; + } + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use PropTypes.checkPropTypes() to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + }; + shim.isRequired = shim; + function getShim() { + return shim; + }; + // Important! + // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`. + var ReactPropTypes = { + array: shim, + bigint: shim, + bool: shim, + func: shim, + number: shim, + object: shim, + string: shim, + symbol: shim, + + any: shim, + arrayOf: getShim, + element: shim, + elementType: shim, + instanceOf: getShim, + node: shim, + objectOf: getShim, + oneOf: getShim, + oneOfType: getShim, + shape: getShim, + exact: getShim, + + checkPropTypes: emptyFunctionWithReset, + resetWarningCache: emptyFunction + }; + + ReactPropTypes.PropTypes = ReactPropTypes; + + return ReactPropTypes; +}; + +},{"./lib/ReactPropTypesSecret":7}],5:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var ReactIs = require('react-is'); +var assign = require('object-assign'); + +var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); +var has = require('./lib/has'); +var checkPropTypes = require('./checkPropTypes'); + +var printWarning = function() {}; + +if (process.env.NODE_ENV !== 'production') { + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} + +function emptyFunctionThatReturnsNull() { + return null; +} + +module.exports = function(isValidElement, throwOnDirectAccess) { + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<>'; + + // Important! + // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bigint: createPrimitiveTypeChecker('bigint'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + symbol: createPrimitiveTypeChecker('symbol'), + + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + elementType: createElementTypeTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker, + exact: createStrictShapeTypeChecker, + }; + + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + /*eslint-disable no-self-compare*/ + function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return x !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } + } + /*eslint-enable no-self-compare*/ + + /** + * We use an Error-like object for backward compatibility as people may call + * PropTypes directly and inspect their output. However, we don't use real + * Errors anymore. We don't inspect their stack anyway, and creating them + * is prohibitively expensive if they are created too often, such as what + * happens in oneOfType() for any type before the one that matched. + */ + function PropTypeError(message, data) { + this.message = message; + this.data = data && typeof data === 'object' ? data: {}; + this.stack = ''; + } + // Make `instanceof Error` still work for returned errors. + PropTypeError.prototype = Error.prototype; + + function createChainableTypeChecker(validate) { + if (process.env.NODE_ENV !== 'production') { + var manualPropTypeCallCache = {}; + var manualPropTypeWarningCount = 0; + } + function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + + if (secret !== ReactPropTypesSecret) { + if (throwOnDirectAccess) { + // New behavior only for users of `prop-types` package + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use `PropTypes.checkPropTypes()` to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') { + // Old behavior for people using React.PropTypes + var cacheKey = componentName + ':' + propName; + if ( + !manualPropTypeCallCache[cacheKey] && + // Avoid spamming the console because they are often not actionable except for lib authors + manualPropTypeWarningCount < 3 + ) { + printWarning( + 'You are manually calling a React.PropTypes validation ' + + 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + + 'and will throw in the standalone `prop-types` package. ' + + 'You may be seeing this warning due to a third-party PropTypes ' + + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' + ); + manualPropTypeCallCache[cacheKey] = true; + manualPropTypeWarningCount++; + } + } + } + if (props[propName] == null) { + if (isRequired) { + if (props[propName] === null) { + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); + } + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + + return chainedCheckType; + } + + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName, secret) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'), + {expectedType: expectedType} + ); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunctionThatReturnsNull); + } + + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); + } + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!isValidElement(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!ReactIs.isValidElementType(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + if (process.env.NODE_ENV !== 'production') { + if (arguments.length > 1) { + printWarning( + 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + + 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' + ); + } else { + printWarning('Invalid argument supplied to oneOf, expected an array.'); + } + } + return emptyFunctionThatReturnsNull; + } + + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (is(propValue, expectedValues[i])) { + return null; + } + } + + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + var type = getPreciseType(value); + if (type === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); + } + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (has(propValue, key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0; + return emptyFunctionThatReturnsNull; + } + + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (typeof checker !== 'function') { + printWarning( + 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + + 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' + ); + return emptyFunctionThatReturnsNull; + } + } + + function validate(props, propName, componentName, location, propFullName) { + var expectedTypes = []; + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret); + if (checkerResult == null) { + return null; + } + if (checkerResult.data && has(checkerResult.data, 'expectedType')) { + expectedTypes.push(checkerResult.data.expectedType); + } + } + var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': ''; + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.')); + } + return createChainableTypeChecker(validate); + } + + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function invalidValidatorError(componentName, location, propFullName, key, type) { + return new PropTypeError( + (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.' + ); + } + + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createStrictShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + // We need to check all keys in case some are required but missing from props. + var allKeys = assign({}, props[propName], shapeTypes); + for (var key in allKeys) { + var checker = shapeTypes[key]; + if (has(shapeTypes, key) && typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + if (!checker) { + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + + '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + + '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') + ); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } + + return createChainableTypeChecker(validate); + } + + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || isValidElement(propValue)) { + return true; + } + + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + + return true; + default: + return false; + } + } + + function isSymbol(propType, propValue) { + // Native Symbol. + if (propType === 'symbol') { + return true; + } + + // falsy value can't be a Symbol + if (!propValue) { + return false; + } + + // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' + if (propValue['@@toStringTag'] === 'Symbol') { + return true; + } + + // Fallback for non-spec compliant Symbols which are polyfilled. + if (typeof Symbol === 'function' && propValue instanceof Symbol) { + return true; + } + + return false; + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + if (isSymbol(propType, propValue)) { + return 'symbol'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + if (typeof propValue === 'undefined' || propValue === null) { + return '' + propValue; + } + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns a string that is postfixed to a warning about an invalid type. + // For example, "undefined" or "of type array" + function getPostfixForTypeWarning(value) { + var type = getPreciseType(value); + switch (type) { + case 'array': + case 'object': + return 'an ' + type; + case 'boolean': + case 'date': + case 'regexp': + return 'a ' + type; + default: + return type; + } + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return ANONYMOUS; + } + return propValue.constructor.name; + } + + ReactPropTypes.checkPropTypes = checkPropTypes; + ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; + ReactPropTypes.PropTypes = ReactPropTypes; + + return ReactPropTypes; +}; + +}).call(this,require("hmr7eR")) +},{"./checkPropTypes":3,"./lib/ReactPropTypesSecret":7,"./lib/has":8,"hmr7eR":1,"object-assign":2,"react-is":11}],6:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +if (process.env.NODE_ENV !== 'production') { + var ReactIs = require('react-is'); + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess); +} else { + // By explicitly using `prop-types` you are opting into new production behavior. + // http://fb.me/prop-types-in-prod + module.exports = require('./factoryWithThrowingShims')(); +} + +}).call(this,require("hmr7eR")) +},{"./factoryWithThrowingShims":4,"./factoryWithTypeCheckers":5,"hmr7eR":1,"react-is":11}],7:[function(require,module,exports){ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + +module.exports = ReactPropTypesSecret; + +},{}],8:[function(require,module,exports){ +module.exports = Function.call.bind(Object.prototype.hasOwnProperty); + +},{}],9:[function(require,module,exports){ +(function (process){ +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + + + +if (process.env.NODE_ENV !== "production") { + (function() { +'use strict'; + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary +// (unstable) APIs that have been removed. Can we remove the symbols? + +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; +var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; +var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; +var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; +var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} // AsyncMode is deprecated along with isAsyncMode + +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} + +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} + +}).call(this,require("hmr7eR")) +},{"hmr7eR":1}],10:[function(require,module,exports){ +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict';var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b? +Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119; +function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d; +exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t}; +exports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p}; +exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z; + +},{}],11:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (process.env.NODE_ENV === 'production') { + module.exports = require('./cjs/react-is.production.min.js'); +} else { + module.exports = require('./cjs/react-is.development.js'); +} + +}).call(this,require("hmr7eR")) +},{"./cjs/react-is.development.js":9,"./cjs/react-is.production.min.js":10,"hmr7eR":1}],12:[function(require,module,exports){ +"use strict"; + +var _education = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/education.js")); +var _common = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/common.js")); +var _themesPanel = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/themes-panel.js")); +var _containerStyles = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/container-styles.js")); +var _backgroundStyles = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/background-styles.js")); +var _buttonStyles = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/button-styles.js")); +var _advancedSettings = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/advanced-settings.js")); +var _fieldStyles = _interopRequireDefault(require("../../../js/integrations/gutenberg/modules/field-styles.js")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* jshint es3: false, esversion: 6 */ +/** + * Gutenberg editor block for Lite. + * + * @since 1.8.8 + */ +var WPForms = window.WPForms || {}; +WPForms.FormSelector = WPForms.FormSelector || function () { + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + var app = { + /** + * Common module object. + * + * @since 1.8.8 + * + * @type {Object} + */ + common: {}, + /** + * Panel modules objects. + * + * @since 1.8.8 + * + * @type {Object} + */ + panels: {}, + /** + * Start the engine. + * + * @since 1.8.8 + */ + init: function init() { + app.education = _education.default; + app.common = _common.default; + app.panels.themes = _themesPanel.default; + app.panels.container = _containerStyles.default; + app.panels.background = _backgroundStyles.default; + app.panels.button = _buttonStyles.default; + app.panels.advanced = _advancedSettings.default; + app.panels.field = _fieldStyles.default; + var blockOptions = { + panels: app.panels, + getThemesPanel: app.panels.themes.getThemesPanel, + getFieldStyles: app.panels.field.getFieldStyles, + getContainerStyles: app.panels.container.getContainerStyles, + getBackgroundStyles: app.panels.background.getBackgroundStyles, + getButtonStyles: app.panels.button.getButtonStyles, + getCommonAttributes: app.getCommonAttributes, + setStylesHandlers: app.getStyleHandlers(), + education: app.education + }; + + // Initialize Advanced Settings module. + app.panels.advanced.init(app.common); + + // Initialize block. + app.common.init(blockOptions); + }, + /** + * Get style handlers. + * + * @since 1.8.8 + * + * @return {Object} Style handlers. + */ + getCommonAttributes: function getCommonAttributes() { + return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, app.panels.field.getBlockAttributes()), app.panels.container.getBlockAttributes()), app.panels.background.getBlockAttributes()), app.panels.button.getBlockAttributes()); + }, + /** + * Get style handlers. + * + * @since 1.8.8 + * + * @return {Object} Style handlers. + */ + getStyleHandlers: function getStyleHandlers() { + return { + 'background-image': app.panels.background.setContainerBackgroundImage, + 'background-position': app.panels.background.setContainerBackgroundPosition, + 'background-repeat': app.panels.background.setContainerBackgroundRepeat, + 'background-width': app.panels.background.setContainerBackgroundWidth, + 'background-height': app.panels.background.setContainerBackgroundHeight, + 'background-color': app.panels.background.setBackgroundColor, + 'background-url': app.panels.background.setBackgroundUrl + }; + } + }; + + // Provide access to public functions/properties. + return app; +}(); + +// Initialize. +WPForms.FormSelector.init(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZWR1Y2F0aW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29tbW9uIiwiX3RoZW1lc1BhbmVsIiwiX2NvbnRhaW5lclN0eWxlcyIsIl9iYWNrZ3JvdW5kU3R5bGVzIiwiX2J1dHRvblN0eWxlcyIsIl9hZHZhbmNlZFNldHRpbmdzIiwiX2ZpZWxkU3R5bGVzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwib3duS2V5cyIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiV1BGb3JtcyIsIndpbmRvdyIsIkZvcm1TZWxlY3RvciIsImFwcCIsImNvbW1vbiIsInBhbmVscyIsImluaXQiLCJlZHVjYXRpb24iLCJ0aGVtZXMiLCJ0aGVtZXNQYW5lbCIsImNvbnRhaW5lciIsImNvbnRhaW5lclN0eWxlcyIsImJhY2tncm91bmQiLCJiYWNrZ3JvdW5kU3R5bGVzIiwiYnV0dG9uIiwiYnV0dG9uU3R5bGVzIiwiYWR2YW5jZWQiLCJhZHZhbmNlZFNldHRpbmdzIiwiZmllbGQiLCJmaWVsZFN0eWxlcyIsImJsb2NrT3B0aW9ucyIsImdldFRoZW1lc1BhbmVsIiwiZ2V0RmllbGRTdHlsZXMiLCJnZXRDb250YWluZXJTdHlsZXMiLCJnZXRCYWNrZ3JvdW5kU3R5bGVzIiwiZ2V0QnV0dG9uU3R5bGVzIiwiZ2V0Q29tbW9uQXR0cmlidXRlcyIsInNldFN0eWxlc0hhbmRsZXJzIiwiZ2V0U3R5bGVIYW5kbGVycyIsImdldEJsb2NrQXR0cmlidXRlcyIsInNldENvbnRhaW5lckJhY2tncm91bmRJbWFnZSIsInNldENvbnRhaW5lckJhY2tncm91bmRQb3NpdGlvbiIsInNldENvbnRhaW5lckJhY2tncm91bmRSZXBlYXQiLCJzZXRDb250YWluZXJCYWNrZ3JvdW5kV2lkdGgiLCJzZXRDb250YWluZXJCYWNrZ3JvdW5kSGVpZ2h0Iiwic2V0QmFja2dyb3VuZENvbG9yIiwic2V0QmFja2dyb3VuZFVybCJdLCJzb3VyY2VzIjpbImZha2VfODFhYjAwZDQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoganNoaW50IGVzMzogZmFsc2UsIGVzdmVyc2lvbjogNiAqL1xuXG5pbXBvcnQgZWR1Y2F0aW9uIGZyb20gJy4uLy4uLy4uL2pzL2ludGVncmF0aW9ucy9ndXRlbmJlcmcvbW9kdWxlcy9lZHVjYXRpb24uanMnO1xuaW1wb3J0IGNvbW1vbiBmcm9tICcuLi8uLi8uLi9qcy9pbnRlZ3JhdGlvbnMvZ3V0ZW5iZXJnL21vZHVsZXMvY29tbW9uLmpzJztcbmltcG9ydCB0aGVtZXNQYW5lbCBmcm9tICcuLi8uLi8uLi9qcy9pbnRlZ3JhdGlvbnMvZ3V0ZW5iZXJnL21vZHVsZXMvdGhlbWVzLXBhbmVsLmpzJztcbmltcG9ydCBjb250YWluZXJTdHlsZXMgZnJvbSAnLi4vLi4vLi4vanMvaW50ZWdyYXRpb25zL2d1dGVuYmVyZy9tb2R1bGVzL2NvbnRhaW5lci1zdHlsZXMuanMnO1xuaW1wb3J0IGJhY2tncm91bmRTdHlsZXMgZnJvbSAnLi4vLi4vLi4vanMvaW50ZWdyYXRpb25zL2d1dGVuYmVyZy9tb2R1bGVzL2JhY2tncm91bmQtc3R5bGVzLmpzJztcbmltcG9ydCBidXR0b25TdHlsZXMgZnJvbSAnLi4vLi4vLi4vanMvaW50ZWdyYXRpb25zL2d1dGVuYmVyZy9tb2R1bGVzL2J1dHRvbi1zdHlsZXMuanMnO1xuaW1wb3J0IGFkdmFuY2VkU2V0dGluZ3MgZnJvbSAnLi4vLi4vLi4vanMvaW50ZWdyYXRpb25zL2d1dGVuYmVyZy9tb2R1bGVzL2FkdmFuY2VkLXNldHRpbmdzLmpzJztcbmltcG9ydCBmaWVsZFN0eWxlcyBmcm9tICcuLi8uLi8uLi9qcy9pbnRlZ3JhdGlvbnMvZ3V0ZW5iZXJnL21vZHVsZXMvZmllbGQtc3R5bGVzLmpzJztcblxuLyoqXG4gKiBHdXRlbmJlcmcgZWRpdG9yIGJsb2NrIGZvciBMaXRlLlxuICpcbiAqIEBzaW5jZSAxLjguOFxuICovXG5jb25zdCBXUEZvcm1zID0gd2luZG93LldQRm9ybXMgfHwge307XG5cbldQRm9ybXMuRm9ybVNlbGVjdG9yID0gV1BGb3Jtcy5Gb3JtU2VsZWN0b3IgfHwgKCBmdW5jdGlvbigpIHtcblx0LyoqXG5cdCAqIFB1YmxpYyBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguOFxuXHQgKlxuXHQgKiBAdHlwZSB7T2JqZWN0fVxuXHQgKi9cblx0Y29uc3QgYXBwID0ge1xuXHRcdC8qKlxuXHRcdCAqIENvbW1vbiBtb2R1bGUgb2JqZWN0LlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC44XG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdGNvbW1vbjoge30sXG5cblx0XHQvKipcblx0XHQgKiBQYW5lbCBtb2R1bGVzIG9iamVjdHMuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKlxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0cGFuZWxzOiB7fSxcblxuXHRcdC8qKlxuXHRcdCAqIFN0YXJ0IHRoZSBlbmdpbmUuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKi9cblx0XHRpbml0KCkge1xuXHRcdFx0YXBwLmVkdWNhdGlvbiA9IGVkdWNhdGlvbjtcblx0XHRcdGFwcC5jb21tb24gPSBjb21tb247XG5cdFx0XHRhcHAucGFuZWxzLnRoZW1lcyA9IHRoZW1lc1BhbmVsO1xuXHRcdFx0YXBwLnBhbmVscy5jb250YWluZXIgPSBjb250YWluZXJTdHlsZXM7XG5cdFx0XHRhcHAucGFuZWxzLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kU3R5bGVzO1xuXHRcdFx0YXBwLnBhbmVscy5idXR0b24gPSBidXR0b25TdHlsZXM7XG5cdFx0XHRhcHAucGFuZWxzLmFkdmFuY2VkID0gYWR2YW5jZWRTZXR0aW5ncztcblx0XHRcdGFwcC5wYW5lbHMuZmllbGQgPSBmaWVsZFN0eWxlcztcblxuXHRcdFx0Y29uc3QgYmxvY2tPcHRpb25zID0ge1xuXHRcdFx0XHRwYW5lbHM6IGFwcC5wYW5lbHMsXG5cdFx0XHRcdGdldFRoZW1lc1BhbmVsOiBhcHAucGFuZWxzLnRoZW1lcy5nZXRUaGVtZXNQYW5lbCxcblx0XHRcdFx0Z2V0RmllbGRTdHlsZXM6IGFwcC5wYW5lbHMuZmllbGQuZ2V0RmllbGRTdHlsZXMsXG5cdFx0XHRcdGdldENvbnRhaW5lclN0eWxlczogYXBwLnBhbmVscy5jb250YWluZXIuZ2V0Q29udGFpbmVyU3R5bGVzLFxuXHRcdFx0XHRnZXRCYWNrZ3JvdW5kU3R5bGVzOiBhcHAucGFuZWxzLmJhY2tncm91bmQuZ2V0QmFja2dyb3VuZFN0eWxlcyxcblx0XHRcdFx0Z2V0QnV0dG9uU3R5bGVzOiBhcHAucGFuZWxzLmJ1dHRvbi5nZXRCdXR0b25TdHlsZXMsXG5cdFx0XHRcdGdldENvbW1vbkF0dHJpYnV0ZXM6IGFwcC5nZXRDb21tb25BdHRyaWJ1dGVzLFxuXHRcdFx0XHRzZXRTdHlsZXNIYW5kbGVyczogYXBwLmdldFN0eWxlSGFuZGxlcnMoKSxcblx0XHRcdFx0ZWR1Y2F0aW9uOiBhcHAuZWR1Y2F0aW9uLFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBBZHZhbmNlZCBTZXR0aW5ncyBtb2R1bGUuXG5cdFx0XHRhcHAucGFuZWxzLmFkdmFuY2VkLmluaXQoIGFwcC5jb21tb24gKTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBibG9jay5cblx0XHRcdGFwcC5jb21tb24uaW5pdCggYmxvY2tPcHRpb25zICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEdldCBzdHlsZSBoYW5kbGVycy5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBTdHlsZSBoYW5kbGVycy5cblx0XHQgKi9cblx0XHRnZXRDb21tb25BdHRyaWJ1dGVzKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4uYXBwLnBhbmVscy5maWVsZC5nZXRCbG9ja0F0dHJpYnV0ZXMoKSxcblx0XHRcdFx0Li4uYXBwLnBhbmVscy5jb250YWluZXIuZ2V0QmxvY2tBdHRyaWJ1dGVzKCksXG5cdFx0XHRcdC4uLmFwcC5wYW5lbHMuYmFja2dyb3VuZC5nZXRCbG9ja0F0dHJpYnV0ZXMoKSxcblx0XHRcdFx0Li4uYXBwLnBhbmVscy5idXR0b24uZ2V0QmxvY2tBdHRyaWJ1dGVzKCksXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBHZXQgc3R5bGUgaGFuZGxlcnMuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gU3R5bGUgaGFuZGxlcnMuXG5cdFx0ICovXG5cdFx0Z2V0U3R5bGVIYW5kbGVycygpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdCdiYWNrZ3JvdW5kLWltYWdlJzogYXBwLnBhbmVscy5iYWNrZ3JvdW5kLnNldENvbnRhaW5lckJhY2tncm91bmRJbWFnZSxcblx0XHRcdFx0J2JhY2tncm91bmQtcG9zaXRpb24nOiBhcHAucGFuZWxzLmJhY2tncm91bmQuc2V0Q29udGFpbmVyQmFja2dyb3VuZFBvc2l0aW9uLFxuXHRcdFx0XHQnYmFja2dyb3VuZC1yZXBlYXQnOiBhcHAucGFuZWxzLmJhY2tncm91bmQuc2V0Q29udGFpbmVyQmFja2dyb3VuZFJlcGVhdCxcblx0XHRcdFx0J2JhY2tncm91bmQtd2lkdGgnOiBhcHAucGFuZWxzLmJhY2tncm91bmQuc2V0Q29udGFpbmVyQmFja2dyb3VuZFdpZHRoLFxuXHRcdFx0XHQnYmFja2dyb3VuZC1oZWlnaHQnOiBhcHAucGFuZWxzLmJhY2tncm91bmQuc2V0Q29udGFpbmVyQmFja2dyb3VuZEhlaWdodCxcblx0XHRcdFx0J2JhY2tncm91bmQtY29sb3InOiBhcHAucGFuZWxzLmJhY2tncm91bmQuc2V0QmFja2dyb3VuZENvbG9yLFxuXHRcdFx0XHQnYmFja2dyb3VuZC11cmwnOiBhcHAucGFuZWxzLmJhY2tncm91bmQuc2V0QmFja2dyb3VuZFVybCxcblx0XHRcdH07XG5cdFx0fSxcblx0fTtcblxuXHQvLyBQcm92aWRlIGFjY2VzcyB0byBwdWJsaWMgZnVuY3Rpb25zL3Byb3BlcnRpZXMuXG5cdHJldHVybiBhcHA7XG59KCkgKTtcblxuLy8gSW5pdGlhbGl6ZS5cbldQRm9ybXMuRm9ybVNlbGVjdG9yLmluaXQoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFFQSxJQUFBQSxVQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksaUJBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLGlCQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFBcUYsU0FBQUQsdUJBQUFTLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEs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 +},{"../../../js/integrations/gutenberg/modules/advanced-settings.js":13,"../../../js/integrations/gutenberg/modules/background-styles.js":15,"../../../js/integrations/gutenberg/modules/button-styles.js":16,"../../../js/integrations/gutenberg/modules/common.js":17,"../../../js/integrations/gutenberg/modules/container-styles.js":18,"../../../js/integrations/gutenberg/modules/education.js":19,"../../../js/integrations/gutenberg/modules/field-styles.js":20,"../../../js/integrations/gutenberg/modules/themes-panel.js":21}],13:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ +/** + * @param strings.custom_css + * @param strings.custom_css_notice + * @param strings.copy_paste_settings + * @param strings.copy_paste_notice + */ +/** + * Gutenberg editor block. + * + * Advanced Settings module. + * + * @since 1.8.8 + */ +var _default = exports.default = function ($) { + /** + * WP core components. + * + * @since 1.8.8 + */ + var addFilter = wp.hooks.addFilter; + var createHigherOrderComponent = wp.compose.createHigherOrderComponent; + var Fragment = wp.element.Fragment; + var _ref = wp.blockEditor || wp.editor, + InspectorAdvancedControls = _ref.InspectorAdvancedControls; + var TextareaControl = wp.components.TextareaControl; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + var _wpforms_gutenberg_fo = wpforms_gutenberg_form_selector, + strings = _wpforms_gutenberg_fo.strings; + + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + var app = { + /** + * Initialize module. + * + * @since 1.8.8 + * + * @param {Object} commonModule Common module. + */ + init: function init(commonModule) { + app.common = commonModule; + app.hooks(); + app.events(); + }, + /** + * Hooks. + * + * @since 1.8.8 + */ + hooks: function hooks() { + addFilter('editor.BlockEdit', 'editorskit/custom-advanced-control', app.withAdvancedControls); + }, + /** + * Events. + * + * @since 1.8.8 + */ + events: function events() { + $(document).on('focus click', 'textarea', app.copyPasteFocus); + }, + /** + * Copy / Paste Style Settings textarea focus event. + * + * @since 1.8.8 + */ + copyPasteFocus: function copyPasteFocus() { + var $input = $(this); + if ($input.siblings('label').text() === strings.copy_paste_settings) { + // Select all text, so it's easier to copy and paste value. + $input.select(); + } + }, + /** + * Get fields. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * + * @return {Object} Inspector advanced controls JSX code. + */ + getFields: function getFields(props) { + var _props$attributes; + // Proceed only for WPForms block and when form ID is set. + if ((props === null || props === void 0 ? void 0 : props.name) !== 'wpforms/form-selector' || !(props !== null && props !== void 0 && (_props$attributes = props.attributes) !== null && _props$attributes !== void 0 && _props$attributes.formId)) { + return null; + } + + // Common event handlers. + var handlers = app.common.getSettingsFieldsHandlers(props); + return /*#__PURE__*/React.createElement(InspectorAdvancedControls, null, /*#__PURE__*/React.createElement("div", { + className: app.common.getPanelClass(props) + ' advanced' + }, /*#__PURE__*/React.createElement(TextareaControl, { + className: "wpforms-gutenberg-form-selector-custom-css", + label: strings.custom_css, + rows: "5", + spellCheck: "false", + value: props.attributes.customCss, + onChange: function onChange(value) { + return handlers.attrChange('customCss', value); + } + }), /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-legend", + dangerouslySetInnerHTML: { + __html: strings.custom_css_notice + } + }), /*#__PURE__*/React.createElement(TextareaControl, { + className: "wpforms-gutenberg-form-selector-copy-paste-settings", + label: strings.copy_paste_settings, + rows: "4", + spellCheck: "false", + value: props.attributes.copyPasteJsonValue, + onChange: function onChange(value) { + return handlers.pasteSettings(value); + } + }), /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-legend", + dangerouslySetInnerHTML: { + __html: strings.copy_paste_notice + } + }))); + }, + /** + * Add controls on Advanced Settings Panel. + * + * @param {Function} BlockEdit Block edit component. + * + * @return {Function} BlockEdit Modified block edit component. + */ + withAdvancedControls: createHigherOrderComponent(function (BlockEdit) { + return function (props) { + return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(BlockEdit, props), app.getFields(props)); + }; + }, 'withAdvancedControls') + }; + + // Provide access to public functions/properties. + return app; +}(jQuery); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwiJCIsImFkZEZpbHRlciIsIndwIiwiaG9va3MiLCJjcmVhdGVIaWdoZXJPcmRlckNvbXBvbmVudCIsImNvbXBvc2UiLCJGcmFnbWVudCIsImVsZW1lbnQiLCJfcmVmIiwiYmxvY2tFZGl0b3IiLCJlZGl0b3IiLCJJbnNwZWN0b3JBZHZhbmNlZENvbnRyb2xzIiwiVGV4dGFyZWFDb250cm9sIiwiY29tcG9uZW50cyIsIl93cGZvcm1zX2d1dGVuYmVyZ19mbyIsIndwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3IiLCJzdHJpbmdzIiwiYXBwIiwiaW5pdCIsImNvbW1vbk1vZHVsZSIsImNvbW1vbiIsImV2ZW50cyIsIndpdGhBZHZhbmNlZENvbnRyb2xzIiwiZG9jdW1lbnQiLCJvbiIsImNvcHlQYXN0ZUZvY3VzIiwiJGlucHV0Iiwic2libGluZ3MiLCJ0ZXh0IiwiY29weV9wYXN0ZV9zZXR0aW5ncyIsInNlbGVjdCIsImdldEZpZWxkcyIsInByb3BzIiwiX3Byb3BzJGF0dHJpYnV0ZXMiLCJuYW1lIiwiYXR0cmlidXRlcyIsImZvcm1JZCIsImhhbmRsZXJzIiwiZ2V0U2V0dGluZ3NGaWVsZHNIYW5kbGVycyIsIlJlYWN0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImdldFBhbmVsQ2xhc3MiLCJsYWJlbCIsImN1c3RvbV9jc3MiLCJyb3dzIiwic3BlbGxDaGVjayIsInZhbHVlIiwiY3VzdG9tQ3NzIiwib25DaGFuZ2UiLCJhdHRyQ2hhbmdlIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfX2h0bWwiLCJjdXN0b21fY3NzX25vdGljZSIsImNvcHlQYXN0ZUpzb25WYWx1ZSIsInBhc3RlU2V0dGluZ3MiLCJjb3B5X3Bhc3RlX25vdGljZSIsIkJsb2NrRWRpdCIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImFkdmFuY2VkLXNldHRpbmdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yICovXG4vKiBqc2hpbnQgZXMzOiBmYWxzZSwgZXN2ZXJzaW9uOiA2ICovXG5cbi8qKlxuICogQHBhcmFtIHN0cmluZ3MuY3VzdG9tX2Nzc1xuICogQHBhcmFtIHN0cmluZ3MuY3VzdG9tX2Nzc19ub3RpY2VcbiAqIEBwYXJhbSBzdHJpbmdzLmNvcHlfcGFzdGVfc2V0dGluZ3NcbiAqIEBwYXJhbSBzdHJpbmdzLmNvcHlfcGFzdGVfbm90aWNlXG4gKi9cblxuLyoqXG4gKiBHdXRlbmJlcmcgZWRpdG9yIGJsb2NrLlxuICpcbiAqIEFkdmFuY2VkIFNldHRpbmdzIG1vZHVsZS5cbiAqXG4gKiBAc2luY2UgMS44LjhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKCBmdW5jdGlvbiggJCApIHtcblx0LyoqXG5cdCAqIFdQIGNvcmUgY29tcG9uZW50cy5cblx0ICpcblx0ICogQHNpbmNlIDEuOC44XG5cdCAqL1xuXHRjb25zdCB7IGFkZEZpbHRlciB9ID0gd3AuaG9va3M7XG5cdGNvbnN0IHsgY3JlYXRlSGlnaGVyT3JkZXJDb21wb25lbnQgfSA9IHdwLmNvbXBvc2U7XG5cdGNvbnN0IHsgRnJhZ21lbnQgfVx0PSB3cC5lbGVtZW50O1xuXHRjb25zdCB7IEluc3BlY3RvckFkdmFuY2VkQ29udHJvbHMgfSA9IHdwLmJsb2NrRWRpdG9yIHx8IHdwLmVkaXRvcjtcblx0Y29uc3QgeyBUZXh0YXJlYUNvbnRyb2wgfSA9IHdwLmNvbXBvbmVudHM7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplZCBkYXRhIGFsaWFzZXMuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguOFxuXHQgKi9cblx0Y29uc3QgeyBzdHJpbmdzIH0gPSB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yO1xuXG5cdC8qKlxuXHQgKiBQdWJsaWMgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAc2luY2UgMS44Ljhcblx0ICpcblx0ICogQHR5cGUge09iamVjdH1cblx0ICovXG5cdGNvbnN0IGFwcCA9IHtcblx0XHQvKipcblx0XHQgKiBJbml0aWFsaXplIG1vZHVsZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGNvbW1vbk1vZHVsZSBDb21tb24gbW9kdWxlLlxuXHRcdCAqL1xuXHRcdGluaXQoIGNvbW1vbk1vZHVsZSApIHtcblx0XHRcdGFwcC5jb21tb24gPSBjb21tb25Nb2R1bGU7XG5cblx0XHRcdGFwcC5ob29rcygpO1xuXHRcdFx0YXBwLmV2ZW50cygpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBIb29rcy5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqL1xuXHRcdGhvb2tzKCkge1xuXHRcdFx0YWRkRmlsdGVyKFxuXHRcdFx0XHQnZWRpdG9yLkJsb2NrRWRpdCcsXG5cdFx0XHRcdCdlZGl0b3Jza2l0L2N1c3RvbS1hZHZhbmNlZC1jb250cm9sJyxcblx0XHRcdFx0YXBwLndpdGhBZHZhbmNlZENvbnRyb2xzXG5cdFx0XHQpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBFdmVudHMuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKi9cblx0XHRldmVudHMoKSB7XG5cdFx0XHQkKCBkb2N1bWVudCApXG5cdFx0XHRcdC5vbiggJ2ZvY3VzIGNsaWNrJywgJ3RleHRhcmVhJywgYXBwLmNvcHlQYXN0ZUZvY3VzICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIENvcHkgLyBQYXN0ZSBTdHlsZSBTZXR0aW5ncyB0ZXh0YXJlYSBmb2N1cyBldmVudC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqL1xuXHRcdGNvcHlQYXN0ZUZvY3VzKCkge1xuXHRcdFx0Y29uc3QgJGlucHV0ID0gJCggdGhpcyApO1xuXG5cdFx0XHRpZiAoICRpbnB1dC5zaWJsaW5ncyggJ2xhYmVsJyApLnRleHQoKSA9PT0gc3RyaW5ncy5jb3B5X3Bhc3RlX3NldHRpbmdzICkge1xuXHRcdFx0XHQvLyBTZWxlY3QgYWxsIHRleHQsIHNvIGl0J3MgZWFzaWVyIHRvIGNvcHkgYW5kIHBhc3RlIHZhbHVlLlxuXHRcdFx0XHQkaW5wdXQuc2VsZWN0KCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEdldCBmaWVsZHMuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCbG9jayBwcm9wZXJ0aWVzLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBJbnNwZWN0b3IgYWR2YW5jZWQgY29udHJvbHMgSlNYIGNvZGUuXG5cdFx0ICovXG5cdFx0Z2V0RmllbGRzKCBwcm9wcyApIHtcblx0XHRcdC8vIFByb2NlZWQgb25seSBmb3IgV1BGb3JtcyBibG9jayBhbmQgd2hlbiBmb3JtIElEIGlzIHNldC5cblx0XHRcdGlmICggcHJvcHM/Lm5hbWUgIT09ICd3cGZvcm1zL2Zvcm0tc2VsZWN0b3InIHx8ICEgcHJvcHM/LmF0dHJpYnV0ZXM/LmZvcm1JZCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbW1vbiBldmVudCBoYW5kbGVycy5cblx0XHRcdGNvbnN0IGhhbmRsZXJzID0gYXBwLmNvbW1vbi5nZXRTZXR0aW5nc0ZpZWxkc0hhbmRsZXJzKCBwcm9wcyApO1xuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQ8SW5zcGVjdG9yQWR2YW5jZWRDb250cm9scz5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT17IGFwcC5jb21tb24uZ2V0UGFuZWxDbGFzcyggcHJvcHMgKSArICcgYWR2YW5jZWQnIH0+XG5cdFx0XHRcdFx0XHQ8VGV4dGFyZWFDb250cm9sXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItY3VzdG9tLWNzc1wiXG5cdFx0XHRcdFx0XHRcdGxhYmVsPXsgc3RyaW5ncy5jdXN0b21fY3NzIH1cblx0XHRcdFx0XHRcdFx0cm93cz1cIjVcIlxuXHRcdFx0XHRcdFx0XHRzcGVsbENoZWNrPVwiZmFsc2VcIlxuXHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuY3VzdG9tQ3NzIH1cblx0XHRcdFx0XHRcdFx0b25DaGFuZ2U9eyAoIHZhbHVlICkgPT4gaGFuZGxlcnMuYXR0ckNoYW5nZSggJ2N1c3RvbUNzcycsIHZhbHVlICkgfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci1sZWdlbmRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17IHsgX19odG1sOiBzdHJpbmdzLmN1c3RvbV9jc3Nfbm90aWNlIH0gfT48L2Rpdj5cblx0XHRcdFx0XHRcdDxUZXh0YXJlYUNvbnRyb2xcblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci1jb3B5LXBhc3RlLXNldHRpbmdzXCJcblx0XHRcdFx0XHRcdFx0bGFiZWw9eyBzdHJpbmdzLmNvcHlfcGFzdGVfc2V0dGluZ3MgfVxuXHRcdFx0XHRcdFx0XHRyb3dzPVwiNFwiXG5cdFx0XHRcdFx0XHRcdHNwZWxsQ2hlY2s9XCJmYWxzZVwiXG5cdFx0XHRcdFx0XHRcdHZhbHVlPXsgcHJvcHMuYXR0cmlidXRlcy5jb3B5UGFzdGVKc29uVmFsdWUgfVxuXHRcdFx0XHRcdFx0XHRvbkNoYW5nZT17ICggdmFsdWUgKSA9PiBoYW5kbGVycy5wYXN0ZVNldHRpbmdzKCB2YWx1ZSApIH1cblx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItbGVnZW5kXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9eyB7IF9faHRtbDogc3RyaW5ncy5jb3B5X3Bhc3RlX25vdGljZSB9IH0+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvSW5zcGVjdG9yQWR2YW5jZWRDb250cm9scz5cblx0XHRcdCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEFkZCBjb250cm9scyBvbiBBZHZhbmNlZCBTZXR0aW5ncyBQYW5lbC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IEJsb2NrRWRpdCBCbG9jayBlZGl0IGNvbXBvbmVudC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge0Z1bmN0aW9ufSBCbG9ja0VkaXQgTW9kaWZpZWQgYmxvY2sgZWRpdCBjb21wb25lbnQuXG5cdFx0ICovXG5cdFx0d2l0aEFkdmFuY2VkQ29udHJvbHM6IGNyZWF0ZUhpZ2hlck9yZGVyQ29tcG9uZW50KFxuXHRcdFx0KCBCbG9ja0VkaXQgKSA9PiB7XG5cdFx0XHRcdHJldHVybiAoIHByb3BzICkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHQ8RnJhZ21lbnQ+XG5cdFx0XHRcdFx0XHRcdDxCbG9ja0VkaXQgeyAuLi5wcm9wcyB9IC8+XG5cdFx0XHRcdFx0XHRcdHsgYXBwLmdldEZpZWxkcyggcHJvcHMgKSB9XG5cdFx0XHRcdFx0XHQ8L0ZyYWdtZW50PlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0J3dpdGhBZHZhbmNlZENvbnRyb2xzJ1xuXHRcdCksXG5cdH07XG5cblx0Ly8gUHJvdmlkZSBhY2Nlc3MgdG8gcHVibGljIGZ1bmN0aW9ucy9wcm9wZXJ0aWVzLlxuXHRyZXR1cm4gYXBwO1xufSggalF1ZXJ5ICkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBLENBQUFDLE9BQUEsR0FPaUIsVUFBVUMsQ0FBQyxFQUFHO0VBQzlCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7RUFDQyxJQUFR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R0FBRztRQUNSQyxVQUFVLEVBQUMsT0FBTztRQUNsQkMsS0FBSyxFQUFHZixLQUFLLENBQUNHLFVBQVUsQ0FBQ2EsU0FBVztRQUNwQ0MsUUFBUSxFQUFHLFNBQVhBLFFBQVFBLENBQUtGLEtBQUs7VUFBQSxPQUFNVixRQUFRLENBQUNhLFVBQVUsQ0FBRSxXQUFXLEVBQUVILEtBQU0sQ0FBQztRQUFBO01BQUUsQ0FDbkUsQ0FBQyxlQUNGUixLQUFBLENBQUFDLGFBQUE7UUFBS0MsU0FBUyxFQUFDLHdDQUF3QztRQUFDVSx1QkFBdUIsRUFBRztVQUFFQyxNQUFNLEVBQUVwQyxPQUFPLENBQUNxQztRQUFrQjtNQUFHLENBQU0sQ0FBQyxlQUNoSWQsS0FBQSxDQUFBQyxhQUFBLENBQUM1QixlQUFlO1FBQ2Y2QixTQUFTLEVBQUMscURBQXFEO1FBQy9ERSxLQUFLLEVBQUczQixPQUFPLENBQUNhLG1CQUFxQjtRQUNyQ2dCLElBQUksRUFBQyxHQUFHO1FBQ1JDLFVBQVUsRUFBQyxPQUFPO1FBQ2xCQyxLQUFLLEVBQUdmLEtBQUssQ0FBQ0csVUFBVSxDQUFDbUIsa0JBQW9CO1FBQzdDTCxRQUFRLEVBQUcsU0FBWEEsUUFBUUEsQ0FBS0YsS0FBSztVQUFBLE9BQU1WLFFBQVEsQ0FBQ2tCLGFBQWEsQ0FBRVIsS0FBTSxDQUFDO1FBQUE7TUFBRSxDQUN6RCxDQUFDLGVBQ0ZSLEtBQUEsQ0FBQUMsYUFBQTtRQUFLQyxTQUFTLEVBQUMsd0NBQXdDO1FBQUNVLHVCQUF1QixFQUFHO1VBQUVDLE1BQU0sRUFBRXBDLE9BQU8sQ0FBQ3dDO1FBQWtCO01BQUcsQ0FBTSxDQUMzSCxDQUNxQixDQUFDO0lBRTlCLENBQUM7SUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNFbEMsb0JBQW9CLEVBQUVsQiwwQkFBMEIsQ0FDL0MsVUFBRXFELFNBQVMsRUFBTTtNQUNoQixPQUFPLFVBQUV6QixLQUFLLEVBQU07UUFDbkIsb0JBQ0NPLEtBQUEsQ0FBQUMsYUFBQSxDQUFDbEMsUUFBUSxxQkFDUmlDLEtBQUEsQ0FBQUMsYUFBQSxDQUFDaUIsU0FBUyxFQUFNekIsS0FBUyxDQUFDLEVBQ3hCZixHQUFHLENBQUNjLFNBQVMsQ0FBRUMsS0FBTSxDQUNkLENBQUM7TUFFYixDQUFDO0lBQ0YsQ0FBQyxFQUNELHNCQUNEO0VBQ0QsQ0FBQzs7RUFFRDtFQUNBLE9BQU9mLEdBQUc7QUFDWCxDQUFDLENBQUV5QyxNQUFPLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0= +},{}],14:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _propTypes = _interopRequireDefault(require("prop-types")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ + +/** + * @param strings.remove_image + */ + +/** + * React component for the background preview. + * + * @since 1.8.8 + * + * @param {Object} props Component props. + * @param {Object} props.attributes Block attributes. + * @param {Function} props.onRemoveBackground Function to remove the background. + * @param {Function} props.onPreviewClicked Function to handle the preview click. + * + * @return {Object} React component. + */ +var BackgroundPreview = function BackgroundPreview(_ref) { + var attributes = _ref.attributes, + onRemoveBackground = _ref.onRemoveBackground, + onPreviewClicked = _ref.onPreviewClicked; + var Button = wp.components.Button; + var _wpforms_gutenberg_fo = wpforms_gutenberg_form_selector, + strings = _wpforms_gutenberg_fo.strings; + return /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-background-preview" + }, /*#__PURE__*/React.createElement("style", null, "\n\t\t\t\t\t.wpforms-gutenberg-form-selector-background-preview-image {\n\t\t\t\t\t\t--wpforms-background-url: ".concat(attributes.backgroundUrl, ";\n\t\t\t\t\t}\n\t\t\t\t")), /*#__PURE__*/React.createElement("input", { + className: "wpforms-gutenberg-form-selector-background-preview-image", + onClick: onPreviewClicked, + tabIndex: 0, + type: "button", + onKeyDown: function onKeyDown(event) { + if (event.key === 'Enter' || event.key === ' ') { + onPreviewClicked(); + } + } + }), /*#__PURE__*/React.createElement(Button, { + isSecondary: true, + className: "is-destructive", + onClick: onRemoveBackground + }, strings.remove_image)); +}; +BackgroundPreview.propTypes = { + attributes: _propTypes.default.object.isRequired, + onRemoveBackground: _propTypes.default.func.isRequired, + onPreviewClicked: _propTypes.default.func.isRequired +}; +var _default = exports.default = BackgroundPreview; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJCYWNrZ3JvdW5kUHJldmlldyIsIl9yZWYiLCJhdHRyaWJ1dGVzIiwib25SZW1vdmVCYWNrZ3JvdW5kIiwib25QcmV2aWV3Q2xpY2tlZCIsIkJ1dHRvbiIsIndwIiwiY29tcG9uZW50cyIsIl93cGZvcm1zX2d1dGVuYmVyZ19mbyIsIndwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3IiLCJzdHJpbmdzIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiY29uY2F0IiwiYmFja2dyb3VuZFVybCIsIm9uQ2xpY2siLCJ0YWJJbmRleCIsInR5cGUiLCJvbktleURvd24iLCJldmVudCIsImtleSIsImlzU2Vjb25kYXJ5IiwicmVtb3ZlX2ltYWdlIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyJiYWNrZ3JvdW5kLXByZXZpZXcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3IgKi9cbi8qIGpzaGludCBlczM6IGZhbHNlLCBlc3ZlcnNpb246IDYgKi9cblxuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuLyoqXG4gKiBAcGFyYW0gc3RyaW5ncy5yZW1vdmVfaW1hZ2VcbiAqL1xuXG4vKipcbiAqIFJlYWN0IGNvbXBvbmVudCBmb3IgdGhlIGJhY2tncm91bmQgcHJldmlldy5cbiAqXG4gKiBAc2luY2UgMS44LjhcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gICBwcm9wcyAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IHByb3BzLlxuICogQHBhcmFtIHtPYmplY3R9ICAgcHJvcHMuYXR0cmlidXRlcyAgICAgICAgIEJsb2NrIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcm9wcy5vblJlbW92ZUJhY2tncm91bmQgRnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvcHMub25QcmV2aWV3Q2xpY2tlZCAgIEZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcHJldmlldyBjbGljay5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJlYWN0IGNvbXBvbmVudC5cbiAqL1xuY29uc3QgQmFja2dyb3VuZFByZXZpZXcgPSAoIHsgYXR0cmlidXRlcywgb25SZW1vdmVCYWNrZ3JvdW5kLCBvblByZXZpZXdDbGlja2VkIH0gKSA9PiB7XG5cdGNvbnN0IHsgQnV0dG9uIH0gPSB3cC5jb21wb25lbnRzO1xuXHRjb25zdCB7IHN0cmluZ3MgfSA9IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3I7XG5cblx0cmV0dXJuIChcblx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItYmFja2dyb3VuZC1wcmV2aWV3XCI+XG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdHsgYFxuXHRcdFx0XHRcdC53cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLWJhY2tncm91bmQtcHJldmlldy1pbWFnZSB7XG5cdFx0XHRcdFx0XHQtLXdwZm9ybXMtYmFja2dyb3VuZC11cmw6ICR7IGF0dHJpYnV0ZXMuYmFja2dyb3VuZFVybCB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0YCB9XG5cdFx0XHQ8L3N0eWxlPlxuXHRcdFx0PGlucHV0XG5cdFx0XHRcdGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItYmFja2dyb3VuZC1wcmV2aWV3LWltYWdlXCJcblx0XHRcdFx0b25DbGljaz17IG9uUHJldmlld0NsaWNrZWQgfVxuXHRcdFx0XHR0YWJJbmRleD17IDAgfVxuXHRcdFx0XHR0eXBlPVwiYnV0dG9uXCJcblx0XHRcdFx0b25LZXlEb3duPXtcblx0XHRcdFx0XHQoIGV2ZW50ICkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKCBldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcgKSB7XG5cdFx0XHRcdFx0XHRcdG9uUHJldmlld0NsaWNrZWQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdD5cblx0XHRcdDwvaW5wdXQ+XG5cdFx0XHQ8QnV0dG9uXG5cdFx0XHRcdGlzU2Vjb25kYXJ5XG5cdFx0XHRcdGNsYXNzTmFtZT1cImlzLWRlc3RydWN0aXZlXCJcblx0XHRcdFx0b25DbGljaz17IG9uUmVtb3ZlQmFja2dyb3VuZCB9XG5cdFx0XHQ+XG5cdFx0XHRcdHsgc3RyaW5ncy5yZW1vdmVfaW1hZ2UgfVxuXHRcdFx0PC9CdXR0b24+XG5cdFx0PC9kaXY+XG5cdCk7XG59O1xuXG5CYWNrZ3JvdW5kUHJldmlldy5wcm9wVHlwZXMgPSB7XG5cdGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcblx0b25SZW1vdmVCYWNrZ3JvdW5kOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXHRvblByZXZpZXdDbGlja2VkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQmFja2dyb3VuZFByZXZpZXc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUFtQyxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUhuQztBQUNBOztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNRyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFBQyxJQUFBLEVBQStEO0VBQUEsSUFBeERDLFVBQVUsR0FBQUQsSUFBQSxDQUFWQyxVQUFVO0lBQUVDLGtCQUFrQixHQUFBRixJQUFBLENBQWxCRSxrQkFBa0I7SUFBRUMsZ0JBQWdCLEdBQUFILElBQUEsQ0FBaEJHLGdCQUFnQjtFQUM3RSxJQUFRQyxNQUFNLEdBQUtDLEVBQUUsQ0FBQ0MsVUFBVSxDQUF4QkYsTUFBTTtFQUNkLElBQUFHLHFCQUFBLEdBQW9CQywrQkFBK0I7SUFBM0NDLE9BQU8sR0FBQUYscUJBQUEsQ0FBUEUsT0FBTztFQUVmLG9CQUNDQyxLQUFBLENBQUFDLGFBQUE7SUFBS0MsU0FBUyxFQUFDO0VBQW9ELGdCQUNsRUYsS0FBQSxDQUFBQyxhQUFBLGtJQUFBRSxNQUFBLENBR2dDWixVQUFVLENBQUNhLGFBQWEsNkJBR2pELENBQUMsZUFDUkosS0FBQSxDQUFBQyxhQUFBO0lBQ0NDLFNBQVMsRUFBQywwREFBMEQ7SUFDcEVHLE9BQU8sRUFBR1osZ0JBQWtCO0lBQzVCYSxRQUFRLEVBQUcsQ0FBRztJQUNkQyxJQUFJLEVBQUMsUUFBUTtJQUNiQyxTQUFTLEVBQ1IsU0FEREEsU0FBU0EsQ0FDTkMsS0FBSyxFQUFNO01BQ1osSUFBS0EsS0FBSyxDQUFDQyxHQUFHLEtBQUssT0FBTyxJQUFJRCxLQUFLLENBQUNDLEdBQUcsS0FBSyxHQUFHLEVBQUc7UUFDakRqQixnQkFBZ0IsQ0FBQyxDQUFDO01BQ25CO0lBQ0Q7RUFDQSxDQUVLLENBQUMsZUFDUk8sS0FBQSxDQUFBQyxhQUFBLENBQUNQLE1BQU07SUFDTmlCLFdBQVc7SUFDWFQsU0FBUyxFQUFDLGdCQUFnQjtJQUMxQkcsT0FBTyxFQUFHYjtFQUFvQixHQUU1Qk8sT0FBTyxDQUFDYSxZQUNILENBQ0osQ0FBQztBQUVSLENBQUM7QUFFRHZCLGlCQUFpQixDQUFDd0IsU0FBUyxHQUFHO0VBQzdCdEIsVUFBVSxFQUFFdUIsa0JBQVMsQ0FBQ0MsTUFBTSxDQUFDQyxVQUFVO0VBQ3ZDeEIsa0JBQWtCLEVBQUVzQixrQkFBUyxDQUFDRyxJQUFJLENBQUNELFVBQVU7RUFDN0N2QixnQkFBZ0IsRUFBRXFCLGtCQUFTLENBQUNHLElBQUksQ0FBQ0Q7QUFDbEMsQ0FBQztBQUFDLElBQUFFLFFBQUEsR0FBQUMsT0FBQSxDQUFBL0IsT0FBQSxHQUVhQyxpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0= +},{"prop-types":6}],15:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _backgroundPreview = _interopRequireDefault(require("./background-preview.js")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ +/** + * @param strings.background_styles + * @param strings.bottom_center + * @param strings.bottom_left + * @param strings.bottom_right + * @param strings.center_center + * @param strings.center_left + * @param strings.center_right + * @param strings.choose_image + * @param strings.image_url + * @param strings.media_library + * @param strings.no_repeat + * @param strings.repeat_x + * @param strings.repeat_y + * @param strings.select_background_image + * @param strings.select_image + * @param strings.stock_photo + * @param strings.tile + * @param strings.top_center + * @param strings.top_left + * @param strings.top_right + */ +/** + * Gutenberg editor block. + * + * Background styles panel module. + * + * @since 1.8.8 + */ +var _default = exports.default = function () { + /** + * WP core components. + * + * @since 1.8.8 + */ + var _ref = wp.blockEditor || wp.editor, + PanelColorSettings = _ref.PanelColorSettings; + var _wp$components = wp.components, + SelectControl = _wp$components.SelectControl, + PanelBody = _wp$components.PanelBody, + Flex = _wp$components.Flex, + FlexBlock = _wp$components.FlexBlock, + __experimentalUnitControl = _wp$components.__experimentalUnitControl, + TextControl = _wp$components.TextControl, + Button = _wp$components.Button; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + var _wpforms_gutenberg_fo = wpforms_gutenberg_form_selector, + strings = _wpforms_gutenberg_fo.strings, + defaults = _wpforms_gutenberg_fo.defaults; + + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + var app = { + /** + * Get block attributes. + * + * @since 1.8.8 + * + * @return {Object} Block attributes. + */ + getBlockAttributes: function getBlockAttributes() { + return { + backgroundImage: { + type: 'string', + default: defaults.backgroundImage + }, + backgroundPosition: { + type: 'string', + default: defaults.backgroundPosition + }, + backgroundRepeat: { + type: 'string', + default: defaults.backgroundRepeat + }, + backgroundSizeMode: { + type: 'string', + default: defaults.backgroundSizeMode + }, + backgroundSize: { + type: 'string', + default: defaults.backgroundSize + }, + backgroundWidth: { + type: 'string', + default: defaults.backgroundWidth + }, + backgroundHeight: { + type: 'string', + default: defaults.backgroundHeight + }, + backgroundColor: { + type: 'string', + default: defaults.backgroundColor + }, + backgroundUrl: { + type: 'string', + default: defaults.backgroundUrl + } + }; + }, + /** + * Get Background Styles panel JSX code. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {Object} formSelectorCommon Block properties. + * @param {Object} stockPhotos Stock Photos module. + * @param {Object} uiState UI state. + * + * @return {Object} Field styles JSX code. + */ + getBackgroundStyles: function getBackgroundStyles(props, handlers, formSelectorCommon, stockPhotos, uiState) { + // eslint-disable-line max-lines-per-function, complexity + var isNotDisabled = uiState.isNotDisabled; + var isProEnabled = uiState.isProEnabled; + var showBackgroundPreview = uiState.showBackgroundPreview; + var setShowBackgroundPreview = uiState.setShowBackgroundPreview; + var lastBgImage = uiState.lastBgImage; + var setLastBgImage = uiState.setLastBgImage; + var tabIndex = isNotDisabled ? 0 : -1; + var cssClass = formSelectorCommon.getPanelClass(props) + (isNotDisabled ? '' : ' wpforms-gutenberg-panel-disabled'); + return /*#__PURE__*/React.createElement(PanelBody, { + className: cssClass, + title: strings.background_styles + }, /*#__PURE__*/React.createElement("div", { + // eslint-disable-line jsx-a11y/no-static-element-interactions + className: "wpforms-gutenberg-form-selector-panel-body", + onClick: function onClick(event) { + if (isNotDisabled) { + return; + } + event.stopPropagation(); + if (!isProEnabled) { + return formSelectorCommon.education.showProModal('background', strings.background_styles); + } + formSelectorCommon.education.showLicenseModal('background', strings.background_styles, 'background-styles'); + }, + onKeyDown: function onKeyDown(event) { + if (isNotDisabled) { + return; + } + event.stopPropagation(); + if (!isProEnabled) { + return formSelectorCommon.education.showProModal('background', strings.background_styles); + } + formSelectorCommon.education.showLicenseModal('background', strings.background_styles, 'background-styles'); + } + }, /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.image, + tabIndex: tabIndex, + value: props.attributes.backgroundImage, + options: [{ + label: strings.none, + value: 'none' + }, { + label: strings.media_library, + value: 'library' + }, { + label: strings.stock_photo, + value: 'stock' + }], + onChange: function onChange(value) { + return app.setContainerBackgroundImageWrapper(props, handlers, value, lastBgImage, setLastBgImage); + } + })), /*#__PURE__*/React.createElement(FlexBlock, null, (props.attributes.backgroundImage !== 'none' || !isNotDisabled) && /*#__PURE__*/React.createElement(SelectControl, { + label: strings.position, + value: props.attributes.backgroundPosition, + tabIndex: tabIndex, + options: [{ + label: strings.top_left, + value: 'top left' + }, { + label: strings.top_center, + value: 'top center' + }, { + label: strings.top_right, + value: 'top right' + }, { + label: strings.center_left, + value: 'center left' + }, { + label: strings.center_center, + value: 'center center' + }, { + label: strings.center_right, + value: 'center right' + }, { + label: strings.bottom_left, + value: 'bottom left' + }, { + label: strings.bottom_center, + value: 'bottom center' + }, { + label: strings.bottom_right, + value: 'bottom right' + }], + disabled: props.attributes.backgroundImage === 'none' && isNotDisabled, + onChange: function onChange(value) { + return handlers.styleAttrChange('backgroundPosition', value); + } + }))), (props.attributes.backgroundImage !== 'none' || !isNotDisabled) && /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.repeat, + tabIndex: tabIndex, + value: props.attributes.backgroundRepeat, + options: [{ + label: strings.no_repeat, + value: 'no-repeat' + }, { + label: strings.tile, + value: 'repeat' + }, { + label: strings.repeat_x, + value: 'repeat-x' + }, { + label: strings.repeat_y, + value: 'repeat-y' + }], + disabled: props.attributes.backgroundImage === 'none' && isNotDisabled, + onChange: function onChange(value) { + return handlers.styleAttrChange('backgroundRepeat', value); + } + })), /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.size, + tabIndex: tabIndex, + value: props.attributes.backgroundSizeMode, + options: [{ + label: strings.dimensions, + value: 'dimensions' + }, { + label: strings.cover, + value: 'cover' + }], + disabled: props.attributes.backgroundImage === 'none' && isNotDisabled, + onChange: function onChange(value) { + return app.handleSizeFromDimensions(props, handlers, value); + } + }))), (props.attributes.backgroundSizeMode === 'dimensions' && props.attributes.backgroundImage !== 'none' || !isNotDisabled) && /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(__experimentalUnitControl, { + label: strings.width, + tabIndex: tabIndex, + value: props.attributes.backgroundWidth, + isUnitSelectTabbable: isNotDisabled, + onChange: function onChange(value) { + return app.handleSizeFromWidth(props, handlers, value); + } + })), /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(__experimentalUnitControl, { + label: strings.height, + tabIndex: tabIndex, + value: props.attributes.backgroundHeight, + isUnitSelectTabbable: isNotDisabled, + onChange: function onChange(value) { + return app.handleSizeFromHeight(props, handlers, value); + } + }))), (!showBackgroundPreview || props.attributes.backgroundUrl === 'url()') && (props.attributes.backgroundImage === 'library' && /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(Button, { + isSecondary: true, + tabIndex: tabIndex, + className: 'wpforms-gutenberg-form-selector-media-library-button', + onClick: app.openMediaLibrary.bind(null, props, handlers, setShowBackgroundPreview) + }, strings.choose_image))) || props.attributes.backgroundImage === 'stock' && /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(Button, { + isSecondary: true, + tabIndex: tabIndex, + className: 'wpforms-gutenberg-form-selector-media-library-button', + onClick: stockPhotos === null || stockPhotos === void 0 ? void 0 : stockPhotos.openModal.bind(null, props, handlers, 'bg-styles', setShowBackgroundPreview) + }, strings.choose_image)))), (showBackgroundPreview && props.attributes.backgroundImage !== 'none' || props.attributes.backgroundUrl !== 'url()') && /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_backgroundPreview.default, { + attributes: props.attributes, + onRemoveBackground: function onRemoveBackground() { + app.onRemoveBackground(setShowBackgroundPreview, handlers, setLastBgImage); + }, + onPreviewClicked: function onPreviewClicked() { + if (props.attributes.backgroundImage === 'library') { + return app.openMediaLibrary(props, handlers, setShowBackgroundPreview); + } + return stockPhotos === null || stockPhotos === void 0 ? void 0 : stockPhotos.openModal(props, handlers, 'bg-styles', setShowBackgroundPreview); + } + })), /*#__PURE__*/React.createElement(TextControl, { + label: strings.image_url, + tabIndex: tabIndex, + value: props.attributes.backgroundImage !== 'none' && props.attributes.backgroundUrl, + className: 'wpforms-gutenberg-form-selector-image-url', + onChange: function onChange(value) { + return handlers.styleAttrChange('backgroundUrl', value); + }, + onLoad: function onLoad(value) { + return props.attributes.backgroundImage !== 'none' && handlers.styleAttrChange('backgroundUrl', value); + } + }))), /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-control-label" + }, strings.colors), /*#__PURE__*/React.createElement(PanelColorSettings, { + __experimentalIsRenderedInSidebar: true, + enableAlpha: true, + showTitle: false, + tabIndex: tabIndex, + className: "wpforms-gutenberg-form-selector-color-panel", + colorSettings: [{ + value: props.attributes.backgroundColor, + onChange: function onChange(value) { + if (!isNotDisabled) { + return; + } + handlers.styleAttrChange('backgroundColor', value); + }, + label: strings.background + }] + }))))); + }, + /** + * Open media library modal and handle image selection. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {Function} setShowBackgroundPreview Set show background preview. + */ + openMediaLibrary: function openMediaLibrary(props, handlers, setShowBackgroundPreview) { + var frame = wp.media({ + title: strings.select_background_image, + multiple: false, + library: { + type: 'image' + }, + button: { + text: strings.select_image + } + }); + frame.on('select', function () { + var attachment = frame.state().get('selection').first().toJSON(); + var setAttr = {}; + var attribute = 'backgroundUrl'; + if (attachment.url) { + var value = "url(".concat(attachment.url, ")"); + setAttr[attribute] = value; + props.setAttributes(setAttr); + handlers.styleAttrChange('backgroundUrl', value); + setShowBackgroundPreview(true); + } + }); + frame.open(); + }, + /** + * Set container background image. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundImage: function setContainerBackgroundImage(container, value) { + if (value === 'none') { + container.style.setProperty("--wpforms-background-url", 'url()'); + } + return true; + }, + /** + * Set container background image. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {string} value Value. + * @param {string} lastBgImage Last background image. + * @param {Function} setLastBgImage Set last background image. + */ + setContainerBackgroundImageWrapper: function setContainerBackgroundImageWrapper(props, handlers, value, lastBgImage, setLastBgImage) { + if (value === 'none') { + setLastBgImage(props.attributes.backgroundUrl); + props.attributes.backgroundUrl = 'url()'; + handlers.styleAttrChange('backgroundUrl', 'url()'); + } else if (lastBgImage) { + props.attributes.backgroundUrl = lastBgImage; + handlers.styleAttrChange('backgroundUrl', lastBgImage); + } + handlers.styleAttrChange('backgroundImage', value); + }, + /** + * Set container background position. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundPosition: function setContainerBackgroundPosition(container, value) { + container.style.setProperty("--wpforms-background-position", value); + return true; + }, + /** + * Set container background repeat. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundRepeat: function setContainerBackgroundRepeat(container, value) { + container.style.setProperty("--wpforms-background-repeat", value); + return true; + }, + /** + * Handle real size from dimensions. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {string} value Value. + */ + handleSizeFromDimensions: function handleSizeFromDimensions(props, handlers, value) { + if (value === 'cover') { + props.attributes.backgroundSize = 'cover'; + handlers.styleAttrChange('backgroundWidth', props.attributes.backgroundWidth); + handlers.styleAttrChange('backgroundHeight', props.attributes.backgroundHeight); + handlers.styleAttrChange('backgroundSizeMode', 'cover'); + handlers.styleAttrChange('backgroundSize', 'cover'); + } else { + props.attributes.backgroundSize = 'dimensions'; + handlers.styleAttrChange('backgroundSizeMode', 'dimensions'); + handlers.styleAttrChange('backgroundSize', props.attributes.backgroundWidth + ' ' + props.attributes.backgroundHeight); + } + }, + /** + * Handle real size from width. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {string} value Value. + */ + handleSizeFromWidth: function handleSizeFromWidth(props, handlers, value) { + props.attributes.backgroundSize = value + ' ' + props.attributes.backgroundHeight; + props.attributes.backgroundWidth = value; + handlers.styleAttrChange('backgroundSize', value + ' ' + props.attributes.backgroundHeight); + handlers.styleAttrChange('backgroundWidth', value); + }, + /** + * Handle real size from height. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block handlers. + * @param {string} value Value. + */ + handleSizeFromHeight: function handleSizeFromHeight(props, handlers, value) { + props.attributes.backgroundSize = props.attributes.backgroundWidth + ' ' + value; + props.attributes.backgroundHeight = value; + handlers.styleAttrChange('backgroundSize', props.attributes.backgroundWidth + ' ' + value); + handlers.styleAttrChange('backgroundHeight', value); + }, + /** + * Set container background width. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundWidth: function setContainerBackgroundWidth(container, value) { + container.style.setProperty("--wpforms-background-width", value); + return true; + }, + /** + * Set container background height. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setContainerBackgroundHeight: function setContainerBackgroundHeight(container, value) { + container.style.setProperty("--wpforms-background-height", value); + return true; + }, + /** + * Set container background url. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setBackgroundUrl: function setBackgroundUrl(container, value) { + container.style.setProperty("--wpforms-background-url", value); + return true; + }, + /** + * Set container background color. + * + * @since 1.8.8 + * + * @param {HTMLElement} container Container element. + * @param {string} value Value. + * + * @return {boolean} True if the value was set, false otherwise. + */ + setBackgroundColor: function setBackgroundColor(container, value) { + container.style.setProperty("--wpforms-background-color", value); + return true; + }, + _showBackgroundPreview: function _showBackgroundPreview(props) { + return props.attributes.backgroundImage !== 'none' && props.attributes.backgroundUrl && props.attributes.backgroundUrl !== 'url()'; + }, + /** + * Remove background image. + * + * @since 1.8.8 + * + * @param {Function} setShowBackgroundPreview Set show background preview. + * @param {Object} handlers Block handlers. + * @param {Function} setLastBgImage Set last background image. + */ + onRemoveBackground: function onRemoveBackground(setShowBackgroundPreview, handlers, setLastBgImage) { + setShowBackgroundPreview(false); + handlers.styleAttrChange('backgroundUrl', 'url()'); + setLastBgImage(''); + } + }; + return app; +}(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFja2dyb3VuZFByZXZpZXciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIl9yZWYiLCJ3cCIsImJsb2NrRWRpdG9yIiwiZWRpdG9yIiwiUGFuZWxDb2xvclNldHRpbmdzIiwiX3dwJGNvbXBvbmVudHMiLCJjb21wb25lbnRzIiwiU2VsZWN0Q29udHJvbCIsIlBhbmVsQm9keSIsIkZsZXgiLCJGbGV4QmxvY2siLCJfX2V4cGVyaW1lbnRhbFVuaXRDb250cm9sIiwiVGV4dENvbnRyb2wiLCJCdXR0b24iLCJfd3Bmb3Jtc19ndXRlbmJlcmdfZm8iLCJ3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yIiwic3RyaW5ncyIsImRlZmF1bHRzIiwiYXBwIiwiZ2V0QmxvY2tBdHRyaWJ1dGVzIiwiYmFja2dyb3VuZEltYWdlIiwidHlwZSIsImJhY2tncm91bmRQb3NpdGlvbiIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kU2l6ZU1vZGUiLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRXaWR0aCIsImJhY2tncm91bmRIZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kVXJsIiwiZ2V0QmFja2dyb3VuZFN0eWxlcyIsInByb3BzIiwiaGFuZGxlcnMiLCJmb3JtU2VsZWN0b3JDb21tb24iLCJzdG9ja1Bob3RvcyIsInVpU3RhdGUiLCJpc05vdERpc2FibGVkIiwiaXNQcm9FbmFibGVkIiwic2hvd0JhY2tncm91bmRQcmV2aWV3Iiwic2V0U2hvd0JhY2tncm91bmRQcmV2aWV3IiwibGFzdEJnSW1hZ2UiLCJzZXRMYXN0QmdJbWFnZSIsInRhYkluZGV4IiwiY3NzQ2xhc3MiLCJnZXRQYW5lbENsYXNzIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwidGl0bGUiLCJiYWNrZ3JvdW5kX3N0eWxlcyIsIm9uQ2xpY2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsImVkdWNhdGlvbiIsInNob3dQcm9Nb2RhbCIsInNob3dMaWNlbnNlTW9kYWwiLCJvbktleURvd24iLCJnYXAiLCJhbGlnbiIsImp1c3RpZnkiLCJsYWJlbCIsImltYWdlIiwidmFsdWUiLCJhdHRyaWJ1dGVzIiwib3B0aW9ucyIsIm5vbmUiLCJtZWRpYV9saWJyYXJ5Iiwic3RvY2tfcGhvdG8iLCJvbkNoYW5nZSIsInNldENvbnRhaW5lckJhY2tncm91bmRJbWFnZVdyYXBwZXIiLCJwb3NpdGlvbiIsInRvcF9sZWZ0IiwidG9wX2NlbnRlciIsInRvcF9yaWdodCIsImNlbnRlcl9sZWZ0IiwiY2VudGVyX2NlbnRlciIsImNlbnRlcl9yaWdodCIsImJvdHRvbV9sZWZ0IiwiYm90dG9tX2NlbnRlciIsImJvdHRvbV9yaWdodCIsImRpc2FibGVkIiwic3R5bGVBdHRyQ2hhbmdlIiwicmVwZWF0Iiwibm9fcmVwZWF0IiwidGlsZSIsInJlcGVhdF94IiwicmVwZWF0X3kiLCJzaXplIiwiZGltZW5zaW9ucyIsImNvdmVyIiwiaGFuZGxlU2l6ZUZyb21EaW1lbnNpb25zIiwid2lkdGgiLCJpc1VuaXRTZWxlY3RUYWJiYWJsZSIsImhhbmRsZVNpemVGcm9tV2lkdGgiLCJoZWlnaHQiLCJoYW5kbGVTaXplRnJvbUhlaWdodCIsImlzU2Vjb25kYXJ5Iiwib3Blbk1lZGlhTGlicmFyeSIsImJpbmQiLCJjaG9vc2VfaW1hZ2UiLCJvcGVuTW9kYWwiLCJvblJlbW92ZUJhY2tncm91bmQiLCJvblByZXZpZXdDbGlja2VkIiwiaW1hZ2VfdXJsIiwib25Mb2FkIiwiY29sb3JzIiwiX19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyIiwiZW5hYmxlQWxwaGEiLCJzaG93VGl0bGUiLCJjb2xvclNldHRpbmdzIiwiYmFja2dyb3VuZCIsImZyYW1lIiwibWVkaWEiLCJzZWxlY3RfYmFja2dyb3VuZF9pbWFnZSIsIm11bHRpcGxlIiwibGlicmFyeSIsImJ1dHRvbiIsInRleHQiLCJzZWxlY3RfaW1hZ2UiLCJvbiIsImF0dGFjaG1lbnQiLCJzdGF0ZSIsImdldCIsImZpcnN0IiwidG9KU09OIiwic2V0QXR0ciIsImF0dHJpYnV0ZSIsInVybCIsImNvbmNhdCIsInNldEF0dHJpYnV0ZXMiLCJvcGVuIiwic2V0Q29udGFpbmVyQmFja2dyb3VuZEltYWdlIiwiY29udGFpbmVyIiwic3R5bGUiLCJzZXRQcm9wZXJ0eSIsInNldENvbnRhaW5lckJhY2tncm91bmRQb3NpdGlvbiIsInNldENvbnRhaW5lckJhY2tncm91bmRSZXBlYXQiLCJzZXRDb250YWluZXJCYWNrZ3JvdW5kV2lkdGgiLCJzZXRDb250YWluZXJCYWNrZ3JvdW5kSGVpZ2h0Iiwic2V0QmFja2dyb3VuZFVybCIsInNldEJhY2tncm91bmRDb2xvciIsIl9zaG93QmFja2dyb3VuZFByZXZpZXciXSwic291cmNlcyI6WyJiYWNrZ3JvdW5kLXN0eWxlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgd3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3RvciAqL1xuLyoganNoaW50IGVzMzogZmFsc2UsIGVzdmVyc2lvbjogNiAqL1xuXG5pbXBvcnQgQmFja2dyb3VuZFByZXZpZXcgZnJvbSAnLi9iYWNrZ3JvdW5kLXByZXZpZXcuanMnO1xuXG4vKipcbiAqIEBwYXJhbSBzdHJpbmdzLmJhY2tncm91bmRfc3R5bGVzXG4gKiBAcGFyYW0gc3RyaW5ncy5ib3R0b21fY2VudGVyXG4gKiBAcGFyYW0gc3RyaW5ncy5ib3R0b21fbGVmdFxuICogQHBhcmFtIHN0cmluZ3MuYm90dG9tX3JpZ2h0XG4gKiBAcGFyYW0gc3RyaW5ncy5jZW50ZXJfY2VudGVyXG4gKiBAcGFyYW0gc3RyaW5ncy5jZW50ZXJfbGVmdFxuICogQHBhcmFtIHN0cmluZ3MuY2VudGVyX3JpZ2h0XG4gKiBAcGFyYW0gc3RyaW5ncy5jaG9vc2VfaW1hZ2VcbiAqIEBwYXJhbSBzdHJpbmdzLmltYWdlX3VybFxuICogQHBhcmFtIHN0cmluZ3MubWVkaWFfbGlicmFyeVxuICogQHBhcmFtIHN0cmluZ3Mubm9fcmVwZWF0XG4gKiBAcGFyYW0gc3RyaW5ncy5yZXBlYXRfeFxuICogQHBhcmFtIHN0cmluZ3MucmVwZWF0X3lcbiAqIEBwYXJhbSBzdHJpbmdzLnNlbGVjdF9iYWNrZ3JvdW5kX2ltYWdlXG4gKiBAcGFyYW0gc3RyaW5ncy5zZWxlY3RfaW1hZ2VcbiAqIEBwYXJhbSBzdHJpbmdzLnN0b2NrX3Bob3RvXG4gKiBAcGFyYW0gc3RyaW5ncy50aWxlXG4gKiBAcGFyYW0gc3RyaW5ncy50b3BfY2VudGVyXG4gKiBAcGFyYW0gc3RyaW5ncy50b3BfbGVmdFxuICogQHBhcmFtIHN0cmluZ3MudG9wX3JpZ2h0XG4gKi9cblxuLyoqXG4gKiBHdXRlbmJlcmcgZWRpdG9yIGJsb2NrLlxuICpcbiAqIEJhY2tncm91bmQgc3R5bGVzIHBhbmVsIG1vZHVsZS5cbiAqXG4gKiBAc2luY2UgMS44LjhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKCBmdW5jdGlvbigpIHtcblx0LyoqXG5cdCAqIFdQIGNvcmUgY29tcG9uZW50cy5cblx0ICpcblx0ICogQHNpbmNlIDEuOC44XG5cdCAqL1xuXHRjb25zdCB7IFBhbmVsQ29sb3JTZXR0aW5ncyB9ID0gd3AuYmxvY2tFZGl0b3IgfHwgd3AuZWRpdG9yO1xuXHRjb25zdCB7IFNlbGVjdENvbnRyb2wsIFBhbmVsQm9keSwgRmxleCwgRmxleEJsb2NrLCBfX2V4cGVyaW1lbnRhbFVuaXRDb250cm9sLCBUZXh0Q29udHJvbCwgQnV0dG9uIH0gPSB3cC5jb21wb25lbnRzO1xuXG5cdC8qKlxuXHQgKiBMb2NhbGl6ZWQgZGF0YSBhbGlhc2VzLlxuXHQgKlxuXHQgKiBAc2luY2UgMS44Ljhcblx0ICovXG5cdGNvbnN0IHsgc3RyaW5ncywgZGVmYXVsdHMgfSA9IHdwZm9ybXNfZ3V0ZW5iZXJnX2Zvcm1fc2VsZWN0b3I7XG5cblx0LyoqXG5cdCAqIFB1YmxpYyBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguOFxuXHQgKlxuXHQgKiBAdHlwZSB7T2JqZWN0fVxuXHQgKi9cblx0Y29uc3QgYXBwID0ge1xuXG5cdFx0LyoqXG5cdFx0ICogR2V0IGJsb2NrIGF0dHJpYnV0ZXMuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gQmxvY2sgYXR0cmlidXRlcy5cblx0XHQgKi9cblx0XHRnZXRCbG9ja0F0dHJpYnV0ZXMoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kSW1hZ2U6IHtcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBkZWZhdWx0cy5iYWNrZ3JvdW5kSW1hZ2UsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJhY2tncm91bmRQb3NpdGlvbjoge1xuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGRlZmF1bHRzLmJhY2tncm91bmRQb3NpdGlvbixcblx0XHRcdFx0fSxcblx0XHRcdFx0YmFja2dyb3VuZFJlcGVhdDoge1xuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGRlZmF1bHRzLmJhY2tncm91bmRSZXBlYXQsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJhY2tncm91bmRTaXplTW9kZToge1xuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGRlZmF1bHRzLmJhY2tncm91bmRTaXplTW9kZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0YmFja2dyb3VuZFNpemU6IHtcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBkZWZhdWx0cy5iYWNrZ3JvdW5kU2l6ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0YmFja2dyb3VuZFdpZHRoOiB7XG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZGVmYXVsdHMuYmFja2dyb3VuZFdpZHRoLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRiYWNrZ3JvdW5kSGVpZ2h0OiB7XG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZGVmYXVsdHMuYmFja2dyb3VuZEhlaWdodCxcblx0XHRcdFx0fSxcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiB7XG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZGVmYXVsdHMuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRiYWNrZ3JvdW5kVXJsOiB7XG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZGVmYXVsdHMuYmFja2dyb3VuZFVybCxcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEdldCBCYWNrZ3JvdW5kIFN0eWxlcyBwYW5lbCBKU1ggY29kZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHByb3BzICAgICAgICAgICAgICBCbG9jayBwcm9wZXJ0aWVzLlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBoYW5kbGVycyAgICAgICAgICAgQmxvY2sgaGFuZGxlcnMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGZvcm1TZWxlY3RvckNvbW1vbiBCbG9jayBwcm9wZXJ0aWVzLlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdG9ja1Bob3RvcyAgICAgICAgU3RvY2sgUGhvdG9zIG1vZHVsZS5cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gdWlTdGF0ZSAgICAgICAgICAgIFVJIHN0YXRlLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBGaWVsZCBzdHlsZXMgSlNYIGNvZGUuXG5cdFx0ICovXG5cdFx0Z2V0QmFja2dyb3VuZFN0eWxlcyggcHJvcHMsIGhhbmRsZXJzLCBmb3JtU2VsZWN0b3JDb21tb24sIHN0b2NrUGhvdG9zLCB1aVN0YXRlICkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb24sIGNvbXBsZXhpdHlcblx0XHRcdGNvbnN0IGlzTm90RGlzYWJsZWQgPSB1aVN0YXRlLmlzTm90RGlzYWJsZWQ7XG5cdFx0XHRjb25zdCBpc1Byb0VuYWJsZWQgPSB1aVN0YXRlLmlzUHJvRW5hYmxlZDtcblx0XHRcdGNvbnN0IHNob3dCYWNrZ3JvdW5kUHJldmlldyA9IHVpU3RhdGUuc2hvd0JhY2tncm91bmRQcmV2aWV3O1xuXHRcdFx0Y29uc3Qgc2V0U2hvd0JhY2tncm91bmRQcmV2aWV3ID0gdWlTdGF0ZS5zZXRTaG93QmFja2dyb3VuZFByZXZpZXc7XG5cdFx0XHRjb25zdCBsYXN0QmdJbWFnZSA9IHVpU3RhdGUubGFzdEJnSW1hZ2U7XG5cdFx0XHRjb25zdCBzZXRMYXN0QmdJbWFnZSA9IHVpU3RhdGUuc2V0TGFzdEJnSW1hZ2U7XG5cdFx0XHRjb25zdCB0YWJJbmRleCA9IGlzTm90RGlzYWJsZWQgPyAwIDogLTE7XG5cdFx0XHRjb25zdCBjc3NDbGFzcyA9IGZvcm1TZWxlY3RvckNvbW1vbi5nZXRQYW5lbENsYXNzKCBwcm9wcyApICsgKCBpc05vdERpc2FibGVkID8gJycgOiAnIHdwZm9ybXMtZ3V0ZW5iZXJnLXBhbmVsLWRpc2FibGVkJyApO1xuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQ8UGFuZWxCb2R5IGNsYXNzTmFtZT17IGNzc0NsYXNzIH0gdGl0bGU9eyBzdHJpbmdzLmJhY2tncm91bmRfc3R5bGVzIH0+XG5cdFx0XHRcdFx0PGRpdiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9uc1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci1wYW5lbC1ib2R5XCJcblx0XHRcdFx0XHRcdG9uQ2xpY2s9eyAoIGV2ZW50ICkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGlzTm90RGlzYWJsZWQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCAhIGlzUHJvRW5hYmxlZCApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZm9ybVNlbGVjdG9yQ29tbW9uLmVkdWNhdGlvbi5zaG93UHJvTW9kYWwoICdiYWNrZ3JvdW5kJywgc3RyaW5ncy5iYWNrZ3JvdW5kX3N0eWxlcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Zm9ybVNlbGVjdG9yQ29tbW9uLmVkdWNhdGlvbi5zaG93TGljZW5zZU1vZGFsKCAnYmFja2dyb3VuZCcsIHN0cmluZ3MuYmFja2dyb3VuZF9zdHlsZXMsICdiYWNrZ3JvdW5kLXN0eWxlcycgKTtcblx0XHRcdFx0XHRcdH0gfVxuXHRcdFx0XHRcdFx0b25LZXlEb3duPXsgKCBldmVudCApID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc05vdERpc2FibGVkICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggISBpc1Byb0VuYWJsZWQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZvcm1TZWxlY3RvckNvbW1vbi5lZHVjYXRpb24uc2hvd1Byb01vZGFsKCAnYmFja2dyb3VuZCcsIHN0cmluZ3MuYmFja2dyb3VuZF9zdHlsZXMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGZvcm1TZWxlY3RvckNvbW1vbi5lZHVjYXRpb24uc2hvd0xpY2Vuc2VNb2RhbCggJ2JhY2tncm91bmQnLCBzdHJpbmdzLmJhY2tncm91bmRfc3R5bGVzLCAnYmFja2dyb3VuZC1zdHlsZXMnICk7XG5cdFx0XHRcdFx0XHR9IH1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHQ8RmxleCBnYXA9eyA0IH0gYWxpZ249XCJmbGV4LXN0YXJ0XCIgY2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZmxleCcgfSBqdXN0aWZ5PVwic3BhY2UtYmV0d2VlblwiPlxuXHRcdFx0XHRcdFx0XHQ8RmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0XHRcdDxTZWxlY3RDb250cm9sXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHN0cmluZ3MuaW1hZ2UgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dGFiSW5kZXg9eyB0YWJJbmRleCB9XG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlIH1cblx0XHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM9eyBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGFiZWw6IHN0cmluZ3Mubm9uZSwgdmFsdWU6ICdub25lJyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLm1lZGlhX2xpYnJhcnksIHZhbHVlOiAnbGlicmFyeScgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy5zdG9ja19waG90bywgdmFsdWU6ICdzdG9jaycgfSxcblx0XHRcdFx0XHRcdFx0XHRcdF0gfVxuXHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U9eyAoIHZhbHVlICkgPT4gYXBwLnNldENvbnRhaW5lckJhY2tncm91bmRJbWFnZVdyYXBwZXIoIHByb3BzLCBoYW5kbGVycywgdmFsdWUsIGxhc3RCZ0ltYWdlLCBzZXRMYXN0QmdJbWFnZSApIH1cblx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0PEZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0XHR7ICggcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSW1hZ2UgIT09ICdub25lJyB8fCAhIGlzTm90RGlzYWJsZWQgKSAmJiAoXG5cdFx0XHRcdFx0XHRcdFx0XHQ8U2VsZWN0Q29udHJvbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHN0cmluZ3MucG9zaXRpb24gfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFBvc2l0aW9uIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dGFiSW5kZXg9eyB0YWJJbmRleCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM9eyBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy50b3BfbGVmdCwgdmFsdWU6ICd0b3AgbGVmdCcgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLnRvcF9jZW50ZXIsIHZhbHVlOiAndG9wIGNlbnRlcicgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLnRvcF9yaWdodCwgdmFsdWU6ICd0b3AgcmlnaHQnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy5jZW50ZXJfbGVmdCwgdmFsdWU6ICdjZW50ZXIgbGVmdCcgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmNlbnRlcl9jZW50ZXIsIHZhbHVlOiAnY2VudGVyIGNlbnRlcicgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmNlbnRlcl9yaWdodCwgdmFsdWU6ICdjZW50ZXIgcmlnaHQnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy5ib3R0b21fbGVmdCwgdmFsdWU6ICdib3R0b20gbGVmdCcgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmJvdHRvbV9jZW50ZXIsIHZhbHVlOiAnYm90dG9tIGNlbnRlcicgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmJvdHRvbV9yaWdodCwgdmFsdWU6ICdib3R0b20gcmlnaHQnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF0gfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlZD17ICggcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSW1hZ2UgPT09ICdub25lJyAmJiBpc05vdERpc2FibGVkICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZT17ICggdmFsdWUgKSA9PiBoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kUG9zaXRpb24nLCB2YWx1ZSApIH1cblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHRcdDwvRmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0PC9GbGV4PlxuXHRcdFx0XHRcdFx0eyAoIHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlICE9PSAnbm9uZScgfHwgISBpc05vdERpc2FibGVkICkgJiYgKFxuXHRcdFx0XHRcdFx0XHQ8RmxleCBnYXA9eyA0IH0gYWxpZ249XCJmbGV4LXN0YXJ0XCIgY2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZmxleCcgfSBqdXN0aWZ5PVwic3BhY2UtYmV0d2VlblwiPlxuXHRcdFx0XHRcdFx0XHRcdDxGbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8U2VsZWN0Q29udHJvbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHN0cmluZ3MucmVwZWF0IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dGFiSW5kZXg9eyB0YWJJbmRleCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlPXsgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kUmVwZWF0IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9ucz17IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLm5vX3JlcGVhdCwgdmFsdWU6ICduby1yZXBlYXQnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy50aWxlLCB2YWx1ZTogJ3JlcGVhdCcgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLnJlcGVhdF94LCB2YWx1ZTogJ3JlcGVhdC14JyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGFiZWw6IHN0cmluZ3MucmVwZWF0X3ksIHZhbHVlOiAncmVwZWF0LXknIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF0gfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlZD17ICggcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSW1hZ2UgPT09ICdub25lJyAmJiBpc05vdERpc2FibGVkICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZT17ICggdmFsdWUgKSA9PiBoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kUmVwZWF0JywgdmFsdWUgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdDwvRmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0XHRcdDxGbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8U2VsZWN0Q29udHJvbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHN0cmluZ3Muc2l6ZSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRhYkluZGV4PXsgdGFiSW5kZXggfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFNpemVNb2RlIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9ucz17IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmRpbWVuc2lvbnMsIHZhbHVlOiAnZGltZW5zaW9ucycgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmNvdmVyLCB2YWx1ZTogJ2NvdmVyJyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRdIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlzYWJsZWQ9eyAoIHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlID09PSAnbm9uZScgJiYgaXNOb3REaXNhYmxlZCApIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U9eyAoIHZhbHVlICkgPT4gYXBwLmhhbmRsZVNpemVGcm9tRGltZW5zaW9ucyggcHJvcHMsIGhhbmRsZXJzLCB2YWx1ZSApIH1cblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9GbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdDwvRmxleD5cblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0eyAoICggcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kU2l6ZU1vZGUgPT09ICdkaW1lbnNpb25zJyAmJiBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRJbWFnZSAhPT0gJ25vbmUnICkgfHwgISBpc05vdERpc2FibGVkICkgJiYgKFxuXHRcdFx0XHRcdFx0XHQ8RmxleCBnYXA9eyA0IH0gYWxpZ249XCJmbGV4LXN0YXJ0XCIgY2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZmxleCcgfSBqdXN0aWZ5PVwic3BhY2UtYmV0d2VlblwiPlxuXHRcdFx0XHRcdFx0XHRcdDxGbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8X19leHBlcmltZW50YWxVbml0Q29udHJvbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHN0cmluZ3Mud2lkdGggfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0YWJJbmRleD17IHRhYkluZGV4IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU9eyBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRXaWR0aCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzVW5pdFNlbGVjdFRhYmJhYmxlPXsgaXNOb3REaXNhYmxlZCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlPXsgKCB2YWx1ZSApID0+IGFwcC5oYW5kbGVTaXplRnJvbVdpZHRoKCBwcm9wcywgaGFuZGxlcnMsIHZhbHVlICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0XHQ8RmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0XHRcdFx0PF9fZXhwZXJpbWVudGFsVW5pdENvbnRyb2xcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyBzdHJpbmdzLmhlaWdodCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRhYkluZGV4PXsgdGFiSW5kZXggfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEhlaWdodCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzVW5pdFNlbGVjdFRhYmJhYmxlPXsgaXNOb3REaXNhYmxlZCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlPXsgKCB2YWx1ZSApID0+IGFwcC5oYW5kbGVTaXplRnJvbUhlaWdodCggcHJvcHMsIGhhbmRsZXJzLCB2YWx1ZSApIH1cblx0XHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9GbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdDwvRmxleD5cblx0XHRcdFx0XHRcdCkgfVxuXHRcdFx0XHRcdFx0eyAoICEgc2hvd0JhY2tncm91bmRQcmV2aWV3IHx8IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFVybCA9PT0gJ3VybCgpJyApICYmIChcblx0XHRcdFx0XHRcdFx0KCBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRJbWFnZSA9PT0gJ2xpYnJhcnknICYmIChcblx0XHRcdFx0XHRcdFx0XHQ8RmxleCBnYXA9eyA0IH0gYWxpZ249XCJmbGV4LXN0YXJ0XCIgY2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZmxleCcgfSBqdXN0aWZ5PVwic3BhY2UtYmV0d2VlblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PEZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEJ1dHRvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzU2Vjb25kYXJ5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGFiSW5kZXg9eyB0YWJJbmRleCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItbWVkaWEtbGlicmFyeS1idXR0b24nIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsaWNrPXsgYXBwLm9wZW5NZWRpYUxpYnJhcnkuYmluZCggbnVsbCwgcHJvcHMsIGhhbmRsZXJzLCBzZXRTaG93QmFja2dyb3VuZFByZXZpZXcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IHN0cmluZ3MuY2hvb3NlX2ltYWdlIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9CdXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0XHQ8L0ZsZXg+XG5cdFx0XHRcdFx0XHRcdCkgKSB8fCAoIHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlID09PSAnc3RvY2snICYmIChcblx0XHRcdFx0XHRcdFx0XHQ8RmxleCBnYXA9eyA0IH0gYWxpZ249XCJmbGV4LXN0YXJ0XCIgY2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZmxleCcgfSBqdXN0aWZ5PVwic3BhY2UtYmV0d2VlblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PEZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEJ1dHRvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzU2Vjb25kYXJ5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGFiSW5kZXg9eyB0YWJJbmRleCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItbWVkaWEtbGlicmFyeS1idXR0b24nIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsaWNrPXsgc3RvY2tQaG90b3M/Lm9wZW5Nb2RhbC5iaW5kKCBudWxsLCBwcm9wcywgaGFuZGxlcnMsICdiZy1zdHlsZXMnLCBzZXRTaG93QmFja2dyb3VuZFByZXZpZXcgKSB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IHN0cmluZ3MuY2hvb3NlX2ltYWdlIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9CdXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0XHQ8L0ZsZXg+XG5cdFx0XHRcdFx0XHRcdCkgKVxuXHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHR7ICggKCBzaG93QmFja2dyb3VuZFByZXZpZXcgJiYgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSW1hZ2UgIT09ICdub25lJyApIHx8IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFVybCAhPT0gJ3VybCgpJyApICYmIChcblx0XHRcdFx0XHRcdFx0PEZsZXggZ2FwPXsgNCB9IGFsaWduPVwiZmxleC1zdGFydFwiIGNsYXNzTmFtZT17ICd3cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLWZsZXgnIH0ganVzdGlmeT1cInNwYWNlLWJldHdlZW5cIj5cblx0XHRcdFx0XHRcdFx0XHQ8RmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PEJhY2tncm91bmRQcmV2aWV3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0cmlidXRlcz17IHByb3BzLmF0dHJpYnV0ZXMgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uUmVtb3ZlQmFja2dyb3VuZD17XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFwcC5vblJlbW92ZUJhY2tncm91bmQoIHNldFNob3dCYWNrZ3JvdW5kUHJldmlldywgaGFuZGxlcnMsIHNldExhc3RCZ0ltYWdlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uUHJldmlld0NsaWNrZWQ9eyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlID09PSAnbGlicmFyeScgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHAub3Blbk1lZGlhTGlicmFyeSggcHJvcHMsIGhhbmRsZXJzLCBzZXRTaG93QmFja2dyb3VuZFByZXZpZXcgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHN0b2NrUGhvdG9zPy5vcGVuTW9kYWwoIHByb3BzLCBoYW5kbGVycywgJ2JnLXN0eWxlcycsIHNldFNob3dCYWNrZ3JvdW5kUHJldmlldyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8VGV4dENvbnRyb2xcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyBzdHJpbmdzLmltYWdlX3VybCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRhYkluZGV4PXsgdGFiSW5kZXggfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlICE9PSAnbm9uZScgJiYgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kVXJsIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItaW1hZ2UtdXJsJyB9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlPXsgKCB2YWx1ZSApID0+IGhhbmRsZXJzLnN0eWxlQXR0ckNoYW5nZSggJ2JhY2tncm91bmRVcmwnLCB2YWx1ZSApIH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0b25Mb2FkPXsgKCB2YWx1ZSApID0+IHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEltYWdlICE9PSAnbm9uZScgJiYgaGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZFVybCcsIHZhbHVlICkgfVxuXHRcdFx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0PC9GbGV4PlxuXHRcdFx0XHRcdFx0KSB9XG5cdFx0XHRcdFx0XHQ8RmxleCBnYXA9eyA0IH0gYWxpZ249XCJmbGV4LXN0YXJ0XCIgY2xhc3NOYW1lPXsgJ3dwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItZmxleCcgfSBqdXN0aWZ5PVwic3BhY2UtYmV0d2VlblwiPlxuXHRcdFx0XHRcdFx0XHQ8RmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci1jb250cm9sLWxhYmVsXCI+eyBzdHJpbmdzLmNvbG9ycyB9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PFBhbmVsQ29sb3JTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRcdFx0X19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbmFibGVBbHBoYVxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd1RpdGxlPXsgZmFsc2UgfVxuXHRcdFx0XHRcdFx0XHRcdFx0dGFiSW5kZXg9eyB0YWJJbmRleCB9XG5cdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJ3cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLWNvbG9yLXBhbmVsXCJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbG9yU2V0dGluZ3M9eyBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6ICggdmFsdWUgKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoICEgaXNOb3REaXNhYmxlZCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kQ29sb3InLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHN0cmluZ3MuYmFja2dyb3VuZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdF0gfVxuXHRcdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHRcdDwvRmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0PC9GbGV4PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L1BhbmVsQm9keT5cblx0XHRcdCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIE9wZW4gbWVkaWEgbGlicmFyeSBtb2RhbCBhbmQgaGFuZGxlIGltYWdlIHNlbGVjdGlvbi5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICAgcHJvcHMgICAgICAgICAgICAgICAgICAgIEJsb2NrIHByb3BlcnRpZXMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICAgaGFuZGxlcnMgICAgICAgICAgICAgICAgIEJsb2NrIGhhbmRsZXJzLlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHNldFNob3dCYWNrZ3JvdW5kUHJldmlldyBTZXQgc2hvdyBiYWNrZ3JvdW5kIHByZXZpZXcuXG5cdFx0ICovXG5cdFx0b3Blbk1lZGlhTGlicmFyeSggcHJvcHMsIGhhbmRsZXJzLCBzZXRTaG93QmFja2dyb3VuZFByZXZpZXcgKSB7XG5cdFx0XHRjb25zdCBmcmFtZSA9IHdwLm1lZGlhKCB7XG5cdFx0XHRcdHRpdGxlOiBzdHJpbmdzLnNlbGVjdF9iYWNrZ3JvdW5kX2ltYWdlLFxuXHRcdFx0XHRtdWx0aXBsZTogZmFsc2UsXG5cdFx0XHRcdGxpYnJhcnk6IHtcblx0XHRcdFx0XHR0eXBlOiAnaW1hZ2UnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRidXR0b246IHtcblx0XHRcdFx0XHR0ZXh0OiBzdHJpbmdzLnNlbGVjdF9pbWFnZSxcblx0XHRcdFx0fSxcblx0XHRcdH0gKTtcblxuXHRcdFx0ZnJhbWUub24oICdzZWxlY3QnLCAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBmcmFtZS5zdGF0ZSgpLmdldCggJ3NlbGVjdGlvbicgKS5maXJzdCgpLnRvSlNPTigpO1xuXHRcdFx0XHRjb25zdCBzZXRBdHRyID0ge307XG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9ICdiYWNrZ3JvdW5kVXJsJztcblxuXHRcdFx0XHRpZiAoIGF0dGFjaG1lbnQudXJsICkge1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gYHVybCgkeyBhdHRhY2htZW50LnVybCB9KWA7XG5cblx0XHRcdFx0XHRzZXRBdHRyWyBhdHRyaWJ1dGUgXSA9IHZhbHVlO1xuXG5cdFx0XHRcdFx0cHJvcHMuc2V0QXR0cmlidXRlcyggc2V0QXR0ciApO1xuXG5cdFx0XHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZFVybCcsIHZhbHVlICk7XG5cblx0XHRcdFx0XHRzZXRTaG93QmFja2dyb3VuZFByZXZpZXcoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXG5cdFx0XHRmcmFtZS5vcGVuKCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNldCBjb250YWluZXIgYmFja2dyb3VuZCBpbWFnZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIENvbnRhaW5lciBlbGVtZW50LlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIHZhbHVlICAgICBWYWx1ZS5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0XHQgKi9cblx0XHRzZXRDb250YWluZXJCYWNrZ3JvdW5kSW1hZ2UoIGNvbnRhaW5lciwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAnbm9uZScgKSB7XG5cdFx0XHRcdGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSggYC0td3Bmb3Jtcy1iYWNrZ3JvdW5kLXVybGAsICd1cmwoKScgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNldCBjb250YWluZXIgYmFja2dyb3VuZCBpbWFnZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICAgcHJvcHMgICAgICAgICAgQmxvY2sgcHJvcGVydGllcy5cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICBoYW5kbGVycyAgICAgICBCbG9jayBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gICB2YWx1ZSAgICAgICAgICBWYWx1ZS5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gICBsYXN0QmdJbWFnZSAgICBMYXN0IGJhY2tncm91bmQgaW1hZ2UuXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0TGFzdEJnSW1hZ2UgU2V0IGxhc3QgYmFja2dyb3VuZCBpbWFnZS5cblx0XHQgKi9cblx0XHRzZXRDb250YWluZXJCYWNrZ3JvdW5kSW1hZ2VXcmFwcGVyKCBwcm9wcywgaGFuZGxlcnMsIHZhbHVlLCBsYXN0QmdJbWFnZSwgc2V0TGFzdEJnSW1hZ2UgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAnbm9uZScgKSB7XG5cdFx0XHRcdHNldExhc3RCZ0ltYWdlKCBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRVcmwgKTtcblx0XHRcdFx0cHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kVXJsID0gJ3VybCgpJztcblxuXHRcdFx0XHRoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kVXJsJywgJ3VybCgpJyApO1xuXHRcdFx0fSBlbHNlIGlmICggbGFzdEJnSW1hZ2UgKSB7XG5cdFx0XHRcdHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFVybCA9IGxhc3RCZ0ltYWdlO1xuXHRcdFx0XHRoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kVXJsJywgbGFzdEJnSW1hZ2UgKTtcblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZEltYWdlJywgdmFsdWUgKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogU2V0IGNvbnRhaW5lciBiYWNrZ3JvdW5kIHBvc2l0aW9uLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC44XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgQ29udGFpbmVyIGVsZW1lbnQuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9ICAgICAgdmFsdWUgICAgIFZhbHVlLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHRcdCAqL1xuXHRcdHNldENvbnRhaW5lckJhY2tncm91bmRQb3NpdGlvbiggY29udGFpbmVyLCB2YWx1ZSApIHtcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSggYC0td3Bmb3Jtcy1iYWNrZ3JvdW5kLXBvc2l0aW9uYCwgdmFsdWUgKTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNldCBjb250YWluZXIgYmFja2dyb3VuZCByZXBlYXQuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44Ljhcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciBDb250YWluZXIgZWxlbWVudC5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gICAgICB2YWx1ZSAgICAgVmFsdWUuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXG5cdFx0ICovXG5cdFx0c2V0Q29udGFpbmVyQmFja2dyb3VuZFJlcGVhdCggY29udGFpbmVyLCB2YWx1ZSApIHtcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSggYC0td3Bmb3Jtcy1iYWNrZ3JvdW5kLXJlcGVhdGAsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGUgcmVhbCBzaXplIGZyb20gZGltZW5zaW9ucy5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHByb3BzICAgIEJsb2NrIHByb3BlcnRpZXMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZXJzIEJsb2NrIGhhbmRsZXJzLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAgICBWYWx1ZS5cblx0XHQgKi9cblx0XHRoYW5kbGVTaXplRnJvbURpbWVuc2lvbnMoIHByb3BzLCBoYW5kbGVycywgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAnY292ZXInICkge1xuXHRcdFx0XHRwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRTaXplID0gJ2NvdmVyJztcblxuXHRcdFx0XHRoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kV2lkdGgnLCBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRXaWR0aCApO1xuXHRcdFx0XHRoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kSGVpZ2h0JywgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSGVpZ2h0ICk7XG5cdFx0XHRcdGhhbmRsZXJzLnN0eWxlQXR0ckNoYW5nZSggJ2JhY2tncm91bmRTaXplTW9kZScsICdjb3ZlcicgKTtcblx0XHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZFNpemUnLCAnY292ZXInICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRTaXplID0gJ2RpbWVuc2lvbnMnO1xuXG5cdFx0XHRcdGhhbmRsZXJzLnN0eWxlQXR0ckNoYW5nZSggJ2JhY2tncm91bmRTaXplTW9kZScsICdkaW1lbnNpb25zJyApO1xuXHRcdFx0XHRoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdiYWNrZ3JvdW5kU2l6ZScsIHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFdpZHRoICsgJyAnICsgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSGVpZ2h0ICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEhhbmRsZSByZWFsIHNpemUgZnJvbSB3aWR0aC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHByb3BzICAgIEJsb2NrIHByb3BlcnRpZXMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZXJzIEJsb2NrIGhhbmRsZXJzLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAgICBWYWx1ZS5cblx0XHQgKi9cblx0XHRoYW5kbGVTaXplRnJvbVdpZHRoKCBwcm9wcywgaGFuZGxlcnMsIHZhbHVlICkge1xuXHRcdFx0cHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kU2l6ZSA9IHZhbHVlICsgJyAnICsgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSGVpZ2h0O1xuXHRcdFx0cHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kV2lkdGggPSB2YWx1ZTtcblxuXHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZFNpemUnLCB2YWx1ZSArICcgJyArIHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZEhlaWdodCApO1xuXHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZFdpZHRoJywgdmFsdWUgKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlIHJlYWwgc2l6ZSBmcm9tIGhlaWdodC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHByb3BzICAgIEJsb2NrIHByb3BlcnRpZXMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZXJzIEJsb2NrIGhhbmRsZXJzLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAgICBWYWx1ZS5cblx0XHQgKi9cblx0XHRoYW5kbGVTaXplRnJvbUhlaWdodCggcHJvcHMsIGhhbmRsZXJzLCB2YWx1ZSApIHtcblx0XHRcdHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFNpemUgPSBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRXaWR0aCArICcgJyArIHZhbHVlO1xuXHRcdFx0cHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kSGVpZ2h0ID0gdmFsdWU7XG5cblx0XHRcdGhhbmRsZXJzLnN0eWxlQXR0ckNoYW5nZSggJ2JhY2tncm91bmRTaXplJywgcHJvcHMuYXR0cmlidXRlcy5iYWNrZ3JvdW5kV2lkdGggKyAnICcgKyB2YWx1ZSApO1xuXHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZEhlaWdodCcsIHZhbHVlICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNldCBjb250YWluZXIgYmFja2dyb3VuZCB3aWR0aC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIENvbnRhaW5lciBlbGVtZW50LlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIHZhbHVlICAgICBWYWx1ZS5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0XHQgKi9cblx0XHRzZXRDb250YWluZXJCYWNrZ3JvdW5kV2lkdGgoIGNvbnRhaW5lciwgdmFsdWUgKSB7XG5cdFx0XHRjb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoIGAtLXdwZm9ybXMtYmFja2dyb3VuZC13aWR0aGAsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBTZXQgY29udGFpbmVyIGJhY2tncm91bmQgaGVpZ2h0LlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC44XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgQ29udGFpbmVyIGVsZW1lbnQuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9ICAgICAgdmFsdWUgICAgIFZhbHVlLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHRcdCAqL1xuXHRcdHNldENvbnRhaW5lckJhY2tncm91bmRIZWlnaHQoIGNvbnRhaW5lciwgdmFsdWUgKSB7XG5cdFx0XHRjb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoIGAtLXdwZm9ybXMtYmFja2dyb3VuZC1oZWlnaHRgLCB2YWx1ZSApO1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogU2V0IGNvbnRhaW5lciBiYWNrZ3JvdW5kIHVybC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIENvbnRhaW5lciBlbGVtZW50LlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIHZhbHVlICAgICBWYWx1ZS5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0XHQgKi9cblx0XHRzZXRCYWNrZ3JvdW5kVXJsKCBjb250YWluZXIsIHZhbHVlICkge1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KCBgLS13cGZvcm1zLWJhY2tncm91bmQtdXJsYCwgdmFsdWUgKTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNldCBjb250YWluZXIgYmFja2dyb3VuZCBjb2xvci5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIENvbnRhaW5lciBlbGVtZW50LlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIHZhbHVlICAgICBWYWx1ZS5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0XHQgKi9cblx0XHRzZXRCYWNrZ3JvdW5kQ29sb3IoIGNvbnRhaW5lciwgdmFsdWUgKSB7XG5cdFx0XHRjb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoIGAtLXdwZm9ybXMtYmFja2dyb3VuZC1jb2xvcmAsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRfc2hvd0JhY2tncm91bmRQcmV2aWV3KCBwcm9wcyApIHtcblx0XHRcdHJldHVybiBwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRJbWFnZSAhPT0gJ25vbmUnICYmXG5cdFx0XHRcdHByb3BzLmF0dHJpYnV0ZXMuYmFja2dyb3VuZFVybCAmJlxuXHRcdFx0XHRwcm9wcy5hdHRyaWJ1dGVzLmJhY2tncm91bmRVcmwgIT09ICd1cmwoKSc7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJlbW92ZSBiYWNrZ3JvdW5kIGltYWdlLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC44XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXRTaG93QmFja2dyb3VuZFByZXZpZXcgU2V0IHNob3cgYmFja2dyb3VuZCBwcmV2aWV3LlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSAgIGhhbmRsZXJzICAgICAgICAgICAgICAgICBCbG9jayBoYW5kbGVycy5cblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXRMYXN0QmdJbWFnZSAgICAgICAgICAgU2V0IGxhc3QgYmFja2dyb3VuZCBpbWFnZS5cblx0XHQgKi9cblx0XHRvblJlbW92ZUJhY2tncm91bmQoIHNldFNob3dCYWNrZ3JvdW5kUHJldmlldywgaGFuZGxlcnMsIHNldExhc3RCZ0ltYWdlICkge1xuXHRcdFx0c2V0U2hvd0JhY2tncm91bmRQcmV2aWV3KCBmYWxzZSApO1xuXHRcdFx0aGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYmFja2dyb3VuZFVybCcsICd1cmwoKScgKTtcblx0XHRcdHNldExhc3RCZ0ltYWdlKCAnJyApO1xuXHRcdH0sXG5cdH07XG5cblx0cmV0dXJuIGFwcDtcbn0oKSApO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxrQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQXdELFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBSHhEO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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 +},{"./background-preview.js":14}],16:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +/* global wpforms_gutenberg_form_selector */ +/* jshint es3: false, esversion: 6 */ +/** + * @param strings.border_radius + * @param strings.border_size + * @param strings.button_color_notice + * @param strings.button_styles + * @param strings.dashed + * @param strings.solid + */ +/** + * Gutenberg editor block. + * + * Button styles panel module. + * + * @since 1.8.8 + */ +var _default = exports.default = function () { + /** + * WP core components. + * + * @since 1.8.8 + */ + var _ref = wp.blockEditor || wp.editor, + PanelColorSettings = _ref.PanelColorSettings; + var _wp$components = wp.components, + SelectControl = _wp$components.SelectControl, + PanelBody = _wp$components.PanelBody, + Flex = _wp$components.Flex, + FlexBlock = _wp$components.FlexBlock, + __experimentalUnitControl = _wp$components.__experimentalUnitControl; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + var _wpforms_gutenberg_fo = wpforms_gutenberg_form_selector, + strings = _wpforms_gutenberg_fo.strings, + defaults = _wpforms_gutenberg_fo.defaults; + + // noinspection UnnecessaryLocalVariableJS + /** + * Public functions and properties. + * + * @since 1.8.8 + * + * @type {Object} + */ + var app = { + /** + * Get block attributes. + * + * @since 1.8.8 + * + * @return {Object} Block attributes. + */ + getBlockAttributes: function getBlockAttributes() { + return { + buttonSize: { + type: 'string', + default: defaults.buttonSize + }, + buttonBorderStyle: { + type: 'string', + default: defaults.buttonBorderStyle + }, + buttonBorderSize: { + type: 'string', + default: defaults.buttonBorderSize + }, + buttonBorderRadius: { + type: 'string', + default: defaults.buttonBorderRadius + }, + buttonBackgroundColor: { + type: 'string', + default: defaults.buttonBackgroundColor + }, + buttonTextColor: { + type: 'string', + default: defaults.buttonTextColor + }, + buttonBorderColor: { + type: 'string', + default: defaults.buttonBorderColor + } + }; + }, + /** + * Get Button styles JSX code. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {Object} sizeOptions Size selector options. + * @param {Object} formSelectorCommon Form selector common object. + * + * @return {Object} Button styles JSX code. + */ + getButtonStyles: function getButtonStyles(props, handlers, sizeOptions, formSelectorCommon) { + // eslint-disable-line max-lines-per-function + return /*#__PURE__*/React.createElement(PanelBody, { + className: formSelectorCommon.getPanelClass(props), + title: strings.button_styles + }, /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.size, + value: props.attributes.buttonSize, + options: sizeOptions, + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonSize', value); + } + })), /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.border, + value: props.attributes.buttonBorderStyle, + options: [{ + label: strings.none, + value: 'none' + }, { + label: strings.solid, + value: 'solid' + }, { + label: strings.dashed, + value: 'dashed' + }, { + label: strings.dotted, + value: 'dotted' + }], + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonBorderStyle', value); + } + }))), /*#__PURE__*/React.createElement(Flex, { + gap: 4, + align: "flex-start", + className: 'wpforms-gutenberg-form-selector-flex', + justify: "space-between" + }, /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(__experimentalUnitControl, { + label: strings.border_size, + value: props.attributes.buttonBorderStyle === 'none' ? '' : props.attributes.buttonBorderSize, + min: 0, + disabled: props.attributes.buttonBorderStyle === 'none', + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonBorderSize', value); + }, + isUnitSelectTabbable: true + })), /*#__PURE__*/React.createElement(FlexBlock, null, /*#__PURE__*/React.createElement(__experimentalUnitControl, { + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonBorderRadius', value); + }, + label: strings.border_radius, + min: 0, + isUnitSelectTabbable: true, + value: props.attributes.buttonBorderRadius + }))), /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-color-picker" + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-control-label" + }, strings.colors), /*#__PURE__*/React.createElement(PanelColorSettings, { + __experimentalIsRenderedInSidebar: true, + enableAlpha: true, + showTitle: false, + className: formSelectorCommon.getColorPanelClass(props.attributes.buttonBorderStyle), + colorSettings: [{ + value: props.attributes.buttonBackgroundColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonBackgroundColor', value); + }, + label: strings.background + }, { + value: props.attributes.buttonBorderColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonBorderColor', value); + }, + label: strings.border + }, { + value: props.attributes.buttonTextColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('buttonTextColor', value); + }, + label: strings.text + }] + }), /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-legend wpforms-button-color-notice" + }, strings.button_color_notice))); + } + }; + return app; +}(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwiX3JlZiIsIndwIiwiYmxvY2tFZGl0b3IiLCJlZGl0b3IiLCJQYW5lbENvbG9yU2V0dGluZ3MiLCJfd3AkY29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJTZWxlY3RDb250cm9sIiwiUGFuZWxCb2R5IiwiRmxleCIsIkZsZXhCbG9jayIsIl9fZXhwZXJpbWVudGFsVW5pdENvbnRyb2wiLCJfd3Bmb3Jtc19ndXRlbmJlcmdfZm8iLCJ3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yIiwic3RyaW5ncyIsImRlZmF1bHRzIiwiYXBwIiwiZ2V0QmxvY2tBdHRyaWJ1dGVzIiwiYnV0dG9uU2l6ZSIsInR5cGUiLCJidXR0b25Cb3JkZXJTdHlsZSIsImJ1dHRvbkJvcmRlclNpemUiLCJidXR0b25Cb3JkZXJSYWRpdXMiLCJidXR0b25CYWNrZ3JvdW5kQ29sb3IiLCJidXR0b25UZXh0Q29sb3IiLCJidXR0b25Cb3JkZXJDb2xvciIsImdldEJ1dHRvblN0eWxlcyIsInByb3BzIiwiaGFuZGxlcnMiLCJzaXplT3B0aW9ucyIsImZvcm1TZWxlY3RvckNvbW1vbiIsIlJlYWN0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImdldFBhbmVsQ2xhc3MiLCJ0aXRsZSIsImJ1dHRvbl9zdHlsZXMiLCJnYXAiLCJhbGlnbiIsImp1c3RpZnkiLCJsYWJlbCIsInNpemUiLCJ2YWx1ZSIsImF0dHJpYnV0ZXMiLCJvcHRpb25zIiwib25DaGFuZ2UiLCJzdHlsZUF0dHJDaGFuZ2UiLCJib3JkZXIiLCJub25lIiwic29saWQiLCJkYXNoZWQiLCJkb3R0ZWQiLCJib3JkZXJfc2l6ZSIsIm1pbiIsImRpc2FibGVkIiwiaXNVbml0U2VsZWN0VGFiYmFibGUiLCJib3JkZXJfcmFkaXVzIiwiY29sb3JzIiwiX19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyIiwiZW5hYmxlQWxwaGEiLCJzaG93VGl0bGUiLCJnZXRDb2xvclBhbmVsQ2xhc3MiLCJjb2xvclNldHRpbmdzIiwiYmFja2dyb3VuZCIsInRleHQiLCJidXR0b25fY29sb3Jfbm90aWNlIl0sInNvdXJjZXMiOlsiYnV0dG9uLXN0eWxlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgd3Bmb3Jtc19ndXRlbmJlcmdfZm9ybV9zZWxlY3RvciAqL1xuLyoganNoaW50IGVzMzogZmFsc2UsIGVzdmVyc2lvbjogNiAqL1xuXG4vKipcbiAqIEBwYXJhbSBzdHJpbmdzLmJvcmRlcl9yYWRpdXNcbiAqIEBwYXJhbSBzdHJpbmdzLmJvcmRlcl9zaXplXG4gKiBAcGFyYW0gc3RyaW5ncy5idXR0b25fY29sb3Jfbm90aWNlXG4gKiBAcGFyYW0gc3RyaW5ncy5idXR0b25fc3R5bGVzXG4gKiBAcGFyYW0gc3RyaW5ncy5kYXNoZWRcbiAqIEBwYXJhbSBzdHJpbmdzLnNvbGlkXG4gKi9cblxuLyoqXG4gKiBHdXRlbmJlcmcgZWRpdG9yIGJsb2NrLlxuICpcbiAqIEJ1dHRvbiBzdHlsZXMgcGFuZWwgbW9kdWxlLlxuICpcbiAqIEBzaW5jZSAxLjguOFxuICovXG5leHBvcnQgZGVmYXVsdCAoICggZnVuY3Rpb24oKSB7XG5cdC8qKlxuXHQgKiBXUCBjb3JlIGNvbXBvbmVudHMuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguOFxuXHQgKi9cblx0Y29uc3QgeyBQYW5lbENvbG9yU2V0dGluZ3MgfSA9IHdwLmJsb2NrRWRpdG9yIHx8IHdwLmVkaXRvcjtcblx0Y29uc3QgeyBTZWxlY3RDb250cm9sLCBQYW5lbEJvZHksIEZsZXgsIEZsZXhCbG9jaywgX19leHBlcmltZW50YWxVbml0Q29udHJvbCB9ID0gd3AuY29tcG9uZW50cztcblxuXHQvKipcblx0ICogTG9jYWxpemVkIGRhdGEgYWxpYXNlcy5cblx0ICpcblx0ICogQHNpbmNlIDEuOC44XG5cdCAqL1xuXHRjb25zdCB7IHN0cmluZ3MsIGRlZmF1bHRzIH0gPSB3cGZvcm1zX2d1dGVuYmVyZ19mb3JtX3NlbGVjdG9yO1xuXG5cdC8vIG5vaW5zcGVjdGlvbiBVbm5lY2Vzc2FyeUxvY2FsVmFyaWFibGVKU1xuXHQvKipcblx0ICogUHVibGljIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcy5cblx0ICpcblx0ICogQHNpbmNlIDEuOC44XG5cdCAqXG5cdCAqIEB0eXBlIHtPYmplY3R9XG5cdCAqL1xuXHRjb25zdCBhcHAgPSB7XG5cblx0XHQvKipcblx0XHQgKiBHZXQgYmxvY2sgYXR0cmlidXRlcy5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguOFxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBCbG9jayBhdHRyaWJ1dGVzLlxuXHRcdCAqL1xuXHRcdGdldEJsb2NrQXR0cmlidXRlcygpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJ1dHRvblNpemU6IHtcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBkZWZhdWx0cy5idXR0b25TaXplLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRidXR0b25Cb3JkZXJTdHlsZToge1xuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGRlZmF1bHRzLmJ1dHRvbkJvcmRlclN0eWxlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRidXR0b25Cb3JkZXJTaXplOiB7XG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZGVmYXVsdHMuYnV0dG9uQm9yZGVyU2l6ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0YnV0dG9uQm9yZGVyUmFkaXVzOiB7XG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdFx0ZGVmYXVsdDogZGVmYXVsdHMuYnV0dG9uQm9yZGVyUmFkaXVzLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRidXR0b25CYWNrZ3JvdW5kQ29sb3I6IHtcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBkZWZhdWx0cy5idXR0b25CYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJ1dHRvblRleHRDb2xvcjoge1xuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IGRlZmF1bHRzLmJ1dHRvblRleHRDb2xvcixcblx0XHRcdFx0fSxcblx0XHRcdFx0YnV0dG9uQm9yZGVyQ29sb3I6IHtcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0XHRkZWZhdWx0OiBkZWZhdWx0cy5idXR0b25Cb3JkZXJDb2xvcixcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEdldCBCdXR0b24gc3R5bGVzIEpTWCBjb2RlLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC44XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgICAgICAgICAgICAgIEJsb2NrIHByb3BlcnRpZXMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZXJzICAgICAgICAgICBCbG9jayBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc2l6ZU9wdGlvbnMgICAgICAgIFNpemUgc2VsZWN0b3Igb3B0aW9ucy5cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZm9ybVNlbGVjdG9yQ29tbW9uIEZvcm0gc2VsZWN0b3IgY29tbW9uIG9iamVjdC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gIEJ1dHRvbiBzdHlsZXMgSlNYIGNvZGUuXG5cdFx0ICovXG5cdFx0Z2V0QnV0dG9uU3R5bGVzKCBwcm9wcywgaGFuZGxlcnMsIHNpemVPcHRpb25zLCBmb3JtU2VsZWN0b3JDb21tb24gKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxpbmVzLXBlci1mdW5jdGlvblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0PFBhbmVsQm9keSBjbGFzc05hbWU9eyBmb3JtU2VsZWN0b3JDb21tb24uZ2V0UGFuZWxDbGFzcyggcHJvcHMgKSB9IHRpdGxlPXsgc3RyaW5ncy5idXR0b25fc3R5bGVzIH0+XG5cdFx0XHRcdFx0PEZsZXggZ2FwPXsgNCB9IGFsaWduPVwiZmxleC1zdGFydFwiIGNsYXNzTmFtZT17ICd3cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLWZsZXgnIH0ganVzdGlmeT1cInNwYWNlLWJldHdlZW5cIj5cblx0XHRcdFx0XHRcdDxGbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdDxTZWxlY3RDb250cm9sXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyBzdHJpbmdzLnNpemUgfVxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlPXsgcHJvcHMuYXR0cmlidXRlcy5idXR0b25TaXplIH1cblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zPXsgc2l6ZU9wdGlvbnMgfVxuXHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlPXsgKCB2YWx1ZSApID0+IGhhbmRsZXJzLnN0eWxlQXR0ckNoYW5nZSggJ2J1dHRvblNpemUnLCB2YWx1ZSApIH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdDwvRmxleEJsb2NrPlxuXHRcdFx0XHRcdFx0PEZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdFx0PFNlbGVjdENvbnRyb2xcblx0XHRcdFx0XHRcdFx0XHRsYWJlbD17IHN0cmluZ3MuYm9yZGVyIH1cblx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYnV0dG9uQm9yZGVyU3R5bGUgfVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM9e1xuXHRcdFx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLm5vbmUsIHZhbHVlOiAnbm9uZScgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy5zb2xpZCwgdmFsdWU6ICdzb2xpZCcgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsYWJlbDogc3RyaW5ncy5kYXNoZWQsIHZhbHVlOiAnZGFzaGVkJyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzdHJpbmdzLmRvdHRlZCwgdmFsdWU6ICdkb3R0ZWQnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlPXsgKCB2YWx1ZSApID0+IGhhbmRsZXJzLnN0eWxlQXR0ckNoYW5nZSggJ2J1dHRvbkJvcmRlclN0eWxlJywgdmFsdWUgKSB9XG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHQ8L0ZsZXg+XG5cdFx0XHRcdFx0PEZsZXggZ2FwPXsgNCB9IGFsaWduPVwiZmxleC1zdGFydFwiIGNsYXNzTmFtZT17ICd3cGZvcm1zLWd1dGVuYmVyZy1mb3JtLXNlbGVjdG9yLWZsZXgnIH0ganVzdGlmeT1cInNwYWNlLWJldHdlZW5cIj5cblx0XHRcdFx0XHRcdDxGbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdDxfX2V4cGVyaW1lbnRhbFVuaXRDb250cm9sXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyBzdHJpbmdzLmJvcmRlcl9zaXplIH1cblx0XHRcdFx0XHRcdFx0XHR2YWx1ZT17IHByb3BzLmF0dHJpYnV0ZXMuYnV0dG9uQm9yZGVyU3R5bGUgPT09ICdub25lJyA/ICcnIDogcHJvcHMuYXR0cmlidXRlcy5idXR0b25Cb3JkZXJTaXplIH1cblx0XHRcdFx0XHRcdFx0XHRtaW49eyAwIH1cblx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlZD17IHByb3BzLmF0dHJpYnV0ZXMuYnV0dG9uQm9yZGVyU3R5bGUgPT09ICdub25lJyB9XG5cdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U9eyAoIHZhbHVlICkgPT4gaGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYnV0dG9uQm9yZGVyU2l6ZScsIHZhbHVlICkgfVxuXHRcdFx0XHRcdFx0XHRcdGlzVW5pdFNlbGVjdFRhYmJhYmxlXG5cdFx0XHRcdFx0XHRcdC8+XG5cdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHRcdDxGbGV4QmxvY2s+XG5cdFx0XHRcdFx0XHRcdDxfX2V4cGVyaW1lbnRhbFVuaXRDb250cm9sXG5cdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U9eyAoIHZhbHVlICkgPT4gaGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYnV0dG9uQm9yZGVyUmFkaXVzJywgdmFsdWUgKSB9XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw9eyBzdHJpbmdzLmJvcmRlcl9yYWRpdXMgfVxuXHRcdFx0XHRcdFx0XHRcdG1pbj17IDAgfVxuXHRcdFx0XHRcdFx0XHRcdGlzVW5pdFNlbGVjdFRhYmJhYmxlXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU9eyBwcm9wcy5hdHRyaWJ1dGVzLmJ1dHRvbkJvcmRlclJhZGl1cyB9IC8+XG5cdFx0XHRcdFx0XHQ8L0ZsZXhCbG9jaz5cblx0XHRcdFx0XHQ8L0ZsZXg+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItY29sb3ItcGlja2VyXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cIndwZm9ybXMtZ3V0ZW5iZXJnLWZvcm0tc2VsZWN0b3ItY29udHJvbC1sYWJlbFwiPnsgc3RyaW5ncy5jb2xvcnMgfTwvZGl2PlxuXHRcdFx0XHRcdFx0PFBhbmVsQ29sb3JTZXR0aW5nc1xuXHRcdFx0XHRcdFx0XHRfX2V4cGVyaW1lbnRhbElzUmVuZGVyZWRJblNpZGViYXJcblx0XHRcdFx0XHRcdFx0ZW5hYmxlQWxwaGFcblx0XHRcdFx0XHRcdFx0c2hvd1RpdGxlPXsgZmFsc2UgfVxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9eyBmb3JtU2VsZWN0b3JDb21tb24uZ2V0Q29sb3JQYW5lbENsYXNzKCBwcm9wcy5hdHRyaWJ1dGVzLmJ1dHRvbkJvcmRlclN0eWxlICkgfVxuXHRcdFx0XHRcdFx0XHRjb2xvclNldHRpbmdzPXsgW1xuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wcy5hdHRyaWJ1dGVzLmJ1dHRvbkJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlOiAoIHZhbHVlICkgPT4gaGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYnV0dG9uQmFja2dyb3VuZENvbG9yJywgdmFsdWUgKSxcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBzdHJpbmdzLmJhY2tncm91bmQsXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogcHJvcHMuYXR0cmlidXRlcy5idXR0b25Cb3JkZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlOiAoIHZhbHVlICkgPT4gaGFuZGxlcnMuc3R5bGVBdHRyQ2hhbmdlKCAnYnV0dG9uQm9yZGVyQ29sb3InLCB2YWx1ZSApLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHN0cmluZ3MuYm9yZGVyLFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHByb3BzLmF0dHJpYnV0ZXMuYnV0dG9uVGV4dENvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6ICggdmFsdWUgKSA9PiBoYW5kbGVycy5zdHlsZUF0dHJDaGFuZ2UoICdidXR0b25UZXh0Q29sb3InLCB2YWx1ZSApLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHN0cmluZ3MudGV4dCxcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRdIH0gLz5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwid3Bmb3Jtcy1ndXRlbmJlcmctZm9ybS1zZWxlY3Rvci1sZWdlbmQgd3Bmb3Jtcy1idXR0b24tY29sb3Itbm90aWNlXCI+XG5cdFx0XHRcdFx0XHRcdHsgc3RyaW5ncy5idXR0b25fY29sb3Jfbm90aWNlIH1cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L1BhbmVsQm9keT5cblx0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 +},{}],17:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } +function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } +function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } +function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +/* global jconfirm, wpforms_gutenberg_form_selector, Choices, JSX, DOM, WPFormsUtils */ +/* jshint es3: false, esversion: 6 */ +/** + * @param strings.copy_paste_error + * @param strings.error_message + * @param strings.form_edit + * @param strings.form_entries + * @param strings.form_keywords + * @param strings.form_select + * @param strings.form_selected + * @param strings.form_settings + * @param strings.label_styles + * @param strings.other_styles + * @param strings.page_break + * @param strings.panel_notice_head + * @param strings.panel_notice_link + * @param strings.panel_notice_link_text + * @param strings.panel_notice_text + * @param strings.show_description + * @param strings.show_title + * @param strings.sublabel_hints + * @param strings.form_not_available_message + * @param urls.entries_url + * @param urls.form_url + * @param window.wpforms_choicesjs_config + * @param wpforms_education.upgrade_bonus + * @param wpforms_gutenberg_form_selector.block_empty_url + * @param wpforms_gutenberg_form_selector.block_preview_url + * @param wpforms_gutenberg_form_selector.get_started_url + * @param wpforms_gutenberg_form_selector.is_full_styling + * @param wpforms_gutenberg_form_selector.is_modern_markup + * @param wpforms_gutenberg_form_selector.logo_url + * @param wpforms_gutenberg_form_selector.wpforms_guide + */ +/** + * Gutenberg editor block. + * + * Common module. + * + * @since 1.8.8 + */ +var _default = exports.default = function (document, window, $) { + /** + * WP core components. + * + * @since 1.8.8 + */ + var _wp = wp, + _wp$serverSideRender = _wp.serverSideRender, + ServerSideRender = _wp$serverSideRender === void 0 ? wp.components.ServerSideRender : _wp$serverSideRender; + var _wp$element = wp.element, + createElement = _wp$element.createElement, + Fragment = _wp$element.Fragment, + createInterpolateElement = _wp$element.createInterpolateElement; + var registerBlockType = wp.blocks.registerBlockType; + var _ref = wp.blockEditor || wp.editor, + InspectorControls = _ref.InspectorControls, + PanelColorSettings = _ref.PanelColorSettings, + useBlockProps = _ref.useBlockProps; + var _wp$components = wp.components, + SelectControl = _wp$components.SelectControl, + ToggleControl = _wp$components.ToggleControl, + PanelBody = _wp$components.PanelBody, + Placeholder = _wp$components.Placeholder; + var __ = wp.i18n.__; + var _wp$element2 = wp.element, + useState = _wp$element2.useState, + useEffect = _wp$element2.useEffect; + + /** + * Localized data aliases. + * + * @since 1.8.8 + */ + var _wpforms_gutenberg_fo = wpforms_gutenberg_form_selector, + strings = _wpforms_gutenberg_fo.strings, + defaults = _wpforms_gutenberg_fo.defaults, + sizes = _wpforms_gutenberg_fo.sizes, + urls = _wpforms_gutenberg_fo.urls, + isPro = _wpforms_gutenberg_fo.isPro, + isLicenseActive = _wpforms_gutenberg_fo.isLicenseActive, + isAdmin = _wpforms_gutenberg_fo.isAdmin; + var defaultStyleSettings = defaults; + + // noinspection JSUnusedLocalSymbols + /** + * WPForms Education script. + * + * @since 1.8.8 + */ + var WPFormsEducation = window.WPFormsEducation || {}; // eslint-disable-line no-unused-vars + + /** + * List of forms. + * + * The default value is localized in FormSelector.php. + * + * @since 1.8.4 + * + * @type {Object} + */ + var formList = wpforms_gutenberg_form_selector.forms; + + /** + * Blocks runtime data. + * + * @since 1.8.1 + * + * @type {Object} + */ + var blocks = {}; + + /** + * Whether it is needed to trigger server rendering. + * + * @since 1.8.1 + * + * @type {boolean} + */ + var triggerServerRender = true; + + /** + * Popup container. + * + * @since 1.8.3 + * + * @type {Object} + */ + var $popup = {}; + + /** + * Track fetch status. + * + * @since 1.8.4 + * + * @type {boolean} + */ + var isFetching = false; + + /** + * Elements holder. + * + * @since 1.8.8 + * + * @type {Object} + */ + var el = {}; + + /** + * Common block attributes. + * + * @since 1.8.8 + * + * @type {Object} + */ + var commonAttributes = { + clientId: { + type: 'string', + default: '' + }, + formId: { + type: 'string', + default: defaultStyleSettings.formId + }, + displayTitle: { + type: 'boolean', + default: defaultStyleSettings.displayTitle + }, + displayDesc: { + type: 'boolean', + default: defaultStyleSettings.displayDesc + }, + preview: { + type: 'boolean' + }, + theme: { + type: 'string', + default: defaultStyleSettings.theme + }, + themeName: { + type: 'string', + default: defaultStyleSettings.themeName + }, + labelSize: { + type: 'string', + default: defaultStyleSettings.labelSize + }, + labelColor: { + type: 'string', + default: defaultStyleSettings.labelColor + }, + labelSublabelColor: { + type: 'string', + default: defaultStyleSettings.labelSublabelColor + }, + labelErrorColor: { + type: 'string', + default: defaultStyleSettings.labelErrorColor + }, + pageBreakColor: { + type: 'string', + default: defaultStyleSettings.pageBreakColor + }, + customCss: { + type: 'string', + default: defaultStyleSettings.customCss + }, + copyPasteJsonValue: { + type: 'string', + default: defaultStyleSettings.copyPasteJsonValue + } + }; + + /** + * Handlers for custom styles settings, defined outside this module. + * + * @since 1.8.8 + * + * @type {Object} + */ + var customStylesHandlers = {}; + + /** + * Dropdown timeout. + * + * @since 1.8.8 + * + * @type {number} + */ + var dropdownTimeout; + + /** + * Whether copy-paste content was generated on edit. + * + * @since 1.9.1 + * + * @type {boolean} + */ + var isCopyPasteGeneratedOnEdit = false; + + /** + * Whether the background is selected. + * + * @since 1.9.3 + * + * @type {boolean} + */ + var backgroundSelected = false; + + /** + * Public functions and properties. + * + * @since 1.8.1 + * + * @type {Object} + */ + var app = { + /** + * Panel modules. + * + * @since 1.8.8 + * + * @type {Object} + */ + panels: {}, + /** + * Start the engine. + * + * @since 1.8.1 + * + * @param {Object} blockOptions Block options. + */ + init: function init(blockOptions) { + el.$window = $(window); + app.panels = blockOptions.panels; + app.education = blockOptions.education; + app.initDefaults(blockOptions); + app.registerBlock(blockOptions); + app.initJConfirm(); + $(app.ready); + }, + /** + * Document ready. + * + * @since 1.8.1 + */ + ready: function ready() { + app.events(); + }, + /** + * Events. + * + * @since 1.8.1 + */ + events: function events() { + el.$window.on('wpformsFormSelectorEdit', _.debounce(app.blockEdit, 250)).on('wpformsFormSelectorFormLoaded', app.formLoaded); + }, + /** + * Init jConfirm. + * + * @since 1.8.8 + */ + initJConfirm: function initJConfirm() { + // jquery-confirm defaults. + jconfirm.defaults = { + closeIcon: false, + backgroundDismiss: false, + escapeKey: true, + animationBounce: 1, + useBootstrap: false, + theme: 'modern', + boxWidth: '400px', + animateFromElement: false + }; + }, + /** + * Get a fresh list of forms via REST-API. + * + * @since 1.8.4 + * + * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-api-fetch/ + */ + getForms: function getForms() { + return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { + var _t; + return _regenerator().w(function (_context) { + while (1) switch (_context.p = _context.n) { + case 0: + if (!isFetching) { + _context.n = 1; + break; + } + return _context.a(2); + case 1: + // Set the flag to true indicating a fetch is in progress. + isFetching = true; + _context.p = 2; + _context.n = 3; + return wp.apiFetch({ + path: wpforms_gutenberg_form_selector.route_namespace + 'forms/', + method: 'GET', + cache: 'no-cache' + }); + case 3: + formList = _context.v; + _context.n = 5; + break; + case 4: + _context.p = 4; + _t = _context.v; + // eslint-disable-next-line no-console + console.error(_t); + case 5: + _context.p = 5; + isFetching = false; + return _context.f(5); + case 6: + return _context.a(2); + } + }, _callee, null, [[2, 4, 5, 6]]); + }))(); + }, + /** + * Open builder popup. + * + * @since 1.6.2 + * + * @param {string} clientID Block Client ID. + */ + openBuilderPopup: function openBuilderPopup(clientID) { + if ($.isEmptyObject($popup)) { + var _parent = $('#wpwrap'); + var canvasIframe = $('iframe[name="editor-canvas"]'); + var isFseMode = Boolean(canvasIframe.length); + var tmpl = isFseMode ? canvasIframe.contents().find('#wpforms-gutenberg-popup') : $('#wpforms-gutenberg-popup'); + _parent.after(tmpl); + $popup = _parent.siblings('#wpforms-gutenberg-popup'); + } + var url = wpforms_gutenberg_form_selector.get_started_url, + $iframe = $popup.find('iframe'); + app.builderCloseButtonEvent(clientID); + $iframe.attr('src', url); + $popup.fadeIn(); + }, + /** + * Close button (inside the form builder) click event. + * + * @since 1.8.3 + * + * @param {string} clientID Block Client ID. + */ + builderCloseButtonEvent: function builderCloseButtonEvent(clientID) { + $popup.off('wpformsBuilderInPopupClose').on('wpformsBuilderInPopupClose', function (e, action, formId, formTitle) { + if (action !== 'saved' || !formId) { + return; + } + + // Insert a new block when a new form is created from the popup to update the form list and attributes. + var newBlock = wp.blocks.createBlock('wpforms/form-selector', { + formId: formId.toString() // Expects string value, make sure we insert string. + }); + + // eslint-disable-next-line camelcase + formList = [{ + ID: formId, + post_title: formTitle + }]; + + // Insert a new block. + wp.data.dispatch('core/block-editor').removeBlock(clientID); + wp.data.dispatch('core/block-editor').insertBlocks(newBlock); + }); + }, + /** + * Register block. + * + * @since 1.8.1 + * + * @param {Object} blockOptions Additional block options. + */ + // eslint-disable-next-line max-lines-per-function + registerBlock: function registerBlock(blockOptions) { + registerBlockType('wpforms/form-selector', { + title: strings.title, + description: strings.description, + icon: app.getIcon(), + keywords: strings.form_keywords, + category: 'widgets', + attributes: app.getBlockAttributes(), + supports: { + customClassName: app.hasForms() + }, + example: { + attributes: { + preview: true + } + }, + // eslint-disable-next-line max-lines-per-function,complexity + edit: function edit(props) { + var attributes = props.attributes; + var formOptions = app.getFormOptions(); + var handlers = app.getSettingsFieldsHandlers(props); + var _useState = useState(isPro && isLicenseActive), + _useState2 = _slicedToArray(_useState, 1), + isNotDisabled = _useState2[0]; // eslint-disable-line react-hooks/rules-of-hooks + var _useState3 = useState(isPro), + _useState4 = _slicedToArray(_useState3, 1), + isProEnabled = _useState4[0]; // eslint-disable-line react-hooks/rules-of-hooks, no-unused-vars + var _useState5 = useState(blockOptions.panels.background._showBackgroundPreview(props)), + _useState6 = _slicedToArray(_useState5, 2), + showBackgroundPreview = _useState6[0], + setShowBackgroundPreview = _useState6[1]; // eslint-disable-line react-hooks/rules-of-hooks + var _useState7 = useState(''), + _useState8 = _slicedToArray(_useState7, 2), + lastBgImage = _useState8[0], + setLastBgImage = _useState8[1]; // eslint-disable-line react-hooks/rules-of-hooks + + var uiState = { + isNotDisabled: isNotDisabled, + isProEnabled: isProEnabled, + showBackgroundPreview: showBackgroundPreview, + setShowBackgroundPreview: setShowBackgroundPreview, + lastBgImage: lastBgImage, + setLastBgImage: setLastBgImage + }; + useEffect(function () { + // eslint-disable-line react-hooks/rules-of-hooks + if (attributes.formId) { + setShowBackgroundPreview(props.attributes.backgroundImage !== 'none' && props.attributes.backgroundUrl && props.attributes.backgroundUrl !== 'url()'); + } + }, [backgroundSelected, props.attributes.backgroundImage, props.attributes.backgroundUrl]); // eslint-disable-line react-hooks/exhaustive-deps + + // Get block properties. + var blockProps = useBlockProps(); // eslint-disable-line react-hooks/rules-of-hooks, no-unused-vars + + // Store block clientId in attributes. + if (!attributes.clientId || !app.isClientIdAttrUnique(props)) { + // We just want the client ID to update once. + // The block editor doesn't have a fixed block ID, so we need to get it on the initial load, but only once. + props.setAttributes({ + clientId: props.clientId + }); + } + + // Main block settings. + var jsx = [app.jsxParts.getMainSettings(attributes, handlers, formOptions)]; + + // Block preview picture. + if (!app.hasForms()) { + jsx.push(app.jsxParts.getEmptyFormsPreview(props)); + return /*#__PURE__*/React.createElement("div", blockProps, jsx); + } + var sizeOptions = app.getSizeOptions(); + + // Show placeholder when form is not available (trashed, deleted etc.). + if (attributes && attributes.formId && app.isFormAvailable(attributes.formId) === false) { + // Block placeholder (form selector). + jsx.push(app.jsxParts.getBlockPlaceholder(props.attributes, handlers, formOptions)); + return /*#__PURE__*/React.createElement("div", blockProps, jsx); + } + + // Form style settings & block content. + if (attributes.formId) { + // Subscribe to block events. + app.maybeSubscribeToBlockEvents(props, handlers, blockOptions); + jsx.push(app.jsxParts.getStyleSettings(props, handlers, sizeOptions, blockOptions, uiState), app.jsxParts.getBlockFormContent(props)); + if (!isCopyPasteGeneratedOnEdit) { + handlers.updateCopyPasteContent(); + isCopyPasteGeneratedOnEdit = true; + } + el.$window.trigger('wpformsFormSelectorEdit', [props]); + return /*#__PURE__*/React.createElement("div", blockProps, jsx); + } + + // Block preview picture. + if (attributes.preview) { + jsx.push(app.jsxParts.getBlockPreview()); + return /*#__PURE__*/React.createElement("div", blockProps, jsx); + } + + // Block placeholder (form selector). + jsx.push(app.jsxParts.getBlockPlaceholder(props.attributes, handlers, formOptions)); + return /*#__PURE__*/React.createElement("div", blockProps, jsx); + }, + save: function save() { + return null; + } + }); + }, + /** + * Init default style settings. + * + * @since 1.8.1 + * @since 1.8.8 Added blockOptions parameter. + * + * @param {Object} blockOptions Additional block options. + */ + initDefaults: function initDefaults() { + var blockOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + commonAttributes = _objectSpread(_objectSpread({}, commonAttributes), blockOptions.getCommonAttributes()); + customStylesHandlers = blockOptions.setStylesHandlers; + ['formId', 'copyPasteJsonValue'].forEach(function (key) { + return delete defaultStyleSettings[key]; + }); + }, + /** + * Check if the site has forms. + * + * @since 1.8.3 + * + * @return {boolean} Whether site has at least one form. + */ + hasForms: function hasForms() { + return formList.length > 0; + }, + /** + * Check if form is available to be previewed. + * + * @since 1.8.9 + * + * @param {number} formId Form ID. + * + * @return {boolean} Whether form is available. + */ + isFormAvailable: function isFormAvailable(formId) { + return formList.find(function (_ref2) { + var ID = _ref2.ID; + return ID === Number(formId); + }) !== undefined; + }, + /** + * Set triggerServerRender flag. + * + * @since 1.8.8 + * + * @param {boolean} $flag The value of the triggerServerRender flag. + */ + setTriggerServerRender: function setTriggerServerRender($flag) { + triggerServerRender = Boolean($flag); + }, + /** + * Maybe subscribe to block events. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties. + * @param {Object} subscriberHandlers Subscriber block event handlers. + * @param {Object} subscriberBlockOptions Subscriber block options. + */ + maybeSubscribeToBlockEvents: function maybeSubscribeToBlockEvents(subscriberProps, subscriberHandlers, subscriberBlockOptions) { + var id = subscriberProps.clientId; + + // Unsubscribe from block events. + // This is needed to avoid multiple subscriptions when the block is re-rendered. + el.$window.off('wpformsFormSelectorDeleteTheme.' + id).off('wpformsFormSelectorUpdateTheme.' + id).off('wpformsFormSelectorSetTheme.' + id); + + // Subscribe to block events. + el.$window.on('wpformsFormSelectorDeleteTheme.' + id, app.subscriberDeleteTheme(subscriberProps, subscriberBlockOptions)).on('wpformsFormSelectorUpdateTheme.' + id, app.subscriberUpdateTheme(subscriberProps, subscriberBlockOptions)).on('wpformsFormSelectorSetTheme.' + id, app.subscriberSetTheme(subscriberProps, subscriberBlockOptions)); + }, + /** + * Block event `wpformsFormSelectorDeleteTheme` handler. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties + * @param {Object} subscriberBlockOptions Subscriber block options. + * + * @return {Function} Event handler. + */ + subscriberDeleteTheme: function subscriberDeleteTheme(subscriberProps, subscriberBlockOptions) { + return function (e, themeSlug, triggerProps) { + var _subscriberProps$attr, _subscriberBlockOptio; + if (subscriberProps.clientId === triggerProps.clientId) { + return; + } + if ((subscriberProps === null || subscriberProps === void 0 || (_subscriberProps$attr = subscriberProps.attributes) === null || _subscriberProps$attr === void 0 ? void 0 : _subscriberProps$attr.theme) !== themeSlug) { + return; + } + if (!(subscriberBlockOptions !== null && subscriberBlockOptions !== void 0 && (_subscriberBlockOptio = subscriberBlockOptions.panels) !== null && _subscriberBlockOptio !== void 0 && _subscriberBlockOptio.themes)) { + return; + } + + // Reset theme to default one. + subscriberBlockOptions.panels.themes.setBlockTheme(subscriberProps, 'default'); + }; + }, + /** + * Block event `wpformsFormSelectorDeleteTheme` handler. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties + * @param {Object} subscriberBlockOptions Subscriber block options. + * + * @return {Function} Event handler. + */ + subscriberUpdateTheme: function subscriberUpdateTheme(subscriberProps, subscriberBlockOptions) { + return function (e, themeSlug, themeData, triggerProps) { + var _subscriberProps$attr2, _subscriberBlockOptio2; + if (subscriberProps.clientId === triggerProps.clientId) { + return; + } + if ((subscriberProps === null || subscriberProps === void 0 || (_subscriberProps$attr2 = subscriberProps.attributes) === null || _subscriberProps$attr2 === void 0 ? void 0 : _subscriberProps$attr2.theme) !== themeSlug) { + return; + } + if (!(subscriberBlockOptions !== null && subscriberBlockOptions !== void 0 && (_subscriberBlockOptio2 = subscriberBlockOptions.panels) !== null && _subscriberBlockOptio2 !== void 0 && _subscriberBlockOptio2.themes)) { + return; + } + + // Reset theme to default one. + subscriberBlockOptions.panels.themes.setBlockTheme(subscriberProps, themeSlug); + }; + }, + /** + * Block event `wpformsFormSelectorSetTheme` handler. + * + * @since 1.8.8 + * + * @param {Object} subscriberProps Subscriber block properties + * @param {Object} subscriberBlockOptions Subscriber block options. + * + * @return {Function} Event handler. + */ + subscriberSetTheme: function subscriberSetTheme(subscriberProps, subscriberBlockOptions) { + // noinspection JSUnusedLocalSymbols + return function (e, block, themeSlug, triggerProps) { + var _subscriberBlockOptio3; + // eslint-disable-line no-unused-vars + if (subscriberProps.clientId === triggerProps.clientId) { + return; + } + if (!(subscriberBlockOptions !== null && subscriberBlockOptions !== void 0 && (_subscriberBlockOptio3 = subscriberBlockOptions.panels) !== null && _subscriberBlockOptio3 !== void 0 && _subscriberBlockOptio3.themes)) { + return; + } + + // Set theme. + app.onSetTheme(subscriberProps); + }; + }, + /** + * Block JSX parts. + * + * @since 1.8.1 + * + * @type {Object} + */ + jsxParts: { + /** + * Get main settings JSX code. + * + * @since 1.8.1 + * + * @param {Object} attributes Block attributes. + * @param {Object} handlers Block event handlers. + * @param {Object} formOptions Form selector options. + * + * @return {JSX.Element} Main setting JSX code. + */ + getMainSettings: function getMainSettings(attributes, handlers, formOptions) { + // eslint-disable-line max-lines-per-function + if (!app.hasForms()) { + return app.jsxParts.printEmptyFormsNotice(attributes.clientId); + } + return /*#__PURE__*/React.createElement(InspectorControls, { + key: "wpforms-gutenberg-form-selector-inspector-main-settings" + }, /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel wpforms-gutenberg-panel-form-settings", + title: strings.form_settings + }, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.form_selected, + value: attributes.formId, + options: formOptions, + onChange: function onChange(value) { + return handlers.attrChange('formId', value); + } + }), attributes.formId ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("p", { + className: "wpforms-gutenberg-form-selector-actions" + }, /*#__PURE__*/React.createElement("a", { + href: urls.form_url.replace('{ID}', attributes.formId), + rel: "noreferrer", + target: "_blank" + }, strings.form_edit), isPro && isLicenseActive && /*#__PURE__*/React.createElement(React.Fragment, null, "\xA0\xA0|\xA0\xA0", /*#__PURE__*/React.createElement("a", { + href: urls.entries_url.replace('{ID}', attributes.formId), + rel: "noreferrer", + target: "_blank" + }, strings.form_entries))), /*#__PURE__*/React.createElement(ToggleControl, { + label: strings.show_title, + checked: attributes.displayTitle, + onChange: function onChange(value) { + return handlers.attrChange('displayTitle', value); + } + }), /*#__PURE__*/React.createElement(ToggleControl, { + label: strings.show_description, + checked: attributes.displayDesc, + onChange: function onChange(value) { + return handlers.attrChange('displayDesc', value); + } + })) : null, /*#__PURE__*/React.createElement("p", { + className: "wpforms-gutenberg-panel-notice" + }, /*#__PURE__*/React.createElement("strong", null, strings.panel_notice_head), strings.panel_notice_text, /*#__PURE__*/React.createElement("a", { + href: strings.panel_notice_link, + rel: "noreferrer", + target: "_blank" + }, strings.panel_notice_link_text)))); + }, + /** + * Print empty forms notice. + * + * @since 1.8.3 + * + * @param {string} clientId Block client ID. + * + * @return {JSX.Element} Field styles JSX code. + */ + printEmptyFormsNotice: function printEmptyFormsNotice(clientId) { + return /*#__PURE__*/React.createElement(InspectorControls, { + key: "wpforms-gutenberg-form-selector-inspector-main-settings" + }, /*#__PURE__*/React.createElement(PanelBody, { + className: "wpforms-gutenberg-panel", + title: strings.form_settings + }, /*#__PURE__*/React.createElement("p", { + className: "wpforms-gutenberg-panel-notice wpforms-warning wpforms-empty-form-notice", + style: { + display: 'block' + } + }, /*#__PURE__*/React.createElement("strong", null, __('You haven’t created a form, yet!', 'wpforms-lite')), __('What are you waiting for?', 'wpforms-lite')), /*#__PURE__*/React.createElement("button", { + type: "button", + className: "get-started-button components-button is-secondary", + onClick: function onClick() { + app.openBuilderPopup(clientId); + } + }, __('Get Started', 'wpforms-lite')))); + }, + /** + * Get Label styles JSX code. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {Object} sizeOptions Size selector options. + * + * @return {Object} Label styles JSX code. + */ + getLabelStyles: function getLabelStyles(props, handlers, sizeOptions) { + return /*#__PURE__*/React.createElement(PanelBody, { + className: app.getPanelClass(props), + title: strings.label_styles + }, /*#__PURE__*/React.createElement(SelectControl, { + label: strings.size, + value: props.attributes.labelSize, + className: "wpforms-gutenberg-form-selector-fix-bottom-margin", + options: sizeOptions, + onChange: function onChange(value) { + return handlers.styleAttrChange('labelSize', value); + } + }), /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-color-picker" + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-control-label" + }, strings.colors), /*#__PURE__*/React.createElement(PanelColorSettings, { + __experimentalIsRenderedInSidebar: true, + enableAlpha: true, + showTitle: false, + className: "wpforms-gutenberg-form-selector-color-panel", + colorSettings: [{ + value: props.attributes.labelColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('labelColor', value); + }, + label: strings.label + }, { + value: props.attributes.labelSublabelColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('labelSublabelColor', value); + }, + label: strings.sublabel_hints.replace('&', '&') + }, { + value: props.attributes.labelErrorColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('labelErrorColor', value); + }, + label: strings.error_message + }] + }))); + }, + /** + * Get Page Indicator styles JSX code. + * + * @since 1.8.7 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * + * @return {Object} Page Indicator styles JSX code. + */ + getPageIndicatorStyles: function getPageIndicatorStyles(props, handlers) { + // eslint-disable-line complexity + var hasPageBreak = app.hasPageBreak(formList, props.attributes.formId); + var hasRating = app.hasRating(formList, props.attributes.formId); + if (!hasPageBreak && !hasRating) { + return null; + } + var label = ''; + if (hasPageBreak && hasRating) { + label = "".concat(strings.page_break, " / ").concat(strings.rating); + } else if (hasPageBreak) { + label = strings.page_break; + } else if (hasRating) { + label = strings.rating; + } + return /*#__PURE__*/React.createElement(PanelBody, { + className: app.getPanelClass(props), + title: strings.other_styles + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-color-picker" + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-gutenberg-form-selector-control-label" + }, strings.colors), /*#__PURE__*/React.createElement(PanelColorSettings, { + __experimentalIsRenderedInSidebar: true, + enableAlpha: true, + showTitle: false, + className: "wpforms-gutenberg-form-selector-color-panel", + colorSettings: [{ + value: props.attributes.pageBreakColor, + onChange: function onChange(value) { + return handlers.styleAttrChange('pageBreakColor', value); + }, + label: label + }] + }))); + }, + /** + * Get style settings JSX code. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * @param {Object} handlers Block event handlers. + * @param {Object} sizeOptions Size selector options. + * @param {Object} blockOptions Block options loaded from external modules. + * @param {Object} uiState UI state. + * + * @return {Object} Inspector controls JSX code. + */ + getStyleSettings: function getStyleSettings(props, handlers, sizeOptions, blockOptions, uiState) { + return /*#__PURE__*/React.createElement(InspectorControls, { + key: "wpforms-gutenberg-form-selector-style-settings" + }, blockOptions.getThemesPanel(props, app, blockOptions.stockPhotos), blockOptions.getFieldStyles(props, handlers, sizeOptions, app), app.jsxParts.getLabelStyles(props, handlers, sizeOptions), blockOptions.getButtonStyles(props, handlers, sizeOptions, app), blockOptions.getContainerStyles(props, handlers, app, uiState), blockOptions.getBackgroundStyles(props, handlers, app, blockOptions.stockPhotos, uiState), app.jsxParts.getPageIndicatorStyles(props, handlers)); + }, + /** + * Get block content JSX code. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * + * @return {JSX.Element} Block content JSX code. + */ + getBlockFormContent: function getBlockFormContent(props) { + if (triggerServerRender) { + return /*#__PURE__*/React.createElement(ServerSideRender, { + key: "wpforms-gutenberg-form-selector-server-side-renderer", + block: "wpforms/form-selector", + attributes: props.attributes + }); + } + var clientId = props.clientId; + var block = app.getBlockContainer(props); + + // In the case of empty content, use server side renderer. + // This happens when the block is duplicated or converted to a reusable block. + if (!(block !== null && block !== void 0 && block.innerHTML)) { + triggerServerRender = true; + return app.jsxParts.getBlockFormContent(props); + } + blocks[clientId] = blocks[clientId] || {}; + blocks[clientId].blockHTML = block.innerHTML; + blocks[clientId].loadedFormId = props.attributes.formId; + return /*#__PURE__*/React.createElement(Fragment, { + key: "wpforms-gutenberg-form-selector-fragment-form-html" + }, /*#__PURE__*/React.createElement("div", { + dangerouslySetInnerHTML: { + __html: blocks[clientId].blockHTML + } + })); + }, + /** + * Get block preview JSX code. + * + * @since 1.8.1 + * + * @return {JSX.Element} Block preview JSX code. + */ + getBlockPreview: function getBlockPreview() { + return /*#__PURE__*/React.createElement(Fragment, { + key: "wpforms-gutenberg-form-selector-fragment-block-preview" + }, /*#__PURE__*/React.createElement("img", { + src: wpforms_gutenberg_form_selector.block_preview_url, + style: { + width: '100%' + }, + alt: "" + })); + }, + /** + * Get block empty JSX code. + * + * @since 1.8.3 + * + * @param {Object} props Block properties. + * @return {JSX.Element} Block empty JSX code. + */ + getEmptyFormsPreview: function getEmptyFormsPreview(props) { + var clientId = props.clientId; + return /*#__PURE__*/React.createElement(Fragment, { + key: "wpforms-gutenberg-form-selector-fragment-block-empty" + }, /*#__PURE__*/React.createElement("div", { + className: "wpforms-no-form-preview" + }, /*#__PURE__*/React.createElement("img", { + src: wpforms_gutenberg_form_selector.block_empty_url, + alt: "" + }), /*#__PURE__*/React.createElement("p", null, createInterpolateElement(__('You can use WPForms to build contact forms, surveys, payment forms, and more with just a few clicks.', 'wpforms-lite'), { + b: /*#__PURE__*/React.createElement("strong", null) + })), /*#__PURE__*/React.createElement("button", { + type: "button", + className: "get-started-button components-button is-primary", + onClick: function onClick() { + app.openBuilderPopup(clientId); + } + }, __('Get Started', 'wpforms-lite')), /*#__PURE__*/React.createElement("p", { + className: "empty-desc" + }, createInterpolateElement(__('Need some help? Check out our comprehensive guide.', 'wpforms-lite'), { + // eslint-disable-next-line jsx-a11y/anchor-has-content + a: /*#__PURE__*/React.createElement("a", { + href: wpforms_gutenberg_form_selector.wpforms_guide, + target: "_blank", + rel: "noopener noreferrer" + }) + })), /*#__PURE__*/React.createElement("div", { + id: "wpforms-gutenberg-popup", + className: "wpforms-builder-popup" + }, /*#__PURE__*/React.createElement("iframe", { + src: "about:blank", + width: "100%", + height: "100%", + id: "wpforms-builder-iframe", + title: "WPForms Builder Popup" + })))); + }, + /** + * Get block placeholder (form selector) JSX code. + * + * @since 1.8.1 + * + * @param {Object} attributes Block attributes. + * @param {Object} handlers Block event handlers. + * @param {Object} formOptions Form selector options. + * + * @return {JSX.Element} Block placeholder JSX code. + */ + getBlockPlaceholder: function getBlockPlaceholder(attributes, handlers, formOptions) { + var isFormNotAvailable = attributes.formId && !app.isFormAvailable(attributes.formId); + return /*#__PURE__*/React.createElement(Placeholder, { + key: "wpforms-gutenberg-form-selector-wrap", + className: "wpforms-gutenberg-form-selector-wrap" + }, /*#__PURE__*/React.createElement("img", { + src: wpforms_gutenberg_form_selector.logo_url, + alt: "" + }), isFormNotAvailable && /*#__PURE__*/React.createElement("p", { + style: { + textAlign: 'center', + marginTop: '0' + } + }, strings.form_not_available_message), /*#__PURE__*/React.createElement(SelectControl, { + key: "wpforms-gutenberg-form-selector-select-control", + value: attributes.formId, + options: formOptions, + onChange: function onChange(value) { + return handlers.attrChange('formId', value); + } + })); + } + }, + /** + * Determine if the form has a Page Break field. + * + * @since 1.8.7 + * + * @param {Object} forms The forms' data object. + * @param {number|string} formId Form ID. + * + * @return {boolean} True when the form has a Page Break field, false otherwise. + */ + hasPageBreak: function hasPageBreak(forms, formId) { + var _JSON$parse; + var currentForm = forms.find(function (form) { + return parseInt(form.ID, 10) === parseInt(formId, 10); + }); + if (!currentForm.post_content) { + return false; + } + var fields = (_JSON$parse = JSON.parse(currentForm.post_content)) === null || _JSON$parse === void 0 ? void 0 : _JSON$parse.fields; + return Object.values(fields).some(function (field) { + return field.type === 'pagebreak'; + }); + }, + hasRating: function hasRating(forms, formId) { + var _JSON$parse2; + var currentForm = forms.find(function (form) { + return parseInt(form.ID, 10) === parseInt(formId, 10); + }); + if (!currentForm.post_content || !isPro || !isLicenseActive) { + return false; + } + var fields = (_JSON$parse2 = JSON.parse(currentForm.post_content)) === null || _JSON$parse2 === void 0 ? void 0 : _JSON$parse2.fields; + return Object.values(fields).some(function (field) { + return field.type === 'rating'; + }); + }, + /** + * Get Style Settings panel class. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * @param {string} panel Panel name. + * + * @return {string} Style Settings panel class. + */ + getPanelClass: function getPanelClass(props) { + var panel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var cssClass = 'wpforms-gutenberg-panel wpforms-block-settings-' + props.clientId; + if (!app.isFullStylingEnabled()) { + cssClass += ' disabled_panel'; + } + + // Restrict styling panel for non-admins. + if (!(isAdmin || panel === 'themes')) { + cssClass += ' wpforms-gutenberg-panel-restricted'; + } + return cssClass; + }, + /** + * Get color panel settings CSS class. + * + * @since 1.8.8 + * + * @param {string} borderStyle Border style value. + * + * @return {string} Style Settings panel class. + */ + getColorPanelClass: function getColorPanelClass(borderStyle) { + var cssClass = 'wpforms-gutenberg-form-selector-color-panel'; + if (borderStyle === 'none') { + cssClass += ' wpforms-gutenberg-form-selector-border-color-disabled'; + } + return cssClass; + }, + /** + * Determine whether the full styling is enabled. + * + * @since 1.8.1 + * + * @return {boolean} Whether the full styling is enabled. + */ + isFullStylingEnabled: function isFullStylingEnabled() { + return wpforms_gutenberg_form_selector.is_modern_markup && wpforms_gutenberg_form_selector.is_full_styling; + }, + /** + * Determine whether the block has lead forms enabled. + * + * @since 1.9.0 + * + * @param {Object} block Gutenberg block + * + * @return {boolean} Whether the block has lead forms enabled + */ + isLeadFormsEnabled: function isLeadFormsEnabled(block) { + if (!block) { + return false; + } + var $form = $(block.querySelector('.wpforms-container')); + return $form.hasClass('wpforms-lead-forms-container'); + }, + /** + * Get block container DOM element. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * + * @return {Element} Block container. + */ + getBlockContainer: function getBlockContainer(props) { + var blockSelector = "#block-".concat(props.clientId, " > div"); + var block = document.querySelector(blockSelector); + + // For FSE / Gutenberg plugin, we need to take a look inside the iframe. + if (!block) { + var editorCanvas = document.querySelector('iframe[name="editor-canvas"]'); + block = editorCanvas === null || editorCanvas === void 0 ? void 0 : editorCanvas.contentWindow.document.querySelector(blockSelector); + } + return block; + }, + /** + * Get form container in Block Editor. + * + * @since 1.9.3 + * + * @param {number} formId Form ID. + * + * @return {Element|null} Form container. + */ + getFormBlock: function getFormBlock(formId) { + // First, try to find the iframe for blocks version 3. + var editorCanvas = document.querySelector('iframe[name="editor-canvas"]'); + + // If the iframe is found, try to find the form. + return (editorCanvas === null || editorCanvas === void 0 ? void 0 : editorCanvas.contentWindow.document.querySelector("#wpforms-".concat(formId))) || $("#wpforms-".concat(formId)); + }, + /** + * Update CSS variable(s) value(s) of the given attribute for given container on the preview. + * + * @since 1.8.8 + * + * @param {string} attribute Style attribute: field-size, label-size, button-size, etc. + * @param {string} value Property new value. + * @param {Element} container Form container. + * @param {Object} props Block properties. + */ + updatePreviewCSSVarValue: function updatePreviewCSSVarValue(attribute, value, container, props) { + // eslint-disable-line complexity, max-lines-per-function + if (!container || !attribute) { + return; + } + var property = attribute.replace(/[A-Z]/g, function (letter) { + return "-".concat(letter.toLowerCase()); + }); + if (typeof customStylesHandlers[property] === 'function') { + customStylesHandlers[property](container, value); + return; + } + switch (property) { + case 'field-size': + case 'label-size': + case 'button-size': + case 'container-shadow-size': + for (var key in sizes[property][value]) { + container.style.setProperty("--wpforms-".concat(property, "-").concat(key), sizes[property][value][key]); + } + break; + case 'field-border-style': + if (value === 'none') { + app.toggleFieldBorderNoneCSSVarValue(container, true); + } else { + app.toggleFieldBorderNoneCSSVarValue(container, false); + container.style.setProperty("--wpforms-".concat(property), value); + } + break; + case 'button-background-color': + app.maybeUpdateAccentColor(props.attributes.buttonBorderColor, value, container); + value = app.maybeSetButtonAltBackgroundColor(value, props.attributes.buttonBorderColor, container); + app.maybeSetButtonAltTextColor(props.attributes.buttonTextColor, value, props.attributes.buttonBorderColor, container); + container.style.setProperty("--wpforms-".concat(property), value); + break; + case 'button-border-color': + app.maybeUpdateAccentColor(value, props.attributes.buttonBackgroundColor, container); + app.maybeSetButtonAltTextColor(props.attributes.buttonTextColor, props.attributes.buttonBackgroundColor, value, container); + container.style.setProperty("--wpforms-".concat(property), value); + break; + case 'button-text-color': + app.maybeSetButtonAltTextColor(value, props.attributes.buttonBackgroundColor, props.attributes.buttonBorderColor, container); + container.style.setProperty("--wpforms-".concat(property), value); + break; + default: + container.style.setProperty("--wpforms-".concat(property), value); + container.style.setProperty("--wpforms-".concat(property, "-spare"), value); + } + }, + /** + * Set/unset field border vars in case of border-style is none. + * + * @since 1.8.8 + * + * @param {Object} container Form container. + * @param {boolean} set True when set, false when unset. + */ + toggleFieldBorderNoneCSSVarValue: function toggleFieldBorderNoneCSSVarValue(container, set) { + var cont = container.querySelector('form'); + if (set) { + cont.style.setProperty('--wpforms-field-border-style', 'solid'); + cont.style.setProperty('--wpforms-field-border-size', '1px'); + cont.style.setProperty('--wpforms-field-border-color', 'transparent'); + return; + } + cont.style.setProperty('--wpforms-field-border-style', null); + cont.style.setProperty('--wpforms-field-border-size', null); + cont.style.setProperty('--wpforms-field-border-color', null); + }, + /** + * Maybe set the button's alternative background color. + * + * @since 1.8.8 + * + * @param {string} value Attribute value. + * @param {string} buttonBorderColor Button border color. + * @param {Object} container Form container. + * + * @return {string|*} New background color. + */ + maybeSetButtonAltBackgroundColor: function maybeSetButtonAltBackgroundColor(value, buttonBorderColor, container) { + // Setting css property value to child `form` element overrides the parent property value. + var form = container.querySelector('form'); + form.style.setProperty('--wpforms-button-background-color-alt', value); + if (WPFormsUtils.cssColorsUtils.isTransparentColor(value)) { + return WPFormsUtils.cssColorsUtils.isTransparentColor(buttonBorderColor) ? defaultStyleSettings.buttonBackgroundColor : buttonBorderColor; + } + return value; + }, + /** + * Maybe set the button's alternative text color. + * + * @since 1.8.8 + * + * @param {string} value Attribute value. + * @param {string} buttonBackgroundColor Button background color. + * @param {string} buttonBorderColor Button border color. + * @param {Object} container Form container. + */ + maybeSetButtonAltTextColor: function maybeSetButtonAltTextColor(value, buttonBackgroundColor, buttonBorderColor, container) { + var form = container.querySelector('form'); + var altColor = null; + value = value.toLowerCase(); + if (WPFormsUtils.cssColorsUtils.isTransparentColor(value) || value === buttonBackgroundColor || WPFormsUtils.cssColorsUtils.isTransparentColor(buttonBackgroundColor) && value === buttonBorderColor) { + altColor = WPFormsUtils.cssColorsUtils.getContrastColor(buttonBackgroundColor); + } + container.style.setProperty("--wpforms-button-text-color-alt", value); + form.style.setProperty("--wpforms-button-text-color-alt", altColor); + }, + /** + * Maybe update accent color. + * + * @since 1.8.8 + * + * @param {string} color Color value. + * @param {string} buttonBackgroundColor Button background color. + * @param {Object} container Form container. + */ + maybeUpdateAccentColor: function maybeUpdateAccentColor(color, buttonBackgroundColor, container) { + // Setting css property value to child `form` element overrides the parent property value. + var form = container.querySelector('form'); + + // Fallback to default color if the border color is transparent. + color = WPFormsUtils.cssColorsUtils.isTransparentColor(color) ? defaultStyleSettings.buttonBackgroundColor : color; + if (WPFormsUtils.cssColorsUtils.isTransparentColor(buttonBackgroundColor)) { + form.style.setProperty('--wpforms-button-background-color-alt', 'rgba( 0, 0, 0, 0 )'); + form.style.setProperty('--wpforms-button-background-color', color); + } else { + container.style.setProperty('--wpforms-button-background-color-alt', buttonBackgroundColor); + form.style.setProperty('--wpforms-button-background-color-alt', null); + form.style.setProperty('--wpforms-button-background-color', null); + } + }, + /** + * Get settings fields event handlers. + * + * @since 1.8.1 + * + * @param {Object} props Block properties. + * + * @return {Object} Object that contains event handlers for the settings fields. + */ + getSettingsFieldsHandlers: function getSettingsFieldsHandlers(props) { + // eslint-disable-line max-lines-per-function + return { + /** + * Field style attribute change event handler. + * + * @since 1.8.1 + * + * @param {string} attribute Attribute name. + * @param {string} value New attribute value. + */ + styleAttrChange: function styleAttrChange(attribute, value) { + var block = app.getBlockContainer(props), + container = block.querySelector("#wpforms-".concat(props.attributes.formId)), + setAttr = {}; + + // Unset the color means setting the transparent color. + if (attribute.includes('Color')) { + value = value !== null && value !== void 0 ? value : 'rgba( 0, 0, 0, 0 )'; + } + app.updatePreviewCSSVarValue(attribute, value, container, props); + setAttr[attribute] = value; + app.setBlockRuntimeStateVar(props.clientId, 'prevAttributesState', props.attributes); + props.setAttributes(setAttr); + triggerServerRender = false; + this.updateCopyPasteContent(); + app.panels.themes.updateCustomThemeAttribute(attribute, value, props); + this.maybeToggleDropdown(props, attribute); + + // Trigger event for developers. + el.$window.trigger('wpformsFormSelectorStyleAttrChange', [block, props, attribute, value]); + }, + /** + * Handles the toggling of the dropdown menu's visibility. + * + * @since 1.8.8 + * + * @param {Object} props The block properties. + * @param {string} attribute The name of the attribute being changed. + */ + maybeToggleDropdown: function maybeToggleDropdown(props, attribute) { + var _this = this; + // eslint-disable-line no-shadow + var formId = props.attributes.formId; + var menu = document.querySelector("#wpforms-form-".concat(formId, " .choices__list.choices__list--dropdown")); + var classicMenu = document.querySelector("#wpforms-form-".concat(formId, " .wpforms-field-select-style-classic select")); + if (attribute === 'fieldMenuColor') { + if (menu) { + menu.classList.add('is-active'); + menu.parentElement.classList.add('is-open'); + } else { + this.showClassicMenu(classicMenu); + } + clearTimeout(dropdownTimeout); + dropdownTimeout = setTimeout(function () { + var toClose = document.querySelector("#wpforms-form-".concat(formId, " .choices__list.choices__list--dropdown")); + if (toClose) { + toClose.classList.remove('is-active'); + toClose.parentElement.classList.remove('is-open'); + } else { + _this.hideClassicMenu(document.querySelector("#wpforms-form-".concat(formId, " .wpforms-field-select-style-classic select"))); + } + }, 5000); + } else if (menu) { + menu.classList.remove('is-active'); + } else { + this.hideClassicMenu(classicMenu); + } + }, + /** + * Shows the classic menu. + * + * @since 1.8.8 + * + * @param {Object} classicMenu The classic menu. + */ + showClassicMenu: function showClassicMenu(classicMenu) { + if (!classicMenu) { + return; + } + classicMenu.size = 2; + classicMenu.style.cssText = 'padding-top: 40px; padding-inline-end: 0; padding-inline-start: 0; position: relative;'; + classicMenu.querySelectorAll('option').forEach(function (option) { + option.style.cssText = 'border-left: 1px solid #8c8f94; border-right: 1px solid #8c8f94; padding: 0 10px; z-index: 999999; position: relative;'; + }); + classicMenu.querySelector('option:last-child').style.cssText = 'border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; padding: 0 10px; border-left: 1px solid #8c8f94; border-right: 1px solid #8c8f94; border-bottom: 1px solid #8c8f94; z-index: 999999; position: relative;'; + }, + /** + * Hides the classic menu. + * + * @since 1.8.8 + * + * @param {Object} classicMenu The classic menu. + */ + hideClassicMenu: function hideClassicMenu(classicMenu) { + if (!classicMenu) { + return; + } + classicMenu.size = 0; + classicMenu.style.cssText = 'padding-top: 0; padding-inline-end: 24px; padding-inline-start: 12px; position: relative;'; + classicMenu.querySelectorAll('option').forEach(function (option) { + option.style.cssText = 'border: none;'; + }); + }, + /** + * Field regular attribute change event handler. + * + * @since 1.8.1 + * + * @param {string} attribute Attribute name. + * @param {string} value New attribute value. + */ + attrChange: function attrChange(attribute, value) { + var setAttr = {}; + setAttr[attribute] = value; + app.setBlockRuntimeStateVar(props.clientId, 'prevAttributesState', props.attributes); + props.setAttributes(setAttr); + triggerServerRender = true; + this.updateCopyPasteContent(); + }, + /** + * Update content of the "Copy/Paste" fields. + * + * @since 1.8.1 + */ + updateCopyPasteContent: function updateCopyPasteContent() { + var content = {}; + var atts = wp.data.select('core/block-editor').getBlockAttributes(props.clientId); + for (var key in defaultStyleSettings) { + content[key] = atts[key]; + } + props.setAttributes({ + copyPasteJsonValue: JSON.stringify(content) + }); + }, + /** + * Paste settings handler. + * + * @since 1.8.1 + * + * @param {string} value New attribute value. + */ + pasteSettings: function pasteSettings(value) { + value = value.trim(); + var pasteAttributes = app.parseValidateJson(value); + if (!pasteAttributes) { + if (value) { + wp.data.dispatch('core/notices').createErrorNotice(strings.copy_paste_error, { + id: 'wpforms-json-parse-error' + }); + } + this.updateCopyPasteContent(); + return; + } + pasteAttributes.copyPasteJsonValue = value; + var themeSlug = app.panels.themes.maybeCreateCustomThemeFromAttributes(pasteAttributes); + app.setBlockRuntimeStateVar(props.clientId, 'prevAttributesState', props.attributes); + props.setAttributes(pasteAttributes); + app.panels.themes.setBlockTheme(props, themeSlug); + triggerServerRender = false; + } + }; + }, + /** + * Parse and validate JSON string. + * + * @since 1.8.1 + * + * @param {string} value JSON string. + * + * @return {boolean|object} Parsed JSON object OR false on error. + */ + parseValidateJson: function parseValidateJson(value) { + if (typeof value !== 'string') { + return false; + } + var atts; + try { + atts = JSON.parse(value.trim()); + } catch (error) { + atts = false; + } + return atts; + }, + /** + * Get WPForms icon DOM element. + * + * @since 1.8.1 + * + * @return {DOM.element} WPForms icon DOM element. + */ + getIcon: function getIcon() { + return createElement('svg', { + width: 20, + height: 20, + viewBox: '0 0 612 612', + className: 'dashicon' + }, createElement('path', { + fill: 'currentColor', + d: 'M544,0H68C30.445,0,0,30.445,0,68v476c0,37.556,30.445,68,68,68h476c37.556,0,68-30.444,68-68V68 C612,30.445,581.556,0,544,0z M464.44,68L387.6,120.02L323.34,68H464.44z M288.66,68l-64.26,52.02L147.56,68H288.66z M544,544H68 V68h22.1l136,92.14l79.9-64.6l79.56,64.6l136-92.14H544V544z M114.24,263.16h95.88v-48.28h-95.88V263.16z M114.24,360.4h95.88 v-48.62h-95.88V360.4z M242.76,360.4h255v-48.62h-255V360.4L242.76,360.4z M242.76,263.16h255v-48.28h-255V263.16L242.76,263.16z M368.22,457.3h129.54V408H368.22V457.3z' + })); + }, + /** + * Get WPForms blocks. + * + * @since 1.8.8 + * + * @return {Array} Blocks array. + */ + getWPFormsBlocks: function getWPFormsBlocks() { + var wpformsBlocks = wp.data.select('core/block-editor').getBlocks(); + return wpformsBlocks.filter(function (props) { + return props.name === 'wpforms/form-selector'; + }); + }, + /** + * Get WPForms blocks. + * + * @since 1.8.8 + * + * @param {Object} props Block properties. + * + * @return {Object} Block attributes. + */ + isClientIdAttrUnique: function isClientIdAttrUnique(props) { + var wpformsBlocks = app.getWPFormsBlocks(); + for (var key in wpformsBlocks) { + // Skip the current block. + if (wpformsBlocks[key].clientId === props.clientId) { + continue; + } + if (wpformsBlocks[key].attributes.clientId === props.attributes.clientId) { + return false; + } + } + return true; + }, + /** + * Get block attributes. + * + * @since 1.8.1 + * + * @return {Object} Block attributes. + */ + getBlockAttributes: function getBlockAttributes() { + return commonAttributes; + }, + /** + * Get block runtime state variable. + * + * @since 1.8.8 + * + * @param {string} clientId Block client ID. + * @param {string} varName Block runtime variable name. + * + * @return {*} Block runtime state variable value. + */ + getBlockRuntimeStateVar: function getBlockRuntimeStateVar(clientId, varName) { + var _blocks$clientId; + return (_blocks$clientId = blocks[clientId]) === null || _blocks$clientId === void 0 ? void 0 : _blocks$clientId[varName]; + }, + /** + * Set block runtime state variable value. + * + * @since 1.8.8 + * + * @param {string} clientId Block client ID. + * @param {string} varName Block runtime state key. + * @param {*} value State variable value. + * + * @return {boolean} True on success. + */ + setBlockRuntimeStateVar: function setBlockRuntimeStateVar(clientId, varName, value) { + // eslint-disable-line complexity + if (!clientId || !varName) { + return false; + } + blocks[clientId] = blocks[clientId] || {}; + blocks[clientId][varName] = value; + + // Prevent referencing to object. + if (_typeof(value) === 'object' && !Array.isArray(value) && value !== null) { + blocks[clientId][varName] = _objectSpread({}, value); + } + return true; + }, + /** + * Get form selector options. + * + * @since 1.8.1 + * + * @return {Array} Form options. + */ + getFormOptions: function getFormOptions() { + var formOptions = formList.map(function (value) { + return { + value: value.ID, + label: value.post_title + }; + }); + formOptions.unshift({ + value: '', + label: strings.form_select + }); + return formOptions; + }, + /** + * Get size selector options. + * + * @since 1.8.1 + * + * @return {Array} Size options. + */ + getSizeOptions: function getSizeOptions() { + return [{ + label: strings.small, + value: 'small' + }, { + label: strings.medium, + value: 'medium' + }, { + label: strings.large, + value: 'large' + }]; + }, + /** + * Event `wpformsFormSelectorEdit` handler. + * + * @since 1.8.1 + * + * @param {Object} e Event object. + * @param {Object} props Block properties. + */ + blockEdit: function blockEdit(e, props) { + var block = app.getBlockContainer(props); + if (!(block !== null && block !== void 0 && block.dataset)) { + return; + } + app.initLeadFormSettings(block); + }, + /** + * Init Lead Form Settings panels. + * + * @since 1.8.1 + * + * @param {Element} block Block element. + * @param {Object} block.dataset Block element. + */ + initLeadFormSettings: function initLeadFormSettings(block) { + var _block$dataset; + if (!app.isFullStylingEnabled()) { + return; + } + if (!(block !== null && block !== void 0 && (_block$dataset = block.dataset) !== null && _block$dataset !== void 0 && _block$dataset.block)) { + return; + } + var clientId = block.dataset.block; + var $panel = $(".wpforms-block-settings-".concat(clientId)); + var isLeadFormsEnabled = app.isLeadFormsEnabled(block); + if (isLeadFormsEnabled) { + $panel.addClass('disabled_panel').find('.wpforms-gutenberg-panel-notice.wpforms-lead-form-notice').css('display', 'block'); + $panel.find('.wpforms-gutenberg-panel-notice.wpforms-use-modern-notice').css('display', 'none'); + return; + } + $panel.removeClass('disabled_panel').removeClass('wpforms-lead-forms-enabled').find('.wpforms-gutenberg-panel-notice.wpforms-lead-form-notice').css('display', 'none'); + $panel.find('.wpforms-gutenberg-panel-notice.wpforms-use-modern-notice').css('display', null); + }, + /** + * Event `wpformsFormSelectorFormLoaded` handler. + * + * @since 1.8.1 + * + * @param {Object} e Event object. + */ + formLoaded: function formLoaded(e) { + app.initLeadFormSettings(e.detail.block); + app.updateAccentColors(e.detail); + app.loadChoicesJS(e.detail); + app.initRichTextField(e.detail.formId); + app.initRepeaterField(e.detail.formId); + $(e.detail.block).off('click').on('click', app.blockClick); + }, + /** + * Click on the block event handler. + * + * @since 1.8.1 + * + * @param {Object} e Event object. + */ + blockClick: function blockClick(e) { + app.initLeadFormSettings(e.currentTarget); + }, + /** + * Update accent colors of some fields in GB block in Modern Markup mode. + * + * @since 1.8.1 + * + * @param {Object} detail Event details object. + */ + updateAccentColors: function updateAccentColors(detail) { + var _window$WPForms; + if (!wpforms_gutenberg_form_selector.is_modern_markup || !((_window$WPForms = window.WPForms) !== null && _window$WPForms !== void 0 && _window$WPForms.FrontendModern) || !(detail !== null && detail !== void 0 && detail.block)) { + return; + } + var $form = $(detail.block.querySelector("#wpforms-".concat(detail.formId))), + FrontendModern = window.WPForms.FrontendModern; + FrontendModern.updateGBBlockPageIndicatorColor($form); + FrontendModern.updateGBBlockIconChoicesColor($form); + FrontendModern.updateGBBlockRatingColor($form); + }, + /** + * Init Modern style Dropdown fields ( + + + + + +
              + +
              + <?php esc_attr_e( 'Sullie the WPForms mascot', 'wpforms-lite' ); ?> +
              + +
              + + form ) : ?> + + + + + + + form_data['settings']['form_title'] ?? $this->form->post_title ); ?> + + + form->post_type === 'wpforms-template' ) : ?> + + + + + + + +
              + +
              + + + + form ) : ?> +
              + + + + get_context_menu_args(), true ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> +
              + + + + + + + + + form->post_type === 'wpforms-template' ) : ?> + + + + + + + + + + + + +
              + +
              + + +
              + + form, $this->view ); + ?> + +
              + +
              + + form, $this->view ); + ?> + +
              + + + +
              + + abort ) { + return; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'builder/fullscreen/abort-message', + [ + 'message' => $this->abort_message, + ], + true + ); + } + + /** + * Change default admin meta viewport tag upon request to force scrollable + * desktop view on small screens. + * + * @since 1.7.8 + * + * @param string|mixed $value Default meta viewport tag value. + * + * @return string + */ + public function viewport_meta( $value ): string { + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( ! empty( $_GET['force_desktop_view'] ) ) { + return 'width=1024, initial-scale=1'; + } + + return (string) $value; + } + + /** + * Get localized currency strings for the builder. + * + * @since 1.8.2 + * + * @param array $strings Array of localized strings. + * + * @return array + */ + private function add_localized_currencies( array $strings ): array { + + $currency = wpforms_get_currency(); + $currencies = wpforms_get_currencies(); + + $strings['currency'] = sanitize_text_field( $currency ); + $strings['currency_name'] = isset( $currencies[ $currency ]['name'] ) ? sanitize_text_field( $currencies[ $currency ]['name'] ) : ''; + $strings['currency_decimals'] = wpforms_get_currency_decimals( $currencies[ $currency ] ); + $strings['currency_decimal'] = isset( $currencies[ $currency ]['decimal_separator'] ) ? sanitize_text_field( $currencies[ $currency ]['decimal_separator'] ) : '.'; + $strings['currency_thousands'] = isset( $currencies[ $currency ]['thousands_separator'] ) ? sanitize_text_field( $currencies[ $currency ]['thousands_separator'] ) : ','; + $strings['currency_symbol'] = isset( $currencies[ $currency ]['symbol'] ) ? sanitize_text_field( $currencies[ $currency ]['symbol'] ) : '$'; + $strings['currency_symbol_pos'] = isset( $currencies[ $currency ]['symbol_pos'] ) ? sanitize_text_field( $currencies[ $currency ]['symbol_pos'] ) : 'left'; + + return $strings; + } + + /** + * Get context menu arguments, depending on the Lite/Pro version and form or form template type. + * + * @since 1.8.8 + * + * @return array + */ + private function get_context_menu_args(): array { + + $args = [ + 'form_id' => $this->form->ID, + 'is_form_template' => $this->form->post_type === 'wpforms-template', + 'has_payments' => wpforms()->obj( 'payment' )->get_by( 'form_id', $this->form->ID ) !== null, + ]; + + if ( wpforms()->is_pro() ) { + $args['has_entries'] = wpforms()->obj( 'entry' )->get_entries( [ 'form_id' => $this->form->ID ], true ) > 0; + $args['can_duplicate'] = $this->can_duplicate(); + } + + return $args; + } + + /** + * Check if the current user is allowed to duplicate the form. + * + * @since 1.8.8 + * + * @return bool + */ + private function can_duplicate(): bool { + + if ( ! wpforms_current_user_can( 'create_forms' ) ) { + return false; + } + + if ( ! wpforms_current_user_can( 'view_form_single', $this->form->ID ) ) { + return false; + } + + return true; + } +} + +WPForms_Builder::instance(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/builder/functions.php b/wp-content/plugins/wpforms-lite/includes/admin/builder/functions.php new file mode 100755 index 00000000..b352403d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/builder/functions.php @@ -0,0 +1,942 @@ + [ 'class' => [] ] ] ) : ''; + $class = ! empty( $args['class'] ) ? wpforms_sanitize_classes( $args['class'] ) : ''; + $input_class = ! empty( $args['input_class'] ) ? wpforms_sanitize_classes( $args['input_class'] ) : ''; + $default = $args['default'] ?? ''; + $placeholder = ! empty( $args['placeholder'] ) ? esc_attr( $args['placeholder'] ) : ''; + $data_attr = ''; + $output = ''; + $smarttags_toggle = ''; + $input_id = sprintf( 'wpforms-panel-field-%s-%s', sanitize_html_class( $panel_id ), sanitize_html_class( $field ) ); + + if ( ! empty( $args['input_id'] ) ) { + $input_id = esc_attr( $args['input_id'] ); + } + + // Sanitize the subsection only if it doesn't contain a connection ID tag. + if ( strpos( $subsection, '%connection_id%' ) === false ) { + $subsection = sanitize_html_class( $subsection ); + } + + // Check for smart tags. + if ( ! empty( $args['smarttags'] ) ) { + $type = ! empty( $args['smarttags']['type'] ) ? esc_attr( $args['smarttags']['type'] ) : 'fields'; + $fields = ! empty( $args['smarttags']['fields'] ) ? esc_attr( $args['smarttags']['fields'] ) : ''; + $is_repeater_allowed = ! empty( $args['smarttags']['allow-repeated-fields'] ) ? esc_attr( $args['smarttags']['allow-repeated-fields'] ) : ''; + $allowed_smarttags = ! empty( $args['smarttags']['allowed'] ) ? esc_attr( $args['smarttags']['allowed'] ) : ''; + $location = ! empty( $args['location'] ) ? esc_attr( $args['location'] ) : ''; + + $args['data'] = [ + 'location' => $location, + 'type' => $type, + 'fields' => $fields, + 'allow-repeated-fields' => $is_repeater_allowed, + 'allowed-smarttags' => $allowed_smarttags, + ]; + + // BC for old addons that use the old smart tags system. + $smarttags_toggle = sprintf( + ' + %4$s + ', + esc_attr( $type ), + esc_attr( $fields ), + esc_attr( $is_repeater_allowed ), + esc_html__( 'Show Smart Tags', 'wpforms-lite' ), + esc_attr( $location ), + esc_attr( $allowed_smarttags ) + ); + } + + if ( ! empty( $args['pro_badge'] ) ) { + $label .= Helpers::get_badge( 'Pro', 'sm', 'inline', 'silver' ); + } + + // Check if we should store values in a parent array. + if ( ! empty( $parent ) ) { + if ( $subsection && ! wpforms_is_empty_string( $index ) ) { + $field_name = sprintf( '%s[%s][%s][%s][%s]', $parent, $panel, $subsection, $index, $field ); + $value = $form_data[ $parent ][ $panel ][ $subsection ][ $index ][ $field ] ?? $default; + $input_id = sprintf( 'wpforms-panel-field-%s-%s-%s-%s', sanitize_html_class( $panel_id ), $subsection, sanitize_html_class( $index ), sanitize_html_class( $field ) ); + } elseif ( ! empty( $subsection ) ) { + $field_name = sprintf( '%s[%s][%s][%s]', $parent, $panel, $subsection, $field ); + $value = $form_data[ $parent ][ $panel ][ $subsection ][ $field ] ?? $default; + $input_id = sprintf( 'wpforms-panel-field-%s-%s-%s', sanitize_html_class( $panel_id ), $subsection, sanitize_html_class( $field ) ); + } else { + $field_name = sprintf( '%s[%s][%s]', $parent, $panel, $field ); + $value = $form_data[ $parent ][ $panel ][ $field ] ?? $default; + } + } else { + $field_name = sprintf( '%s[%s]', $panel, $field ); + $value = $form_data[ $panel ][ $field ] ?? $default; + } + + if ( isset( $args['field_name'] ) ) { + $field_name = $args['field_name']; + } + + if ( isset( $args['value'] ) ) { + $value = $args['value']; + } + + // Check for data attributes. + if ( ! empty( $args['data'] ) ) { + foreach ( $args['data'] as $key => $val ) { + if ( is_array( $val ) ) { + $val = wp_json_encode( $val ); + } + $data_attr .= ' data-' . $key . '=\'' . $val . '\''; + } + } + + // Check for readonly inputs. + if ( ! empty( $args['readonly'] ) ) { + $data_attr .= 'readonly'; + } + + // Determine what field type to output. + switch ( $option ) { + // Text input. + case 'text': + // Handle min and max attributes for number fields. + if ( ! empty( $args['type'] ) && $args['type'] === 'number' ) { + if ( isset( $args['min'] ) && is_int( $args['min'] ) ) { + $data_attr .= sprintf( ' min="%1$d" oninput="validity.valid||(value=\'%1$d\');" ', esc_attr( $args['min'] ) ); + } + + if ( isset( $args['max'] ) && is_int( $args['max'] ) ) { + $data_attr .= sprintf( ' max="%1$d" oninput="validity.valid||(value=\'%1$d\');" ', esc_attr( $args['max'] ) ); + } + } + + $output = sprintf( + '', + ! empty( $args['type'] ) ? esc_attr( $args['type'] ) : 'text', + $input_id, + $field_name, + esc_attr( $value ), + $placeholder, + $input_class, + $data_attr + ); + break; + + // Image uploader. + case 'image_upload': + $output = wpforms_panel_field_image_upload_control( + $option, + $args, + $panel, + $parent, + $field, + $form_data, + $field_name, + $input_id + ); + break; + + // Textarea. + case 'textarea': + $output = sprintf( + '', + $input_id, + $field_name, + ! empty( $args['rows'] ) ? (int) $args['rows'] : '3', + $placeholder, + $input_class, + $data_attr, + esc_textarea( $value ) + ); + break; + + // TinyMCE. + case 'tinymce': + $id = str_replace( '-', '_', $input_id ); + $args['tinymce']['textarea_name'] = $field_name; + $args['tinymce']['teeny'] = true; + $args['tinymce'] = wp_parse_args( + $args['tinymce'], + [ + 'media_buttons' => false, + 'teeny' => true, + ] + ); + + ob_start(); + wp_editor( $value, $id, $args['tinymce'] ); + + $output = ob_get_clean(); + break; + + // Checkbox. + case 'checkbox': + $output = sprintf( + '', + $input_id, + $field_name, + $input_class, + checked( '1', $value, false ), + $data_attr + ); + $output .= sprintf( + ''; + break; + + // Toggle. + case 'toggle': + $toggle_args = $args; + $toggle_args['input-class'] = $input_class; + $output = wpforms_panel_field_toggle_control( $toggle_args, $input_id, $field_name, $label, $value, $data_attr ); + break; + + // Radio. + case 'radio': + $options = $args['options']; + $radio_counter = 1; + + foreach ( $options as $key => $item ) { + if ( empty( $item['label'] ) ) { + continue; + } + + $item_value = ! empty( $item['value'] ) ? $item['value'] : $key; + + $output .= ''; + + if ( ! empty( $item['pre_label'] ) ) { + $output .= ''; + + ++$radio_counter; + } + + if ( ! empty( $output ) ) { + $output = '
              ' . $output . '
              '; + } + break; + + // Select. + case 'select': + if ( empty( $args['options'] ) && empty( $args['field_map'] ) && empty( $args['multiple'] ) ) { + return ''; + } + + if ( ! empty( $args['field_map'] ) ) { + $options = []; + $available_fields = wpforms_get_form_fields( $form_data, $args['field_map'] ); + + if ( ! empty( $available_fields ) ) { + foreach ( $available_fields as $id => $available_field ) { + $options[ $id ] = ! empty( $available_field['label'] ) + ? esc_attr( $available_field['label'] ) + : sprintf( /* translators: %d - field ID. */ + esc_html__( 'Field #%d', 'wpforms-lite' ), + absint( $id ) + ); + } + } + $input_class .= ' wpforms-field-map-select'; + $data_attr .= ' data-field-map-allowed="' . implode( ' ', $args['field_map'] ) . '"'; + + if ( ! empty( $placeholder ) ) { + $data_attr .= ' data-field-map-placeholder="' . esc_attr( $placeholder ) . '"'; + } + } else { + $options = $args['options']; + } + + if ( array_key_exists( 'choicesjs', $args ) && is_array( $args['choicesjs'] ) ) { + $input_class .= ' choicesjs-select'; + $data_attr .= ! empty( $args['choicesjs']['use_ajax'] ) ? ' data-choicesjs-use-ajax=1' : ''; + $data_attr .= ! empty( $args['choicesjs']['callback_fn'] ) ? ' data-choicesjs-callback-fn="' . esc_attr( $args['choicesjs']['callback_fn'] ) . '"' : ''; + } + + if ( ! empty( $args['multiple'] ) ) { + $data_attr .= ' multiple'; + } + + $output = sprintf( + ''; + break; + + case 'color': + $class .= ' wpforms-panel-field-colorpicker'; + $input_class .= ' wpforms-color-picker'; + $fallback_value = $args['data']['fallback-color'] ?? $value; + + $output = sprintf( + '', + $input_id, + $field_name, + esc_attr( $value ), + esc_attr( $fallback_value ), + wpforms_sanitize_classes( $input_class ), + $data_attr + ); + break; + + /** + * Number input. + * + * @since 1.9.8 + */ + case 'number': + if ( isset( $args['min'] ) ) { + $data_attr .= sprintf( ' min="%1$d" oninput="validity.valid||(value=\'%1$d\');" ', esc_attr( $args['min'] ) ); + } + + if ( isset( $args['step'] ) ) { + $data_attr .= sprintf( ' step="%1$d" oninput="validity.valid||(value=\'%1$d\');" ', esc_attr( $args['step'] ) ); + } + + $output = '
              '; + + $output .= sprintf( + '', + $input_id, + $field_name, + esc_attr( $value ), + $placeholder, + $input_class, + $data_attr + ); + + if ( ! empty( $args['show_unit'] ) ) { + $output .= '' . $args['show_unit'] . ''; + } + + $output .= '
              '; + break; + } + + // Put the pieces together. + $field_open = sprintf( + '
              ', + $input_id, + $class, + 'wpforms-panel-field-' . sanitize_html_class( $option ) + ); + $field_open .= ! empty( $args['before'] ) ? $args['before'] : ''; + + if ( $option !== 'toggle' && $option !== 'checkbox' && ! empty( $label ) ) { + $field_label = sprintf( + ''; + + if ( ! empty( $args['after_label'] ) ) { + $field_label .= $args['after_label']; + } + } else { + $field_label = ''; + } + + $field_close = ''; + + $field_close .= ! empty( $args['after'] ) ? $args['after'] : ''; + $field_close .= '
              '; + $output = $field_open . $field_label . $output . $field_close; + + // Wash our hands. + if ( $do_echo ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $output; + + return null; + } + + return $output; +} + +/** + * Create toggle control. + * + * It's like a regular checkbox but with a modern visual appearance. + * + * @since 1.6.8 + * + * @param array $args Arguments array. + * + * @type bool $status If `true`, control will display the current status next to the toggle. + * @type string $status_on Status `On` text. By default, `On`. + * @type string $status_off Status `Off` text. By default, `Off`. + * @type bool $label_hide If `true `, then the label will not display. + * @type string $tooltip Tooltip text. + * @type string $input_class CSS class for the hidden ``. + * @type string $control_class CSS class for the wrapper ``. + * + * @param string $input_id Input ID. + * @param string $field_name Field name. + * @param string $label Label text. Can contain HTML to display additional badges. + * @param mixed $value Value. + * @param string $data_attr Attributes. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ +function wpforms_panel_field_toggle_control( $args, $input_id, $field_name, $label, $value, $data_attr ): string { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $checked = checked( true, (bool) $value, false ); + $status = ''; + + if ( ! empty( $args['status'] ) ) { + $status_on = ! empty( $args['status-on'] ) ? $args['status-on'] : esc_html__( 'On', 'wpforms-lite' ); + $status_off = ! empty( $args['status-off'] ) ? $args['status-off'] : esc_html__( 'Off', 'wpforms-lite' ); + $status = sprintf( + '', + esc_attr( $input_id ), + esc_attr( $status_on ), + esc_attr( $status_off ), + esc_html( $value ? $status_on : $status_off ) + ); + } + + $label_html = empty( $args['label-hide'] ) && ! empty( $label ) ? + sprintf( + '', + esc_attr( $input_id ), + $label + ) : ''; + $label_html .= isset( $args['tooltip'] ) ? + sprintf( + '', + esc_attr( $args['tooltip'] ) + ) : ''; + + $label_left = ! empty( $args['label-left'] ) ? $label_html . $status : ''; + $label_right = empty( $args['label-left'] ) ? $status . $label_html : ''; + $title = isset( $args['title'] ) ? ' title="' . esc_attr( $args['title'] ) . '"' : ''; + $control_class = ! empty( $args['control-class'] ) ? $args['control-class'] : ''; + $input_class = ! empty( $args['input-class'] ) ? $args['input-class'] : ''; + + return sprintf( + ' + %1$s + + + %6$s + ', + $label_left, + esc_attr( $input_id ), + esc_attr( $field_name ), + $checked, + $data_attr, + $label_right, + wpforms_sanitize_classes( $input_class ), + wpforms_sanitize_classes( $control_class ), + $title, + ! empty( $args['disabled'] ) ? 'disabled' : '' + ); +} + +/** + * Get a settings block state, whether it's opened or closed. + * + * @since 1.4.8 + * + * @param int $form_id Form ID. + * @param int $block_id Block ID. + * @param string $block_type Block type. + * + * @return string + */ +function wpforms_builder_settings_block_get_state( $form_id, $block_id, $block_type ): string { + + $form_id = absint( $form_id ); + $block_id = absint( $block_id ); + $block_type = sanitize_key( $block_type ); + $state = 'opened'; + + $all_states = get_user_meta( get_current_user_id(), 'wpforms_builder_settings_collapsable_block_states', true ); + + if ( empty( $all_states ) ) { + return $state; + } + + if ( + is_array( $all_states ) && + ! empty( $all_states[ $form_id ][ $block_type ][ $block_id ] ) && + $all_states[ $form_id ][ $block_type ][ $block_id ] === 'closed' + ) { + $state = 'closed'; + } + + // Backward compatibility for notifications. + if ( $block_type === 'notification' && $state !== 'closed' ) { + $notification_states = get_user_meta( get_current_user_id(), 'wpforms_builder_notification_states', true ); + } + + if ( + ! empty( $notification_states[ $form_id ][ $block_id ] ) && + $notification_states[ $form_id ][ $block_id ] === 'closed' + ) { + $state = 'closed'; + } + + if ( $block_type === 'notification' ) { + // Backward compatibility for notifications. + + /** + * Filters notification get state. + * + * @since 1.4.8 + * + * @param string $state Notification get state. + * @param int $form_id Form ID. + * @param int $block_id Block ID. + * + * @return string + */ + return (string) apply_filters( 'wpforms_builder_notification_get_state', $state, $form_id, $block_id ); // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + } + + /** + * Filters settings block state. + * + * @since 1.4.8 + * + * @param string $state Settings block state. + * @param int $form_id Form ID. + * @param int $block_id Block ID. + * @param string $block_type Block type. + * + * @return string + */ + return apply_filters( 'wpforms_builder_settings_block_get_state', $state, $form_id, $block_id, $block_type ); +} + +/** + * Get the list of allowed tags, used in a pair with the wp_kses () function. + * This allows removing of all potentially harmful HTML tags and attributes. + * + * @since 1.5.9 + * + * @return array Allowed Tags. + */ +function wpforms_builder_preview_get_allowed_tags(): array { + + static $allowed_tags; + + if ( ! empty( $allowed_tags ) ) { + return $allowed_tags; + } + + $atts = [ 'align', 'class', 'type', 'id', 'for', 'style', 'src', 'rel', 'href', 'target', 'value', 'width', 'height' ]; + $tags = [ 'label', 'iframe', 'style', 'button', 'strong', 'small', 'table', 'span', 'abbr', 'code', 'pre', 'div', 'img', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'li', 'em', 'hr', 'br', 'th', 'tr', 'td', 'p', 'a', 'b', 'i' ]; + + $allowed_atts = array_fill_keys( $atts, [] ); + $allowed_tags = array_fill_keys( $tags, $allowed_atts ); + + return $allowed_tags; +} + +/** + * Output builder panel fields group wrapper. + * + * @since 1.6.6 + * + * @param string $inner Inner HTML to wrap. + * @param array $args Array of arguments. + * @param bool $do_echo Flag to display. + * + * @return string|null + * @noinspection HtmlUnknownAttribute + */ +function wpforms_panel_fields_group( $inner, $args = [], $do_echo = true ): ?string { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $group = ! empty( $args['group'] ) ? $args['group'] : ''; + $unfoldable = ! empty( $args['unfoldable'] ); + $default = ( ! empty( $args['default'] ) && $args['default'] === 'opened' ) ? ' opened' : ''; + $opened = ! empty( $_COOKIE[ 'wpforms_fields_group_' . $group ] ) && $_COOKIE[ 'wpforms_fields_group_' . $group ] === 'true' ? ' opened' : $default; + $class = ! empty( $args['class'] ) ? wpforms_sanitize_classes( $args['class'] ) : ''; + + $output = sprintf( + '
              ', + $class, + $unfoldable ? ' unfoldable' . $opened : '', + $unfoldable ? ' data-group="' . $group . '"' : '' + ); + + if ( ! empty( $args['borders'] ) && in_array( 'top', $args['borders'], true ) ) { + $output .= '
              '; + } + + if ( ! empty( $args['title'] ) ) { + $chevron = $unfoldable ? '' : ''; + $output .= '
              ' . esc_html( $args['title'] ) . $chevron . '
              '; + } + + if ( ! empty( $args['description'] ) ) { + $output .= '
              ' . wp_kses_post( $args['description'] ) . '
              '; + } + + $output .= sprintf( + '
              %s
              ', + empty( $opened ) && $unfoldable ? ' style="display: none;"' : '', + $inner + ); + + if ( ! empty( $args['borders'] ) && in_array( 'bottom', $args['borders'], true ) ) { + $output .= '
              '; + } + + $output .= '
              '; + + if ( ! $do_echo ) { + return $output; + } + + echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + + return null; +} + +/** + * Get the pages for the "Show Page" dropdown selection in Confirmations Settings in Builder. + * + * @since 1.7.9 + * + * @param array $form_data Form data. + * @param int $confirmation_id Confirmation ID. + * + * @return array + */ +function wpforms_builder_form_settings_confirmation_get_pages( $form_data, $confirmation_id ): array { + + $pre_selected_page_id = empty( $form_data['settings']['confirmations'][ $confirmation_id ]['page'] ) + ? 0 + : absint( $form_data['settings']['confirmations'][ $confirmation_id ]['page'] ); + + $pages = [ 'previous_page' => esc_html__( 'Back to Previous Page (Referrer) ', 'wpforms-lite' ) ]; + $pages += wp_list_pluck( wpforms_search_posts(), 'post_title', 'ID' ); + + if ( empty( $pre_selected_page_id ) || isset( $pages[ $pre_selected_page_id ] ) ) { + return $pages; + } + + // If the pre-selected page isn't in `$pages`, we manually fetch it include it in `$pages`. + $pre_selected_page = get_post( $pre_selected_page_id ); + + if ( empty( $pre_selected_page ) ) { + return $pages; + } + + $pages[ $pre_selected_page->ID ] = wpforms_get_post_title( $pre_selected_page ); + + return $pages; +} + +/** + * Generates an image upload control for WPForms builder panels. + * + * @since 1.8.0 + * + * @param string $option Field type. + * @param array $args Arguments for the control: + * - default_id - Default image ID if no value is set. + * - default_size - Default image size ('full', 'large', 'medium', 'small'). + * - default_position - Default image position ('left', 'center', 'right'). + * - default_url - Default image URL if no value is set. + * @param string $panel Panel name. + * @param string $parent_name Parent field name. + * @param string $field Field name. + * @param array $form Form data. + * @param string $field_name Field name attribute. + * @param string $input_id Input ID attribute. + * + * @return string HTML markup for the image upload control. + */ +function wpforms_panel_field_image_upload_control( // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded + string $option, + array $args, + string $panel, + string $parent_name, + string $field, + array $form, + string $field_name, + string $input_id +): string { + + // Handle subsection, which is the primary use case. + $subsection = ! empty( $args['subsection'] ) ? $args['subsection'] : ''; + + // Set default values from args if they exist. + $image_id = ! empty( $args['default_id'] ) ? $args['default_id'] : 0; + $image_size = ! empty( $args['default_size'] ) ? $args['default_size'] : 'medium'; + $image_position = ! empty( $args['default_position'] ) ? $args['default_position'] : 'left'; + $image_url = ! empty( $args['default_url'] ) ? $args['default_url'] : ''; + $hidden_fields = ! empty( $args['hidden_fields'] ) ? $args['hidden_fields'] : []; + + $key_id = $field . '_id'; + $key_size = $field . '_size'; + $key_position = $field . '_position'; + $key_url = $field . '_url'; + + // Get stored values if they exist. + if ( + isset( $form[ $parent_name ][ $panel ][ $subsection ][ $key_url ] ) + ) { + $image_id = absint( $form[ $parent_name ][ $panel ][ $subsection ][ $key_id ] ?? $image_id ); + $image_size = $form[ $parent_name ][ $panel ][ $subsection ][ $key_size ] ?? $image_size; + $image_position = $form[ $parent_name ][ $panel ][ $subsection ][ $key_position ] ?? $image_position; + $image_url = $form[ $parent_name ][ $panel ][ $subsection ][ $key_url ]; + } + + // Check if we have an image. + $has_image = ! empty( $image_id ) || ! empty( $image_url ); + + if ( ! empty( $image_id ) && empty( $image_url ) ) { + $image_attributes = wp_get_attachment_image_src( $image_id, 'full' ); + + if ( $image_attributes ) { + $image_url = $image_attributes[0]; + } else { + // The image doesn't exist or is invalid. + $has_image = false; + $image_id = 0; + } + } + + // Determine button visibility classes. + $upload_button_class = $has_image ? 'wpforms-image-upload-button wpforms-hidden' : 'wpforms-image-upload-button'; + $remove_button_class = $has_image ? 'wpforms-image-remove-button' : 'wpforms-image-remove-button wpforms-hidden'; + + // Set preview image source. + $preview_src = $has_image && $image_url ? $image_url : ''; + + // Define standard sizes. + $sizes = [ + 'full' => esc_html__( 'Full', 'wpforms-lite' ), + 'large' => esc_html__( 'Large', 'wpforms-lite' ), + 'medium' => esc_html__( 'Medium', 'wpforms-lite' ), + 'small' => esc_html__( 'Small', 'wpforms-lite' ), + ]; + + // Define standard positions. + $positions = [ + 'left' => esc_html__( 'Left', 'wpforms-lite' ), + 'center' => esc_html__( 'Center', 'wpforms-lite' ), + 'right' => esc_html__( 'Right', 'wpforms-lite' ), + ]; + + // Prepare the field name prefix. Remove the square bracket at the end if present. + $field_name_prefix = preg_replace( '/]$/', '', $field_name ); + + // Start output buffering to capture HTML. + ob_start(); + + ?> +
              +
              +
              +
              + <?php echo $has_image ? esc_attr__( 'Preview of selected image', 'wpforms-lite' ) : esc_attr__( 'No image selected', 'wpforms-lite' ); ?> +
              + +
              + +
              + + +
              + + + +
              + + +
              + + +
              + + + +
              +
              + + + + +
              +
              +
              + form = wpforms()->obj( 'form' )->get( $form_id ); + + $this->form_data = $this->form ? wpforms_decode( $this->form->post_content ) : false; + + // Get current revision, if available. + $revision = wpforms()->obj( 'revisions' )->get_revision(); + + // If we're viewing a valid revision, replace the form data so the Form Builder shows correct state. + if ( $revision && isset( $revision->post_content ) ) { + $this->form_data = wpforms_decode( $revision->post_content ); + } + + // Bootstrap. + $this->init(); + + // Save instance. + self::$instance = $this; + + // Primary panel button. + add_action( 'wpforms_builder_panel_buttons', [ $this, 'button' ], $this->order, 2 ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $is_active = $this->slug === sanitize_key( $_GET['view'] ?? 'setup' ); + + if ( $this->on_demand && ! $is_active ) { + // Load panel loader enqueues. + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues_loader' ] ); + } + + + // Load payments panel enqueues. + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues_payments' ] ); + + // Load panel specific enqueues. + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ], 15 ); + + if ( $is_active || ! $this->on_demand ) { + // Output. + add_action( 'wpforms_builder_panels', [ $this, 'panel_output' ], $this->order, 2 ); + } + } + + /** + * Get class instance. + * + * @since 1.7.7 + * + * @return static + */ + public static function instance() { + + if ( self::$instance === null || ! self::$instance instanceof static ) { + self::$instance = new static(); + } + + return self::$instance; + } + + /** + * All systems go. Used by children. + * + * @since 1.0.0 + */ + public function init() { + } + + /** + * Enqueue assets for the builder. Used by children. + * + * @since 1.0.0 + */ + public function enqueues() { + } + + /** + * Enqueue panel loader assets. + * + * @since 1.8.6 + */ + public function enqueues_loader() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-panel-loader', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/panel-loader{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + } + + /** + * Enqueue assets for the payments panel. + * + * @since 1.9.5 + */ + public function enqueues_payments() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-payments-utils', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/payments-utils{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + + $strings = [ + 'payments_plan_placeholder' => esc_html__( 'Plan Name', 'wpforms-lite' ), + 'payments_disabled_recurring' => esc_html__( 'You can only use one payment type at a time. If you\'d like to enable Recurring Payments, please disable One-Time Payments.', 'wpforms-lite' ), + 'payments_disabled_one_time' => esc_html__( 'You can only use one payment type at a time. If you\'d like to enable One-Time Payments, please disable Recurring Payments.', 'wpforms-lite' ), + ]; + + wp_localize_script( + 'wpforms-builder-payments-utils', + 'wpforms_builder_payments_utils', + $strings + ); + } + + /** + * Primary panel button in the left panel navigation. + * + * @since 1.0.0 + * + * @param mixed $form + * @param string $view + */ + public function button( $form, $view ) { + + $active = $view === $this->slug ? 'active' : ''; + ?> + + + + sidebar ? 'wpforms-panel-sidebar-content' : 'wpforms-panel-full-content'; + $classes = [ 'wpforms-panel' ]; + + // Determine whether the form data is corrupted and a dedicated alert message needs to be shown, + // keep the revisions panel to be able to restore the form. + $is_form_corrupted = is_array( $this->form_data ) && empty( $this->form_data ) && $this->slug !== 'revisions'; + + if ( in_array( $this->slug, [ 'fields', 'revisions' ], true ) ) { + $classes[] = 'wpforms-panel-fields'; + } + + if ( $view === $this->slug ) { + $classes[] = 'active'; + } + + if ( $is_form_corrupted ) { + $classes[] = 'wpforms-panel-corrupted-data'; + } + + printf( '
              ', wpforms_sanitize_classes( $classes, true ), esc_attr( $this->slug ) ); + + printf( '
              ', esc_attr( $wrap ) ); + + if ( $this->sidebar === true && ! $is_form_corrupted ) { + + if ( $this->slug === 'fields' ) { + echo '
              '; + } + + echo '
              '; + + do_action( 'wpforms_builder_before_panel_sidebar', $this->form, $this->slug ); + + $this->panel_sidebar(); + + do_action( 'wpforms_builder_after_panel_sidebar', $this->form, $this->slug ); + + echo '
              '; + + /** + * Allow adding custom content after the panel sidebar in the Form Builder. + * + * @since 1.9.7 + * + * @param object $form Current form object. + * @param string $slug Current panel slug. + */ + do_action( 'wpforms_builder_panel_sidebar_after', $this->form, $this->slug ); + } + + echo '
              '; + + echo '
              '; + + if ( $is_form_corrupted ) { + $this->form_corrupted_message(); + } else { + + /** + * Allow adding custom content before the panel content in the Form Builder. + * + * @since 1.0.0 + * + * @param object $form Current form object. + * @param string $slug Current panel slug. + */ + do_action( 'wpforms_builder_before_panel_content', $this->form, $this->slug ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $this->panel_content(); + + /** + * Allow adding custom content after the panel content in the Form Builder. + * + * @since 1.0.0 + * + * @param object $form Current form object. + * @param string $slug Current panel slug. + */ + do_action( 'wpforms_builder_after_panel_content', $this->form, $this->slug ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + echo '
              '; + + echo '
              '; + + echo '
              '; + + echo '
              '; + } + + /** + * Output the panel's sidebar if we have one. + * + * @since 1.0.0 + */ + public function panel_sidebar() { + } + + /** + * Output panel sidebar sections. + * + * @since 1.0.0 + * + * @param string $name Sidebar section name. + * @param string $slug Sidebar section slug. + * @param string $icon Sidebar section icon. + */ + public function panel_sidebar_section( $name, $slug, $icon = '' ) { + + $default_classes = [ + 'wpforms-panel-sidebar-section', + 'wpforms-panel-sidebar-section-' . $slug, + ]; + + if ( $slug === 'default' ) { + $default_classes[] = 'default'; + } + + if ( ! empty( $icon ) ) { + $default_classes[] = 'icon'; + } + + /** + * Allow adding custom CSS classes to a sidebar section in the Form Builder. + * + * @since 1.7.7.2 + * + * @param array $classes Sidebar section classes. + * @param string $name Sidebar section name. + * @param string $slug Sidebar section slug. + * @param string $icon Sidebar section icon. + */ + $classes = (array) apply_filters( 'wpforms_builder_panel_sidebar_section_classes', [], $name, $slug, $icon ); + $classes = array_merge( $default_classes, $classes ); + + echo ''; + + if ( ! empty( $icon ) ) { + echo ''; + } + + echo esc_html( $name ); + + echo ''; + + echo ''; + } + + /** + * Output the panel's primary content. + * + * @since 1.0.0 + */ + public function panel_content() { + } + + /** + * Error message for a corrupted form. + * + * @since 1.9.7 + */ + private function form_corrupted_message(): void { + ?> + +
              +
              +

              + +

              +
              +
              +

              + Form Revisions.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + ], + ] + ) + ); + ?> +

              +
              +

              + please contact support.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/account/support/', 'Corrupted Form Data' ) ) + ); + ?> +

              +
              +
              + name = esc_html__( 'Fields', 'wpforms-lite' ); + $this->slug = 'fields'; + $this->icon = 'fa-list-alt'; + $this->order = 10; + $this->sidebar = true; + + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.8 + * + * @return void + */ + private function hooks(): void { + + if ( ! $this->form ) { + return; + } + + add_action( 'wpforms_builder_fields', [ $this, 'search' ], 5 ); + add_action( 'wpforms_builder_fields', [ $this, 'fields' ] ); + add_action( 'wpforms_builder_fields_options', [ $this, 'fields_options' ] ); + add_action( 'wpforms_builder_preview', [ $this, 'preview' ] ); + + // Template for form builder previews. + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'field_preview_templates' ] ); + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'choices_limit_message_template' ] ); + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'choices_empty_message_template' ] ); + } + + /** + * Enqueue assets for the Fields panel. + * + * @since 1.0.0 + * @since 1.6.8 All the builder stylesheets enqueues moved to the `\WPForms_Builder::enqueues()`. + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-drag-fields', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/drag-fields{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + + wp_enqueue_script( + 'wpforms-builder-search-fields', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/search-fields{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + } + + /** + * Output the Field panel sidebar. + * + * @since 1.0.0 + */ + public function panel_sidebar() { + + // Sidebar contents are not valid unless we have a form. + if ( ! $this->form ) { + return; + } + ?> + + +
              + form ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ?> +
              + +
              + form ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ?> +
              + form ) { + echo '
              '; + echo wp_kses( + __( 'You need to setup your form before you can manage the fields.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + 'data-panel' => [], + ], + ] + ); + echo '
              '; + + return; + } + + ?> + +
              + +
              + +
              +
              +

              + form_data['settings']['form_title'] ?? $this->form->post_title ); ?> +

              + + form_data['settings']['form_desc'] ?? $this->form->post_excerpt, + wpforms_builder_preview_get_allowed_tags() + ); + ?> + +
              +
              + + form_data ); + ?> + +
              + no_fields_options(); ?> + no_fields_preview(); ?> +
              + +
              + form ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ?> +
              + + + +
              +
              +
              + + + +
              +
              +

              hCaptcha

              +

              reCAPTCHA

              +

              Turnstile

              +

              + +

              +
              +
              +
              + + form_data['settings']['submit_text'] ) ? $this->form_data['settings']['submit_text'] : esc_html__( 'Submit', 'wpforms-lite' ); + $submit_style = empty( $this->form_data['fields'] ) ? 'display: none;' : ''; + + printf( '

              ', esc_attr( $submit_style ), esc_attr( $submit ) ); + + /** This action is documented in includes/class-frontend.php. */ + do_action( 'wpforms_display_submit_after', $this->form_data, 'submit' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ?> + + form_data ); ?> +
              + +
              + + $group ) { + + usort( $group['fields'], [ $this, 'field_order' ] ); + + echo '
              '; + + echo ''; + + echo '' . esc_html( $group['group_name'] ) . ''; + + echo ''; + + echo ''; + + echo '
              '; + + foreach ( $group['fields'] as $field ) { + /** + * Attributes of the form field button on the Add Fields tab in the Form Builder. + * + * @since 1.5.1 + * + * @param array $attributes Field attributes. + * @param array $field Field data. + * @param array $form_data Form data. + */ + $atts = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_builder_field_button_attributes', + [ + 'id' => 'wpforms-add-fields-' . $field['type'], + 'class' => [ 'wpforms-add-fields-button' ], + 'data' => [ + 'field-type' => $field['type'], + ], + 'atts' => [], + ], + $field, + $this->form_data + ); + + if ( ! empty( $field['keywords'] ) ) { + $atts['data']['field-keywords'] = $field['keywords']; + } + + if ( ! empty( $field['class'] ) ) { + $atts['class'][] = $field['class']; + } + + echo ''; + } + + echo '
              '; + + echo '
              '; + } + } + + /** + * Editor Field Options. + * + * @since 1.0.0 + */ + public function fields_options(): void { + + // Check to make sure the form actually has fields created already. + if ( empty( $this->form_data['fields'] ) ) { + $this->no_fields_options(); + + return; + } + + $fields = $this->form_data['fields']; + + foreach ( $fields as $field ) { + + /** + * Filters the class attribute of the field option container in the Form Builder. + * + * @since 1.3.0 + * + * @param string $class Field option class. + * @param array $field Field data. + */ + $class = apply_filters( 'wpforms_builder_field_option_class', '', $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + printf( '
              ', sanitize_html_class( $field['type'] ), wpforms_sanitize_classes( $class ), (int) $field['id'], (int) $field['id'] ); + + printf( '', (int) $field['id'], (int) $field['id'] ); + + printf( '', (int) $field['id'], esc_attr( $field['type'] ) ); + + /** + * Fires after the field option container in the Form Builder. + * + * @since 1.0.0 + * + * @param array $field Field data. + */ + do_action( "wpforms_builder_fields_options_{$field['type']}", $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + echo '
              '; + } + } + + /** + * Editor preview (right pane). + * + * @since 1.0.0 + */ + public function preview(): void { + + // Check to make sure the form actually has fields created already. + if ( empty( $this->form_data['fields'] ) ) { + $this->no_fields_preview(); + + return; + } + + /** + * Filters the fields which must be displayed on the base level on the preview panel in the Form Builder. + * + * @since 1.7.7 + * + * @param array $fields Form fields data. + */ + $fields = (array) apply_filters( 'wpforms_builder_panel_fields_preview_fields', $this->form_data['fields'] ); + + foreach ( $fields as $field ) { + + $this->preview_single_field( + $field, + [] + ); + } + } + + /** + * Preview a single field. + * + * @since 1.7.7 + * + * @param array $field Field data. + * @param array $args Additional arguments. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function preview_single_field( $field, $args ): void { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $class = ! empty( $field['size'] ) ? 'size-' . esc_attr( $field['size'] ) : ''; + $class .= ! empty( $field['label_hide'] ) ? ' label_hide' : ''; + $class .= ! empty( $field['read_only'] ) ? ' readonly' : ''; + $class .= isset( $field['label'] ) && empty( $field['label'] ) && ! in_array( $field['type'], [ 'html', 'content' ], true ) ? ' label_empty' : ''; + $class .= ! empty( $field['sublabel_hide'] ) ? ' sublabel_hide' : ''; + $class .= ! empty( $field['required'] ) ? ' required' : ''; + $class .= isset( $field['meta']['delete'] ) && $field['meta']['delete'] === false ? ' no-delete' : ''; + $class .= isset( $field['meta']['duplicate'] ) && $field['meta']['duplicate'] === false ? ' no-duplicate' : ''; + + if ( ! empty( $field['input_columns'] ) ) { + $class .= $field['input_columns'] === '2' ? ' wpforms-list-2-columns' : ''; + $class .= $field['input_columns'] === '3' ? ' wpforms-list-3-columns' : ''; + $class .= $field['input_columns'] === 'inline' ? ' wpforms-list-inline' : ''; + } + + /** + * Filters class attribute of the field preview container in the Form Builder. + * + * @since 1.4.0 + * + * @param string $css Field preview class. + * @param array $field Field data. + */ + $class = apply_filters( 'wpforms_field_preview_class', $class, $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + if ( ! has_action( "wpforms_display_field_{$field['type']}" ) ) { + $this->unavailable_fields_preview( $field ); + + return; + } + + printf( + '
              ', + esc_attr( $field['type'] ), + esc_attr( $class ), + wpforms_validate_field_id( $field['id'] ) + ); + + /** + * Filters display the field duplicate button flag. + * + * @since 1.5.6.2 + * + * @param bool $display_duplicate_button Display field duplicate button flag. + * @param array $field Field data. + * @param array $form_data Form data. + */ + if ( apply_filters( 'wpforms_field_preview_display_duplicate_button', true, $field, $this->form_data ) ) { // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + printf( + '', + esc_attr__( 'Duplicate Field', 'wpforms-lite' ) + ); + } + + printf( + '', + esc_attr__( 'Delete Field', 'wpforms-lite' ) + ); + + if ( empty( $_COOKIE['wpforms_field_helper_hide'] ) ) { + printf( + '
              + %s + %s + + + +
              ', + esc_html__( 'Click to Edit', 'wpforms-lite' ), + esc_html__( 'Drag to Reorder', 'wpforms-lite' ), + esc_attr__( 'Hide Helper', 'wpforms-lite' ) + ); + } + + /** + * Fires after the field preview output in the Form Builder. + * + * @since 1.0.0 + * + * @param array $field Field data. + */ + do_action( "wpforms_builder_fields_previews_{$field['type']}", $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + echo '
              '; + } + + /** + * Generate HTML for hidden inputs from given data. + * + * @since 1.6.7 + * + * @param array $data Field array data. + * @param string $name Input name prefix. + */ + private function generate_hidden_inputs( $data = [], string $name = '' ): void { + + if ( ! is_array( $data ) || empty( $data ) ) { + return; + } + + foreach ( $data as $key => $value ) { + if ( $key === 'id' ) { + continue; + } + + $key = ! empty( $data['id'] ) ? sprintf( '[%s][%s]', $data['id'], $key ) : sprintf( '[%s]', $key ); + + if ( ! empty( $name ) ) { + $key = trim( $name ) . $key; + } + + if ( is_array( $value ) ) { + $this->generate_hidden_inputs( $value, $key ); + } else { + printf( "", esc_attr( $key ), esc_attr( $value ) ); + } + } + } + + /** + * Unavailable builder field display. + * + * @since 1.6.7 + * + * @param array $field Field array data. + * + * @noinspection HtmlUnknownTarget + */ + public function unavailable_fields_preview( array $field ): void { + + // Using ucwords() for certain fields may generate incorrect words. + switch ( $field['type'] ) { + case 'url': + $field_type = 'URL'; + break; + + case 'html': + $field_type = 'HTML'; + break; + + case 'gdpr-checkbox': + $field_type = 'GDPR Checkbox'; + break; + + default: + $field_type = ucwords( preg_replace( '/[_-]/', ' ', $field['type'] ) ); + } + + $warning_message = sprintf( /* translators: %s - unavailable field name. */ + esc_html__( 'Unfortunately, the %s field is not available and will be ignored on the front end.', 'wpforms-lite' ), + '' . $field_type . '' + ); + + $field_id = $field['id'] ?? 0; + + printf( + '
              ', + wpforms_validate_field_id( $field['id'] ) + ); + + printf( + '
              +

              %1$s

              +
              +
              + %3$s +
              ', + $warning_message, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'https://wpforms.com/docs/how-to-import-and-export-wpforms/#field-missing', + esc_html__( 'Learn More', 'wpforms-lite' ), + esc_attr__( 'Dismiss this message. The field will be deleted as well.', 'wpforms-lite' ), + wpforms_validate_field_id( $field_id ) + ); + + // Save unavailable fields data in hidden inputs. + $this->generate_hidden_inputs( $field, 'fields' ); + + echo '
              '; + } + + /** + * No fields options markup. + * + * @since 1.6.0 + */ + public function no_fields_options(): void { + + printf( + '

              %s

              ', + esc_html__( 'You don\'t have any fields yet.', 'wpforms-lite' ) + ); + } + + /** + * No fields preview placeholder markup. + * + * @since 1.6.0 + */ + public function no_fields_preview(): void { + + printf( + '
              +

              %1$s

              +

              %2$s

              +
              ', + esc_html__( 'You don\'t have any fields yet. Add some!', 'wpforms-lite' ), + esc_html__( 'Take your pick from our wide variety of fields and start building out your form!', 'wpforms-lite' ) + ); + } + + /** + * Sort Add Field buttons by order provided. + * + * @since 1.0.0 + * + * @param array $a First item. + * @param array $b Second item. + * + * @return int + */ + public function field_order( array $a, array $b ): int { + + return $a['order'] - $b['order']; + } + + /** + * Template for form builder preview. + * + * @since 1.4.5 + */ + public function field_preview_templates(): void { + + // Checkbox, Radio, and Payment Multiple/Checkbox field choices. + ?> + + + + + + +
              +
              + + + +
              + +
              +
              +
              +
              +
              + +
              +

              + +

              +
              +
              + name = esc_html__( 'Payments', 'wpforms-lite' ); + $this->slug = 'payments'; + $this->icon = 'fa-usd'; + $this->order = 10; + $this->sidebar = true; + } + + /** + * Output the Payments panel sidebar. + * + * @since 1.0.0 + */ + public function panel_sidebar() { + + // Sidebar contents are not valid unless we have a form. + if ( ! $this->form ) { + return; + } + + $this->panel_sidebar_section( esc_html__( 'Default', 'wpforms-lite' ), 'default' ); + + do_action( 'wpforms_payments_panel_sidebar', $this->form ); + } + + /** + * Output the Payments panel primary content. + * + * @since 1.0.0 + */ + public function panel_content() { + + // An array of all the active provider addons. + $payments_active = apply_filters( 'wpforms_payments_available', [] ); + + if ( ! $this->form ) { + + // Check if there is a form created. When no form has been created + // yet let the user know we need a form to setup a payment. + echo '
              '; + echo wp_kses( + __( 'You need to setup your form before you can manage these settings.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + 'data-panel' => [], + ], + ] + ); + echo '
              '; + + return; + } + + if ( empty( $payments_active ) ) { + + // Check for active payment addons. When no payment addons are + // activated let the user know they need to install/activate an + // addon to setup a payment. + echo '
              +
              +
              ' . esc_html__( 'Install Your Payment Integration', 'wpforms-lite' ) . '
              +

              ' . sprintf( + wp_kses( + /* translators: %s - addons page URL. */ + __( 'It seems you do not have any payment addons activated. You can head over to the Addons page to install and activate the addon for your payment service.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + ], + ] + ), + esc_url( admin_url( 'admin.php?page=wpforms-addons' ) ) + ) . + '

              +
              '; + + } else { + + // Everything is good - display default instructions. + echo '
              +
              +
              ' . esc_html__( 'Install Your Payment Integration', 'wpforms-lite' ) . '
              +

              ' . esc_html__( 'It seems you don\'t have any payment addons activated. Click one of the available addons and start accepting payments today!', 'wpforms-lite' ) . '

              +
              '; + } + + do_action( 'wpforms_payments_panel_content', $this->form ); + } +} +new WPForms_Builder_Panel_Payments(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-providers.php b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-providers.php new file mode 100755 index 00000000..939eb530 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-providers.php @@ -0,0 +1,154 @@ +name = esc_html__( 'Marketing', 'wpforms-lite' ); + $this->slug = 'providers'; + $this->icon = 'fa-bullhorn'; + $this->order = 10; + $this->sidebar = true; + } + + /** + * Enqueue assets for the Providers panel. + * + * @since 1.0.0 + * @since 1.6.8 All the builder stylesheets enqueues moved to the `\WPForms_Builder::enqueues()`. + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-providers', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/admin-builder-providers{$min}.js", + [ 'jquery', 'wpforms-builder' ], + WPFORMS_VERSION, + false + ); + + wp_localize_script( + 'wpforms-builder-providers', + 'wpforms_builder_providers', + [ + 'url' => esc_url( remove_query_arg( [ 'newform', 'section' ], add_query_arg( [ 'view' => 'providers' ] ) ) ), + 'confirm_save' => esc_html__( 'We need to save your progress to continue to the Marketing panel. Is that OK?', 'wpforms-lite' ), + 'confirm_connection' => esc_html__( 'Are you sure you want to delete this connection?', 'wpforms-lite' ), + /* translators: %s - connection type. */ + 'prompt_connection' => esc_html( sprintf( __( 'Enter a %s nickname', 'wpforms-lite' ), '%type%' ) ), + 'prompt_placeholder' => esc_html__( 'Eg: Newsletter Optin', 'wpforms-lite' ), + 'error_name' => esc_html__( 'You must provide a connection nickname.', 'wpforms-lite' ), + 'required_field' => esc_html__( 'Field required', 'wpforms-lite' ), + 'custom_fields_placeholder' => esc_html__( '--- Select Form Field ---', 'wpforms-lite' ), + ] + ); + } + + /** + * Output the Provider panel sidebar. + * + * @since 1.0.0 + */ + public function panel_sidebar() { + + // Sidebar contents are not valid unless we have a form. + if ( ! $this->form ) { + return; + } + + $this->panel_sidebar_section( esc_html__( 'Default', 'wpforms-lite' ), 'default' ); + + do_action( 'wpforms_providers_panel_sidebar', $this->form ); + } + + /** + * Output the Provider panel primary content. + * + * @since 1.0.0 + * + * @noinspection HtmlUnknownTarget + */ + public function panel_content() { + + if ( ! $this->form ) { + + // Check if there is a form created. + // When no form has been created yet let the user know, we need a form to set up a provider. + echo '
              '; + echo wp_kses( + __( 'You need to set up your form before you can manage these settings.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + 'data-panel' => [], + ], + ] + ); + echo '
              '; + + return; + } + + // An array of all the active provider addons. + $providers_active = wpforms_get_providers_available(); + + if ( empty( $providers_active ) ) { + + // Check for active provider addons. + // When no provider addons are activated, + // let the user know they need to install/activate an addon to set up a provider. + echo ''; + } else { + + // Everything is good - display default instructions. + echo '
              +
              +
              ' . esc_html__( 'Select Your Marketing Integration', 'wpforms-lite' ) . '
              +

              ' . esc_html__( /** @lang text */ 'Select your email marketing service provider or CRM from the options on the left. If you don\'t see your email marketing service listed, then let us know and we\'ll do our best to get it added as fast as possible.', 'wpforms-lite' ) . '

              +
              '; + } + + do_action( 'wpforms_providers_panel_content', $this->form ); + } +} + +new WPForms_Builder_Panel_Providers(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-revisions.php b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-revisions.php new file mode 100755 index 00000000..6f011e3d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-revisions.php @@ -0,0 +1,205 @@ +name = esc_html__( 'Revisions', 'wpforms-lite' ); + $this->slug = 'revisions'; + $this->icon = 'fa-history'; + $this->order = 10; + $this->sidebar = true; + + $this->title = $this->form && $this->form->post_type === 'wpforms-template' ? + __( 'Form Template Revisions', 'wpforms-lite' ) : + __( 'Form Revisions', 'wpforms-lite' ); + + $this->hooks(); + } + + /** + * Hook into WordPress lifecycle. + * + * @since 1.7.3 + */ + private function hooks() { + + // Add a notice above all panels if revision is loaded. + add_action( 'wpforms_builder_panels', [ $this, 'panel_notice' ], 100, 2 ); + } + + /** + * Primary panel button in the left panel navigation. + * + * @since 1.7.3 + * + * @param mixed $form The form object. + * @param string $view Current view/panel. + */ + public function button( $form, $view ) { + + $classes = 'wpforms-panel-revisions-button'; + + if ( $view === $this->slug ) { + $classes .= ' active'; + } + + $badge = ''; + + if ( $this->form && ! wp_revisions_enabled( $this->form ) && ! wpforms()->obj( 'revisions' )->panel_viewed() ) { + $badge = ' + + + + + '; + } + + printf( + '
              + ', + esc_attr( $classes ), + esc_attr( $this->slug ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $badge, + esc_attr( $this->icon ), + esc_html( $this->name ), + esc_html( $this->title ) + ); + } + + /** + * Output the Settings panel sidebar. + * + * @since 1.7.3 + */ + public function panel_sidebar() { + + // Sidebar contents are not valid unless we have a form. + if ( ! $this->form ) { + return; + } + + printf( + '
              +

              %s

              +

              %s

              +
              ', + esc_html( $this->title ), + esc_html__( 'Select a revision to roll back to that version. All changes, including settings, will be reverted.', 'wpforms-lite' ) + ); + + // Render a list of form revisions, including current version. All data is safe, escaped in the template. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms()->obj( 'revisions' )->render_revisions_list(); + + $revisions_to_keep = wp_revisions_to_keep( $this->form ); + + if ( $revisions_to_keep === 0 ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( 'builder/revisions/notice-disabled' ); + } + + if ( $revisions_to_keep > 0 ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'builder/revisions/notice-limited', + [ + 'revisions_to_keep' => $revisions_to_keep, + ], + true + ); + } + } + + /** + * Output revision notice above the panels. + * + * @since 1.7.3 + * + * @return void + */ + public function panel_notice() { + + $revision = wpforms()->obj( 'revisions' )->get_revision(); + + if ( ! $revision ) { + return; + } + + $restore_link = sprintf( + '%2$s', + esc_url( + wp_nonce_url( + wpforms()->obj( 'revisions' )->get_url( + [ + 'revision_id' => $revision->ID, + 'action' => 'restore_revision', + ] + ), + 'restore_revision', + 'wpforms_nonce' + ) + ), + __( 'Restore this revision', 'wpforms-lite' ) + ); + + $back_link = sprintf( + '%2$s', + esc_url( wpforms()->obj( 'revisions' )->get_url() ), + __( 'go back to the current version', 'wpforms-lite' ) + ); + + $message = sprintf( /* translators: %1$s - revision date, %2$s - revision time, %3$s - "Restore this revision" link, %4$s - "go back to the current version" link. */ + __( 'You’re currently viewing a form revision from %1$s at %2$s. %3$s or %4$s.', 'wpforms-lite' ), + wpforms()->obj( 'revisions' )->get_formatted_datetime( $revision->post_modified_gmt ), + wpforms()->obj( 'revisions' )->get_formatted_datetime( $revision->post_modified_gmt, 'time' ), + $restore_link, + $back_link + ); + + printf( + '
              +

              %s

              +
              ', + wp_kses( + $message, + [ + 'a' => [ + 'href' => [], + ], + ] + ) + ); + } +} + +new WPForms_Builder_Panel_Revisions(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-settings.php b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-settings.php new file mode 100755 index 00000000..4b8a4031 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-settings.php @@ -0,0 +1,385 @@ +name = esc_html__( 'Settings', 'wpforms-lite' ); + $this->slug = 'settings'; + $this->icon = 'fa-sliders'; + $this->order = 10; + $this->sidebar = true; + + /** + * Filters the form data for the form builder. + * + * @since 1.9.0 + * + * @param array $form_data Form data. + */ + $this->form_data = apply_filters( 'wpforms_builder_panel_settings_init_form_data', $this->form_data ); + } + + /** + * Output the Settings panel sidebar. + * + * @since 1.0.0 + */ + public function panel_sidebar() { + + // Sidebar contents are not valid unless we have a form. + if ( ! $this->form ) { + return; + } + + $sections = [ + 'general' => esc_html__( 'General', 'wpforms-lite' ), + 'anti_spam' => esc_html__( 'Spam Protection and Security', 'wpforms-lite' ), + 'themes' => esc_html__( 'Themes', 'wpforms-lite' ), + 'notifications' => esc_html__( 'Notifications', 'wpforms-lite' ), + 'confirmation' => esc_html__( 'Confirmations', 'wpforms-lite' ), + ]; + + /** + * Filters builder settings sections. + * + * @since 1.1.9 + * + * @param array $sections Sections. + * @param array $form_data Form data. + * + * @return array + */ + $sections = (array) apply_filters( 'wpforms_builder_settings_sections', $sections, $this->form_data ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + foreach ( $sections as $slug => $section ) { + $this->panel_sidebar_section( $section, $slug ); + } + } + + /** + * Enqueue assets. + * + * @since 1.7.5 + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-settings', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/settings{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-builder-settings', + 'wpforms_builder_settings', + [ + 'choicesjs_config' => $this->get_choicesjs_config(), + 'all_tags_choices' => Tags::get_all_tags_choices(), + ] + ); + } + + /** + * Get Choices.js configuration. + * + * @since 1.7.5 + * + * @return array + */ + private function get_choicesjs_config(): array { + + $config = Tags::get_choicesjs_config(); + + $config['noResultsText'] = esc_html__( 'Press Enter or "," key to add new tag', 'wpforms-lite' ); + + return $config; + } + + /** + * Output the Settings panel primary content. + * + * @since 1.0.0 + */ + public function panel_content() { + + // Check if there is a form created. + if ( ! $this->form ) { + echo '
              '; + echo wp_kses( + __( 'You need to setup your form before you can manage the settings.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + 'data-panel' => [], + ], + ] + ); + echo '
              '; + + return; + } + + /* + * General. + */ + echo '
              '; + echo '
              '; + esc_html_e( 'General', 'wpforms-lite' ); + echo '
              '; + + wpforms_panel_field( + 'text', + 'settings', + 'form_title', + $this->form_data, + esc_html__( 'Form Name', 'wpforms-lite' ), + [ + 'default' => $this->form->post_title, + ] + ); + wpforms_panel_field( + 'textarea', + 'settings', + 'form_desc', + $this->form_data, + esc_html__( 'Form Description', 'wpforms-lite' ), + [ + 'tooltip' => esc_html__( 'Enter descriptive text or instructions to help your users understand the requirements of your form.', 'wpforms-lite' ), + 'input_class' => 'wpforms-smart-tags-enabled', + 'data' => [ + 'type' => 'all', + 'fields' => '', + ], + ] + ); + + if ( $this->form->post_type === 'wpforms-template' ) { + wpforms_panel_field( + 'textarea', + 'settings', + 'template_description', + $this->form_data, + esc_html__( 'Template Description', 'wpforms-lite' ), + [ + 'tooltip' => esc_html__( 'Describe the use case for your template. Only displayed internally.', 'wpforms-lite' ), + ] + ); + } + + $this->general_setting_tags(); + + wpforms_panel_field( + 'text', + 'settings', + 'submit_text', + $this->form_data, + esc_html__( 'Submit Button Text', 'wpforms-lite' ), + [ + 'default' => esc_html__( 'Submit', 'wpforms-lite' ), + ] + ); + wpforms_panel_field( + 'text', + 'settings', + 'submit_text_processing', + $this->form_data, + esc_html__( 'Submit Button Processing Text', 'wpforms-lite' ), + [ + 'tooltip' => esc_html__( 'Enter the submit button text you would like the button display while the form submit is processing.', 'wpforms-lite' ), + ] + ); + + $this->general_setting_advanced(); + + echo '
              '; + + /* + * Notifications. + */ + echo '
              '; + + /** + * Output notifications. + * + * @since 1.6.7.3 + * + * @param WPForms_Builder_Panel_Settings $settings Current settings. + */ + do_action( 'wpforms_form_settings_notifications', $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + echo '
              '; + + /* + * Confirmations. + */ + echo '
              '; + + /** + * Output confirmations. + * + * @since 1.6.7.3 + * + * @param WPForms_Builder_Panel_Settings $settings Current settings. + */ + do_action( 'wpforms_form_settings_confirmations', $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + echo '
              '; + + /** + * Output custom panels. + * + * @since 1.6.7.3 + * + * @param WPForms_Builder_Panel_Settings $settings Current settings. + */ + do_action( 'wpforms_form_settings_panel_content', $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Output the Tags setting. + * + * @since 1.7.5 + */ + private function general_setting_tags() { + + $form_tags = []; + + if ( ! empty( $this->form_data['settings']['form_tags'] ) ) { + $form_tags = get_terms( + [ + 'taxonomy' => WPForms_Form_Handler::TAGS_TAXONOMY, + 'name' => $this->form_data['settings']['form_tags'], + 'hide_empty' => false, + ] + ); + $form_tags = is_wp_error( $form_tags ) ? [] : (array) $form_tags; + } + + $tags_value = wp_list_pluck( $form_tags, 'term_id' ); + $tags_options = wp_list_pluck( $form_tags, 'name', 'term_id' ); + + wpforms_panel_field( + 'select', + 'settings', + 'form_tags', + $this->form_data, + esc_html__( 'Tags', 'wpforms-lite' ), + [ + 'options' => $tags_options, + 'value' => $tags_value, + 'multiple' => true, + 'tooltip' => esc_html__( 'Mark form with the tags. To create a new tag, simply type it and press Enter.', 'wpforms-lite' ), + ] + ); + } + + /** + * Output the *CAPTCHA settings. + * + * @since 1.6.8 + * + * @noinspection HtmlUnknownTarget + */ + private function general_setting_advanced() { + + ob_start(); + + wpforms_panel_field( + 'text', + 'settings', + 'form_class', + $this->form_data, + esc_html__( 'Form CSS Class', 'wpforms-lite' ), + [ + 'tooltip' => esc_html__( 'Enter CSS class names for the form wrapper. Multiple class names should be separated with spaces.', 'wpforms-lite' ), + ] + ); + + wpforms_panel_field( + 'text', + 'settings', + 'submit_class', + $this->form_data, + esc_html__( 'Submit Button CSS Class', 'wpforms-lite' ), + [ + 'tooltip' => esc_html__( 'Enter CSS class names for the form submit button. Multiple names should be separated with spaces.', 'wpforms-lite' ), + ] + ); + + wpforms_panel_field( + 'toggle', + 'settings', + 'dynamic_population', + $this->form_data, + esc_html__( 'Enable Prefill by URL', 'wpforms-lite' ), + [ + 'tooltip' => sprintf( + '%2$s', + wpforms_utm_link( 'https://wpforms.com/developers/how-to-enable-dynamic-field-population/', 'Builder Settings', 'Prefill by URL Tooltip' ), + esc_html__( 'How to use Prefill by URL', 'wpforms-lite' ) + ), + ] + ); + + wpforms_panel_field( + 'toggle', + 'settings', + 'ajax_submit', + $this->form_data, + esc_html__( 'Enable AJAX form submission', 'wpforms-lite' ), + [ + 'tooltip' => esc_html__( 'Enables form submission without page reload.', 'wpforms-lite' ), + ] + ); + + /** + * Fires after general settings. + * + * @since 1.0.2 + * + * @param WPForms_Builder_Panel_Settings $settings Current settings. + */ + do_action( 'wpforms_form_settings_general', $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + // Wrap advanced settings to the unfoldable group. + wpforms_panel_fields_group( + ob_get_clean(), + [ + 'borders' => [ 'top' ], + 'unfoldable' => true, + 'group' => 'settings_advanced', + 'title' => esc_html__( 'Advanced', 'wpforms-lite' ), + ] + ); + } +} + +new WPForms_Builder_Panel_Settings(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-setup.php b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-setup.php new file mode 100755 index 00000000..ebef068d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/builder/panels/class-setup.php @@ -0,0 +1,132 @@ +name = esc_html__( 'Setup', 'wpforms-lite' ); + $this->slug = 'setup'; + $this->icon = 'fa-cog'; + $this->order = 5; + $this->on_demand = true; + + $this->addons_obj = wpforms()->obj( 'addons' ); + } + + /** + * Enqueue assets for the Setup panel. + * + * @since 1.0.0 + * @since 1.6.8 All the builder stylesheets enqueues moved to the `\WPForms_Builder::enqueues()`. + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-setup', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/setup{$min}.js", + [ 'wpforms-builder', 'listjs' ], + WPFORMS_VERSION, + true + ); + } + + /** + * Output the Settings panel primary content. + * + * @since 1.0.0 + * + * @noinspection HtmlUnknownTarget + */ + public function panel_content() { + + ?> +
              + + +
              + +
              + + +
              + +

              + blank form or create your own.', 'wpforms-lite' ), + [ + 'strong' => [], + 'a' => [ + 'href' => [], + 'class' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-create-a-custom-form-template/', 'builder-templates', 'Create Your Own Template Documentation' ) ) + ); + + if ( AIHelpers::is_disabled() ) { + echo ' '; + printf( + wp_kses( /* translators: %1$s - create a template doc link, %2$s - Contact us page link. */ + __( 'Have a suggestion for a new template? We’d love to hear it!', 'wpforms-lite' ), + [ + 'strong' => [], + 'a' => [ + 'href' => [], + 'class' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/form-template-suggestion/', 'builder-templates', 'Suggest a Template' ) ) + ); + } + ?> +

              + + output_templates_content(); + + /** + * Fires after WPForms builder setup panel. + * + * @since 1.0.6 + */ + do_action( 'wpforms_setup_panel_after' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } +} + +new WPForms_Builder_Panel_Setup(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/class-about.php b/wp-content/plugins/wpforms-lite/includes/admin/class-about.php new file mode 100755 index 00000000..bc714db6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/class-about.php @@ -0,0 +1,1820 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.2.3 + */ + private function hooks(): void { + + // Maybe load tools page. + add_action( 'admin_init', [ $this, 'init' ] ); + } + + /** + * Determining if the user is viewing our page, if so, party on. + * + * @since 1.5.0 + */ + public function init(): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Check what page we are on. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + + // Only load if we are actually on the settings page. + if ( $page !== self::SLUG ) { + return; + } + + /* + * Define the core views for our tab. + */ + $about_us = esc_html__( 'About Us', 'wpforms-lite' ); + $getting_started = esc_html__( 'Getting Started', 'wpforms-lite' ); + + /** + * Filter the views for the About Us tab. + * + * @since 1.5.0 + * + * @param array $views Array of views. + */ + $this->views = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_admin_about_views', + [ + $about_us => [ 'about' ], + $getting_started => [ 'getting-started' ], + ] + ); + + $license = $this->get_license_type(); + + if ( + ( + $license === 'pro' || + ! in_array( $license, self::$licenses_pro_and_top, true ) + ) || + wpforms_debug() + ) { + $vs_tab_name = sprintf( /* translators: %1$s - current license type, %2$s - suggested license type. */ + esc_html__( '%1$s vs %2$s', 'wpforms-lite' ), + ucfirst( $license ), + $this->get_next_license( $license ) + ); + + $this->views[ $vs_tab_name ] = [ 'versus' ]; + } + + // Determine the current active settings tab. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $this->view = ! empty( $_GET['view'] ) ? sanitize_text_field( wp_unslash( $_GET['view'] ) ) : self::DEFAULT_TAB; + + // If the user tries to load an invalid view - fallback to About Us. + if ( + ! has_action( 'wpforms_admin_about_display_tab_' . sanitize_key( $this->view ) ) && + ! in_array( $this->view, array_merge( ...array_values( $this->views ) ), true ) + ) { + $this->view = self::DEFAULT_TAB; + } + + add_action( 'wpforms_admin_page', [ $this, 'output' ] ); + + /** + * Fires on the About WPForms admin page init after main classes/methods initiation. + * + * Used by addons to hook into About page initialization. + * + * @since 1.5.0 + */ + do_action( 'wpforms_admin_about_init' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Output the basic page structure. + * + * @since 1.5.0 + * + * @noinspection HtmlUnknownTarget + */ + public function output(): void { + + $show_nav = false; + + foreach ( $this->views as $view ) { + if ( in_array( $this->view, (array) $view, true ) ) { + $show_nav = true; + + break; + } + } + + ?> +
              + '; + foreach ( $this->views as $label => $view ) { + $class = in_array( $this->view, $view, true ) ? 'active' : ''; + + echo '
            • '; + printf( + '%3$s', + esc_url( admin_url( 'admin.php?page=' . self::SLUG . '&view=' . sanitize_key( $view[0] ) ) ), + esc_attr( $class ), + esc_html( $label ) + ); + echo '
            • '; + } + echo ''; + } + + ?> +

              + view ) { + case 'about': + $this->output_about(); + break; + + case 'getting-started': + $this->output_getting_started(); + break; + + case 'versus': + $this->output_versus(); + break; + + default: + /** + * Display custom tab content in the About WPForms admin page. + * The variable part of the hook name is the current tab view being displayed. + * + * @since 1.5.0 + */ + do_action( 'wpforms_admin_about_display_tab_' . sanitize_key( $this->view ) ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + break; + } + + ?> +
              + output_about_info(); + $this->output_about_addons(); + } + + /** + * Display the General Info section of the About tab. + * + * @since 1.5.8 + * + * @noinspection HtmlUnknownTarget + */ + protected function output_about_info(): void { + + ?> +
              +
              +

              + +

              +

              + +

              +

              + +

              +

              + WPBeginner, the most popular lead-generation software, OptinMonster, the best WordPress analytics plugin, MonsterInsights, and more!', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + 'https://www.wpbeginner.com/?utm_source=wpformsplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpforms', + 'https://optinmonster.com/?utm_source=wpformsplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpforms', + 'https://www.monsterinsights.com/?utm_source=wpformsplugin&utm_medium=pluginaboutpage&utm_campaign=aboutwpforms' + ); + ?> +

              +

              + +

              +
              + +
              +
              + <?php esc_attr_e( 'The WPForms Team photo', 'wpforms-lite' ); ?> +
              +
              +
              +
              +
              +
              + get_am_plugins(); + $can_install_plugins = wpforms_can_install( 'plugin' ); + $can_activate_plugins = wpforms_can_activate( 'plugin' ); + + ?> +
              +
              + $details ) : + $plugin_data = $this->get_plugin_data( $plugin, $details, $all_plugins ); + $plugin_ready_to_activate = $can_activate_plugins + && isset( $plugin_data['status_class'] ) + && $plugin_data['status_class'] === 'status-installed'; + $plugin_not_activated = ! isset( $plugin_data['status_class'] ) + || $plugin_data['status_class'] !== 'status-active'; + + ?> +
              +
              +
              + <?php echo esc_attr( $plugin_data['details']['name'] ); ?> +
              + +
              +

              + +

              +
              +
              +
              + + ' . wp_kses_post( $plugin_data['status_text'] ) . '' + ); + ?> + +
              +
              + + + + + + + + +
              +
              +
              +
              + +
              +
              + get_license_type(); + $utm_campaign = $license === 'lite' ? 'liteplugin' : 'plugin'; + + $links = [ + 'add-new' => "https://wpforms.com/docs/creating-first-form/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Add a New Form#add-new", + 'customize-fields' => "https://wpforms.com/docs/creating-first-form/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Customize Form Fields#customize-fields", + 'display-form' => "https://wpforms.com/docs/creating-first-form/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Display Forms on Your Site#display-form", + 'right-form-field' => "https://wpforms.com/docs/how-to-choose-the-right-form-field-for-your-forms/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Choose the Right Form Field", + 'complete-guide' => "https://wpforms.com/docs/a-complete-guide-to-wpforms-settings/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=A Complete Guide to WPForms Settings", + 'gdpr-compliant' => "https://wpforms.com/docs/how-to-create-gdpr-compliant-forms/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Create GDPR Complaint Forms", + 'install-activate-addons' => "https://wpforms.com/docs/install-activate-wpforms-addons/?utm_source=WordPress&utm_medium=wpforms-about-page&utm_campaign={$utm_campaign}&utm_content=How to Install and Activate WPForms Addons", + ]; + ?> + +
              + +
              + +

              + +

              + +

              + +

              + +

              + +

              + +

              + +

              + + + +
              + +
              + +
              + +
              + + +
              + +
              +

              + +

              + +

              + Upgrade to WPForms Pro to unlock all the awesome features and experience
              why WPForms is consistently rated the best WordPress form builder.', 'wpforms-lite' ), + [ + 'br' => [], + 'strong' => [], + ] + ); + ?> +

              + +

              + 13,000+ five star ratings (%s) and is active on over 6 million websites.', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ), + '' . + '' . + '' . + '' . + '' + ); + ?> +

              +
              + +
              +
              +
              +
                +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              +
              +
              +
                +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              +
              +
              + +
              + +

              + %2$s', + esc_url( wpforms_admin_upgrade_link( 'wpforms-about-page', 'Get WPForms Pro Today' ) ), + esc_html__( 'Get WPForms Pro Today and Unlock all the Powerful Features', 'wpforms-lite' ) + ); + + ?> +

              + + +

              + 50% off regular price, automatically applied at checkout.', 'wpforms-lite' ), + [ + 'span' => [ + 'class' => [], + ], + ] + ); + ?> +

              + +
              + +
              + + +
              +
              + +
              +
              +

              + +

              + +

              + +

              + + + + +
              +
              + +
              +
              + +
              +
              +

              + +

              + +

              + +

              + + + + +
              +
              + +
              +
              + +
              +
              +

              + +

              + +

              + +

              + + + + +
              +
              + +
              +
              + +
              +
              +

              + +

              + +

              + +

              + + + + +
              +
              + + 'Pro', + 'Basic' => 'Pro', + 'Plus' => 'Pro', + 'Pro' => 'Elite', + ]; + + return $license_pairs[ $current ] ?? 'Elite'; + } + + /** + * Display the Versus tab content. + * + * @since 1.5.0 + * + * @noinspection HtmlUnknownTarget + */ + protected function output_versus(): void { + + $license = $this->get_license_type(); + $next_license = $this->get_next_license( $license ); + + ?> +
              +

              + vs +

              + +

              + +

              +
              + +
              +
              +
              +

              + +

              +
              +
              +

              + +

              +
              +
              +

              + +

              +
              +
              +
              + + get_licenses_features_list() as $slug => $name ) { + $current = $this->get_license_data( $slug, $license ); + $next = $this->get_license_data( $slug, strtolower( $next_license ) ); + + if ( empty( $current ) || empty( $next ) ) { + continue; + } + + $current_status = $current['status']; + + if ( $current['text'] !== $next['text'] && $current_status === 'full' ) { + $current_status = 'partial'; + } + ?> + + + + + + +
              +

              +
              + +

              + ', $current['text'] ) ); ?> +

              + +
              + +

              + ', $next['text'] ) ); ?> +

              + +
              +
              +
              + +
              +
              +

              + %2$s', + esc_url( wpforms_admin_upgrade_link( 'wpforms-about-page', 'Get WPForms Pro Today' ) ), + sprintf( /* translators: %s - next license level. */ + esc_html__( 'Get WPForms %s Today and Unlock all the Powerful Features', 'wpforms-lite' ), + esc_html( $next_license ) + ) + ); + ?> +

              + + +

              + 50% off regular price, automatically applied at checkout.', 'wpforms-lite' ), + [ + 'span' => [ + 'class' => [], + ], + ] + ); + ?> +

              + +
              +
              + [ + 'icon' => $images_url . 'plugin-om.png', + 'name' => esc_html__( 'OptinMonster', 'wpforms-lite' ), + 'desc' => esc_html__( 'Instantly get more subscribers, leads, and sales with the #1 conversion optimization toolkit. Create high converting popups, announcement bars, spin a wheel, and more with smart targeting and personalization.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/optinmonster/', + 'url' => 'https://downloads.wordpress.org/plugin/optinmonster.zip', + ], + + 'google-analytics-for-wordpress/googleanalytics.php' => [ + 'icon' => $images_url . 'plugin-mi.png', + 'name' => esc_html__( 'MonsterInsights', 'wpforms-lite' ), + 'desc' => esc_html__( 'The leading WordPress analytics plugin that shows you how people find and use your website, so you can make data driven decisions to grow your business. Properly set up Google Analytics without writing code.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/google-analytics-for-wordpress/', + 'url' => 'https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.zip', + 'pro' => [ + 'plug' => 'google-analytics-premium/googleanalytics-premium.php', + 'icon' => $images_url . 'plugin-mi.png', + 'name' => esc_html__( 'MonsterInsights Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'The leading WordPress analytics plugin that shows you how people find and use your website, so you can make data driven decisions to grow your business. Properly set up Google Analytics without writing code.', 'wpforms-lite' ), + 'url' => 'https://www.monsterinsights.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'wp-mail-smtp/wp_mail_smtp.php' => [ + 'icon' => $images_url . 'plugin-smtp.png', + 'name' => esc_html__( 'WP Mail SMTP', 'wpforms-lite' ), + 'desc' => esc_html__( "Improve your WordPress email deliverability and make sure that your website emails reach user's inbox with the #1 SMTP plugin for WordPress. Over 3 million websites use it to fix WordPress email issues.", 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/wp-mail-smtp/', + 'url' => 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip', + 'pro' => [ + 'plug' => 'wp-mail-smtp-pro/wp_mail_smtp.php', + 'icon' => $images_url . 'plugin-smtp.png', + 'name' => esc_html__( 'WP Mail SMTP Pro', 'wpforms-lite' ), + 'desc' => esc_html__( "Improve your WordPress email deliverability and make sure that your website emails reach user's inbox with the #1 SMTP plugin for WordPress. Over 3 million websites use it to fix WordPress email issues.", 'wpforms-lite' ), + 'url' => 'https://wpmailsmtp.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'all-in-one-seo-pack/all_in_one_seo_pack.php' => [ + 'icon' => $images_url . 'plugin-aioseo.png', + 'name' => esc_html__( 'AIOSEO', 'wpforms-lite' ), + 'desc' => esc_html__( "The original WordPress SEO plugin and toolkit that improves your website's search rankings. Comes with all the SEO features like Local SEO, WooCommerce SEO, sitemaps, SEO optimizer, schema, and more.", 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/all-in-one-seo-pack/', + 'url' => 'https://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip', + 'pro' => [ + 'plug' => 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php', + 'icon' => $images_url . 'plugin-aioseo.png', + 'name' => esc_html__( 'AIOSEO Pro', 'wpforms-lite' ), + 'desc' => esc_html__( "The original WordPress SEO plugin and toolkit that improves your website's search rankings. Comes with all the SEO features like Local SEO, WooCommerce SEO, sitemaps, SEO optimizer, schema, and more.", 'wpforms-lite' ), + 'url' => 'https://aioseo.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'coming-soon/coming-soon.php' => [ + 'icon' => $images_url . 'plugin-seedprod.png', + 'name' => esc_html__( 'SeedProd', 'wpforms-lite' ), + 'desc' => esc_html__( 'The fastest drag & drop landing page builder for WordPress. Create custom landing pages without writing code, connect them with your CRM, collect subscribers, and grow your audience. Trusted by 1 million sites.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/coming-soon/', + 'url' => 'https://downloads.wordpress.org/plugin/coming-soon.zip', + 'pro' => [ + 'plug' => 'seedprod-coming-soon-pro-5/seedprod-coming-soon-pro-5.php', + 'icon' => $images_url . 'plugin-seedprod.png', + 'name' => esc_html__( 'SeedProd Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'The fastest drag & drop landing page builder for WordPress. Create custom landing pages without writing code, connect them with your CRM, collect subscribers, and grow your audience. Trusted by 1 million sites.', 'wpforms-lite' ), + 'url' => 'https://www.seedprod.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'rafflepress/rafflepress.php' => [ + 'icon' => $images_url . 'plugin-rp.png', + 'name' => esc_html__( 'RafflePress', 'wpforms-lite' ), + 'desc' => esc_html__( 'Turn your website visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with the most powerful giveaways & contests plugin for WordPress.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/rafflepress/', + 'url' => 'https://downloads.wordpress.org/plugin/rafflepress.zip', + 'pro' => [ + 'plug' => 'rafflepress-pro/rafflepress-pro.php', + 'icon' => $images_url . 'plugin-rp.png', + 'name' => esc_html__( 'RafflePress Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'Turn your website visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with the most powerful giveaways & contests plugin for WordPress.', 'wpforms-lite' ), + 'url' => 'https://rafflepress.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'pushengage/main.php' => [ + 'icon' => $images_url . 'plugin-pushengage.png', + 'name' => esc_html__( 'PushEngage', 'wpforms-lite' ), + 'desc' => esc_html__( 'Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 15 billion notifications each month.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/pushengage/', + 'url' => 'https://downloads.wordpress.org/plugin/pushengage.zip', + ], + + 'instagram-feed/instagram-feed.php' => [ + 'icon' => $images_url . 'plugin-sb-instagram.png', + 'name' => esc_html__( 'Smash Balloon Instagram Feeds', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display Instagram content on your WordPress site without writing any code. Comes with multiple templates, ability to show content from multiple accounts, hashtags, and more. Trusted by 1 million websites.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/instagram-feed/', + 'url' => 'https://downloads.wordpress.org/plugin/instagram-feed.zip', + 'pro' => [ + 'plug' => 'instagram-feed-pro/instagram-feed.php', + 'icon' => $images_url . 'plugin-sb-instagram.png', + 'name' => esc_html__( 'Smash Balloon Instagram Feeds Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display Instagram content on your WordPress site without writing any code. Comes with multiple templates, ability to show content from multiple accounts, hashtags, and more. Trusted by 1 million websites.', 'wpforms-lite' ), + 'url' => 'https://smashballoon.com/instagram-feed/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'custom-facebook-feed/custom-facebook-feed.php' => [ + 'icon' => $images_url . 'plugin-sb-fb.png', + 'name' => esc_html__( 'Smash Balloon Facebook Feeds', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display Facebook content on your WordPress site without writing any code. Comes with multiple templates, ability to embed albums, group content, reviews, live videos, comments, and reactions.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/custom-facebook-feed/', + 'url' => 'https://downloads.wordpress.org/plugin/custom-facebook-feed.zip', + 'pro' => [ + 'plug' => 'custom-facebook-feed-pro/custom-facebook-feed.php', + 'icon' => $images_url . 'plugin-sb-fb.png', + 'name' => esc_html__( 'Smash Balloon Facebook Feeds Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display Facebook content on your WordPress site without writing any code. Comes with multiple templates, ability to embed albums, group content, reviews, live videos, comments, and reactions.', 'wpforms-lite' ), + 'url' => 'https://smashballoon.com/custom-facebook-feed/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'feeds-for-youtube/youtube-feed.php' => [ + 'icon' => $images_url . 'plugin-sb-youtube.png', + 'name' => esc_html__( 'Smash Balloon YouTube Feeds', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display YouTube videos on your WordPress site without writing any code. Comes with multiple layouts, ability to embed live streams, video filtering, ability to combine multiple channel videos, and more.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/feeds-for-youtube/', + 'url' => 'https://downloads.wordpress.org/plugin/feeds-for-youtube.zip', + 'pro' => [ + 'plug' => 'youtube-feed-pro/youtube-feed.php', + 'icon' => $images_url . 'plugin-sb-youtube.png', + 'name' => esc_html__( 'Smash Balloon YouTube Feeds Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display YouTube videos on your WordPress site without writing any code. Comes with multiple layouts, ability to embed live streams, video filtering, ability to combine multiple channel videos, and more.', 'wpforms-lite' ), + 'url' => 'https://smashballoon.com/youtube-feed/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'custom-twitter-feeds/custom-twitter-feed.php' => [ + 'icon' => $images_url . 'plugin-sb-twitter.png', + 'name' => esc_html__( 'Smash Balloon Twitter Feeds', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display Twitter content in WordPress without writing any code. Comes with multiple layouts, ability to combine multiple Twitter feeds, Twitter card support, tweet moderation, and more.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/custom-twitter-feeds/', + 'url' => 'https://downloads.wordpress.org/plugin/custom-twitter-feeds.zip', + 'pro' => [ + 'plug' => 'custom-twitter-feeds-pro/custom-twitter-feed.php', + 'icon' => $images_url . 'plugin-sb-twitter.png', + 'name' => esc_html__( 'Smash Balloon Twitter Feeds Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'Easily display Twitter content in WordPress without writing any code. Comes with multiple layouts, ability to combine multiple Twitter feeds, Twitter card support, tweet moderation, and more.', 'wpforms-lite' ), + 'url' => 'https://smashballoon.com/custom-twitter-feeds/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'trustpulse-api/trustpulse.php' => [ + 'icon' => $images_url . 'plugin-trustpulse.png', + 'name' => esc_html__( 'TrustPulse', 'wpforms-lite' ), + 'desc' => esc_html__( 'Boost your sales and conversions by up to 15% with real-time social proof notifications. TrustPulse helps you show live user activity and purchases to help convince other users to purchase.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/trustpulse-api/', + 'url' => 'https://downloads.wordpress.org/plugin/trustpulse-api.zip', + ], + + 'searchwp/index.php' => [ + 'icon' => $images_url . 'plugin-searchwp.png', + 'name' => esc_html__( 'SearchWP', 'wpforms-lite' ), + 'desc' => esc_html__( 'The most advanced WordPress search plugin. Customize your WordPress search algorithm, reorder search results, track search metrics, and everything you need to leverage search to grow your business.', 'wpforms-lite' ), + 'wporg' => false, + 'url' => 'https://searchwp.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + + 'affiliate-wp/affiliate-wp.php' => [ + 'icon' => $images_url . 'plugin-affwp.png', + 'name' => esc_html__( 'AffiliateWP', 'wpforms-lite' ), + 'desc' => esc_html__( 'The #1 affiliate management plugin for WordPress. Easily create an affiliate program for your eCommerce store or membership site within minutes and start growing your sales with the power of referral marketing.', 'wpforms-lite' ), + 'wporg' => false, + 'url' => 'https://affiliatewp.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + + 'stripe/stripe-checkout.php' => [ + 'icon' => $images_url . 'plugin-wp-simple-pay.png', + 'name' => esc_html__( 'WP Simple Pay', 'wpforms-lite' ), + 'desc' => esc_html__( 'The #1 Stripe payments plugin for WordPress. Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart. No code required.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/stripe/', + 'url' => 'https://downloads.wordpress.org/plugin/stripe.zip', + 'pro' => [ + 'plug' => 'wp-simple-pay-pro-3/simple-pay.php', + 'icon' => $images_url . 'plugin-wp-simple-pay.png', + 'name' => esc_html__( 'WP Simple Pay Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'The #1 Stripe payments plugin for WordPress. Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart. No code required.', 'wpforms-lite' ), + 'url' => 'https://wpsimplepay.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + + 'easy-digital-downloads/easy-digital-downloads.php' => [ + 'icon' => $images_url . 'plugin-edd.png', + 'name' => esc_html__( 'Easy Digital Downloads', 'wpforms-lite' ), + 'desc' => esc_html__( 'The best WordPress eCommerce plugin for selling digital downloads. Start selling eBooks, software, music, digital art, and more within minutes. Accept payments, manage subscriptions, advanced access control, and more.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/easy-digital-downloads/', + 'url' => 'https://downloads.wordpress.org/plugin/easy-digital-downloads.zip', + ], + + 'sugar-calendar-lite/sugar-calendar-lite.php' => [ + 'icon' => $images_url . 'plugin-sugarcalendar.png', + 'name' => esc_html__( 'Sugar Calendar', 'wpforms-lite' ), + 'desc' => esc_html__( 'A simple & powerful event calendar plugin for WordPress that comes with all the event management features including payments, scheduling, timezones, ticketing, recurring events, and more.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/sugar-calendar-lite/', + 'url' => 'https://downloads.wordpress.org/plugin/sugar-calendar-lite.zip', + 'pro' => [ + 'plug' => 'sugar-calendar/sugar-calendar.php', + 'icon' => $images_url . 'plugin-sugarcalendar.png', + 'name' => esc_html__( 'Sugar Calendar Pro', 'wpforms-lite' ), + 'desc' => esc_html__( 'A simple & powerful event calendar plugin for WordPress that comes with all the event management features including payments, scheduling, timezones, ticketing, recurring events, and more.', 'wpforms-lite' ), + 'url' => 'https://sugarcalendar.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=About%20WPForms', + 'act' => 'go-to-url', + ], + ], + 'charitable/charitable.php' => [ + 'icon' => $images_url . 'plugin-charitable.png', + 'name' => esc_html__( 'Charitable', 'wpforms-lite' ), + 'desc' => esc_html__( 'Top-rated WordPress donation and fundraising plugin. Over 10,000+ non-profit organizations and website owners use Charitable to create fundraising campaigns and raise more money online.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/charitable/', + 'url' => 'https://downloads.wordpress.org/plugin/charitable.zip', + ], + 'insert-headers-and-footers/ihaf.php' => [ + 'icon' => $images_url . 'plugin-wpcode.png', + 'name' => esc_html__( 'WPCode', 'wpforms-lite' ), + 'desc' => esc_html__( 'Future proof your WordPress customizations with the most popular code snippet management plugin for WordPress. Trusted by over 1,500,000+ websites for easily adding code to WordPress right from the admin area.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/insert-headers-and-footers/', + 'url' => 'https://downloads.wordpress.org/plugin/insert-headers-and-footers.zip', + ], + 'duplicator/duplicator.php' => [ + 'icon' => $images_url . 'plugin-duplicator.png', + 'name' => esc_html__( 'Duplicator', 'wpforms-lite' ), + 'desc' => esc_html__( 'Leading WordPress backup & site migration plugin. Over 1,500,000+ smart website owners use Duplicator to make reliable and secure WordPress backups to protect their websites. It also makes website migration really easy.', 'wpforms-lite' ), + 'wporg' => 'https://wordpress.org/plugins/duplicator/', + 'url' => 'https://downloads.wordpress.org/plugin/duplicator.zip', + ], + ]; + } + + /** + * Get the array of data that compared the license data. + * + * @since 1.5.0 + * + * @param string $feature Feature name. + * @param string $license License type to get data for. + * + * @return array|false + */ + protected function get_license_data( string $feature, string $license ) { + + $data = [ + 'entries' => [ + 'lite' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Entries via Email Only', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Complete Entry Management inside WordPress', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Complete Entry Management inside WordPress', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Complete Entry Management inside WordPress', 'wpforms-lite' ) . '', + ], + ], + ], + 'fields' => [ + 'lite' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Standard and Payment Fields', 'wpforms-lite' ) . '', + esc_html__( 'Name, Email, Single Line Text, Paragraph Text, Dropdown, Multiple Choice, Checkboxes, Numbers, Number Slider, and Payment Fields (Single Item, Total, etc.)', 'wpforms-lite' ), + ], + ], + 'basic' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Access to all Standard, Fancy, and Payment Fields', 'wpforms-lite' ) . '', + esc_html__( 'Address, Phone, Website / URL, Date / Time, Password, File Upload, Layout, Rich Text, Content, HTML, Pagebreaks, Entry Preview, Section Dividers, Ratings, and Hidden Field', 'wpforms-lite' ), + ], + ], + 'plus' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Access to all Standard, Fancy, and Payment Fields', 'wpforms-lite' ) . '', + esc_html__( 'Address, Phone, Website / URL, Date / Time, Password, File Upload, Layout, Rich Text, Content, HTML, Pagebreaks, Entry Preview, Section Dividers, Ratings, and Hidden Field', 'wpforms-lite' ), + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Access to all Standard, Fancy, and Payment Fields', 'wpforms-lite' ) . '', + esc_html__( 'Address, Phone, Website / URL, Date / Time, Password, File Upload, Layout, Rich Text, Content, HTML, Pagebreaks, Entry Preview, Section Dividers, Ratings, and Hidden Field', 'wpforms-lite' ), + ], + ], + ], + 'conditionals' => [ + 'lite' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'Not available', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Powerful Form Logic for Building Smart Forms', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Powerful Form Logic for Building Smart Forms', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Powerful Form Logic for Building Smart Forms', 'wpforms-lite' ) . '', + ], + ], + ], + 'templates' => [ + 'lite' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Basic Form Templates', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Basic Form Templates', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Basic Form Templates', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . + sprintf( /* translators: %s - number of templates. */ + esc_html__( 'All Form Templates including Bonus %s pre-made form templates', 'wpforms-lite' ), + '2000+' + ) . + '', + ], + ], + ], + 'antispam' => [ + 'lite' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Basic Anti-Spam Settings', 'wpforms-lite' ) . '', + esc_html__( 'Basic Protection, reCAPTCHA, hCaptcha, Cloudflare Turnstile and Akismet', 'wpforms-lite' ), + ], + ], + 'basic' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Additional Anti-Spam Settings', 'wpforms-lite' ) . '', + esc_html__( 'Basic Protection, reCAPTCHA, hCaptcha, Cloudflare Turnstile, Akismet, Country Filter, Keyword Filter, and Custom Captcha', 'wpforms-lite' ), + ], + ], + 'plus' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Additional Anti-Spam Settings', 'wpforms-lite' ) . '', + esc_html__( 'Basic Protection, reCAPTCHA, hCaptcha, Cloudflare Turnstile, Akismet, Country Filter, Keyword Filter, and Custom Captcha', 'wpforms-lite' ), + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Additional Anti-Spam Settings', 'wpforms-lite' ) . '', + esc_html__( 'Basic Protection, reCAPTCHA, hCaptcha, Cloudflare Turnstile, Akismet, Country Filter, Keyword Filter, and Custom Captcha', 'wpforms-lite' ), + ], + ], + ], + 'marketing' => [ + 'lite' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Marketing Integration', 'wpforms-lite' ) . '', + esc_html__( 'Constant Contact only', 'wpforms-lite' ), + ], + ], + 'basic' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Marketing Integration', 'wpforms-lite' ) . '', + esc_html__( 'Constant Contact only', 'wpforms-lite' ), + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Additional Marketing Integrations', 'wpforms-lite' ) . '', + wpforms_list_array( + [ + 'Constant Contact', + 'Mailchimp', + 'AWeber', + 'GetResponse', + 'Campaign Monitor', + 'Brevo', + 'Drip', + 'MailerLite', + 'MailPoet', + 'Kit', + 'Slack', + 'Twilio', + ] + ), + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Additional Marketing Integrations', 'wpforms-lite' ) . '', + wpforms_list_array( + [ + 'Constant Contact', + 'Mailchimp', + 'AWeber', + 'GetResponse', + 'Campaign Monitor', + 'Brevo', + 'Drip', + 'MailerLite', + 'MailPoet', + 'Kit', + 'Slack', + 'Twilio', + 'Make', + 'n8n', + ] + ), + '', + wp_kses( + __( 'Bonus: 7000+ integrations with Zapier.', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ), + ], + ], + 'elite' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Marketing Integrations', 'wpforms-lite' ) . '', + wpforms_list_array( + [ + 'ActiveCampaign', + 'Constant Contact', + 'Mailchimp', + 'AWeber', + 'GetResponse', + 'Campaign Monitor', + 'Salesforce', + 'Brevo', + 'HubSpot', + 'Drip', + 'MailerLite', + 'MailPoet', + 'Kit', + 'Slack', + 'Twilio', + 'Pipedrive', + 'Make', + 'Zoho CRM', + 'n8n', + ] + ), + '', + wp_kses( + __( 'Bonus: 7000+ integrations with Zapier.', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ), + ], + ], + 'ultimate' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Marketing Integrations', 'wpforms-lite' ) . '', + wpforms_list_array( + [ + 'ActiveCampaign', + 'Constant Contact', + 'Mailchimp', + 'AWeber', + 'GetResponse', + 'Campaign Monitor', + 'Salesforce', + 'Brevo', + 'HubSpot', + 'Drip', + 'MailerLite', + 'MailPoet', + 'Kit', + 'Slack', + 'Twilio', + 'Pipedrive', + 'Make', + 'Zoho CRM', + 'n8n', + ] + ), + '', + wp_kses( + __( 'Bonus: 7000+ integrations with Zapier.', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ), + ], + ], + 'agency' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Marketing Integrations', 'wpforms-lite' ) . '', + wpforms_list_array( + [ + 'ActiveCampaign', + 'Constant Contact', + 'Mailchimp', + 'AWeber', + 'GetResponse', + 'Campaign Monitor', + 'Salesforce', + 'Brevo', + 'HubSpot', + 'Drip', + 'MailerLite', + 'MailPoet', + 'Kit', + 'Slack', + 'Twilio', + 'Pipedrive', + 'Make', + 'Zoho CRM', + 'n8n', + ] + ), + '', + wp_kses( + __( 'Bonus: 7000+ integrations with Zapier.', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ), + ], + ], + ], + 'payments' => [ + 'lite' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using Stripe and Square only', 'wpforms-lite' ), + ], + ], + 'basic' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using Stripe and Square only', 'wpforms-lite' ), + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using Stripe and Square only', 'wpforms-lite' ), + ], + ], + 'pro' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Create Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using PayPal Commerce, Stripe, Square, and PayPal Standard', 'wpforms-lite' ), + ], + ], + 'elite' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Create Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using PayPal Commerce, Stripe, Square, PayPal Standard, and Authorize.Net', 'wpforms-lite' ), + ], + ], + 'agency' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Create Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using PayPal Commerce, Stripe, Square, PayPal Standard, and Authorize.Net', 'wpforms-lite' ), + ], + ], + 'ultimate' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Create Payment Forms', 'wpforms-lite' ) . '', + esc_html__( 'Accept payments using PayPal Commerce, Stripe, Square, PayPal Standard, and Authorize.Net', 'wpforms-lite' ), + ], + ], + ], + 'surveys' => [ + 'lite' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'Not Available', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'Not Available', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'Not Available', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Create interactive Surveys and Polls with beautiful reports', 'wpforms-lite' ) . '', + ], + ], + ], + 'advanced' => [ + 'lite' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'No Advanced Features', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Advanced Features', 'wpforms-lite' ) . '', + esc_html__( 'Multi-page Forms, File Upload Forms, Multiple Form Notifications, File Upload and CSV Attachments, Conditional Form Confirmation', 'wpforms-lite' ), + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Limited Advanced Features', 'wpforms-lite' ) . '', + esc_html__( 'Multi-page Forms, File Upload Forms, Multiple Form Notifications, File Upload and CSV Attachments, Conditional Form Confirmation, Save and Resume Form', 'wpforms-lite' ), + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Advanced Features', 'wpforms-lite' ) . '', + esc_html__( 'Multi-page Forms, File Upload Forms, Multiple Form Notifications, File Upload and CSV Attachments, Conditional Form Confirmation, Custom CAPTCHA, Offline Forms, Signature Forms, Save and Resume Form, Coupons', 'wpforms-lite' ), + ], + ], + ], + 'addons' => [ + 'lite' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'No Addons Included', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'No Addons Included', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Email Marketing Addons included', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Pro Addons Included', 'wpforms-lite' ) . '', + $this->get_pro_addon_list(), + ], + ], + 'elite' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Addons Included', 'wpforms-lite' ) . '', + self::get_top_addons_list(), + ], + ], + 'ultimate' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Addons Included', 'wpforms-lite' ) . '', + self::get_top_addons_list(), + ], + ], + 'agency' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'All Addons Included', 'wpforms-lite' ) . '', + self::get_top_addons_list(), + ], + ], + ], + 'support' => [ + 'lite' => [ + 'status' => 'none', + 'text' => [ + '' . esc_html__( 'Limited Support', 'wpforms-lite' ) . '', + ], + ], + 'basic' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Standard Support', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( 'Standard Support', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Priority Support', 'wpforms-lite' ) . '', + ], + ], + 'elite' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Premium Support', 'wpforms-lite' ) . '', + ], + ], + 'ultimate' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Premium Support', 'wpforms-lite' ) . '', + ], + ], + 'agency' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Premium Support', 'wpforms-lite' ) . '', + ], + ], + ], + 'sites' => [ + 'basic' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( '1 Site', 'wpforms-lite' ) . '', + ], + ], + 'plus' => [ + 'status' => 'partial', + 'text' => [ + '' . esc_html__( '3 Sites', 'wpforms-lite' ) . '', + ], + ], + 'pro' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( '5 Sites', 'wpforms-lite' ) . '', + ], + ], + 'elite' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Unlimited Sites', 'wpforms-lite' ) . '', + ], + ], + 'ultimate' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Unlimited Sites', 'wpforms-lite' ) . '', + ], + ], + 'agency' => [ + 'status' => 'full', + 'text' => [ + '' . esc_html__( 'Unlimited Sites', 'wpforms-lite' ) . '', + ], + ], + ], + ]; + + // Wrong feature? + if ( ! isset( $data[ $feature ] ) ) { + return false; + } + + // Is a top level license? + $is_licenses_pro_and_top = in_array( $license, self::$licenses_pro_and_top, true ); + + // Wrong license type? + if ( ! isset( $data[ $feature ][ $license ] ) && ! $is_licenses_pro_and_top ) { + return false; + } + + // Some licenses have partial data. + return $data[ $feature ][ $license ] ?? ( $is_licenses_pro_and_top ? $data[ $feature ]['pro'] : $data[ $feature ][ $license ] ); + } + + /** + * Get the current installation license type (always lowercase). + * + * @since 1.5.0 + * + * @return string + */ + protected function get_license_type(): string { + + $type = wpforms_get_license_type(); + + return $type ? $type : 'lite'; + } + + /** + * Get the list of features for the licenses. + * + * @since 1.8.2.3 + * + * @return array + */ + private function get_licenses_features_list(): array { + + self::$licenses_features = [ + 'entries' => esc_html__( 'Form Entries', 'wpforms-lite' ), + 'fields' => esc_html__( 'Form Fields', 'wpforms-lite' ), + 'templates' => esc_html__( 'Form Templates', 'wpforms-lite' ), + 'antispam' => esc_html__( 'Spam Protection and Security', 'wpforms-lite' ), + 'conditionals' => esc_html__( 'Smart Conditional Logic', 'wpforms-lite' ), + 'marketing' => esc_html__( 'Marketing Integrations', 'wpforms-lite' ), + 'payments' => esc_html__( 'Payment Forms', 'wpforms-lite' ), + 'surveys' => esc_html__( 'Surveys & Polls', 'wpforms-lite' ), + 'advanced' => esc_html__( 'Advanced Form Features', 'wpforms-lite' ), + 'addons' => esc_html__( 'WPForms Addons', 'wpforms-lite' ), + 'support' => esc_html__( 'Customer Support', 'wpforms-lite' ), + 'sites' => esc_html__( 'Number of Sites', 'wpforms-lite' ), + ]; + + return self::$licenses_features; + } + + /** + * Get the list of addons included in Pro license. + * + * @since 1.9.8.3 + * + * @return string + */ + private function get_pro_addon_list(): string { + + static $pro_addons_list = null; + + if ( $pro_addons_list === null ) { + $pro_addons = Requirements::get_instance()->get_addons_by_license( 'basic, plus, pro' ); + $pro_addons_list = sprintf( + /* translators: %s - number of addons. */ + esc_html__( 'PDF, Calculations, Form Abandonment, Conversational Forms, Lead Forms, Frontend Post Submission, User Registration, Geolocation, Google Sheets, Coupons, Dropbox, Google Calendar, Google Drive, Airtable, Notion, and more (%1$s+ total)', 'wpforms-lite' ), + count( $pro_addons ) + ); + } + + return $pro_addons_list; + } + + /** + * Get the list of addons included in Elite, Ultimate, and Agency licenses. + * + * @since 1.9.8.3 + * + * @return string + */ + private static function get_top_addons_list(): string { + + static $top_addons_list = null; + + if ( $top_addons_list === null ) { + $pro_addons = Requirements::get_instance()->get_addons_by_license( Requirements::BASIC_PLUS_PRO_AND_TOP ); + $top_addons_list = sprintf( + /* translators: %s - number of addons. */ + esc_html__( 'PDF, Calculations, Form Abandonment, Conversational Forms, Lead Forms, Frontend Post Submission, User Registration, Geolocation, Webhooks, Google Sheets, Coupons, Dropbox, Google Calendar, Google Drive, Entry Automation, Airtable, Notion, and more (%1$s+ total)', 'wpforms-lite' ), + count( $pro_addons ) + ); + } + + return $top_addons_list; + } +} + +new WPForms_About(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/class-editor.php b/wp-content/plugins/wpforms-lite/includes/admin/class-editor.php new file mode 100755 index 00000000..d8370a24 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/class-editor.php @@ -0,0 +1,383 @@ +is_post_editor_page(), $editor_id ) ) { + return; + } + + // Setup the icon - currently using a dashicon. + $icon = ''; + + printf( + '', + esc_attr( $editor_id ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $icon, + esc_html__( 'Add Form', 'wpforms-lite' ) + ); + + $min = wpforms_get_min_suffix(); + + // If we have made it this far then load the JS. + wp_enqueue_script( + 'wpforms-editor', + WPFORMS_PLUGIN_URL . "assets/js/admin/admin-editor{$min}.js", + [ 'jquery' ], + WPFORMS_VERSION, + true + ); + + add_action( 'admin_footer', [ $this, 'shortcode_modal' ] ); + } + + /** + * Check if we are on the post editor admin page. + * + * @since 1.6.2 + * + * @returns boolean True if it is post editor admin page. + */ + public function is_post_editor_page() { + + if ( ! is_admin() ) { + return false; + } + + // get_current_screen() is loaded after 'admin_init' hook and may not exist yet. + if ( ! function_exists( 'get_current_screen' ) ) { + return false; + } + + $screen = get_current_screen(); + + return $screen !== null && $screen->parent_base === 'edit'; + } + + /** + * Modal window for inserting the form shortcode into TinyMCE. + * + * Thickbox is old and busted so we don't use that. Creating a custom view in + * Backbone would make me pull my hair out. So instead we offer a small clean + * modal that is based off of the WordPress insert link modal. + * + * @since 1.0.0 + */ + public function shortcode_modal() { + ?> + + + + hooks(); + } + + /** + * Hooks. + * + * @since 1.9.7.3 + * + * @return void + */ + private function hooks(): void { + + // Let's make some menus. + add_action( 'admin_menu', [ $this, 'register_menus' ], 9 ); + add_action( 'admin_head', [ $this, 'hide_wpforms_submenu_items' ] ); + add_action( 'admin_head', [ $this, 'adjust_pro_menu_item' ] ); + add_action( 'admin_head', [ $this, 'admin_menu_styles' ], 11 ); + + // Plugins page settings link. + add_filter( 'plugin_action_links_' . plugin_basename( WPFORMS_PLUGIN_DIR . 'wpforms.php' ), [ $this, 'settings_link' ], 10, 4 ); + + add_action( 'activated_plugin', [ $this, 'activated_rotation_plugin' ], 10, 2 ); + } + + /** + * Register our menus. + * + * @since 1.0.0 + */ + public function register_menus(): void { + + $manage_cap = wpforms_get_capability_manage_options(); + $access = wpforms()->obj( 'access' ); + + if ( ! $access || ! method_exists( $access, 'get_menu_cap' ) ) { + return; + } + + // Default Forms top level menu item. + add_menu_page( + esc_html__( 'WPForms', 'wpforms-lite' ), + esc_html__( 'WPForms', 'wpforms-lite' ), + $access->get_menu_cap( 'view_forms' ), + 'wpforms-overview', + [ $this, 'admin_page' ], + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + 'data:image/svg+xml;base64,' . base64_encode( '' ), + /** + * Filters WPForms menu position. + * + * @since 1.6.0.2 + * + * @param string|int|float $position Menu position. + */ + apply_filters( 'wpforms_menu_position', '58.9' ) // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ); + + // All Forms sub menu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'WPForms', 'wpforms-lite' ), + esc_html__( 'All Forms', 'wpforms-lite' ), + $access->get_menu_cap( 'view_forms' ), + 'wpforms-overview', + [ $this, 'admin_page' ] + ); + + // Add New submenu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'WPForms Builder', 'wpforms-lite' ), + esc_html__( 'Add New Form', 'wpforms-lite' ), + $access->get_menu_cap( [ 'create_forms', 'edit_forms' ] ), + 'wpforms-builder', + [ $this, 'admin_page' ] + ); + + // Entries sub menu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'Form Entries', 'wpforms-lite' ), + esc_html__( 'Entries', 'wpforms-lite' ), + $access->get_menu_cap( 'view_entries' ), + 'wpforms-entries', + [ $this, 'admin_page' ] + ); + + // Payments sub menu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'Payments', 'wpforms-lite' ), + esc_html__( 'Payments', 'wpforms-lite' ) . $this->get_new_badge_html(), + $manage_cap, + WPForms\Admin\Payments\Payments::SLUG, + [ $this, 'admin_page' ] + ); + + do_action_deprecated( // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + 'wpform_admin_menu', + [ $this ], + '1.5.5 of the WPForms plugin', + 'wpforms_admin_menu' + ); + + /** + * Fires after constructing the WPForms admin menu. + * + * @since 1.5.4.2 + * + * @param WPForms_Admin_Menu $instance WPForms Admin Menu instance. + */ + do_action( 'wpforms_admin_menu', $this ); + + // Templates sub menu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'WPForms Templates', 'wpforms-lite' ), + esc_html__( 'Form Templates', 'wpforms-lite' ), + $access->get_menu_cap( 'edit_forms' ), + 'wpforms-templates', + [ $this, 'admin_page' ] + ); + + // Settings submenu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'WPForms Settings', 'wpforms-lite' ), + esc_html__( 'Settings', 'wpforms-lite' ), + $manage_cap, + 'wpforms-settings', + [ $this, 'admin_page' ] + ); + + // Tools sub menu item. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'WPForms Tools', 'wpforms-lite' ), + esc_html__( 'Tools', 'wpforms-lite' ), + $access->get_menu_cap( [ 'create_forms', 'view_forms', 'view_entries' ] ), + 'wpforms-tools', + [ $this, 'admin_page' ] + ); + + // Hidden placeholder paged used for misc content. + add_submenu_page( + 'wpforms-settings', + esc_html__( 'WPForms', 'wpforms-lite' ), + esc_html__( 'Info', 'wpforms-lite' ), + $access->get_menu_cap( 'any' ), + 'wpforms-page', + [ $this, 'admin_page' ] + ); + + // Addons submenu page. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'WPForms Addons', 'wpforms-lite' ), + '' . esc_html__( 'Addons', 'wpforms-lite' ) . '', + $access->get_menu_cap( 'edit_forms' ), + 'wpforms-addons', + [ $this, 'admin_page' ] + ); + + // Rotating submenu. + $rotation = $this->get_rotating_submenu(); + + if ( $rotation ) { + add_submenu_page( + 'wpforms-overview', + $rotation['page_title'], + $rotation['menu_title'], + $manage_cap, + $rotation['menu_slug'], + [ $this, 'admin_page' ] + ); + } + + // SMTP submenu page. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'SMTP', 'wpforms-lite' ), + esc_html__( 'SMTP', 'wpforms-lite' ), + $manage_cap, + WPForms\Admin\Pages\SMTP::SLUG, + [ $this, 'admin_page' ] + ); + + // About submenu page. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'About WPForms', 'wpforms-lite' ), + esc_html__( 'About Us', 'wpforms-lite' ), + $access->get_menu_cap( 'any' ), + WPForms_About::SLUG, + [ $this, 'admin_page' ] + ); + + // Community submenu page. + add_submenu_page( + 'wpforms-overview', + esc_html__( 'Community', 'wpforms-lite' ), + esc_html__( 'Community', 'wpforms-lite' ), + $manage_cap, + WPForms\Admin\Pages\Community::SLUG, + [ $this, 'admin_page' ] + ); + + if ( ! wpforms()->is_pro() ) { + add_submenu_page( + 'wpforms-overview', + esc_html__( 'Upgrade to Pro', 'wpforms-lite' ), + esc_html__( 'Upgrade to Pro', 'wpforms-lite' ), + $manage_cap, + wpforms_admin_upgrade_link( 'admin-menu' ) + ); + } + } + + /** + * Hide the "Add New" admin menu item if a user can't create forms. + * + * @since 1.5.8 + */ + public function hide_wpforms_submenu_items(): void { + + if ( wpforms_current_user_can( 'create_forms' ) ) { + return; + } + + global $submenu; + + if ( ! isset( $submenu['wpforms-overview'] ) ) { + return; + } + + foreach ( $submenu['wpforms-overview'] as $key => $item ) { + if ( isset( $item[2] ) && $item[2] === 'wpforms-builder' ) { + unset( $submenu['wpforms-overview'][ $key ] ); + break; + } + } + + $this->hide_wpforms_menu_item(); + } + + /** + * Hide the "WPForms" admin menu if it has no submenu items. + * + * @since 1.5.8 + */ + public function hide_wpforms_menu_item(): void { + + global $submenu, $menu; + + if ( ! empty( $submenu['wpforms-overview'] ) ) { + return; + } + + unset( $submenu['wpforms-overview'] ); + + foreach ( $menu as $key => $item ) { + if ( isset( $item[2] ) && $item[2] === 'wpforms-overview' ) { + unset( $menu[ $key ] ); + break; + } + } + } + + /** + * Make changes to the PRO menu item. + * + * @since 1.8.1 + */ + public function adjust_pro_menu_item(): void { + + global $submenu; + + // Bail if a plugin menu is not registered. + if ( ! isset( $submenu['wpforms-overview'] ) ) { + return; + } + + $upgrade_link_position = key( + array_filter( + $submenu['wpforms-overview'], + static function ( $item ) { + + return strpos( urldecode( $item[2] ), 'wpforms.com/lite-upgrade' ) !== false; + } + ) + ); + + // Bail if "Upgrade to Pro" menu item is not registered. + if ( $upgrade_link_position === null ) { + return; + } + + // Add the PRO badge to the menu item. + // phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited + if ( isset( $submenu['wpforms-overview'][ $upgrade_link_position ][4] ) ) { + $submenu['wpforms-overview'][ $upgrade_link_position ][4] .= ' wpforms-sidebar-upgrade-pro'; + } else { + $submenu['wpforms-overview'][ $upgrade_link_position ][] = 'wpforms-sidebar-upgrade-pro'; + } + + $current_screen = get_current_screen(); + $upgrade_utm_content = $current_screen === null ? 'Upgrade to Pro' : 'Upgrade to Pro - ' . $current_screen->base; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $upgrade_utm_content = empty( $_GET['view'] ) ? $upgrade_utm_content : $upgrade_utm_content . ': ' . sanitize_key( $_GET['view'] ); + + // Add utm_content to the menu item. + $submenu['wpforms-overview'][ $upgrade_link_position ][2] = esc_url( + add_query_arg( + 'utm_content', + $upgrade_utm_content, + $submenu['wpforms-overview'][ $upgrade_link_position ][2] + ) + ); + // phpcs:enable WordPress.WP.GlobalVariablesOverride.Prohibited + } + + /** + * Wrapper for the hook to render our custom settings pages. + * + * @since 1.0.0 + */ + public function admin_page(): void { + + /** + * Fires to show the WPForms admin page. + * + * @since 1.0.0 + */ + do_action( 'wpforms_admin_page' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Add a settings link to the Plugins page. + * + * @since 1.3.9 + * + * @param array|mixed $links Plugin row links. + * @param string $plugin_file Path to the plugin file relative to the plugins' directory. + * @param array $plugin_data An array of plugin data. See `get_plugin_data()`. + * @param string $context The plugin context. + * + * @return array $links + * @noinspection PhpUnusedParameterInspection + * @noinspection HtmlUnknownTarget + * @noinspection PhpMissingParamTypeInspection + */ + public function settings_link( $links, $plugin_file, $plugin_data, $context ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $custom['wpforms-pro'] = sprintf( + '%3$s', + esc_url( + wpforms_admin_upgrade_link( + 'all-plugins', + 'Get WPForms Pro' + ) + ), + esc_attr__( 'Upgrade to WPForms Pro', 'wpforms-lite' ), + esc_html__( 'Get WPForms Pro', 'wpforms-lite' ) + ); + + $custom['wpforms-settings'] = sprintf( + '%s', + esc_url( + add_query_arg( + [ 'page' => 'wpforms-settings' ], + admin_url( 'admin.php' ) + ) + ), + esc_attr__( 'Go to WPForms Settings page', 'wpforms-lite' ), + esc_html__( 'Settings', 'wpforms-lite' ) + ); + + $custom['wpforms-docs'] = sprintf( + '%3$s', + esc_url( + add_query_arg( + [ + 'utm_content' => 'Documentation', + 'utm_campaign' => 'liteplugin', + 'utm_medium' => 'all-plugins', + 'utm_source' => 'WordPress', + ], + 'https://wpforms.com/docs/' + ) + ), + esc_attr__( 'Read the documentation', 'wpforms-lite' ), + esc_html__( 'Docs', 'wpforms-lite' ) + ); + + return array_merge( $custom, (array) $links ); + } + + /** + * Determine which submenu item to show (rotation). + * + * Current behavior: + * - Show item until the plugin has been activated for 7 or more days. + * - Once 7+ days have passed since activation - show next item. + * - Once the last item has been active for more than 7 days, always display the first item (WP Consent page). + * + * @since 1.9.8.6 + * + * @return array|null { menu_title, page_title, menu_slug } or null to show none. + */ + private function get_rotating_submenu(): ?array { + + $items = $this->get_rotation_items(); + $now = time(); + $defaults = [ + 'label' => '', + 'menu_slug' => '', + 'slug' => '', + 'plugin_file' => '', + ]; + + // Find the first item that should be displayed. + foreach ( $items as $item ) { + $item = wp_parse_args( $item, $defaults ); + + $label = (string) $item['label']; + $menu_slug = (string) $item['menu_slug']; + $plugin_slug = (string) $item['slug']; + + if ( empty( $label ) || empty( $menu_slug ) ) { + continue; // Skip misconfigured items. + } + + $timestamp = $this->get_promo_plugin_activation_timestamp( $plugin_slug ); + + // Show if a plugin has never activated or within 7 days of activation. + $within = $timestamp === 0 || ( $now - $timestamp ) < 7 * DAY_IN_SECONDS; + + if ( $within ) { + return [ + 'menu_title' => $label, + 'page_title' => $label, + 'menu_slug' => $menu_slug, + ]; + } + } + + // If all items are considered "complete", return the first one (cycle back). + $first = $items[0]; + $label = $first['label']; + $menu_slug = $first['menu_slug']; + + if ( ! empty( $label ) && ! empty( $menu_slug ) ) { + return [ + 'menu_title' => $label, + 'page_title' => $label, + 'menu_slug' => $menu_slug, + ]; + } + + return null; + } + + /** + * List of rotating plugins files. + * + * @since 1.9.8.6 + * + * @return array + */ + private function get_rotation_plugins(): array { + + return [ + 'wpconsent-cookies-banner-privacy-suite/wpconsent.php' => 'wpconsent', + 'wpconsent-premium/wpconsent-premium.php' => 'wpconsent', + 'sugar-calendar-lite/sugar-calendar-lite.php' => 'sugar-calendar', + 'sugar-calendar/sugar-calendar.php' => 'sugar-calendar', + 'duplicator/duplicator.php' => 'duplicator', + 'duplicator-pro/duplicator-pro.php' => 'duplicator', + 'uncanny-automator/uncanny-automator.php' => 'uncanny-automator', + 'uncanny-automator-pro/uncanny-automator-pro.php' => 'uncanny-automator', + ]; + } + + /** + * Record the activation time of a rotation plugin. + * + * @since 1.9.8.6 + * + * @param string $plugin Path to the plugin file relative to the plugins' directory. + * @param bool $network_wide Whether the plugin is being activated network wide. + */ + public function activated_rotation_plugin( string $plugin, bool $network_wide ): void { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $rotation_plugins = $this->get_rotation_plugins(); + $plugin_key = $rotation_plugins[ $plugin ] ?? ''; + + if ( empty( $plugin_key ) ) { + return; + } + + $activated_plugins = (array) get_option( 'wpforms_rotation_activated_plugins', [] ); + + // Skip if already recorded. + if ( isset( $activated_plugins[ $plugin_key ] ) ) { + return; + } + + $activated_plugins[ $plugin_key ] = time(); + + update_option( 'wpforms_rotation_activated_plugins', $activated_plugins ); + } + + /** + * Editable list of rotating submenu items. + * + * @since 1.9.8.6 + * + * @return array + */ + private function get_rotation_items(): array { + + return [ + [ + 'label' => esc_html__( 'Privacy Compliance', 'wpforms-lite' ), + 'menu_slug' => WPForms\Admin\Pages\PrivacyCompliance::SLUG, + 'slug' => 'wpconsent', + 'plugin_file' => 'wpconsent-cookies-banner-privacy-suite/wpconsent.php', + ], + [ + 'label' => esc_html__( 'Events', 'wpforms-lite' ), + 'menu_slug' => WPForms\Admin\Pages\SugarCalendar::SLUG, + 'slug' => 'sugar-calendar', + 'plugin_file' => 'sugar-calendar-lite/sugar-calendar-lite.php', + ], + [ + 'label' => esc_html__( 'Backups', 'wpforms-lite' ), + 'menu_slug' => WPForms\Admin\Pages\Duplicator::SLUG, + 'slug' => 'duplicator', + 'plugin_file' => 'duplicator/duplicator.php', + ], + [ + 'label' => esc_html__( 'Automation', 'wpforms-lite' ), + 'menu_slug' => WPForms\Admin\Pages\UncannyAutomator::SLUG, + 'slug' => 'uncanny-automator', + 'plugin_file' => 'uncanny-automator/uncanny-automator.php', + ], + ]; + } + + /** + * Get the HTML for the "NEW!" badge. + * + * @since 1.7.8 + * + * @return string + */ + private function get_new_badge_html(): string { + + return ' NEW!'; + } + + /** + * Output inline styles for the admin menu. + * + * @since 1.7.8 + */ + public function admin_menu_styles(): void { + + $styles = '#adminmenu .wpforms-menu-new { display: inline-block; color: #f18500; vertical-align: super; font-size: 9px; font-weight: 600; padding-inline-start: 2px; }'; + + if ( ! wpforms()->is_pro() ) { + $styles .= 'a.wpforms-sidebar-upgrade-pro { background-color: #00a32a !important; color: #fff !important; font-weight: 600 !important; }'; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + printf( '', $styles ); + } + + /** + * Get a timestamp. + * + * @since 1.9.8.6 + * + * @param string $slug Slug of the plugin. + * + * @return int + */ + private function get_promo_plugin_activation_timestamp( string $slug ): int { + + $activated_plugins = (array) get_option( 'wpforms_rotation_activated_plugins', [] ); + + return isset( $activated_plugins[ $slug ] ) ? (int) $activated_plugins[ $slug ] : 0; + } +} + +new WPForms_Admin_Menu(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/class-notices.php b/wp-content/plugins/wpforms-lite/includes/admin/class-notices.php new file mode 100755 index 00000000..dd3d00dc --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/class-notices.php @@ -0,0 +1,139 @@ +notices ); + } + + /** + * Add notice to instance property. + * + * @since 1.3.9 + * + * @param string $message Message to display. + * @param string $type Type of the notice (default: ''). + */ + public static function add( $message, $type = '' ) { + + _deprecated_function( __METHOD__, '1.7.2 of the WPForms plugin' ); + + $instance = self::getInstance(); + $id = 'wpforms-notice-' . ( count( $instance->notices ) + 1 ); + $type = ! empty( $type ) ? 'notice-' . $type : ''; + $notice = sprintf( '
              %s
              ', $type, $id, wpautop( $message ) ); + + $instance->notices[] = $notice; + } + + /** + * Add Info notice. + * + * @since 1.3.9 + * + * @param string $message Message to display. + */ + public static function info( $message ) { + self::add( $message, 'info' ); + } + + /** + * Add Error notice. + * + * @since 1.3.9 + * + * @param string $message Message to display. + */ + public static function error( $message ) { + self::add( $message, 'error' ); + } + + /** + * Add Success notice. + * + * @since 1.3.9 + * + * @param string $message Message to display. + */ + public static function success( $message ) { + self::add( $message, 'success' ); + } + + /** + * Add Warning notice. + * + * @since 1.3.9 + * + * @param string $message Message to display. + */ + public static function warning( $message ) { + self::add( $message, 'warning' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/admin/class-review.php b/wp-content/plugins/wpforms-lite/includes/admin/class-review.php new file mode 100755 index 00000000..bcfb80dd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/class-review.php @@ -0,0 +1,346 @@ +hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + * + * @return void + */ + private function hooks(): void { + + // Admin notice requesting review. + add_action( 'admin_init', [ $this, 'review_request' ] ); + + // Admin footer text. + add_filter( 'admin_footer_text', [ $this, 'admin_footer' ], 1, 2 ); + add_action( 'in_admin_footer', [ $this, 'promote_wpforms' ] ); + } + + /** + * Add admin notices as needed for reviews. + * + * @since 1.3.2 + */ + public function review_request() { + + if ( + // Only consider showing the review request to admin users. + ! is_super_admin() || + // If the user has opted out of product announcement notifications, don't display the review request. + wpforms_setting( 'hide-announcements' ) || + // Do not show the review request on Addons page. + wpforms_is_admin_page( 'addons' ) + ) { + return; + } + + // Verify that we can do a check for reviews. + $notices = (array) get_option( 'wpforms_admin_notices', [] ); + $time = time(); + $load = false; + + if ( empty( $notices['review_request'] ) ) { + $notices['review_request'] = [ + 'time' => $time, + 'dismissed' => false, + ]; + + update_option( 'wpforms_admin_notices', $notices ); + + return; + } + + // Check if it has been dismissed or not. + if ( + isset( $notices['review_request']['dismissed'], $notices['review_request']['time'] ) && + ! $notices['review_request']['dismissed'] && + ( ( $notices['review_request']['time'] + DAY_IN_SECONDS ) <= $time ) + ) { + $load = true; + } + + // If we cannot load, return early. + if ( ! $load ) { + return; + } + + // The Logic is slightly different depending on what's at our disposal. + if ( class_exists( 'WPForms_Entry_Handler', false ) && wpforms()->is_pro() ) { + $this->review(); + } else { + $this->review_lite(); + } + } + + /** + * Maybe show review request. + * + * @since 1.3.9 + */ + public function review() { + + // Fetch total entries. + $entry_handler = wpforms()->obj( 'entry' ); + $entries = $entry_handler ? $entry_handler->get_entries( [ 'number' => 50 ], true ) : 0; + + // Only show review request if the site has collected at least 50 entries. + if ( empty( $entries ) || $entries < 50 ) { + return; + } + + ob_start(); + + // We have a candidate! Output a review message. + $this->review_content(); + + Notice::info( + ob_get_clean(), + [ + 'dismiss' => Notice::DISMISS_GLOBAL, + 'slug' => 'review_request', + 'autop' => false, + 'class' => 'wpforms-review-notice', + ] + ); + } + + /** + * Maybe show Lite review request. + * + * @since 1.3.9 + */ + public function review_lite() { + + // Do not show the review request on Entries pages. + if ( wpforms_is_admin_page( 'entries' ) ) { + return; + } + + // Fetch when plugin was initially installed. + $activated = (array) get_option( 'wpforms_activated', [] ); + + if ( ! empty( $activated['lite'] ) ) { + // Only continue if the plugin has been installed for at least 14 days. + if ( ( $activated['lite'] + ( DAY_IN_SECONDS * 14 ) ) > time() ) { + return; + } + } else { + $activated['lite'] = time(); + + update_option( 'wpforms_activated', $activated ); + + return; + } + + // Only proceed with displaying if the user created at least one form. + $form_count = wp_count_posts( 'wpforms' ); + + if ( empty( $form_count->publish ) ) { + return; + } + + // Check if the Constant Contact notice is displaying. + $cc = get_option( 'wpforms_constant_contact', false ); + + // If it's displaying don't ask for review until they configure CC or + // dismiss the notice. + if ( $cc ) { + return; + } + + ob_start(); + + // We have a candidate! Output a review message. + $this->review_content(); + + Notice::info( + ob_get_clean(), + [ + 'dismiss' => Notice::DISMISS_GLOBAL, + 'slug' => 'review_lite_request', + 'autop' => false, + 'class' => 'wpforms-review-notice', + ] + ); + } + + /** + * Output the review content. + * + * @since 1.8.7.2 + */ + private function review_content(): void { + + ?> +

              +

              + + + +
              + + + +
              + + + +

              + id ) && strpos( $current_screen->id, 'wpforms' ) !== false ) { + $url = wpforms_wp_org_review_link(); + $text = sprintf( + wp_kses( /* translators: $1$s - WPForms plugin name, $2$s - WP.org review link, $3$s - WP.org review link. */ + __( 'Please rate %1$s ★★★★★ on WordPress.org to help us spread the word.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + 'WPForms', + $url, + $url + ); + } + + return $text; + } + + /** + * Pre-footer promotion block, displayed on all WPForms admin pages except Form Builder. + * + * @since 1.8.0 + */ + public function promote_wpforms() { + + // phpcs:ignore WordPress.Security.NonceVerification + $current_page = isset( $_REQUEST['page'] ) ? sanitize_key( $_REQUEST['page'] ) : ''; + + if ( ! in_array( $current_page, self::PAGES, true ) ) { + return; + } + + $links = [ + [ + 'url' => wpforms()->is_pro() ? + wpforms_utm_link( + 'https://wpforms.com/account/support/', + 'Plugin Footer', + 'Contact Support' + ) : 'https://wordpress.org/support/plugin/wpforms-lite/', + 'text' => __( 'Support', 'wpforms-lite' ), + 'target' => '_blank', + ], + [ + 'url' => wpforms_utm_link( + 'https://wpforms.com/docs/', + 'Plugin Footer', + 'Plugin Documentation' + ), + 'text' => __( 'Docs', 'wpforms-lite' ), + 'target' => '_blank', + ], + [ + 'url' => 'https://www.facebook.com/groups/wpformsvip/', + 'text' => __( 'VIP Circle', 'wpforms-lite' ), + 'target' => '_blank', + ], + [ + 'url' => admin_url( 'admin.php?page=wpforms-about' ), + 'text' => __( 'Free Plugins', 'wpforms-lite' ), + ], + ]; + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/promotion', + [ + 'title' => __( 'Made with ♥ by the WPForms Team', 'wpforms-lite' ), + 'links' => $links, + ], + true + ); + } +} + +new WPForms_Review(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/class-settings.php b/wp-content/plugins/wpforms-lite/includes/admin/class-settings.php new file mode 100755 index 00000000..a426b671 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/class-settings.php @@ -0,0 +1,820 @@ +hooks(); + } + + /** + * Hooks. + * + * @since 1.8.5.4 + */ + private function hooks() { + + // Maybe load settings page. + add_action( 'admin_init', [ $this, 'init' ] ); + } + + /** + * Determine if the user is viewing the settings page, if so, party on. + * + * @since 1.0.0 + */ + public function init() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Only load if we are actually on the settings page. + if ( ! wpforms_is_admin_page( 'settings' ) ) { + return; + } + + // Include API callbacks and functions. + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/settings-api.php'; + + // Show downgraded notice. + $this->maybe_display_downgraded_notice(); + + // Watch for triggered save. + $this->save_settings(); + + // Determine the current active settings tab. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $this->view = isset( $_GET['view'] ) ? sanitize_key( wp_unslash( $_GET['view'] ) ) : 'general'; + + $this->modify_url(); + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); + add_action( 'wpforms_admin_page', [ $this, 'output' ] ); + + // Monitor custom tables. + $this->monitor_custom_tables(); + + // Hook for addons. + do_action( 'wpforms_settings_init', $this ); + } + + /** + * Remove `wpforms-integration` query arg from URL. + * The `wpforms-integration` query arg is used to highlight a specific provider on the Integrations page. + * + * @since 1.8.5.4 + */ + private function modify_url() { + + if ( $this->view !== 'integrations' ) { + return; + } + + $_SERVER['REQUEST_URI'] = remove_query_arg( 'wpforms-integration' ); + } + + /** + * Display admin notice about using a downgraded version of WPForms. + * + * @since 1.8.5.4 + */ + private function maybe_display_downgraded_notice() { + + if ( ! $this->is_downgraded_version() ) { + return; + } + + $notice = sprintf( + wp_kses( /* translators: %1$s - WPForms.com doc page URL; %2$s - button text. */ + __( + 'It looks like you\'ve downgraded to an older version of WPForms. We recommend always using the latest version as some features may not function as expected in older versions. %2$s', + 'wpforms-lite' + ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/why-you-should-always-use-the-latest-version-of-wpforms/', 'Settings', 'Downgrade notice' ) ), + esc_html__( 'Learn More', 'wpforms-lite' ) + ); + + Notice::warning( + $notice, + [ + 'dismiss' => Notice::DISMISS_GLOBAL, + 'slug' => 'wpforms_is_downgraded', + ] + ); + } + + /** + * Check if plugin was downgraded. + * + * @since 1.8.5.4 + * + * @return bool + */ + private function is_downgraded_version(): bool { + + // Get all installed versions. + $installed_versions = wpforms()->is_pro() ? + (array) get_option( Migrations::MIGRATED_OPTION_NAME, [] ) : + (array) get_option( LiteMigration::MIGRATED_OPTION_NAME, [] ); + + // Get the most recent installed version. + $db_latest = array_keys( $installed_versions )[ count( $installed_versions ) - 1 ]; + + // Check if downgrade happened. + return version_compare( $db_latest, WPFORMS_VERSION, '>' ); + } + + /** + * Sanitize and save settings. + * + * @since 1.3.9 + */ + public function save_settings() { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded, Generic.Metrics.NestingLevel.MaxExceeded + + // Check nonce and other various security checks. + if ( ! isset( $_POST['wpforms-settings-submit'] ) || empty( $_POST['nonce'] ) ) { + return; + } + + if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpforms-settings-nonce' ) ) { + return; + } + + if ( ! wpforms_current_user_can() ) { + return; + } + + if ( empty( $_POST['view'] ) ) { + return; + } + + $current_view = sanitize_key( $_POST['view'] ); + + // Get registered fields and current settings. + $fields = $this->get_registered_settings( $current_view ); + $settings = get_option( 'wpforms_settings', [] ); + $original_settings = $settings; + + // Views excluded from saving list. + $exclude_views = apply_filters( 'wpforms_settings_exclude_view', [], $fields, $settings ); + + if ( is_array( $exclude_views ) && in_array( $current_view, $exclude_views, true ) ) { + // Run a custom save processing for excluded views. + do_action( 'wpforms_settings_custom_process', $current_view, $fields, $settings ); + + return; + } + + if ( empty( $fields ) || ! is_array( $fields ) ) { + return; + } + + // Sanitize and prep each field. + foreach ( $fields as $id => $field ) { + + // Certain field types are not valid for saving and are skipped. + $exclude = apply_filters( 'wpforms_settings_exclude_type', [ 'content', 'license', 'providers' ] ); + + if ( empty( $field['type'] ) || in_array( $field['type'], $exclude, true ) ) { + continue; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $value = isset( $_POST[ $id ] ) ? wp_unslash( $_POST[ $id ] ) : false; + $value_prev = isset( $settings[ $id ] ) ? $settings[ $id ] : false; + + // Trim all string values. + if ( is_string( $value ) ) { + $value = trim( $value ); + } + + // Custom filter can be provided for sanitizing, otherwise use defaults. + if ( ! empty( $field['filter'] ) && is_callable( $field['filter'] ) ) { + + $value = call_user_func( $field['filter'], $value, $id, $field, $value_prev ); + + } else { + + switch ( $field['type'] ) { + case 'checkbox': + case 'toggle': + $value = (bool) $value; + break; + + case 'image': + $value = esc_url_raw( $value ); + break; + + case 'color': + $value = wpforms_sanitize_hex_color( $value ); + break; + + case 'color_scheme': + $value = array_map( 'wpforms_sanitize_hex_color', $value ); + break; + + case 'number': + $value = (float) $value; + break; + + case 'radio': + case 'select': + $value = $this->validate_field_with_options( $field, $value, $value_prev ); + break; + + case 'text': + default: + $value = sanitize_text_field( $value ); + break; + } + } + + // Add to settings. + $settings[ $id ] = $value; + } + + // Save settings. + wpforms_update_settings( $settings ); + + Notice::success( esc_html__( 'Settings were successfully saved.', 'wpforms-lite' ) ); + + if ( isset( $original_settings['currency'], $settings['currency'] ) && $original_settings['currency'] !== $settings['currency'] ) { + + Notice::warning( esc_html__( "You've changed your currency. Please double-check the product prices in your forms and verify that they're correct.", 'wpforms-lite' ) ); + } + } + + /** + * Enqueue assets for the settings page. + * + * @since 1.0.0 + */ + public function enqueues() { + + do_action( 'wpforms_settings_enqueue' ); + } + + /** + * Return registered settings tabs. + * + * @since 1.3.9 + * + * @return array + */ + public function get_tabs() { + + $tabs = [ + 'general' => [ + 'name' => esc_html__( 'General', 'wpforms-lite' ), + 'form' => true, + 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), + ], + 'validation' => [ + 'name' => esc_html__( 'Validation', 'wpforms-lite' ), + 'form' => true, + 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), + ], + 'integrations' => [ + 'name' => esc_html__( 'Integrations', 'wpforms-lite' ), + 'form' => false, + 'submit' => false, + ], + 'geolocation' => [ + 'name' => esc_html__( 'Geolocation', 'wpforms-lite' ), + 'form' => false, + 'submit' => false, + ], + 'misc' => [ + 'name' => esc_html__( 'Misc', 'wpforms-lite' ), + 'form' => true, + 'submit' => esc_html__( 'Save Settings', 'wpforms-lite' ), + ], + ]; + + return apply_filters( 'wpforms_settings_tabs', $tabs ); + } + + /** + * Output tab navigation area. + * + * @since 1.3.9 + */ + public function tabs() { + + $tabs = $this->get_tabs(); + + echo '
                '; + foreach ( $tabs as $id => $tab ) { + + $active = $id === $this->view ? 'active' : ''; + $link = add_query_arg( 'view', $id, admin_url( 'admin.php?page=wpforms-settings' ) ); + + echo '
              • ' . esc_html( $tab['name'] ) . '
              • '; + } + echo '
              '; + } + + /** + * Return all the default registered settings fields. + * + * @since 1.3.9 + * + * @param string $view The current view (tab) on Settings page. + * + * @return array + */ + public function get_registered_settings( $view = '' ) { + + $defaults = [ + // General Settings tab. + 'general' => [ + 'license-heading' => [ + 'id' => 'license-heading', + 'content' => '

              ' . esc_html__( 'License', 'wpforms-lite' ) . '

              ' . esc_html__( 'Your license key provides access to updates and addons.', 'wpforms-lite' ) . '

              ', + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'section-heading' ], + ], + 'license-key' => [ + 'id' => 'license-key', + 'name' => esc_html__( 'License Key', 'wpforms-lite' ), + 'type' => 'license', + ], + 'general-heading' => [ + 'id' => 'general-heading', + 'content' => '

              ' . esc_html__( 'General', 'wpforms-lite' ) . '

              ', + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'section-heading', 'no-desc' ], + ], + 'disable-css' => [ + 'id' => 'disable-css', + 'name' => esc_html__( 'Include Form Styling', 'wpforms-lite' ), + 'desc' => sprintf( + wp_kses( /* translators: %s - WPForms.com form styling setting URL. */ + __( 'Determines which CSS files to load and use for the site. "Base and Form Theme Styling" is recommended, unless you are experienced with CSS or instructed by support to change settings. Learn More', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + 'class' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-choose-an-include-form-styling-setting/', 'settings-license', 'Form Styling Documentation' ) ) + ), + 'type' => 'select', + 'choicesjs' => true, + 'default' => 1, + 'options' => [ + 1 => esc_html__( 'Base and form theme styling', 'wpforms-lite' ), + 2 => esc_html__( 'Base styling only', 'wpforms-lite' ), + 3 => esc_html__( 'No styling', 'wpforms-lite' ), + ], + ], + 'global-assets' => [ + 'id' => 'global-assets', + 'name' => esc_html__( 'Load Assets Globally', 'wpforms-lite' ), + 'desc' => esc_html__( 'Load WPForms assets site-wide. Only check if your site is having compatibility issues or instructed to by support.', 'wpforms-lite' ), + 'type' => 'toggle', + 'status' => true, + ], + 'gdpr-heading' => [ + 'id' => 'GDPR', + 'content' => '

              ' . esc_html__( 'GDPR', 'wpforms-lite' ) . '

              ', + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'section-heading', 'no-desc' ], + ], + 'gdpr' => [ + 'id' => 'gdpr', + 'name' => esc_html__( 'GDPR Enhancements', 'wpforms-lite' ), + 'desc' => sprintf( + wp_kses( /* translators: %s - WPForms.com GDPR documentation URL. */ + __( 'Enable GDPR related features and enhancements. Learn More', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + 'class' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-create-gdpr-compliant-forms/', 'settings-license', 'GDPR Documentation' ) ) + ), + 'type' => 'toggle', + 'status' => true, + ], + ], + // Validation messages settings tab. + 'validation' => [ + 'validation-heading' => [ + 'id' => 'validation-heading', + 'content' => sprintf( /* translators: %s - WPForms.com smart tags documentation URL. */ + esc_html__( '%1$s These messages are displayed to the users as they fill out a form in real-time. Messages can include plain text and/or %2$sSmart Tags%3$s.', 'wpforms-lite' ), + '

              ' . esc_html__( 'Validation Messages', 'wpforms-lite' ) + . '

              ', + '', + '' + ), + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'section-heading' ], + ], + 'validation-required' => [ + 'id' => 'validation-required', + 'name' => esc_html__( 'Required', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'This field is required.', 'wpforms-lite' ), + ], + 'validation-email' => [ + 'id' => 'validation-email', + 'name' => esc_html__( 'Email', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Please enter a valid email address.', 'wpforms-lite' ), + ], + 'validation-email-suggestion' => [ + 'id' => 'validation-email-suggestion', + 'name' => esc_html__( 'Email Suggestion', 'wpforms-lite' ), + 'type' => 'text', + 'default' => sprintf( /* translators: %s - suggested email address. */ + esc_html__( 'Did you mean %s?', 'wpforms-lite' ), + '{suggestion}' + ), + ], + 'validation-email-restricted' => [ + 'id' => 'validation-email-restricted', + 'name' => esc_html__( 'Email Restricted', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'This email address is not allowed.', 'wpforms-lite' ), + ], + 'validation-number' => [ + 'id' => 'validation-number', + 'name' => esc_html__( 'Number', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Please enter a valid number.', 'wpforms-lite' ), + ], + 'validation-number-positive' => [ + 'id' => 'validation-number-positive', + 'name' => esc_html__( 'Number Positive', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Please enter a valid positive number.', 'wpforms-lite' ), + ], + 'validation-minimum-price' => [ + 'id' => 'validation-minimum-price', + 'name' => esc_html__( 'Minimum Price', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Amount entered is less than the required minimum.', 'wpforms-lite' ), + ], + 'validation-confirm' => [ + 'id' => 'validation-confirm', + 'name' => esc_html__( 'Confirm Value', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Field values do not match.', 'wpforms-lite' ), + ], + 'validation-inputmask-incomplete' => [ + 'id' => 'validation-inputmask-incomplete', + 'name' => esc_html__( 'Input Mask Incomplete', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Please fill out the field in required format.', 'wpforms-lite' ), + ], + 'validation-check-limit' => [ + 'id' => 'validation-check-limit', + 'name' => esc_html__( 'Checkbox Selection Limit', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'You have exceeded the number of allowed selections: {#}.', 'wpforms-lite' ), + ], + 'validation-character-limit' => [ + 'id' => 'validation-character-limit', + 'name' => esc_html__( 'Character Limit', 'wpforms-lite' ), + 'type' => 'text', + 'default' => sprintf( /* translators: %1$s - characters limit, %2$s - number of characters left. */ + esc_html__( 'Limit is %1$s characters. Characters remaining: %2$s.', 'wpforms-lite' ), + '{limit}', + '{remaining}' + ), + ], + 'validation-word-limit' => [ + 'id' => 'validation-word-limit', + 'name' => esc_html__( 'Word Limit', 'wpforms-lite' ), + 'type' => 'text', + 'default' => sprintf( /* translators: %1$s - words limit, %2$s - number of words left. */ + esc_html__( 'Limit is %1$s words. Words remaining: %2$s.', 'wpforms-lite' ), + '{limit}', + '{remaining}' + ), + ], + 'validation-requiredpayment' => [ + 'id' => 'validation-requiredpayment', + 'name' => esc_html__( 'Payment Required', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Payment is required.', 'wpforms-lite' ), + ], + 'validation-creditcard' => [ + 'id' => 'validation-creditcard', + 'name' => esc_html__( 'Credit Card', 'wpforms-lite' ), + 'type' => 'text', + 'default' => esc_html__( 'Please enter a valid credit card number.', 'wpforms-lite' ), + ], + 'validation-min' => [ + 'id' => 'validation-min', + 'name' => esc_html__( 'Minimum Value', 'wpforms-lite' ), + 'type' => 'text', + 'default' => sprintf( /* translators: %s - value to compare with. */ + esc_html__( 'Please enter a value greater than or equal to %s.', 'wpforms-lite' ), + '{value}' + ), + ], + 'validation-max' => [ + 'id' => 'validation-max', + 'name' => esc_html__( 'Maximum Value', 'wpforms-lite' ), + 'type' => 'text', + 'default' => sprintf( /* translators: %s - value to compare with. */ + esc_html__( 'Please enter a value less than or equal to %s.', 'wpforms-lite' ), + '{value}' + ), + ], + ], + // Provider integrations settings tab. + 'integrations' => [ + 'integrations-heading' => [ + 'id' => 'integrations-heading', + 'content' => '

              ' . esc_html__( 'Integrations', 'wpforms-lite' ) . '

              ' . esc_html__( 'Manage integrations with popular providers such as Constant Contact, Mailchimp, Zapier, and more.', 'wpforms-lite' ) . '

              ', + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'section-heading' ], + ], + 'integrations-providers' => [ + 'id' => 'integrations-providers', + 'content' => '

              ' . esc_html__( 'Integrations', 'wpforms-lite' ) . '

              ' . esc_html__( 'Manage integrations with popular providers such as Constant Contact, Mailchimp, Zapier, and more.', 'wpforms-lite' ) . '

              ', + 'type' => 'providers', + 'wrap' => 'none', + ], + ], + // Misc. settings tab. + 'misc' => [ + 'misc-heading' => [ + 'id' => 'misc-heading', + 'content' => '

              ' . esc_html__( 'Miscellaneous', 'wpforms-lite' ) . '

              ', + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'section-heading', 'no-desc' ], + ], + 'delete-spam-entries' => [ + 'id' => 'delete-spam-entries', + 'name' => esc_html__( 'Delete Spam Entries', 'wpforms-lite' ), + 'desc' => esc_html__( 'Choose the frequency spam entries are automatically deleted.', 'wpforms-lite' ), + 'type' => 'select', + 'default' => 90, + 'is_hidden' => ! $this->show_spam_entries_setting(), + 'options' => [ + 7 => esc_html__( '7 Days', 'wpforms-lite' ), + 15 => esc_html__( '15 Days', 'wpforms-lite' ), + 30 => esc_html__( '30 Days', 'wpforms-lite' ), + 90 => esc_html__( '90 Days', 'wpforms-lite' ), + ], + ], + 'hide-announcements' => [ + 'id' => 'hide-announcements', + 'name' => esc_html__( 'Hide Announcements', 'wpforms-lite' ), + 'desc' => esc_html__( 'Hide plugin announcements and update details.', 'wpforms-lite' ), + 'type' => 'toggle', + 'status' => true, + ], + 'hide-admin-bar' => [ + 'id' => 'hide-admin-bar', + 'name' => esc_html__( 'Hide Admin Bar Menu', 'wpforms-lite' ), + 'desc' => esc_html__( 'Hide the WPForms admin bar menu.', 'wpforms-lite' ), + 'type' => 'toggle', + 'status' => true, + ], + 'uninstall-data' => [ + 'id' => 'uninstall-data', + 'name' => esc_html__( 'Uninstall WPForms', 'wpforms-lite' ), + 'desc' => $this->get_uninstall_desc(), + 'type' => 'toggle', + 'status' => true, + ], + ], + ]; + + $defaults = apply_filters( 'wpforms_settings_defaults', $defaults ); + + // Take care of invalid views. + if ( ! empty( $view ) && ! array_key_exists( $view, $defaults ) ) { + $this->view = key( $defaults ); + + return reset( $defaults ); + } + + return empty( $view ) ? $defaults : $defaults[ $view ]; + } + + /** + * Get uninstall description. + * + * @since 1.8.4 + * + * @return string + */ + private function get_uninstall_desc() { + + $desc = esc_html__( 'Remove ALL WPForms data upon plugin deletion.', 'wpforms-lite' ); + $warning = esc_html__( 'All forms and settings will be unrecoverable.', 'wpforms-lite' ); + + if ( wpforms()->is_pro() ) { + $desc = esc_html__( 'Remove ALL WPForms data upon plugin deletion.', 'wpforms-lite' ); + $warning = esc_html__( 'All forms, entries, and uploaded files will be unrecoverable.', 'wpforms-lite' ); + } + + return sprintf( '%s %s', $desc, $warning ); + } + + /** + * Return array containing markup for all the appropriate settings fields. + * + * @since 1.3.9 + * + * @param string $view View slug. + * + * @return array + */ + public function get_settings_fields( $view = '' ) { + + $fields = []; + $settings = $this->get_registered_settings( $view ); + + foreach ( $settings as $id => $args ) { + + $fields[ $id ] = wpforms_settings_output_field( $args ); + } + + return apply_filters( 'wpforms_settings_fields', $fields, $view ); + } + + /** + * Build the output for the plugin settings page. + * + * @since 1.0.0 + */ + public function output() { + + $tabs = $this->get_tabs(); + $fields = $this->get_settings_fields( $this->view ); + ?> + +
              + + tabs(); ?> + +

              + + is_pro() && class_exists( 'WPForms_License', false ) ) { + wpforms()->obj( 'license' )->notices( true ); + } + ?> + +
              + + view ]['form'] ) ) : + ?> +
              + + + + + + view, $fields ); ?> + + + + view ]['submit'] ) ) : ?> +

              + +

              + + + view, $fields ); ?> + + view ]['form'] ) ) : ?> +
              + + +
              + +
              + + General page only. + * + * @since 1.6.2 + */ + public function monitor_custom_tables() { + + // Proceed on Settings plugin admin area page only. + if ( $this->view !== 'general' ) { + return; + } + + /* + * Tasks Meta table. + */ + $meta = new \WPForms\Tasks\Meta(); + + if ( $meta->table_exists() ) { + return; + } + + $meta->create_table(); + } + + /** + * Validate radio and select fields. + * + * @since 1.7.5.5 + * + * @param array $field Field. + * @param mixed $value Value. + * @param mixed $value_prev Previous value. + * + * @return mixed + */ + private function validate_field_with_options( $field, $value, $value_prev ) { + + $value = sanitize_text_field( $value ); + + if ( isset( $field['options'] ) && array_key_exists( $value, $field['options'] ) ) { + return $value; + } + + return isset( $field['default'] ) ? $field['default'] : $value_prev; + } + + /** + * Check if spam entries setting should be shown. + * + * Show setting only if WPFORMS_DELETE_SPAM_ENTRIES is not defined, and the plugin is Pro. + * + * @since 1.9.1 + * + * @return bool + */ + private function show_spam_entries_setting(): bool { + + return ! defined( 'WPFORMS_DELETE_SPAM_ENTRIES' ) && wpforms()->is_pro(); + } +} + +new WPForms_Settings(); diff --git a/wp-content/plugins/wpforms-lite/includes/admin/class-welcome.php b/wp-content/plugins/wpforms-lite/includes/admin/class-welcome.php new file mode 100755 index 00000000..59a51039 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/admin/class-welcome.php @@ -0,0 +1,394 @@ +is_pro() ? 'pro' : 'lite'; + ?> + +
              + +
              + +
              + +
              + <?php esc_attr_e( 'Sullie the WPForms mascot', 'wpforms-lite' ); ?> +
              + +
              +

              +
              +
              + + + <?php esc_attr_e( 'Watch how to create your first form', 'wpforms-lite' ); ?> + + +
              + +
              + +
              +
              + + + +
              +
              + + + +
              +
              + +
              + +
              + +
              + +
              + +

              +
              + +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              +

              +
              + +
              + +
              + + + +
              + +
              + +
              + +
              + +
              + +
              +

              +
                +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              +
              + +
              +

              PRO

              +
              + 199
              + +
              + + + +
              + +
              + +
              + +
              + +
              + +

              + +
              + +

              +

              +

              Bill Erickson, Erickson Web Consulting

              +
              + +
              + +

              +

              +

              David Henzel, MaxCDN

              +
              + +
              + +
              + + + +
              + +
              + 'display:none;' ] : [] + ); + + // Build standard field markup and return. + $output = "
              "; + + if ( ! empty( $args['name'] ) && empty( $args['no_label'] ) ) { + $output .= ''; + $output .= ''; + $output .= ''; + } + + $output .= ''; + $output .= $field; + + if ( ! empty( $args['desc_after'] ) ) { + $output .= '
              ' . $args['desc_after'] . '
              '; + } + + $output .= '
              '; + $output .= '
              '; + + return $output; +} + +/** + * Missing Callback. + * + * If a function is missing for settings, callbacks alert the user. + * + * @since 1.3.9 + * + * @param array $args Arguments passed by the setting. + * + * @return string + */ +function wpforms_settings_missing_callback( array $args ): string { + + return sprintf( + /* translators: %s - ID of a setting. */ + esc_html__( 'The callback function used for the %s setting is missing.', 'wpforms-lite' ), + '' . wpforms_sanitize_key( $args['id'] ) . '' + ); +} + +/** + * Settings content field callback. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_content_callback( array $args ): string { + + return ! empty( $args['content'] ) ? $args['content'] : ''; +} + +/** + * Settings license field callback. + * + * @since 1.3.9 + * + * @param array $args Settings arguments. + * + * @return string + * @noinspection HtmlUnknownTarget + * @noinspection PhpUnusedParameterInspection + */ +function wpforms_settings_license_callback( array $args ): string { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + $output = '

              ' . esc_html__( 'You\'re using WPForms Lite - no license needed. Enjoy!', 'wpforms-lite' ) . ' 🙂

              '; + $output .= + '

              ' . + sprintf( + wp_kses( /* translators: %s - WPForms.com upgrade URL. */ + __( 'To unlock more features consider upgrading to PRO.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + 'target' => [], + 'rel' => [], + ], + 'strong' => [], + ] + ), + esc_url( wpforms_admin_upgrade_link( 'settings-license', 'Upgrade to WPForms Pro text Link' ) ) + ) . + '

              '; + $output .= + '

              ' . + wp_kses( + __( 'As a valued WPForms Lite user you receive 50% off, automatically applied at checkout!', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ) . + '

              '; + + $output .= '

              ' . esc_html__( 'Already purchased? Simply enter your license key below to enable WPForms PRO!', 'wpforms-lite' ) . '

              '; + $output .= '

              '; + $output .= ''; + $output .= ''; + $output .= '

              '; + + /** + * Filter license settings HTML output. + * + * @since 1.7.9 + * + * @param string $output HTML markup to be rendered in place of license settings. + */ + return (string) apply_filters( 'wpforms_settings_license_output', $output ); +} + +/** + * Settings text input field callback. + * + * @since 1.3.9 + * + * @param array $args Settings arguments. + * + * @return string + */ +function wpforms_settings_text_callback( array $args ): string { + + if ( ! in_array( $args['type'], [ 'text', 'password' ], true ) ) { + $args['type'] = 'text'; + } + + $default = isset( $args['default'] ) ? esc_html( $args['default'] ) : ''; + $value = wpforms_setting( $args['id'], $default ); + $id = wpforms_sanitize_key( $args['id'] ); + + $output = ''; + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings password input field callback. + * + * @since 1.8.4 + * + * @param array $args Setting field arguments. + * + * @return string + */ +function wpforms_settings_password_callback( array $args ): string { + + return wpforms_settings_text_callback( $args ); +} + +/** + * Settings number input field callback. + * + * @since 1.5.3 + * + * @param array $args Setting field arguments. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ +function wpforms_settings_number_callback( array $args ): string { + + $default = isset( $args['default'] ) ? esc_html( $args['default'] ) : ''; + $id = 'wpforms-setting-' . wpforms_sanitize_key( $args['id'] ); + $attr = [ + 'value' => wpforms_setting( $args['id'], $default ), + 'name' => wpforms_sanitize_key( $args['id'] ), + ]; + $data = ! empty( $args['data'] ) ? $args['data'] : []; + + if ( ! empty( $args['attr'] ) ) { + $attr = array_merge( $attr, $args['attr'] ); + } + + $output = sprintf( + '', + wpforms_html_attributes( $id, [], $data, $attr ) + ); + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings select field callback. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_select_callback( array $args ): string { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $default = isset( $args['default'] ) ? esc_html( $args['default'] ) : ''; + $value = wpforms_setting( $args['id'], $default ); + $id = wpforms_sanitize_key( $args['id'] ); + $select_name = $id; + $class = ! empty( $args['choicesjs'] ) ? 'choicesjs-select' : ''; + $choices = ! empty( $args['choicesjs'] ); + $data = isset( $args['data'] ) ? (array) $args['data'] : []; + $attr = isset( $args['attr'] ) ? (array) $args['attr'] : []; + + if ( $choices && ! empty( $args['search'] ) ) { + $data['search'] = 'true'; + } + + if ( ! empty( $args['placeholder'] ) ) { + $data['placeholder'] = $args['placeholder']; + } + + $size_attr = ''; + + if ( $choices && ! empty( $args['multiple'] ) ) { + $attr[] = 'multiple'; + $select_name = $id . '[]'; + $size_attr = ' size="1"'; + } + + foreach ( $data as $name => $val ) { + $data[ $name ] = 'data-' . sanitize_html_class( $name ) . '="' . esc_attr( $val ) . '"'; + } + + $data = implode( ' ', $data ); + $attr = implode( ' ', array_map( 'sanitize_html_class', $attr ) ); + + $output = $choices ? '' : ''; + $output .= ''; + $output .= $choices ? '' : ''; + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings checkbox field callback. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_checkbox_callback( array $args ): string { + + $value = wpforms_setting( $args['id'] ); + $id = wpforms_sanitize_key( $args['id'] ); + $checked = ! empty( $value ) ? checked( 1, $value, false ) : ''; + $disabled = ! empty( $args['disabled'] ) ? ' disabled' : ''; + + $output = ''; + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + if ( ! empty( $args['disabled_desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['disabled_desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings radio field callback. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_radio_callback( array $args ): string { + + $default = isset( $args['default'] ) ? esc_html( $args['default'] ) : ''; + $value = wpforms_setting( $args['id'], $default ); + $id = wpforms_sanitize_key( $args['id'] ); + $output = ''; + $x = 1; + + foreach ( $args['options'] as $option => $name ) { + + $checked = checked( $value, $option, false ); + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + + ++$x; + } + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Email template endpoint field callback. + * + * @since 1.8.5 + * + * @param array $args Field arguments. + * + * @return string + */ +function wpforms_settings_email_template_callback( array $args ): string { + + $id = wpforms_sanitize_key( $args['id'] ); + $is_pro = wpforms()->is_pro(); + $output = ''; + $x = 1; + $education_args = [ + 'name' => esc_html__( 'Email Templates', 'wpforms-lite' ), + 'plural' => '1', + 'action' => 'upgrade', + ]; + + foreach ( $args['options'] as $option => $attrs ) { + $checked = checked( $args['value'], $option, false ); + $has_education = ! $is_pro && isset( $attrs['is_pro'] ) && $attrs['is_pro']; + $class = [ 'wpforms-settings-field-radio-wrapper', 'wpforms-card-image' ]; + $data = []; + + // Add class and data attributes for education modal, if needed. + if ( $has_education ) { + $class[] = 'education-modal'; // This class is used for JS. + $data = $education_args; // This data is used for JS. + } + + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + + ++$x; + } + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings toggle field callback. + * + * @since 1.7.4 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_toggle_callback( array $args ): string { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $value = ! empty( $args['value'] ) ? $args['value'] : wpforms_setting( $args['id'] ); + $id = wpforms_sanitize_key( $args['id'] ); + $class = ! empty( $args['control-class'] ) ? $args['control-class'] : ''; + $class .= ! empty( $args['is-important'] ) ? ' wpforms-important' : ''; + $input_attr = ! empty( $args['input-attr'] ) ? $args['input-attr'] : ''; + + $default_args = [ + 'control-class' => $class, + ]; + + $args = wp_parse_args( $args, $default_args ); + + $output = wpforms_panel_field_toggle_control( + $args, + 'wpforms-setting-' . $id, + $id, + ! empty( $args['label'] ) ? $args['label'] : '', + $value, + $input_attr + ); + + $desc_on = ! empty( $args['desc'] ) ? $args['desc'] : ''; + $desc_on = ! empty( $args['desc-on'] ) ? $args['desc-on'] : $desc_on; + $desc_off = ! empty( $args['desc-off'] ) ? $args['desc-off'] : ''; + + $output .= sprintf( + '

              %2$s

              ', + empty( $value ) && ! empty( $desc_off ) ? ' wpforms-hidden' : '', + wp_kses_post( $desc_on ) + ); + + if ( ! empty( $desc_off ) ) { + $output .= sprintf( + '

              %2$s

              ', + empty( $value ) ? '' : ' wpforms-hidden', + wp_kses_post( $desc_off ) + ); + } + + if ( ! empty( $args['disabled_desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['disabled_desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings image uploads field callback. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_image_callback( array $args ): string { + + $default = isset( $args['default'] ) ? esc_html( $args['default'] ) : ''; + $value = wpforms_setting( $args['id'], $default ); + $id = wpforms_sanitize_key( $args['id'] ); + $output = ''; + + if ( ! empty( $value ) ) { + $output .= ''; + } + + $output .= ''; + + // Show the remove button if specified. + if ( isset( $args['show_remove'] ) && $args['show_remove'] ) { + $output .= ''; + } + + $output .= ''; + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings color picker field callback. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + */ +function wpforms_settings_color_callback( array $args ): string { + + $default = isset( $args['default'] ) ? esc_html( $args['default'] ) : ''; + $value = wpforms_setting( $args['id'], $default ); + $id = wpforms_sanitize_key( $args['id'] ); + $data = isset( $args['data'] ) ? (array) $args['data'] : []; + + foreach ( $data as $name => $val ) { + $data[ $name ] = 'data-' . sanitize_html_class( $name ) . '="' . esc_attr( $val ) . '"'; + } + + $data = implode( ' ', $data ); + + $output = ''; + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Color scheme endpoint fieldset callback. + * This function will output a fieldset with color picker inputs. + * + * @since 1.8.5 + * + * @param array $args Field arguments. + * + * @return string + */ +function wpforms_settings_color_scheme_callback( array $args ): string { + + $id = wpforms_sanitize_key( $args['id'] ); + $value = wpforms_setting( $args['id'], [] ); + $output = ''; + + foreach ( $args['colors'] as $color => $attrs ) { + $data = isset( $attrs['data'] ) ? (array) $attrs['data'] : []; + $default_value = isset( $data['fallback-color'] ) ? wpforms_sanitize_hex_color( $data['fallback-color'] ) : ''; + $field_id = "{$id}-{$color}"; + $field_value = isset( $value[ $color ] ) ? wpforms_sanitize_hex_color( $value[ $color ] ) : $default_value; + $input_attributes = wpforms_html_attributes( + "wpforms-setting-{$field_id}", + [ 'wpforms-color-picker' ], + $data, + [ + 'type' => 'text', + 'name' => "{$id}[{$color}]", + 'value' => esc_attr( $field_value ), + ] + ); + + $output .= ""; + $output .= ''; + } + + if ( ! empty( $args['desc'] ) ) { + $output .= '

              ' . wp_kses_post( $args['desc'] ) . '

              '; + } + + return $output; +} + +/** + * Settings providers field callback - this is for the Integrations tab. + * + * @since 1.3.9 + * + * @param array $args Arguments. + * + * @return string + * @noinspection PhpUnusedParameterInspection + */ +function wpforms_settings_providers_callback( array $args ): string { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + $active = wpforms_get_providers_available(); + $providers = wpforms_get_providers_options(); + + $output = '
              '; + + ob_start(); + + /** + * Output settings providers. + * + * @since 1.3.9.1 + * + * @param array $active Active providers. + * @param array $providers Providers options. + */ + do_action( 'wpforms_settings_providers', $active, $providers ); + + $output .= ob_get_clean(); + $output .= '
              '; + + return $output; +} + +/** + * Webhooks' endpoint field callback. + * + * @since 1.8.4 + * + * @param array $args Field arguments. + * + * @return string + */ +function wpforms_settings_webhook_endpoint_callback( array $args ): string { + + if ( empty( $args['url'] ) ) { + return ''; // Early return if no URL is provided. + } + + $provider = $args['provider'] ?? 'stripe'; + $input_id = "wpforms-{$provider}-webhook-endpoint-url"; + $copy_btn = ''; + $input_field = ''; + + $output = sprintf( + '
              %2$s %3$s
              ', + esc_attr( "wpforms-{$provider}-webhook-endpoint-url" ), + $input_field, + $copy_btn + ); + + if ( ! empty( $args['desc'] ) ) { + $output .= sprintf( '

              %s

              ', wp_kses_post( $args['desc'] ) ); + } + + return $output; +} + +/** + * Settings field columns callback. + * + * @since 1.5.8 + * + * @param array $args Arguments passed by the setting. + * + * @return string + */ +function wpforms_settings_columns_callback( array $args ): string { + + if ( empty( $args['columns'] ) || ! is_array( $args['columns'] ) ) { + return ''; + } + + $output = '
              '; + + foreach ( $args['columns'] as $column ) { + + // Define default callback for this field type. + $callback = ! empty( $column['type'] ) ? 'wpforms_settings_' . $column['type'] . '_callback' : ''; + + // Allow custom callback to be provided via arg. + if ( ! empty( $column['callback'] ) ) { + $callback = $column['callback']; + } + + $output .= '
              '; + + if ( ! empty( $column['name'] ) ) { + $output .= ''; + } + + if ( function_exists( $callback ) ) { + $output .= $callback( $column ); + } + + $output .= '
              '; + } + + $output .= '
              '; + + return $output; +} diff --git a/wp-content/plugins/wpforms-lite/includes/class-db.php b/wp-content/plugins/wpforms-lite/includes/class-db.php new file mode 100755 index 00000000..b36641b6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-db.php @@ -0,0 +1,949 @@ +cache_group = static::class . '_cache'; + $this->cache_disabled = defined( 'WPFORMS_DISABLE_DB_CACHE' ) && WPFORMS_DISABLE_DB_CACHE; + + $this->hooks(); + } + + /** + * Query filter. + * + * @since 1.9.0 + * + * @return void + */ + private function hooks() { + + add_filter( 'query', [ $this, 'query_filter' ] ); + } + + /** + * Retrieve the list of columns for the database table. + * Subclasses should define an array of columns here. + * + * @since 1.1.6 + * + * @return array List of columns. + */ + public function get_columns() { + + return []; + } + + /** + * Retrieve column defaults. + * Subclasses can define default for any/all columns defined in the get_columns() method. + * + * @since 1.1.6 + * + * @return array All defined column defaults. + */ + public function get_column_defaults() { + + return []; + } + + /** + * Filter the query. + * + * @since 1.9.0 + * + * @param string|mixed $query Query. + * + * @return string + */ + public function query_filter( $query ): string { + + $query = (string) $query; + + if ( strpos( $query, $this->table_name ) === false ) { + // Not a query for our table, bail out. + return $query; + } + + if ( ! $this->is_select( $query ) ) { + // Flush cache on non-SELECT queries. + $this->cache_flush_group(); + } + + return $query; + } + + /** + * Retrieve a row from the database based on a given row ID. + * + * @since 1.1.6 + * + * @param int $row_id Row ID. + * + * @return null|object + */ + public function get( $row_id ) { + + global $wpdb; + + $key = md5( __METHOD__ . $row_id ); + $row = $this->cache_get( $key, $found ); + + if ( $found ) { + return $row; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $row = $wpdb->get_row( + $wpdb->prepare( + "SELECT * FROM $this->table_name WHERE $this->primary_key = %d LIMIT 1;", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + (int) $row_id + ) + ); + + $this->cache_set( $key, $row ); + + return $row; + } + + /** + * Retrieve a row based on column and row ID. + * + * @since 1.1.6 + * + * @param string $column Column name. + * @param int|string $value Column value. + * + * @return object|null Database query result, object or null on failure. + */ + public function get_by( $column, $value ) { + + global $wpdb; + + if ( + empty( $value ) || + ! array_key_exists( $column, $this->get_columns() ) + ) { + return null; + } + + $key = md5( __METHOD__ . $column . $value ); + $row = $this->cache_get( $key, $found ); + + if ( $found ) { + return $row; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $row = $wpdb->get_row( + $wpdb->prepare( + "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $value + ) + ); + + $this->cache_set( $key, $row ); + + return $row; + } + + /** + * Retrieve a value based on column name and row ID. + * + * @since 1.1.6 + * + * @param string $column Column name. + * @param int|string $row_id Row ID. + * + * @return string|null Database query result (as string), or null on failure. + * @noinspection PhpUnused + */ + public function get_column( $column, $row_id ) { + + global $wpdb; + + if ( empty( $row_id ) || ! array_key_exists( $column, $this->get_columns() ) ) { + return null; + } + + $key = md5( __METHOD__ . $column . $row_id ); + $var = $this->cache_get( $key, $found ); + + if ( $found ) { + return $var; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $var = $wpdb->get_var( + $wpdb->prepare( + "SELECT $column FROM $this->table_name WHERE $this->primary_key = %d LIMIT 1;", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + (int) $row_id + ) + ); + + $this->cache_set( $key, $var ); + + return $var; + } + + /** + * Retrieve one column value based on another given column and matching value. + * + * @since 1.1.6 + * + * @param string $column Column name. + * @param string $column_where Column to match against in the WHERE clause. + * @param string $column_value Value to match to the column in the WHERE clause. + * + * @return string|null Database query result (as string), or null on failure. + * @noinspection PhpUnused + */ + public function get_column_by( $column, $column_where, $column_value ) { + + global $wpdb; + + if ( + empty( $column ) || + empty( $column_where ) || + empty( $column_value ) || + ! array_key_exists( $column_where, $this->get_columns() ) || + ! array_key_exists( $column, $this->get_columns() ) + ) { + return null; + } + + $key = md5( __METHOD__ . $column . $column_where . $column_value ); + $var = $this->cache_get( $key, $found ); + + if ( $found ) { + return $var; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $var = $wpdb->get_var( + $wpdb->prepare( + "SELECT $column FROM $this->table_name WHERE $column_where = %s LIMIT 1;", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $column_value + ) + ); + + $this->cache_set( $key, $var ); + + return $var; + } + + /** + * Clone of $wpdb->query() with caching. + * + * @since 1.9.0 + * + * @param string $query Database query. + * + * @return int|bool Boolean true for CREATE, ALTER, TRUNCATE and DROP queries. Number of rows + * affected/selected for all other queries. Boolean false on error. + * + * @noinspection PhpMissingParamTypeInspection + */ + public function query( $query ) { + + global $wpdb; + + if ( ! $this->is_select( $query ) ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->query( $query ); + } + + $key = md5( __METHOD__ . $query ); + $results = $this->cache_get( $key, $found ); + + if ( $found ) { + return $results; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $results = $wpdb->query( $query ); + + $this->cache_set( $key, $results ); + + return $results; + } + + /** + * Clone of $wpdb->get_results() with caching. + * + * @since 1.9.0 + * + * @param string|null $query SQL query. + * @param string $output Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. + * + * @return array|object|null Database query results. + * @noinspection PhpMissingParamTypeInspection + */ + public function get_results( $query = null, $output = OBJECT ) { + + global $wpdb; + + if ( ! $this->is_select( $query ) ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->get_results( $query, $output ); + } + + $key = md5( __METHOD__ . $query . $output ); + $results = $this->cache_get( $key, $found ); + + if ( $found ) { + return $results; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $results = $wpdb->get_results( $query, $output ); + + $this->cache_set( $key, $results ); + + return $results; + } + + /** + * Clone of $wpdb->get_col() with caching. + * + * @since 1.9.4 + * + * @param string|null $query SQL query. + * @param int $x Column to return. Indexed from 0. + * + * @return array Database query results. + * @noinspection PhpMissingParamTypeInspection + */ + public function get_col( $query = null, $x = 0 ) { + + global $wpdb; + + if ( ! $this->is_select( $query ) ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->get_col( $query ); + } + + $key = md5( __METHOD__ . $query . $x ); + $col = $this->cache_get( $key, $found ); + + if ( $found ) { + return $col; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $col = $wpdb->get_col( $query, $x ); + + $this->cache_set( $key, $col ); + + return $col; + } + + /** + * Clone of $wpdb->get_row() with caching. + * + * @since 1.9.0 + * + * @param string|null $query SQL query. + * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which + * correspond to an stdClass object, an associative array, or a numeric array, + * respectively. Default OBJECT. + * @param int $y Optional. Row to return. Indexed from 0. Default 0. + * + * @return array|int|object|stdClass|null Database query result in format specified by $output or null on failure. + * @noinspection PhpMissingParamTypeInspection + */ + public function get_row( $query = null, $output = OBJECT, $y = 0 ) { + + global $wpdb; + + if ( ! $query ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->get_row( $query, $output, $y ); + } + + $key = md5( __METHOD__ . $query . $output . $y ); + $row = $this->cache_get( $key, $found ); + + if ( $found ) { + return $row; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $row = $wpdb->get_row( $query, $output, $y ); + + $this->cache_set( $key, $row ); + + return $row; + } + + /** + * Clone of $wpdb->get_var() with caching. + * + * @since 1.9.0 + * + * @param string|null $query Optional. SQL query. Defaults to null, use the result from the previous query. + * @param int $x Optional. Column of value to return. Indexed from 0. Default 0. + * @param int $y Optional. Row of value to return. Indexed from 0. Default 0. + * + * @return string|null Database query result (as string), or null on failure. + * + * @noinspection PhpMissingParamTypeInspection + */ + public function get_var( $query = null, $x = 0, $y = 0 ) { + + global $wpdb; + + if ( ! $query ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->get_var( $query, $x, $y ); + } + + $key = md5( __METHOD__ . $query . $x . $y ); + $var = $this->cache_get( $key, $found ); + + if ( $found ) { + return $var; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $var = $wpdb->get_var( $query, $x, $y ); + + $this->cache_set( $key, $var ); + + return $var; + } + + /** + * Insert a new record into the database. + * + * @since 1.1.6 + * + * @param array $data Column data. + * @param string $type Optional. Data type context. + * + * @return int ID for the newly inserted record. Zero otherwise. + */ + public function add( $data, $type = '' ) { + + global $wpdb; + + // Set default values. + $data = wp_parse_args( $data, $this->get_column_defaults() ); + + do_action( 'wpforms_pre_insert_' . $type, $data ); + + // Initialise column format array. + $column_formats = $this->get_columns(); + + // Force fields to lower a case. + $data = array_change_key_case( $data ); + + // Whitelist columns. + $data = array_intersect_key( $data, $column_formats ); + + // Reorder $column_formats to match the order of columns given in $data. + $data_keys = array_keys( $data ); + $column_formats = array_merge( array_flip( $data_keys ), $column_formats ); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery + $wpdb->insert( $this->table_name, $data, $column_formats ); + + do_action( 'wpforms_post_insert_' . $type, $wpdb->insert_id, $data ); + + return $wpdb->insert_id; + } + + /** + * Insert a new record into the database. This runs the add() method. + * + * @see add() + * + * @since 1.1.6 + * + * @param array $data Column data. + * + * @return int ID for the newly inserted record. + */ + public function insert( $data ) { + + return $this->add( $data ); + } + + /** + * Update an existing record in the database. + * + * @since 1.1.6 + * + * @param int|string $row_id Row ID for the record being updated. + * @param array $data Optional. Array of columns and associated data to update. Default empty array. + * @param string $where Optional. Column to match against in the WHERE clause. If empty, $primary_key + * will be used. Default empty. + * @param string $type Optional. Data type context, e.g. 'affiliate', 'creative', etc. Default empty. + * + * @return bool False if the record could not be updated, true otherwise. + */ + public function update( $row_id, $data = [], $where = '', $type = '' ) { + + global $wpdb; + + // Row ID must be a positive integer. + $row_id = absint( $row_id ); + + if ( empty( $row_id ) ) { + return false; + } + + if ( empty( $where ) ) { + $where = $this->primary_key; + } + + /** + * Fires before updating a record in the database. + * + * @since 1.5.9 + * @since 1.9.2 Added $row_id parameter. + * + * @param array $data Array of columns and associated data to update. + * @param int $row_id Row ID for the record being updated. + */ + do_action( "wpforms_pre_update_{$type}", $data, $row_id ); + + // Initialise column format array. + $column_formats = $this->get_columns(); + + // Force fields to the lower case. + $data = array_change_key_case( $data ); + + // Whitelist columns. + $data = array_intersect_key( $data, $column_formats ); + + // Reorder $column_formats to match the order of columns given in $data. + $data_keys = array_keys( $data ); + $column_formats = array_merge( array_flip( $data_keys ), $column_formats ); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + if ( $wpdb->update( $this->table_name, $data, [ $where => $row_id ], $column_formats ) === false ) { + return false; + } + + /** + * Fires after a record has been updated in the database. + * + * @since 1.1.6 + * @since 1.9.2 Added $row_id parameter. + * + * @param array $data Array of columns and associated data that were updated. + * @param int $row_id Row ID for the record that was updated. + */ + do_action( "wpforms_post_update_{$type}", $data, $row_id ); + + return true; + } + + /** + * Delete a record from the database. + * + * @since 1.1.6 + * + * @param int|string $row_id Row ID. + * + * @return bool False if the record could not be deleted, true otherwise. + */ + public function delete( $row_id = 0 ): bool { + + global $wpdb; + + // Row ID must be a positive integer. + $row_id = absint( $row_id ); + + if ( empty( $row_id ) ) { + return false; + } + + /** + * Fires before a record is deleted from the database. + * + * @since 1.5.9 + * + * @param int $row_id Row ID. + */ + do_action( 'wpforms_pre_delete', $row_id ); + + /** + * Fires before a record is deleted from the database by type. + * + * @since 1.5.9 + * @since 1.8.6 Added `$primary_key` parameter. + * + * @param int $row_id Column value. + * @param string $primary_key Column name. + */ + do_action( 'wpforms_pre_delete_' . $this->type, $row_id, $this->primary_key ); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $result = $wpdb->query( + $wpdb->prepare( + "DELETE FROM $this->table_name WHERE $this->primary_key = %d", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $row_id + ) + ); + + if ( $result === false ) { + return false; + } + + do_action( 'wpforms_post_delete', $row_id ); + do_action( 'wpforms_post_delete_' . $this->type, $row_id ); + + return true; + } + + /** + * Delete a record from the database by column. + * + * @since 1.1.6 + * + * @param string $column Column name. + * @param int|string $column_value Column value. + * + * @return bool False if the record could not be deleted, true otherwise. + */ + public function delete_by( $column, $column_value ) { + + global $wpdb; + + if ( + empty( $column ) || + empty( $column_value ) || + ! array_key_exists( $column, $this->get_columns() ) + ) { + return false; + } + + // This action is documented in includes/class-db.php method delete(). + do_action( 'wpforms_pre_delete', $column_value ); + + // This action is documented in includes/class-db.php method delete(). + do_action( 'wpforms_pre_delete_' . $this->type, $column_value, $column ); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $result = $wpdb->query( + $wpdb->prepare( + "DELETE FROM $this->table_name WHERE $column = %s", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $column_value + ) + ); + + if ( $result === false ) { + return false; + } + + do_action( 'wpforms_post_delete', $column_value ); + do_action( 'wpforms_post_delete_' . $this->type, $column_value ); + + return true; + } + + /** + * Delete record(s) from the database using WHERE IN syntax. + * + * @since 1.6.4 + * + * @param string $column Column name. + * @param mixed $column_values Column values. + * + * @return int|bool Number of deleted records, false otherwise. + */ + public function delete_where_in( $column, $column_values ) { + + global $wpdb; + + if ( empty( $column ) || empty( $column_values ) ) { + return false; + } + + if ( ! array_key_exists( $column, $this->get_columns() ) ) { + return false; + } + + $values = (array) $column_values; + + foreach ( $values as $key => $value ) { + // Check if a string contains an integer and sanitize accordingly. + if ( (string) (int) $value === $value ) { + $values[ $key ] = (int) $value; + $placeholders[ $key ] = '%d'; + } else { + $values[ $key ] = sanitize_text_field( $value ); + $placeholders[ $key ] = '%s'; + } + } + + $placeholders = isset( $placeholders ) ? implode( ',', $placeholders ) : ''; + $sql = "DELETE FROM $this->table_name WHERE $column IN ( $placeholders )"; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->query( $wpdb->prepare( $sql, $values ) ); + } + + /** + * Check if the given table exists. + * + * @since 1.1.6 + * @since 1.5.9 Default value is now the current child class table name. + * + * @param string $table The table name. Defaults to the child class table name. + * + * @return bool If the table name exists. + */ + public function table_exists( string $table = '' ): bool { + + $table = ! empty( $table ) ? sanitize_text_field( $table ) : $this->table_name; + + return DB::table_exists( $table ); + } + + /** + * Build WHERE for a query. + * + * @since 1.7.2.2 + * + * @param array $args Optional args. + * @param array $keys Allowed arg items. + * @param string|string[] $formats Formats of arg items. + * + * @return string + */ + protected function build_where( $args, $keys = [], $formats = [] ) { + + $formats = array_pad( $formats, count( $keys ), '%d' ); + $where = ''; + + foreach ( $keys as $index => $key ) { + // Value `$args[ $key ]` can be a natural number and a numeric string. + // We should skip empty string values, but continue working with '0'. + if ( empty( $args[ $key ] ) && $args[ $key ] !== '0' ) { + continue; + } + + $ids = wpforms_wpdb_prepare_in( $args[ $key ], $formats[ $index ] ); + + $where .= empty( $where ) ? 'WHERE' : 'AND'; + $where .= " `{$key}` IN ( {$ids} ) "; + } + + return $where; + } + + /** + * WP Cache Get wrapper. + * + * @since 1.9.0 + * + * @param int|string $key Cache key. + * @param bool|null $found Whether the key was found in the cache. + * + * @return false|mixed + * @noinspection PhpMissingParamTypeInspection + */ + private function cache_get( $key, &$found ) { + + if ( $this->cache_disabled ) { + $found = false; + + return false; + } + + $all_keys = wp_cache_get( self::ALL_KEYS, $this->cache_group, false, $found ); + $all_keys = $found ? (array) $all_keys : []; + + if ( ! in_array( $key, $all_keys, true ) ) { + $found = false; + + return false; + } + + $data = wp_cache_get( $key, $this->cache_group, false, $found ); + + return $found ? $data : false; + } + + /** + * WP Cache Set wrapper. + * + * @since 1.9.0 + * + * @param string $key Cache key. + * @param mixed $data Cache data. + * + * @return bool + * @noinspection PhpReturnValueOfMethodIsNeverUsedInspection + */ + private function cache_set( string $key, $data ): bool { + + if ( $this->cache_disabled ) { + return false; + } + + $all_keys = wp_cache_get( self::ALL_KEYS, $this->cache_group, false, $found ); + $all_keys = $found ? array_unique( array_merge( (array) $all_keys, [ $key ] ) ) : [ $key ]; + + return ( + wp_cache_set( $key, $data, $this->cache_group ) && + wp_cache_set( self::ALL_KEYS, $all_keys, $this->cache_group ) + ); + } + + /** + * Flush the cache group. + * + * @since 1.9.0 + * + * @return bool + * @noinspection PhpReturnValueOfMethodIsNeverUsedInspection + */ + private function cache_flush_group(): bool { + + if ( $this->cache_disabled ) { + return false; + } + + $all_keys = wp_cache_get( self::ALL_KEYS, $this->cache_group, false, $found ); + + if ( ! $found ) { + return true; + } + + $result = wp_cache_delete( self::ALL_KEYS, $this->cache_group ); + + foreach ( (array) $all_keys as $key ) { + $result = wp_cache_delete( $key, $this->cache_group ) && $result; + } + + return $result; + } + + /** + * Check if the query is a SELECT query. + * + * @since 1.9.0 + * + * @param string|null $query SQL query. + * + * @return bool + * @noinspection PhpMissingParamTypeInspection + */ + private function is_select( $query ): bool { + + return stripos( trim( (string) $query ), 'SELECT' ) === 0; + } + + /** + * Get an instance of the current class. + * Used to reload the class while going through the blogs of multisite. + * + * @see WPForms_Install::maybe_create_tables() + * + * @since 1.8.9 + */ + public static function get_instance(): WPForms_DB { + + return new static(); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/class-fields.php b/wp-content/plugins/wpforms-lite/includes/class-fields.php new file mode 100755 index 00000000..dfa4d740 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-fields.php @@ -0,0 +1,98 @@ +init(); + } + + /** + * Initialize hooks. + * + * @since 1.2.8 + * @since 1.8.2 Moved base class loading to \WPForms\WPForms::includes. + */ + public function init() { + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.7.7 + */ + private function hooks() { + + // Load default fields on WP init. + add_action( 'init', [ $this, 'load' ] ); + } + + /** + * Load default field types. + * + * @since 1.0.0 + * @since 1.9.4 Removed Pro fields from the list. They loaded in the main Loader class. + */ + public function load() { + + $fields = [ + 'text', + 'textarea', + 'select', + 'radio', + 'checkbox', + 'email', + 'name', + 'number', + 'number-slider', + 'internal-information', + ]; + + // Include GDPR Checkbox field if GDPR enhancements are enabled. + if ( wpforms_setting( 'gdpr' ) ) { + $fields[] = 'gdpr-checkbox'; + } + + /** + * Filters array of fields to be loaded. + * + * @since 1.0.0 + * + * @param array $fields Field types. + */ + $fields = (array) apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_load_fields', + $fields + ); + + foreach ( $fields as $field ) { + + $file = WPFORMS_PLUGIN_DIR . 'includes/fields/class-' . $field . '.php'; + + if ( file_exists( $file ) ) { + require_once $file; + } + } + + // We have to put it here due to tests for restricted emails. + new WPForms_Field_Email(); + } +} + +new WPForms_Fields(); diff --git a/wp-content/plugins/wpforms-lite/includes/class-form.php b/wp-content/plugins/wpforms-lite/includes/class-form.php new file mode 100755 index 00000000..c89f11aa --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-form.php @@ -0,0 +1,1566 @@ +is_form_data_slashing_enabled = wpforms_is_form_data_slashing_enabled(); + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.7.5 + */ + private function hooks(): void { + + // Register wpforms custom post type and taxonomy. + add_action( 'init', [ $this, 'register_taxonomy' ] ); + add_action( 'init', [ $this, 'register_cpt' ] ); + + // Add wpforms to a new-content admin bar menu. + add_action( 'admin_bar_menu', [ $this, 'admin_bar' ], 99 ); + add_action( 'wpforms_create_form', [ $this, 'track_first_form' ], 10, 3 ); + + // @WPFormsBackCompat Support Zapier v1.5.0 and earlier. + add_filter( 'wpforms_form_handler_add_notices', [ $this, '_zapier_disconnected_on_duplication' ], 10, 3 ); + } + + /** + * Register the custom post type to be used for forms. + * + * @since 1.0.0 + */ + public function register_cpt(): void { + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Filters Custom Post Type arguments. + * + * @since 1.0.0 + * + * @param array $args Arguments. + */ + $args = apply_filters( + 'wpforms_post_type_args', + [ + 'label' => 'WPForms', + 'public' => false, + 'exclude_from_search' => true, + 'show_ui' => false, + 'show_in_admin_bar' => false, + 'rewrite' => false, + 'query_var' => false, + 'can_export' => false, + 'supports' => [ 'title', 'author', 'revisions' ], + 'capability_type' => 'wpforms_form', // Not using 'capability_type' anywhere. It just has to be custom for security reasons. + 'map_meta_cap' => false, // Don't let WP to map meta caps to have a granular control over this process via 'map_meta_cap' filter. + ] + ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + // Register the post type. + register_post_type( 'wpforms', $args ); + } + + /** + * Register the new taxonomy for tags. + * + * @since 1.7.5 + */ + public function register_taxonomy(): void { + + /** + * Filters Tags taxonomy arguments. + * + * @since 1.7.5 + * + * @param array $args Arguments. + */ + $args = apply_filters( + 'wpforms_form_handler_register_taxonomy_args', + [ + 'hierarchical' => false, + 'rewrite' => false, + 'public' => false, + ] + ); + + register_taxonomy( self::TAGS_TAXONOMY, 'wpforms', $args ); + } + + /** + * Add "WPForms" item to new-content admin bar menu item. + * + * @since 1.1.7.2 + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + */ + public function admin_bar( $wp_admin_bar ): void { + + if ( ! is_admin_bar_showing() || ! wpforms_current_user_can( 'create_forms' ) ) { + return; + } + + $args = [ + 'id' => 'wpforms', + 'title' => esc_html__( 'WPForms', 'wpforms-lite' ), + 'href' => admin_url( 'admin.php?page=wpforms-builder' ), + 'parent' => 'new-content', + ]; + + $wp_admin_bar->add_node( $args ); + } + + /** + * Preserve the timestamp when the very first form has been created. + * + * @since 1.6.7.1 + * + * @param int $form_id Newly created form ID. + * @param array $form Array past to create a new form in the wp_posts table. + * @param array $data Additional form data. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function track_first_form( $form_id, $form, $data ): void { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + // Do we have the value already? + $time = get_option( 'wpforms_forms_first_created' ); + + // Check whether we have already saved this option - skip. + if ( ! empty( $time ) ) { + return; + } + + // Check whether we have any forms other than the currently created one. + $other_form = $this->get( + '', + [ + 'posts_per_page' => 1, + 'nopaging' => false, + 'fields' => 'ids', + 'post__not_in' => [ $form_id ], // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'cap' => false, + ] + ); + + // As we have other forms - we are not certain about the situation, skip. + if ( ! empty( $other_form ) ) { + return; + } + + add_option( 'wpforms_forms_first_created', time(), '', 'no' ); + } + + /** + * Fetch forms. + * + * @since 1.0.0 + * + * @param mixed $id Form ID. + * @param array $args Additional arguments array. + * + * @return array|bool|null|WP_Post + */ + public function get( $id = '', array $args = [] ) { + + if ( $id === false ) { + return false; + } + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Allow developers to filter the WPForms_Form_Handler::get() arguments. + * + * @since 1.0.0 + * + * @param array $args Arguments array. + * @param mixed $id Form ID. + */ + $args = (array) apply_filters( 'wpforms_get_form_args', $args, $id ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + // By default, we should return only published forms. + $defaults = [ + 'post_status' => 'publish', + ]; + + $args = wp_parse_args( $args, $defaults ); + + $forms = empty( $id ) ? $this->get_multiple( $args ) : $this->get_single( $id, $args ); + + return ! empty( $forms ) ? $forms : false; + } + + /** + * Fetch a single form. + * + * @since 1.5.8 + * + * @param string|int $id Form ID. + * @param array $args Additional arguments array. + * + * @return array|bool|null|WP_Post + */ + protected function get_single( $id = '', array $args = [] ) { + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Allow developers to filter the get_single() arguments. + * + * @since 1.5.8 + * + * @param array $args Arguments' array, same as for `get_post()` function. + * @param string|int $id Form ID. + */ + $args = apply_filters( 'wpforms_get_single_form_args', $args, $id ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + $access_obj = wpforms()->obj( 'access' ); + + if ( ! $access_obj ) { + return false; + } + + if ( ! isset( $args['cap'] ) && $access_obj->init_allowed() ) { + $args['cap'] = 'view_form_single'; + } + + if ( ! empty( $args['cap'] ) && ! wpforms_current_user_can( $args['cap'], $id ) ) { + return false; + } + + // If no ID provided, we can't get a single form. + if ( empty( $id ) ) { + return false; + } + + // If ID is provided, we get a single form. + $form = get_post( absint( $id ) ); + + // Check if the form exists. + if ( empty( $form ) || ! $form instanceof WP_Post ) { + return false; + } + + // Check if the form is of the allowed post type. + if ( ! in_array( $form->post_type, self::POST_TYPES, true ) ) { + return false; + } + + // Decode the form content. + if ( ! empty( $args['content_only'] ) ) { + $form = wpforms_decode( $form->post_content ); + } + + return $form; + } + + /** + * Fetch multiple forms. + * + * @since 1.5.8 + * @since 1.7.2 Added support for $args['search']['term'] - search form title or description by term. + * + * @param array $args Additional arguments array. + * + * @return array + */ + protected function get_multiple( array $args = [] ): array { + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Allow developers to filter the get_multiple() arguments. + * + * @since 1.5.8 + * + * @param array $args Arguments' array. Almost the same as for the `get_posts ()` function. + * Additional element: + * ['search']['term'] - search the form title or description by term. + */ + $args = (array) apply_filters( 'wpforms_get_multiple_forms_args', $args ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + // No ID provided, get multiple forms. + $defaults = [ + 'orderby' => 'id', + 'order' => 'ASC', + 'no_found_rows' => true, + 'nopaging' => true, + 'suppress_filters' => false, + ]; + + $args = wp_parse_args( $args, $defaults ); + + $post_type = $args['post_type'] ?? []; + + // Post type should be one of the allowed post types. + $post_type = array_intersect( (array) $post_type, self::POST_TYPES ); + + // If no valid (allowed) post types are provided, use the default one. + $args['post_type'] = ! empty( $post_type ) ? $post_type : 'wpforms'; + + /** + * Allow developers to execute some code before get_posts() call inside \WPForms_Form_Handler::get_multiple(). + * + * @since 1.7.2 + * + * @param array $args Arguments of the `get_posts()`. + */ + do_action( 'wpforms_form_handler_get_multiple_before_get_posts', $args ); + + $forms = get_posts( $args ); + + /** + * Allow developers to execute some code right after the get_posts () call inside \WPForms_Form_Handler::get_multiple(). + * + * @since 1.7.2 + * + * @param array $args Arguments of the `get_posts`. + * @param array $forms Forms data. Result of getting multiple forms. + */ + do_action( 'wpforms_form_handler_get_multiple_after_get_posts', $args, $forms ); + + /** + * Allow developers to filter the result of get_multiple(). + * + * @since 1.7.2 + * + * @param array $forms Result of getting multiple forms. + */ + return apply_filters( 'wpforms_form_handler_get_multiple_forms_result', $forms ); + } + + /** + * Update the form status. + * + * @since 1.7.3 + * + * @param int $form_id Form ID. + * @param string $status New status. + * + * @return bool + */ + public function update_status( $form_id, $status ): bool { + + // Status updates are used only in trash and restore actions, + // which are actually part of the deletion operation. + // Therefore, we should check the `delete_form_single` and not `edit_form_single` permission. + if ( ! wpforms_current_user_can( 'delete_form_single', $form_id ) ) { + return false; + } + + $form_id = absint( $form_id ); + $status = empty( $status ) ? 'publish' : sanitize_key( $status ); + + /** + * Filters the allowed form statuses. + * + * @since 1.7.3 + * + * @param array $allowed_statuses Array of allowed form statuses. Default: publish, trash. + */ + $allowed = (array) apply_filters( 'wpforms_form_handler_update_status_allowed', [ 'publish', 'trash' ] ); + + if ( ! in_array( $status, $allowed, true ) ) { + return false; + } + + $result = wp_update_post( + [ + 'ID' => $form_id, + 'post_status' => $status, + ] + ); + + /** + * Allow developers to execute some code after changing form status. + * + * @since 1.8.1 + * + * @param string $form_id Form ID. + * @param string $status New form status, `publish` or `trash`. + */ + do_action( 'wpforms_form_handler_update_status', $form_id, $status ); + + return $result !== 0; + } + + /** + * Delete all forms in the Trash. + * + * @since 1.7.3 + * + * @return int|bool Number of deleted forms OR false. + */ + public function empty_trash() { + + $forms = $this->get_multiple( + [ + 'post_type' => self::POST_TYPES, + 'post_status' => 'trash', + 'fields' => 'ids', + 'suppress_filters' => true, // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters + ] + ); + + if ( empty( $forms ) ) { + return false; + } + + return $this->delete( $forms ) ? count( $forms ) : false; + } + + /** + * Delete forms. + * + * @since 1.0.0 + * + * @param array $ids Form IDs. + * + * @return bool + */ + public function delete( $ids = [] ): bool { + + if ( ! is_array( $ids ) ) { + $ids = [ $ids ]; + } + + $ids = array_map( 'absint', $ids ); + + foreach ( $ids as $id ) { + + // Check for permissions. + if ( ! wpforms_current_user_can( 'delete_form_single', $id ) ) { + return false; + } + + $entry_obj = wpforms()->obj( 'entry' ); + $entry_meta_obj = wpforms()->obj( 'entry_meta' ); + $entry_fields_obj = wpforms()->obj( 'entry_fields' ); + + if ( $entry_obj && $entry_meta_obj && $entry_fields_obj ) { + $entry_obj->delete_by( 'form_id', $id ); + $entry_meta_obj->delete_by( 'form_id', $id ); + $entry_fields_obj->delete_by( 'form_id', $id ); + } + + $form = wp_delete_post( $id, true ); + + if ( ! $form ) { + return false; + } + } + + /** + * Fires when forms are deleted. + * + * @since 1.5.1 + * + * @param array $ids Array of form IDs. + */ + do_action( 'wpforms_delete_form', $ids ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + return true; + } + + /** + * Add a new form. + * + * @since 1.0.0 + * + * @param string $title Form title. + * @param array $args Additional arguments. + * @param array $data Form data. + * + * @return false|int|WP_Error + */ + public function add( $title = '', $args = [], $data = [] ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks, Generic.Metrics.CyclomaticComplexity.TooHigh + + // Must have a title. + if ( empty( $title ) ) { + return false; + } + + // Check for permissions. + if ( ! wpforms_current_user_can( 'create_forms' ) ) { + return false; + } + + $this->remove_form_content_filters(); + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Filters form creation arguments. + * + * @since 1.0.0 + * + * @param array $args Form creation arguments. + * @param array $data Additional data. + */ + $args = apply_filters( 'wpforms_create_form_args', $args, $data ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + $form_content = [ + 'field_id' => '0', + 'settings' => [ + 'form_title' => sanitize_text_field( $title ), + 'form_desc' => '', + ], + ]; + + if ( $this->is_form_data_slashing_enabled ) { + $form_content = wp_slash( $form_content ); + } + + $args_form_data = isset( $args['post_content'] ) ? json_decode( wp_unslash( $args['post_content'] ), true ) : null; + + // Prevent $args['post_content'] from overwriting predefined $form_content. + // Typically, it happens if the form was created with a form template and a user was not redirected to a form editing screen afterward. + // This is only possible if a user has 'wpforms_create_forms' and no 'wpforms_edit_own_forms' capability. + if ( is_array( $args_form_data ) ) { + $args['post_content'] = wpforms_encode( array_replace_recursive( $form_content, $args_form_data ) ); + } + + // Merge args and create the form. + $form = wp_parse_args( + $args, + [ + 'post_title' => esc_html( $title ), + 'post_status' => 'publish', + 'post_type' => 'wpforms', + 'post_content' => wpforms_encode( $form_content ), + ] + ); + + $form_id = wp_insert_post( $form ); + + // Set form tags. + if ( ! empty( $form_id ) && ! empty( $args_form_data['settings']['form_tags'] ) ) { + wp_set_post_terms( + $form_id, + implode( ',', $args_form_data['settings']['form_tags'] ), + self::TAGS_TAXONOMY + ); + } + + // If a user has no editing permissions, the form considered to be created out of the WPForms form builder's context. + if ( ! wpforms_current_user_can( 'edit_form_single', $form_id ) ) { + $data['builder'] = false; + } + + // If the form is created outside the context of the WPForms form + // builder, then we define some additional default values. + if ( ! empty( $form_id ) && isset( $data['builder'] ) && $data['builder'] === false ) { + $form_data = json_decode( wp_unslash( $form['post_content'] ), true ); + $form_data['id'] = $form_id; + $form_data['settings']['submit_text'] = esc_html__( 'Submit', 'wpforms-lite' ); + $form_data['settings']['submit_text_processing'] = esc_html__( 'Sending...', 'wpforms-lite' ); + $form_data['settings']['notification_enable'] = '1'; + $form_data['settings']['notifications'] = [ + '1' => [ + 'email' => '{admin_email}', + 'subject' => sprintf( /* translators: %s - form name. */ + esc_html__( 'New Entry: %s', 'wpforms-lite' ), + esc_html( $title ) + ), + 'sender_name' => get_bloginfo( 'name' ), + 'sender_address' => '{admin_email}', + 'message' => '{all_fields}', + ], + ]; + $form_data['settings']['confirmations'] = [ + '1' => [ + 'type' => 'message', + 'message' => esc_html__( 'Thanks for contacting us! We will be in touch with you shortly.', 'wpforms-lite' ), + 'message_scroll' => '1', + ], + ]; + + $this->update( $form_id, $form_data, [ 'cap' => 'create_forms' ] ); + } + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Fires after the form was created. + * + * @since 1.0.0 + * + * @param int $form_id Form ID. + * @param array $form Form data. + * @param array $data Additional data. + */ + do_action( 'wpforms_create_form', $form_id, $form, $data ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + return $form_id; + } + + /** + * Update form. + * + * @since 1.0.0 + * + * @param string|int $form_id Form ID. + * @param array $data Data retrieved from $_POST and processed. + * @param array $args Empty by default. May have custom data not intended to be saved. + * + * @return int|false + */ + public function update( $form_id = '', array $data = [], array $args = [] ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks, Generic.Metrics.CyclomaticComplexity.TooHigh + + if ( empty( $data ) ) { + return false; + } + + if ( empty( $form_id ) && isset( $data['id'] ) ) { + $form_id = $data['id']; + } + + if ( ! isset( $args['cap'] ) ) { + $args['cap'] = 'edit_form_single'; + } + + if ( ! empty( $args['cap'] ) && ! wpforms_current_user_can( $args['cap'], $form_id ) ) { + return false; + } + + $this->remove_form_content_filters(); + + if ( $this->is_form_data_slashing_enabled ) { + // Even though we are not going to unslash some data, + // columns-json and calculation_code fields must be unslashed. + $data = $this->unslash_field_keys( $data, [ 'columns-json', 'calculation_code' ] ); + } else { + $data = (array) wp_unslash( $data ); + } + + $title = empty( $data['settings']['form_title'] ) ? get_the_title( $form_id ) : $data['settings']['form_title']; + $desc = empty( $data['settings']['form_desc'] ) ? '' : $data['settings']['form_desc']; + + $data['field_id'] = ! empty( $data['field_id'] ) ? wpforms_validate_field_id( $data['field_id'] ) : '0'; + + // Preserve the explicit "Do not store spam entries" state. + $data['settings']['store_spam_entries'] = $data['settings']['store_spam_entries'] ?? '0'; + + // Use the default 'submit' button text if not provided. + $data['settings']['submit_text'] = ! empty( $data['settings']['submit_text'] ) ? $data['settings']['submit_text'] : esc_html__( 'Submit', 'wpforms-lite' ); + + // Preserve form meta. + $meta = $this->get_meta( $form_id ); + + /** + * Filters the form meta before saving. + * + * @since 1.9.8 + * + * @param array $meta Form meta. + * @param int $form_id Form ID. + * @param array $data Form data. + */ + $meta = apply_filters( 'wpforms_form_handler_update_meta', $meta, $form_id, $data ); + + if ( $meta ) { + $data['meta'] = $meta; + } + + // Update category and subcategory only if available. + if ( ! empty( $args['category'] ) ) { + $data['meta']['category'] = $args['category']; + } + + if ( ! empty( $args['subcategory'] ) ) { + $data['meta']['subcategory'] = $args['subcategory']; + } + + // Preserve fields meta. + if ( isset( $data['fields'] ) ) { + $data['fields'] = $this->update__preserve_fields_meta( $data['fields'], $form_id ); + } + + // Sanitize - don't allow tags for users who do not have the appropriate cap. + // If we don't do this, forms for these users can get corrupt due to conflicts with wp_kses(). + if ( ! current_user_can( 'unfiltered_html' ) ) { + $data = map_deep( $data, 'wp_strip_all_tags' ); + } + + // Sanitize notifications names. + if ( isset( $data['settings']['notifications'] ) ) { + $data['settings']['notifications'] = $this->update__sanitize_notifications_names( $data['settings']['notifications'] ); + } + + unset( $notification ); + + /** + * Allow changing post data before saving. + * + * @since 1.0.0 + * + * @param array $post_data Post data. + * @param array $form_data Form data. + * @param array $args Empty by default. May have custom data not intended to be saved. + */ + $form = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_save_form_args', + [ + 'ID' => $form_id, + 'post_title' => esc_html( $title ), + 'post_excerpt' => $desc, + 'post_content' => wpforms_encode( $data ), + ], + $data, + $args + ); + + if ( ! empty( $args['skip_revision'] ) ) { + remove_action( 'post_updated', 'wp_save_post_revision' ); + } + + $_form_id = wp_update_post( $form ); + + if ( ! empty( $args['skip_revision'] ) ) { + add_action( 'post_updated', 'wp_save_post_revision' ); + } + + if ( is_wp_error( $_form_id ) ) { + return false; + } + + /** + * Fires after saving the form. + * + * @since 1.0.0 + * + * @param int $_form_id Form ID. + * @param array $form Form. + */ + do_action( 'wpforms_save_form', $_form_id, $form ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + return $_form_id; + } + + /** + * Preserve fields meta in 'update' method. + * + * @since 1.5.8 + * + * @param array $fields Form fields. + * @param string|int $form_id Form ID. + * + * @return array + */ + protected function update__preserve_fields_meta( $fields, $form_id ): array { + + foreach ( $fields as $i => $field_data ) { + if ( isset( $field_data['id'] ) ) { + $field_meta = $this->get_field_meta( $form_id, $field_data['id'] ); + + if ( $field_meta ) { + $fields[ $i ]['meta'] = $field_meta; + } + } + } + + return $fields; + } + + /** + * Sanitize notifications names meta in 'update' method. + * + * @since 1.5.8 + * + * @param array $notifications Form notifications. + * + * @return array + */ + protected function update__sanitize_notifications_names( $notifications ): array { + + foreach ( $notifications as &$notification ) { + if ( ! empty( $notification['notification_name'] ) ) { + $notification['notification_name'] = sanitize_text_field( $notification['notification_name'] ); + } + } + + return $notifications; + } + + /** + * Duplicate forms. + * + * @since 1.1.4 + * @since 1.8.8 Return array of new form IDs instead of true. + * + * @param array|string $ids Form IDs to duplicate. + * + * @return bool|array Array of new form IDs or false. + */ + public function duplicate( $ids ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks, Generic.Metrics.CyclomaticComplexity.TooHigh + + // Check for permissions. + if ( ! wpforms_current_user_can( 'create_forms' ) ) { + return false; + } + + $this->remove_form_content_filters(); + + if ( ! is_array( $ids ) ) { + $ids = [ $ids ]; + } + + $ids = array_map( 'absint', $ids ); + + $duplicate_ids = []; + + foreach ( $ids as $id ) { + + // Get the original entry. + $form = get_post( $id ); + + if ( ! wpforms_current_user_can( 'view_form_single', $id ) ) { + return false; + } + + // Confirm form exists. + if ( empty( $form ) ) { + return false; + } + + // Get the form data. + $new_form_data = (array) wpforms_decode( $form->post_content ); + + if ( $this->is_form_data_slashing_enabled ) { + $new_form_data = (array) wp_slash( $new_form_data ); + } + + // Remove form ID from the title if present. + $new_form_data['settings']['form_title'] = str_replace( '(ID #' . absint( $id ) . ')', '', $new_form_data['settings']['form_title'] ); + + // Remove '(copy)' from the form template title if present. + $new_form_data['settings']['form_title'] = str_replace( __( '(copy)', 'wpforms-lite' ), '', $new_form_data['settings']['form_title'] ); + + // Remove trailing spaces. + $new_form_data['settings']['form_title'] = rtrim( $new_form_data['settings']['form_title'] ); + + // Remove the `-template ` suffix and all after it from the post name. + $post_name = preg_replace( '/-template(-\d+)?/', '', $form->post_name ); + + // Add some notice messages before form preview area. + $new_form_data = $this->add_notices( $new_form_data, (int) $id ); + + // Create the duplicate form. + $new_form = [ + 'post_content' => wpforms_encode( $new_form_data ), + 'post_excerpt' => $form->post_excerpt, + 'post_status' => $form->post_status, + 'post_title' => $new_form_data['settings']['form_title'], + 'post_type' => $form->post_type, + 'post_name' => wpforms_is_form_template( $id ) ? $post_name . '-template' : $post_name, + ]; + $new_form_id = wp_insert_post( $new_form ); + + if ( ! $new_form_id || is_wp_error( $new_form_id ) ) { + return false; + } + + // Set a new form name. + $new_form_data['settings']['form_title'] .= $form->post_type === 'wpforms-template' ? + ' ' . __( '(copy)', 'wpforms-lite' ) : + ' (ID #' . absint( $new_form_id ) . ')'; + + // Set a new form ID. + $new_form_data['id'] = absint( $new_form_id ); + + // Update a new duplicate form. + $new_form_id = $this->update( $new_form_id, $new_form_data, [ 'cap' => 'create_forms' ] ); + + if ( ! $new_form_id ) { + return false; + } + + // Add tags to the new form. + if ( ! empty( $new_form_data['settings']['form_tags'] ) ) { + wp_set_post_terms( + $new_form_id, + implode( ',', (array) $new_form_data['settings']['form_tags'] ), + self::TAGS_TAXONOMY + ); + } + + /** + * Fires after the form was duplicated. + * + * @since 1.8.2.2 + * + * @param int $id Original form ID. + * @param int $new_form_id New form ID. + * @param array $new_form_data New form data. + */ + do_action( 'wpforms_form_handler_duplicate_form', $id, $new_form_id, $new_form_data ); + + $duplicate_ids[] = $new_form_id; + } + + return $duplicate_ids; + } + + /** + * Convert form to a template and vice versa. + * + * @since 1.8.8 + * + * @param string|int $form_id Form ID. + * @param string $convert_to Convert to, `form` or `template`. + * + * @return false|int New object ID or false on failure. + */ + public function convert( $form_id, string $convert_to ) { + + if ( ! in_array( $convert_to, [ 'form', 'template' ], true ) ) { + return false; + } + + // Duplicate the form. + $ids = $this->duplicate( $form_id ); + + if ( empty( $ids ) ) { + return false; + } + + $new_form_id = current( $ids ); + $form = get_post( $new_form_id ); + $form_data = wpforms_decode( $form->post_content ); + + if ( $this->is_form_data_slashing_enabled ) { + $form_data = wp_slash( $form_data ); + } + + /** + * Filters the form data before converting it to a template or vice versa. + * + * @since 1.8.8 + * + * @param array $form_data Form data. + * @param string|int $form_id Form ID. + * @param string $convert_to Convert to, `form` or `template`. + */ + $form_data = apply_filters( 'wpforms_form_handler_convert_form_data', $form_data, $form_id, $convert_to ); + + // Set default post type. + $post_type = 'wpforms'; + + // Remove the numeric suffix from the post name. + // Duplication always adds `-{numeric}` suffix. + $post_name = preg_replace( '/-\d+$/', '', $form->post_name ); + + // Remove the `-template ` suffix and all after it from the post name. + $post_name = preg_replace( '/-template(-\d+)?/', '', $post_name ); + + // Remove (copy) from the form title, if present. + $form_data['settings']['form_title'] = str_replace( __( '(copy)', 'wpforms-lite' ), '', $form_data['settings']['form_title'] ); + + // Remove trailing spaces. + $form_data['settings']['form_title'] = rtrim( $form_data['settings']['form_title'] ); + + // Remove template description. + unset( $form_data['settings']['template_description'] ); + + if ( $convert_to === 'template' ) { + $post_type = 'wpforms-template'; + + // Remove (ID #
              ) from the form title, if present. + $form_data['settings']['form_title'] = preg_replace( '/\(ID #\d+\)/', '', $form_data['settings']['form_title'] ); + + // Set an empty template description. + $form_data['settings']['template_description'] = ''; + + // Remove traces of any other template that may have been used to create the original form by setting itself as a template. + $form_data['meta']['template'] = 'wpforms-user-template-' . $new_form_id; + + // Add `-template` suffix to the post name. + $post_name .= '-template'; + } + + wp_update_post( + [ + 'ID' => $new_form_id, + 'post_title' => $form_data['settings']['form_title'], + 'post_type' => $post_type, + 'post_content' => wpforms_encode( $form_data ), + 'post_name' => $post_name, + ] + ); + + return $new_form_id; + } + + /** + * Append notice(s) before form preview, if needed. + * + * @since 1.8.8 + * + * @param array $new_form_data New form data. + * @param int $form_id Original form ID. + * + * @return array + */ + private function add_notices( array $new_form_data, int $form_id ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + /** + * Add custom notices to be displayed in the preview area of the Form Builder + * after a form or a form template has been duplicated or converted. + * + * @since 1.8.8 + * + * @param array $notices Array of notices. + * @param array $new_form_data Form data of the newly duplicated form or form template. + * @param int $form_id Original form ID. + */ + $notices = apply_filters( 'wpforms_form_handler_add_notices', [], $new_form_data, $form_id ); + + if ( empty( $notices ) ) { + return $new_form_data; + } + + $current_field_id = ! empty( $new_form_data['fields'] ) ? max( array_keys( $new_form_data['fields'] ) ) : 0; + $code_fields = array_column( $new_form_data['fields'], 'code' ); + $next_field_id = $current_field_id; + $warning = []; + + foreach ( $notices as $notice ) { + // Skip the duplicate notice if it already exists. + if ( ! empty( $notice['code'] ) && in_array( $notice['code'], $code_fields, true ) ) { + continue; + } + + $next_field_id = ++$current_field_id; + $warning[ $next_field_id ] = [ + 'id' => $next_field_id, + 'type' => 'internal-information', + 'code' => ! empty( $notice['code'] ) ? esc_attr( $notice['code'] ) : '', + 'description' => '', + ]; + + $warning[ $next_field_id ]['description'] .= ! empty( $notice['title'] ) ? '' . esc_html( $notice['title'] ) . '' : ''; + $warning[ $next_field_id ]['description'] .= ! empty( $notice['message'] ) ? '

              ' . wp_kses_post( $notice['message'] ) . '

              ' : ''; + + // Do not add notice with empty body. + if ( empty( $warning[ $next_field_id ]['description'] ) ) { + unset( $warning[ $next_field_id ] ); + --$next_field_id; // Reset the next field ID to the previous value. + } + } + + if ( ! empty( $warning ) ) { + $new_form_data['fields'] = $warning + $new_form_data['fields']; + + // Update the next field ID to be used for future created fields. Otherwise, the IIF field would be overwritten. + $new_form_data['field_id'] = $next_field_id + 1; + } + + return $new_form_data; + } + + /** + * Add a notice about Zapier zaps disconnected after the form being duplicated or converted to/from the template. + * + * @WPFormsBackCompat Support Zapier v1.5.0 and earlier. + * + * @since 1.8.8 + * + * @param array $notices Array of notices. + * @param array $new_form_data Form data. + * @param int $form_id Original form ID. + * + * @return array + * @noinspection HtmlUnknownTarget + * @noinspection PhpUnusedParameterInspection + */ + public function _zapier_disconnected_on_duplication( $notices, array $new_form_data, int $form_id ): array { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore + + // Check if the original form had any Zaps connected. + $is_zapier_connected = get_post_meta( $form_id, 'wpforms_zapier', true ); + + if ( ! $is_zapier_connected ) { + return $notices; + } + + $notices['zapier'] = [ + 'title' => esc_html__( 'Zaps Have Been Disabled', 'wpforms-lite' ), + 'code' => 'disconnected_on_duplication', + 'message' => sprintf( /* translators: %s - URL the to list of Zaps. */ + __( 'Head over to the Zapier settings in the Marketing tab or visit your Zapier account to restore them.', 'wpforms-lite' ), + esc_url( 'https://zapier.com/app/zaps' ) + ), + ]; + + return $notices; + } + + /** + * Get the next available field ID and increment by one. + * + * @since 1.0.0 + * + * @param string|int $form_id Form ID. + * @param array $args Additional arguments. + * + * @return mixed int or false + */ + public function next_field_id( $form_id, $args = [] ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks, Generic.Metrics.CyclomaticComplexity.TooHigh + + if ( empty( $form_id ) ) { + return false; + } + + $defaults = [ + 'content_only' => true, + ]; + + if ( isset( $args['cap'] ) ) { + $defaults['cap'] = $args['cap']; + } + + $form = $this->get( $form_id, $defaults ); + + if ( $this->is_form_data_slashing_enabled ) { + $form = wp_slash( $form ); + } + + if ( empty( $form ) ) { + return false; + } + + $field_id = 0; + $max_field_id = ! empty( $form['fields'] ) ? max( array_keys( $form['fields'] ) ) : 0; + + // We pass the `field_id` after duplicating the Layout field that contains a bunch of fields. + // This is needed to avoid multiple AJAX calls after duplicating each field in the Layout. + if ( isset( $args['field_id'] ) ) { + $set_field_id = absint( $args['field_id'] ) - 1; + $field_id = $set_field_id > $max_field_id ? $set_field_id : $max_field_id + 1; + } elseif ( ! empty( $form['field_id'] ) ) { + $field_id = absint( $form['field_id'] ); + $field_id = $max_field_id > $field_id ? $max_field_id + 1 : $field_id; + } + + $form['field_id'] = $field_id + 1; + + // Skip creating a revision for this action. + remove_action( 'post_updated', 'wp_save_post_revision' ); + + $this->update( $form_id, $form ); + + // Restore the initial revisions state. + add_action( 'post_updated', 'wp_save_post_revision' ); + + return $field_id; + } + + /** + * Get private meta information for a form. + * + * @since 1.0.0 + * + * @param string|int $form_id Form ID. + * @param string $field Field. + * @param array $args Additional arguments. + * + * @return false|array + */ + public function get_meta( $form_id, $field = '', $args = [] ) { + + if ( empty( $form_id ) ) { + return false; + } + + $defaults = [ + 'content_only' => true, + ]; + + if ( isset( $args['cap'] ) ) { + $defaults['cap'] = $args['cap']; + } + + $data = $this->get( $form_id, $defaults ); + + if ( ! isset( $data['meta'] ) ) { + return false; + } + + if ( empty( $field ) ) { + return $data['meta']; + } + + return $data['meta'][ $field ] ?? false; + } + + /** + * Update or add form meta information to a form. + * + * @since 1.4.0 + * + * @param string|int $form_id Form ID. + * @param string $meta_key Meta key. + * @param mixed $meta_value Meta value. + * @param array $args Additional arguments. + * + * @return false|int|WP_Error + */ + public function update_meta( $form_id, $meta_key, $meta_value, $args = [] ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks, Generic.Metrics.CyclomaticComplexity.TooHigh + + if ( empty( $form_id ) || empty( $meta_key ) ) { + return false; + } + + $this->remove_form_content_filters(); + + if ( ! isset( $args['cap'] ) ) { + $args['cap'] = 'edit_form_single'; + } + + $form = $this->get_single( absint( $form_id ), $args ); + + if ( empty( $form ) ) { + return false; + } + + $data = (array) wpforms_decode( $form->post_content ); + $meta_key = wpforms_sanitize_key( $meta_key ); + + $data['meta'][ $meta_key ] = $meta_value; + + $form = [ + 'ID' => $form_id, + 'post_content' => wpforms_encode( $data ), + ]; + + /** + * Allow changing form before updating form meta. + * + * @since 1.4.0 + * + * @param array $form Form. + * @param array $data Form data. + */ + $form = (array) apply_filters( 'wpforms_update_form_meta_args', $form, $data ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + if ( ! empty( $args['skip_revision'] ) ) { + remove_action( 'post_updated', 'wp_save_post_revision' ); + } + + $result = wp_update_post( $form ); + + if ( is_wp_error( $result ) ) { + return $result; + } + + if ( ! empty( $args['skip_revision'] ) ) { + add_action( 'post_updated', 'wp_save_post_revision' ); + } + + /** + * Fires when form meta is updated. + * + * @since 1.4.0 + * + * @param string|int $form_id Form ID. + * @param array $form Form. + * @param string $meta_key Meta key. + * @param mixed $meta_value Meta value. + */ + do_action( 'wpforms_update_form_meta', $form_id, $form, $meta_key, $meta_value ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + return $form_id; + } + + /** + * Delete form meta information from a form. + * + * @since 1.4.0 + * + * @param string|int $form_id Form ID. + * @param string $meta_key Meta key. + * @param array $args Additional arguments. + * + * @return false|int|WP_Error + */ + public function delete_meta( $form_id, $meta_key, $args = [] ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( empty( $form_id ) || empty( $meta_key ) ) { + return false; + } + + $this->remove_form_content_filters(); + + if ( ! isset( $args['cap'] ) ) { + $args['cap'] = 'edit_form_single'; + } + + $form = $this->get_single( absint( $form_id ), $args ); + + if ( empty( $form ) ) { + return false; + } + + $data = (array) wpforms_decode( $form->post_content ); + $meta_key = wpforms_sanitize_key( $meta_key ); + + unset( $data['meta'][ $meta_key ] ); + + $form = [ + 'ID' => $form_id, + 'post_content' => wpforms_encode( $data ), + ]; + + /** + * Filters form which meta to be deleted. + * + * @since 1.4.0 + * + * @param array $form Form. + * @param array $data Form data. + */ + $form = (array) apply_filters( 'wpforms_delete_form_meta_args', $form, $data ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + $result = wp_update_post( $form ); + + if ( is_wp_error( $result ) ) { + return $result; + } + + /** + * Fires when form meta is deleted. + * + * @since 1.4.0 + * + * @param string|int $form_id Form ID. + * @param array $form Form. + * @param string $meta_key Meta key. + */ + do_action( 'wpforms_delete_form_meta', $form_id, $form, $meta_key ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + return $form_id; + } + + /** + * Get private meta information for a form field. + * + * @since 1.0.0 + * + * @param string|int $form_id Form ID. + * @param string $field_id Field ID. + * @param array $args Additional arguments. + * + * @return array|false + */ + public function get_field( $form_id, $field_id = '', $args = [] ) { + + if ( empty( $form_id ) ) { + return false; + } + + $defaults = [ + 'content_only' => true, + ]; + + if ( isset( $args['cap'] ) ) { + $defaults['cap'] = $args['cap']; + } + + $data = $this->get( $form_id, $defaults ); + + return $data['fields'][ $field_id ] ?? false; + } + + /** + * Get private meta information for a form field. + * + * @since 1.0.0 + * + * @param string|int $form_id Form ID. + * @param string $field_id Field ID. + * @param array $args Additional arguments. + * + * @return array|false + */ + public function get_field_meta( $form_id, $field_id = '', $args = [] ) { + + $field = $this->get_field( $form_id, $field_id, $args ); + + if ( ! $field ) { + return false; + } + + return $field['meta'] ?? false; + } + + /** + * Checks if any forms are present on the site. + * + * @since 1.8.8 + * + * @retun bool + */ + public function forms_exist(): bool { + + return (bool) $this->get( + '', + [ + 'numberposts' => 1, + 'fields' => 'ids', + 'no_found_rows' => true, + 'suppress_filters' => true, // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters + 'nopaging' => false, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + ] + ); + } + + /** + * Get the forms' count per page. + * + * @since 1.8.8 + * + * @return int + */ + public function get_count_per_page(): int { + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + /** + * Allow developers to modify the number of forms per page. + * + * @since 1.8.8 + * + * @param array $count Forms count per page. + */ + return (int) apply_filters( 'wpforms_forms_per_page', 20 ); + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Unslash field keys. + * + * @since 1.9.0 + * + * @param array $data Form data. + * @param array $keys Field keys. + * + * @return array + * @noinspection PhpSameParameterValueInspection + */ + private function unslash_field_keys( array $data, array $keys ): array { + + if ( empty( $data['fields'] ) ) { + return $data; + } + + /** + * Filter field keys to be unslashed before saving. + * + * Works used with the filter wpforms_enable_form_data_slashing set to true. + * + * @since 1.9.0 + * + * @param array $keys Field keys. + * + * @return array + */ + $keys = (array) apply_filters( 'wpforms_form_handler_unslash_field_keys', $keys ); + + if ( empty( $keys ) ) { + return $data; + } + + foreach ( $data['fields'] as $id => $field ) { + foreach ( $keys as $key ) { + if ( isset( $field[ $key ] ) ) { + $data['fields'][ $id ][ $key ] = wp_unslash( $field[ $key ] ); + } + } + } + + return $data; + } + + /** + * Removes content filters that may break forms with HTML and adds a filter to prevent JSON damage. + * + * Specifically, it removes filters that sanitize content in a way that disrupts form functionality: + * - `balanceTags` to prevent unintended tag balancing. + * - `wp_filter_post_kses` to bypass permission-based sanitization (`unfiltered_html` capability). + * + * Additionally, adds a filter to clear `link rel` attributes to avoid unintended JSON issues. + * + * @since 1.9.8 + */ + private function remove_form_content_filters(): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + // This filter breaks forms if they contain HTML. + remove_filter( 'content_save_pre', 'balanceTags', 50 ); + // This filter breaks forms if the current user doesn't have "unfiltered_html" capability. + remove_filter( 'content_save_pre', 'wp_filter_post_kses' ); + + // Add a filter of the link rel attr to avoid JSON damage. + add_filter( 'wp_targeted_link_rel', '__return_empty_string', 50, 1 ); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/class-install.php b/wp-content/plugins/wpforms-lite/includes/class-install.php new file mode 100755 index 00000000..5c58e052 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-install.php @@ -0,0 +1,229 @@ +hooks(); + } + + /** + * Hooks. + * + * @since 1.9.0 + * + * @return void + */ + private function hooks() { + + // Watch for new multisite blogs. + add_action( 'wp_initialize_site', [ $this, 'new_multisite_blog' ], 10, 2 ); + + // Watch for delayed admin install. + add_action( 'admin_init', [ $this, 'admin' ] ); + } + + /** + * Perform certain actions on plugin activation. + * + * @since 1.0.0 + * + * @param bool $network_wide Whether to enable the plugin for all sites in the network + * or just the current site. Multisite only. Default is false. + * + * @noinspection DisconnectedForeachInstructionInspection + */ + public function install( $network_wide = false ) { + + // Check if we are on multisite and network activating. + if ( $network_wide && is_multisite() ) { + + // Multisite - go through each subsite and run the installer. + $sites = get_sites( + [ + 'fields' => 'ids', + 'number' => 0, + ] + ); + + foreach ( $sites as $blog_id ) { + switch_to_blog( $blog_id ); + $this->run(); + restore_current_blog(); + } + } else { + + // Normal single site. + $this->run(); + } + + set_transient( 'wpforms_just_activated', wpforms()->is_pro() ? 'pro' : 'lite', 60 ); + + // Abort, so we only set the transient for single site installs. + if ( isset( $_GET['activate-multi'] ) || is_network_admin() ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return; + } + + // Add transient to trigger redirect to the Welcome screen. + set_transient( 'wpforms_activation_redirect', true, 30 ); + } + + /** + * Run manual installation. + * + * @since 1.5.4.2 + * + * @param bool $silent Silent install, disables welcome page. + */ + public function manual( $silent = false ) { + + $this->install( is_plugin_active_for_network( plugin_basename( WPFORMS_PLUGIN_FILE ) ) ); + + if ( $silent ) { + delete_transient( 'wpforms_activation_redirect' ); + } + } + + /** + * Perform certain actions on plugin deactivation. + * + * @since 1.5.9 + */ + public function deactivate() { + + // Unschedule all ActionScheduler actions by group. + wpforms()->obj( 'tasks' )->cancel_all(); + + // Remove plugin cron jobs. + wp_clear_scheduled_hook( 'wpforms_email_summaries_cron' ); + + // Check if the event is scheduled before attempting to clear it. + // This event is only registered for the Lite edition of the plugin. + // It's advisable to verify if the CRON event is scheduled using `wp_next_scheduled`. + // This precaution ensures that you are not attempting to clear a scheduled + // hook that may not exist, which could result in unexpected behavior. + if ( wp_next_scheduled( 'wpforms_weekly_entries_count_cron' ) ) { + wp_clear_scheduled_hook( 'wpforms_weekly_entries_count_cron' ); + } + } + + /** + * Watch for delayed install procedure from WPForms admin. + * + * @since 1.5.4.2 + */ + public function admin() { + + if ( ! is_admin() ) { + return; + } + + $install = get_option( 'wpforms_install', false ); + + if ( empty( $install ) ) { + return; + } + + $this->manual( true ); + + delete_option( 'wpforms_install' ); + } + + /** + * Run the actual installer. + * + * @since 1.5.4.2 + */ + protected function run() { + + // Create custom database tables. + $this->maybe_create_tables(); + + // Hook for Pro users. + /** + * Fires before WPForms plugin installation is performed. + * + * @since 1.3.0 + */ + do_action( 'wpforms_install' ); + + /* + * Set the current version to be referenced in future updates. + */ + // Used by Pro migrations. + update_option( 'wpforms_version', WPFORMS_VERSION ); + // Used by Lite migrations. + update_option( 'wpforms_version_lite', WPFORMS_VERSION ); + + // Store the date when the initial activation was performed. + $type = class_exists( 'WPForms_Lite', false ) ? 'lite' : 'pro'; + $activated = (array) get_option( 'wpforms_activated', [] ); + + if ( empty( $activated[ $type ] ) ) { + $activated[ $type ] = time(); + + update_option( 'wpforms_activated', $activated ); + } + } + + /** + * When a new site is created in multisite, see if we are network activated, + * and if so run the installer. + * + * @since 1.3.0 + * @since 1.8.4 Added $new_site and $args parameters and removed $blog_id, $user_id, $domain, $path, $site_id, + * and $meta parameters. + * + * @param WP_Site $new_site New site object. + * @param array $args Arguments for the initialization. + * + * @noinspection PhpUnusedParameterInspection + * @noinspection PhpMissingParamTypeInspection + */ + public function new_multisite_blog( $new_site, $args ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + if ( is_plugin_active_for_network( plugin_basename( WPFORMS_PLUGIN_FILE ) ) ) { + switch_to_blog( $new_site->blog_id ); + $this->run(); + restore_current_blog(); + } + } + + /** + * Create database tables if they do not exist. + * It covers new installations. + * + * @since 1.8.2 + */ + private function maybe_create_tables() { + + DB::create_custom_tables( true ); + } +} + +new WPForms_Install(); diff --git a/wp-content/plugins/wpforms-lite/includes/class-process.php b/wp-content/plugins/wpforms-lite/includes/class-process.php new file mode 100755 index 00000000..783c2ee1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-process.php @@ -0,0 +1,2237 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.3 + */ + private function hooks() { + + add_action( 'wp', [ $this, 'listen' ] ); + add_action( 'wp_ajax_wpforms_submit', [ $this, 'ajax_submit' ] ); + add_action( 'wp_ajax_nopriv_wpforms_submit', [ $this, 'ajax_submit' ] ); + add_filter( 'wpforms_ajax_submit_redirect', [ $this, 'maybe_open_in_new_tab' ] ); + add_filter( 'wpforms_smarttags_process_value', [ Notifications::class, 'filter_smarttags_process_value' ], PHP_INT_MAX, 6 ); + } + + /** + * Listen to see if this is a return callback or a posted form entry. + * + * @since 1.0.0 + */ + public function listen() { + + // Catch the post_max_size overflow. + if ( $this->post_max_size_overflow() ) { + return; + } + + // phpcs:disable WordPress.Security.NonceVerification + if ( ! empty( $_GET['wpforms_return'] ) ) { + // Additional redirect trigger for addons. + $this->entry_confirmation_redirect( '', sanitize_text_field( wp_unslash( $_GET['wpforms_return'] ) ) ); + } + + $form_id = ! empty( $_POST['wpforms']['id'] ) ? absint( $_POST['wpforms']['id'] ) : 0; + + if ( ! $form_id ) { + return; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $this->process( wp_unslash( $_POST['wpforms'] ) ); + // phpcs:enable WordPress.Security.NonceVerification + + /** + * Runs right after the processing form entry. + * + * @since 1.9.0 + * + * @param array $fields Entry fields data. + * @param array $entry_id Entry ID. + * @param array $form_data Form data. + */ + do_action( 'wpforms_process_after', $this->fields, $this->entry_id, $this->form_data ); + + if ( ! wpforms_is_amp() ) { + return; + } + + // Send 400 Bad Request when there are errors. + if ( empty( $this->errors[ $form_id ] ) ) { + $this->entry_confirmation_redirect( $this->form_data ); + wp_send_json( + [ + 'message' => $this->get_confirmation_message( $this->form_data, $this->fields, $this->entry_id ), + ], + 200 + ); + + return; + } + + $message_parts = [ $this->errors[ $form_id ]['header'] ]; + + if ( ! empty( $this->errors[ $form_id ]['recaptcha'] ) ) { + $message_parts[] = $this->errors[ $form_id ]['recaptcha']; + } + + if ( ! empty( $this->errors[ $form_id ]['footer'] ) ) { + $message_parts[] = $this->errors[ $form_id ]['footer']; + } + + wp_send_json( + [ + 'message' => implode( '
              ', $message_parts ), + ], + 400 + ); + } + + /** + * Process the form entry. + * + * @since 1.0.0 + * @since 1.6.4 Added hCaptcha support. + * + * @param array $entry Form submission raw data ($_POST). + * + * @noinspection HtmlUnknownTarget + */ + public function process( $entry ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded, Generic.Metrics.NestingLevel.MaxExceeded + + $this->errors = []; + $this->fields = []; + + $form_id = absint( $entry['id'] ); + $form = wpforms()->obj( 'form' )->get( $form_id ); + + // Validate form is real and active (published). + if ( ! $form || $form->post_status !== 'publish' ) { + $this->errors[ $form_id ]['header'] = esc_html__( 'Invalid form.', 'wpforms-lite' ); + + return; + } + + /** + * Filter form data obtained during the form process. + * + * @since 1.5.3 + * + * @param array $form_data Form data. + * @param array $entry Form entry. + */ + $this->form_data = (array) apply_filters( 'wpforms_process_before_form_data', wpforms_decode( $form->post_content ), $entry ); + + if ( ! empty( $this->form_data['settings']['ajax_submit'] ) && ! $this->is_valid_ajax_submit_action() ) { + wpforms_log( + 'Attempt to submit corrupted post data.', + wp_unslash( $_POST ), + [ + 'type' => [ 'error', 'entry' ], + 'form_id' => $this->form_data['id'], + ] + ); + + $this->errors[ $form_id ]['header'] = esc_html__( 'Attempt to submit corrupted post data.', 'wpforms-lite' ); + + /** + * Fires when corrupted form submission is detected. + * + * @since 1.9.8 + * + * @param array $form_data Form data. + */ + do_action( 'wpforms_process_submission_corrupted', $this->form_data ); + + return; + } + + $store_spam_entries = ! empty( $this->form_data['settings']['store_spam_entries'] ); + + /** + * Check the modern Anti-Spam (v3) protection. + * + * Run as early as possible to remove the honeypot field from the entry to prevent unnecessary field processing. + * Bail early if the form is marked as spam and storing spam entries is disabled. + * + * Important! We should check first on modern Anti-Spam because it is skipped in case $store_spam_entries === true. + */ + // phpcs:ignore Generic.Commenting.DocComment.MissingShort + /** @noinspection NotOptimalIfConditionsInspection */ + if ( ! $this->modern_anti_spam_check( $entry ) && ! $store_spam_entries ) { + return; + } + + if ( ! isset( $this->form_data['fields'], $this->form_data['id'] ) ) { + $error_id = uniqid( '', true ); + + // Logs missing form data. + wpforms_log( + /* translators: %s - error unique ID. */ + sprintf( esc_html__( 'Missing form data on form submission process %s', 'wpforms-lite' ), $error_id ), + esc_html__( 'Form data is not an array in `\WPForms_Process::process()`. It might be caused by incorrect data returned by `wpforms_process_before_form_data` filter. Verify whether you have a custom code using this filter and debug value it is returning.', 'wpforms-lite' ), + [ + 'type' => [ 'error', 'entry' ], + 'form_id' => $form_id, + ] + ); + + $error_messages[] = esc_html__( 'Your form has not been submitted because data is missing from the entry.', 'wpforms-lite' ); + + if ( wpforms_setting( 'logs-enable' ) && wpforms_current_user_can( wpforms_get_capability_manage_options() ) ) { + $error_messages[] = sprintf( + wp_kses( /* translators: %s - URL to the WForms Logs admin page. */ + __( 'Check the WPForms » Tools » Logs for more details.', 'wpforms-lite' ), + [ 'a' => [ 'href' => [] ] ] + ), + esc_url( + add_query_arg( + [ + 'page' => 'wpforms-tool', + 'view' => 'logs', + ], + admin_url( 'admin.php' ) + ) + ) + ); + + /* translators: %s - error unique ID. */ + $error_messages[] = sprintf( esc_html__( 'Error ID: %s.', 'wpforms-lite' ), $error_id ); + } + + $errors[ $form_id ]['header'] = implode( '
              ', $error_messages ); + $this->errors = $errors; + + return; + } + + /** + * Filter form entry before processing. + * Data are not validated or cleaned yet, so use them with caution. + * + * @since 1.4.0 + * + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data. + */ + $entry = apply_filters( 'wpforms_process_before_filter', $entry, $this->form_data ); + + /** + * Pre-process hook. + * + * @since 1.4.0 + * + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data. + */ + do_action( 'wpforms_process_before', $entry, $this->form_data ); + + /** + * Pre-process hook by form ID. + * + * @since 1.4.0 + * + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data. + */ + do_action( "wpforms_process_before_{$form_id}", $entry, $this->form_data ); + + // Validate fields. + foreach ( $this->form_data['fields'] as $field_properties ) { + + $field_id = $field_properties['id']; + $field_type = $field_properties['type']; + $field_submit = $entry['fields'][ $field_id ] ?? ''; + + /** + * Field type validation hook. + * + * @since 1.4.0 + * + * @param string|int $field_id Field ID as a numeric string. + * @param mixed $field_submit Submitted field value (raw data). + * @param array $form_data Form data. + */ + do_action( "wpforms_process_validate_{$field_type}", $field_id, $field_submit, $this->form_data ); + } + + // Check if combined upload size exceeds allowed maximum. + $this->validate_combined_upload_size( $form ); + + /** + * Filter initial errors. + * Don't proceed if there are any errors thus far. + * We provide a filter so that other features, such as conditional logic, can adjust blocking errors. + * + * @since 1.4.0 + * + * @param array $errors List of errors. + * @param array $form_data Form data. + */ + $errors = apply_filters( 'wpforms_process_initial_errors', $this->errors, $this->form_data ); + + if ( isset( $_POST['__amp_form_verify'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing + if ( empty( $errors[ $form_id ] ) ) { + wp_send_json( [], 200 ); + } else { + $verify_errors = []; + + foreach ( $errors[ $form_id ] as $field_id => $error_fields ) { + $field = $this->form_data['fields'][ $field_id ]; + $field_properties = wpforms()->obj( 'frontend' )->get_field_properties( $field, $this->form_data ); + + if ( is_string( $error_fields ) ) { + $name = ''; + + if ( $field['type'] === 'checkbox' || $field['type'] === 'radio' || $field['type'] === 'select' ) { + $first = current( $field_properties['inputs'] ); + $name = $first['attr']['name']; + } elseif ( isset( $field_properties['inputs']['primary']['attr']['name'] ) ) { + $name = $field_properties['inputs']['primary']['attr']['name']; + } + + $verify_errors[] = [ + 'name' => $name, + 'message' => $error_fields, + ]; + } else { + foreach ( $error_fields as $error_field => $error_message ) { + $name = $field_properties['inputs'][ $error_field ]['attr']['name'] ?? ''; + + $verify_errors[] = [ + 'name' => $name, + 'message' => $error_message, + ]; + } + } + } + + wp_send_json( + [ + 'verifyErrors' => $verify_errors, + ], + 400 + ); + } + + return; + } + + if ( ! empty( $errors[ $form_id ] ) ) { + + if ( empty( $errors[ $form_id ]['header'] ) && empty( $errors[ $form_id ]['footer'] ) ) { + $errors[ $form_id ]['header'] = esc_html__( 'Form has not been submitted, please see the errors below.', 'wpforms-lite' ); + } + + $this->errors = $errors; + + return; + } + + // If a logged-in user fails the nonce check, we want to log the entry, disable the errors and fail silently. + // Please note that logs may be disabled, and in this case, nothing will be logged or reported. + if ( + is_user_logged_in() && + ( empty( $entry['nonce'] ) || ! wp_verify_nonce( $entry['nonce'], "wpforms::form_{$form_id}" ) ) + ) { + // Logs XSS attempt depending on log levels set. + wpforms_log( + 'Cross-site scripting attempt ' . uniqid( '', true ), + [ true, $entry ], + [ + 'type' => [ 'security' ], + 'form_id' => $this->form_data['id'], + ] + ); + + $this->errors[ $this->form_data['id'] ]['footer_styled'] = esc_html__( 'The form could not be submitted due to a security issue.', 'wpforms-lite' ); + + return; + } + + // Format fields. + foreach ( (array) $this->form_data['fields'] as $field_properties ) { + + $field_id = $field_properties['id']; + $field_type = $field_properties['type']; + $field_submit = $entry['fields'][ $field_id ] ?? ''; + + /** + * Format field by type. + * + * @since 1.4.0 + * + * @param string $field_id Field ID. + * @param string $field_submit Submitted field value. + * @param array $form_data Form data and settings. + */ + do_action( "wpforms_process_format_{$field_type}", $field_id, $field_submit, $this->form_data ); + } + + $honeypot = wpforms()->obj( 'honeypot' )->validate( $this->form_data, $this->fields, $entry ); + + // If we trigger the honey pot, we want to log the entry, disable the errors, and fail silently. + if ( $honeypot ) { + + $this->log_spam_entry( $entry, $honeypot ); + + // Fail silently. + return; + } + + $token = wpforms()->obj( 'token' )->validate( $this->form_data, $this->fields, $entry ); + + // If spam - return early. + // For antispam, we want to make sure that we have a value, we are not using AMP, and the value is an error string. + if ( $token && is_string( $token ) && ! wpforms_is_amp() ) { + $this->errors[ $this->form_data['id'] ]['header'] = $token; + + $this->log_spam_entry( $entry, $token ); + + return; + } + + // Detect direct POST requests when the AJAX submission is enabled. + $this->direct_post_request_check( $entry ); + + $is_pro = wpforms()->is_pro(); + + if ( ! $this->is_bypass_spam_check( $entry ) ) { + // Store spam entries detected by filtering. + if ( $is_pro && ! empty( $this->form_data['settings']['anti_spam']['filtering_store_spam'] ) ) { + $this->country_filter_check( $entry, $form_id ); + $this->keyword_filter_check( $entry, $form_id ); + } + + // Check if the form was submitted too quickly. + $this->time_limit_check(); + + // Check for spam. + $this->process_spam_check( $entry ); + } + + // Convert spam errors to form errors if spam entries are not stored. + if ( ! $store_spam_entries && ! empty( $this->spam_errors ) ) { + $this->errors = $this->spam_errors; + } + + // Store spam reason. + if ( $this->spam_reason ) { + $this->form_data['spam_reason'] = $this->spam_reason; + } + + // Pass the form creation date into the form data. + $this->form_data['created'] = $form->post_date; + + /** + * Format form data after all fields have been processed. + * This hook is for internal purposes and should not be leveraged. + * + * @since 1.4.0 + * + * @param array $form_data Form data and settings. + */ + do_action( 'wpforms_process_format_after', $this->form_data ); + + /** + * Filter fields before processing. + * Process hooks/filter - this is where most addons should hook + * because at this point we have completed all field validations and formatted the data. + * + * @since 1.4.0 + * + * @param array $fields Form fields. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data and settings. + */ + $this->fields = apply_filters( 'wpforms_process_filter', $this->fields, $entry, $this->form_data ); + /** + * Process form fields. + * + * @since 1.4.0 + * + * @param array $fields Form fields. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data and settings. + */ + do_action( 'wpforms_process', $this->fields, $entry, $this->form_data ); + + /** + * Process form fields by form ID. + * + * @since 1.4.0 + * + * @param array $fields Form fields. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data and settings. + */ + do_action( "wpforms_process_{$form_id}", $this->fields, $entry, $this->form_data ); + + /** + * Filter fields after processing. + * + * @since 1.4.0 + * + * @param array $fields Form fields. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data and settings. + */ + $this->fields = apply_filters( 'wpforms_process_after_filter', $this->fields, $entry, $this->form_data ); + + // One last error check - don't proceed if there are any errors. + if ( ! empty( $this->errors[ $form_id ] ) ) { + + if ( empty( $this->errors[ $form_id ]['header'] ) && empty( $this->errors[ $form_id ]['footer'] ) ) { + $this->errors[ $form_id ]['header'] = esc_html__( 'Form has not been submitted, please see the errors below.', 'wpforms-lite' ); + } + + return; + } + + // Set raw post data. + $this->form_data['post_data_raw'] = [ + 'page_url' => isset( $_POST['page_url'] ) ? esc_url_raw( wp_unslash( $_POST['page_url'] ) ) : '', + ]; + + // Success - add entry to a database. + $this->entry_id = $this->entry_save( $this->fields, $entry, $this->form_data['id'], $this->form_data ); + + // Add payment to a database. + $payment_id = $this->payment_save( $entry ); + + $this->form_data['entry_meta'] = [ + 'page_url' => isset( $_POST['page_url'] ) ? esc_url_raw( wp_unslash( $_POST['page_url'] ) ) : '', + 'page_title' => isset( $_POST['page_title'] ) ? sanitize_text_field( wp_unslash( $_POST['page_title'] ) ) : '', + 'page_id' => isset( $_POST['page_id'] ) ? absint( $_POST['page_id'] ) : '', + 'url_referer' => isset( $_POST['url_referer'] ) ? esc_url_raw( wp_unslash( $_POST['url_referer'] ) ) : '', + 'user_id' => get_current_user_id(), + ]; + + // Save meta data. + $this->save_meta( $this->entry_id, $this->form_data['id'] ); + + /** + * Runs right after adding an entry to the database. + * + * @since 1.7.7 + * @since 1.8.2 Added Payment ID param. + * + * @param array $fields Fields data. + * @param array $entry User submitted data. + * @param array $form_data Form data. + * @param int $entry_id Entry ID. + * @param int $payment_id Payment ID. + */ + do_action( 'wpforms_process_entry_saved', $this->fields, $entry, $this->form_data, $this->entry_id, $payment_id ); + + // Fire the logic to send notification emails. + $this->entry_email( $this->fields, $entry, $this->form_data, $this->entry_id, 'entry' ); + + // Pass completed and formatted fields in POST. + $_POST['wpforms']['complete'] = $this->fields; + + // Pass entry ID in POST. + $_POST['wpforms']['entry_id'] = $this->entry_id; + + // Logs entry depending on log levels set. + if ( $is_pro ) { + wpforms_log( + $this->entry_id ? "Entry {$this->entry_id}" : 'Entry', + $this->fields, + [ + 'type' => [ 'entry' ], + 'parent' => $this->entry_id, + 'form_id' => $this->form_data['id'], + ] + ); + } + + // Mark the submission as spam if one of the spam checks failed and spam entries are stored. + $marked_as_spam = $this->spam_reason && $store_spam_entries; + + // Proceed if the entry is not marked as spam. + if ( ! $marked_as_spam ) { + $this->process_complete( $form_id, $this->form_data, $this->fields, $entry, $this->entry_id ); + } else { + /** + * Fires in the case the entry was marked as spam during the form submission. + * + * @since 1.9.8.1 + * + * @param int $entry_id Entry ID. + * @param int $form_id Form ID. + */ + do_action( 'wpforms_process_anti_spam_entry_marked_as_spam', $this->entry_id, $form_id ); + } + + $this->entry_confirmation_redirect( $this->form_data ); + } + + /** + * Run the modern Anti-Spam check. + * + * @since 1.9.0 + * + * @param array $entry Form submission raw data ($_POST). + * + * @return bool True if the modern Anti-Spam check was passed, false otherwise. + */ + private function modern_anti_spam_check( array &$entry ): bool { + + // Skip if spam was already detected. + if ( $this->spam_reason ) { + return false; + } + + /** + * Allow bypassing the modern Anti-Spam check. + * + * @since 1.9.0 + * + * @param bool $bypass Whether to bypass the modern Anti-Spam check, default false. + * @param array $form_data Form data. + * @param array $entry Form submission raw data ($_POST). + * + * @return bool + */ + if ( apply_filters( 'wpforms_process_anti_spam_honeypot_bypass', false, $this->form_data, $entry ) ) { + return true; + } + + // Skip if the modern Anti-Spam check was passed. + if ( wpforms()->obj( 'anti_spam' )->validate( $this->form_data, $this->fields, $entry ) ) { + return true; + } + + $form_id = $this->form_data['id'] ?? 0; + + $this->spam_errors[ $form_id ]['header'] = esc_html__( 'Anti-spam Honeypot V2 verification was failed, please try again later.', 'wpforms-lite' ); + + $this->spam_reason = 'Honeypot V2'; + + // Log the spam entry depending on log levels set. + $this->log_spam_entry( + $entry, + 'Anti-spam Honeypot V2 verification was failed.' + ); + + return false; + } + + /** + * Detect direct POST requests when the AJAX submission is enabled. + * For Anti-spam Modern (v3) enabled forms only. + * + * @since 1.9.0 + * + * @param array $entry Form submission raw data ($_POST). + */ + private function direct_post_request_check( array $entry ) { + + if ( + // Skip if spam was already detected. + $this->spam_reason || + + // Skip if the Anti-spam Modern (v3) is not enabled. + empty( $this->form_data['settings']['antispam_v3'] ) + ) { + return; + } + + /** + * Allow bypassing the direct POST request check. + * + * @since 1.9.0 + * + * @param bool $bypass Whether to bypass the direct POST request check, default is false. + * @param array $form_data Form data. + * @param array $entry Form entry. + */ + if ( apply_filters( 'wpforms_process_anti_spam_direct_post_bypass', false, $this->form_data, $entry ) ) { + return; + } + + // phpcs:disable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput + $is_ajax_form = ! empty( $this->form_data['settings']['ajax_submit'] ); + $is_post = ( $_SERVER['REQUEST_METHOD'] ?? 'GET' ) === 'POST'; + $is_direct_post = ! wpforms_is_frontend_ajax() && $is_post; + // phpcs:enable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput + + if ( ! ( $is_ajax_form && $is_direct_post ) ) { + return; + } + + $form_id = $this->form_data['id'] ?? 0; + + $this->spam_errors[ $form_id ]['header'] = esc_html__( 'Direct POST requests are not allowed when the AJAX submission is enabled.', 'wpforms-lite' ); + + $this->spam_reason = esc_html__( 'Direct POST request', 'wpforms-lite' ); + + // Log the spam entry depending on log levels set. + $this->log_spam_entry( + $entry, + 'Direct POST request form submission' + ); + } + + /** + * Run Country filter check. + * + * @since 1.9.2 + * + * @param array $entry Form submission raw data ($_POST). + * @param int $form_id Form ID. + */ + private function country_filter_check( array $entry, int $form_id ) { + + // Skip if spam was already detected. + if ( $this->spam_reason ) { + return; + } + + $country_filter = wpforms()->obj( 'antispam_country_filter' ); + + // Skip if the Country check was passed. + if ( $country_filter->is_valid( $this->form_data ) ) { + return; + } + + $this->spam_errors[ $form_id ]['footer'] = $country_filter->get_error_message( $this->form_data ); + + $this->spam_reason = 'Country Filter'; + + // Log the spam entry depending on log levels set. + $this->log_spam_entry( + $entry, + 'Country filter verification was failed.' + ); + } + + /** + * Run Keyword filter check. + * + * @since 1.9.2 + * + * @param array $entry Form submission raw data ($_POST). + * @param int $form_id Form ID. + */ + private function keyword_filter_check( array $entry, int $form_id ) { + + // Skip if spam was already detected. + if ( $this->spam_reason ) { + return; + } + + $keyword_filter = wpforms()->obj( 'antispam_keyword_filter' ); + + // Skip if the Keyword check was passed. + if ( $keyword_filter->is_valid( $this->form_data, $this->fields ) ) { + return; + } + + $this->spam_errors[ $form_id ]['footer'] = $keyword_filter->get_error_message( $this->form_data ); + + $this->spam_reason = 'Keyword Filter'; + + // Log the spam entry depending on log levels set. + $this->log_spam_entry( + $entry, + 'Keyword filter verification was failed.' + ); + } + + /** + * Save entry meta data. + * + * @since 1.8.7 + * + * @param int $entry_id Entry ID. + * @param int $form_id Form ID. + */ + protected function save_meta( $entry_id, $form_id ) { + + if ( ! wpforms()->is_pro() ) { + return; + } + + $meta_data = $this->form_data['entry_meta']; + $entry_meta = wpforms()->obj( 'entry_meta' ); + + foreach ( $meta_data as $type => $value ) { + $entry_meta->add( + [ + 'entry_id' => $entry_id, + 'form_id' => $form_id, + 'user_id' => get_current_user_id(), + 'type' => $type, + 'data' => $value, + ], + 'entry_meta' + ); + } + } + + /** + * Log spam entry. + * + * @since 1.8.3 + * + * @param array $entry Form submission raw data ($_POST). + * @param string $message Spam message. + */ + private function log_spam_entry( $entry, $message ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Log the spam entry message after processing the entry when the entry ID is generated. + add_action( + 'wpforms_process_after', + static function ( $fields, $entry_id, $form_data ) use ( $entry, $message ) { + + wpforms_log( + 'Spam Entry ' . uniqid( '', true ), + [ $message, $entry ], + [ + 'type' => [ 'spam' ], + 'form_id' => $form_data['id'] ?? 0, + 'parent' => $entry_id, + ] + ); + }, + 10, + 3 + ); + } + + /** + * Check if the form was submitted too quickly. + * + * @since 1.8.3 + */ + private function time_limit_check() { + + /** + * Allow bypassing the time limit check. + * + * @since 1.8.3 + * + * @param bool $bypass Whether to bypass the time limit check, default false. + * @param array $form_data Form data. + * + * @return bool + */ + if ( apply_filters( 'wpforms_process_time_limit_check_bypass', false, $this->form_data ) ) { + return; + } + + $settings = $this->form_data['settings']; + $time_limit = ! empty( $settings['anti_spam']['time_limit'] ) ? $settings['anti_spam']['time_limit'] : []; + + $enabled = ! empty( $time_limit['enable'] ); + $duration = ! empty( $time_limit['duration'] ) ? absint( $time_limit['duration'] ) : 0; + + if ( ! $enabled || $duration <= 0 ) { + return; + } + + //phpcs:disable WordPress.Security.NonceVerification.Missing + $start = ! empty( $_POST['start_timestamp'] ) ? absint( $_POST['start_timestamp'] ) : 0; + $end = ! empty( $_POST['end_timestamp'] ) ? absint( $_POST['end_timestamp'] ) : 0; + //phpcs:enable WordPress.Security.NonceVerification.Missing + + // Filter out empty fields. + $fields = array_filter( + $this->fields, + static function ( $field ) { + + return ! empty( $field['value'] ); + } + ); + + // Skip the time limit check if the form was submitted with prefilled values. + if ( $start === 0 && ! empty( $fields ) ) { + return; + } + + // If the form was submitted too quickly, add an error. + if ( ( $end - $start ) < $duration || $start === 0 ) { + $this->errors[ $this->form_data['id'] ]['header'] = esc_html__( 'Please wait a little longer before submitting. We’re running a quick security check.', 'wpforms-lite' ); + } + } + + /** + * Process complete. + * + * @since 1.8.3 + * + * @param int $form_id Form ID. + * @param array $form_data Form data and settings. + * @param array $fields Fields data. + * @param array $entry Form submission raw data ($_POST). + * @param int $entry_id Entry ID. + */ + public function process_complete( $form_id, $form_data, $fields, $entry, $entry_id ) { + /** + * Runs right after the form has been successfully submitted. + * + * @since 1.0.0 + * @since 1.8.3 Added $entry parameter. + * + * @param array $fields Fields data. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data. + * @param int $entry_id Entry ID. + */ + do_action( 'wpforms_process_complete', $fields, $entry, $form_data, $entry_id ); + + /** + * Runs right after the form has been successfully submitted by form ID. + * + * @since 1.0.0 + * @since 1.8.3 Added $entry parameter. + * + * @param array $fields Fields data. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data. + * @param int $entry_id Entry ID. + */ + do_action( "wpforms_process_complete_{$form_id}", $fields, $entry, $form_data, $entry_id ); + } + + /** + * Check for spam. + * + * @since 1.8.3 + * + * @param array $entry Form submission raw data ($_POST). + */ + public function process_spam_check( $entry ) { + + // CAPTCHA check. + $this->process_captcha( $entry ); + + if ( $this->spam_reason ) { + return; + } + + $akismet = wpforms()->obj( 'akismet' )->validate( $this->form_data, $entry ); + + // If Akismet marks the entry as spam, we want to log the entry and fail silently. + if ( $akismet ) { + + $this->spam_errors[ $this->form_data['id'] ]['header'] = $akismet; + + // Log the spam entry depending on log levels set. + $this->log_spam_entry( $entry, $akismet ); + + $this->spam_reason = esc_html__( 'Akismet', 'wpforms-lite' ); + } + } + + /** + * Is bypass spam check. + * + * @since 1.8.3 + * + * @param array $entry Form submission raw data ($_POST). + * + * @return bool + */ + protected function is_bypass_spam_check( $entry ) { + + /** + * Filter to bypass CAPTCHA check. + * + * @since 1.6.6 + * + * @param bool $bypass_captcha Whether to bypass CAPTCHA check. + * @param array $entry Form submission raw data ($_POST). + * @param array $form_data Form data. + */ + return apply_filters( 'wpforms_process_bypass_captcha', false, $entry, $this->form_data ); + } + + /** + * Process captcha. + * + * @since 1.8.0 + * @since 1.8.3 Removed $captcha_settings parameter. + * + * @param array $entry Form submission raw data ($_POST). + * + * @return void + */ + private function process_captcha( $entry ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Skip if spam was already detected. + if ( $this->spam_reason ) { + return; + } + + $captcha_settings = wpforms_get_captcha_settings(); + + if ( ! $this->allow_process_captcha( $entry, $captcha_settings ) ) { + return; + } + + $provider = $captcha_settings['provider']; + + $current_captcha = $this->get_captcha( $provider ); + + if ( empty( $current_captcha ) ) { + return; + } + + $verify_url_raw = $current_captcha['verify_url_raw']; + $captcha_provider = $current_captcha['provider']; + $post_key = $current_captcha['post_key']; + + /* translators: %s - The CAPTCHA provider name. */ + $error = wpforms_setting( "{$provider}-fail-msg", sprintf( esc_html__( '%s verification failed, please try again later.', 'wpforms-lite' ), $captcha_provider ) ); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.NonceVerification.Missing + $token = ! empty( $_POST[ $post_key ] ) ? $_POST[ $post_key ] : false; + + $is_recaptcha_v3 = $provider === 'recaptcha' && $captcha_settings['recaptcha_type'] === 'v3'; + + if ( $is_recaptcha_v3 ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.NonceVerification.Missing + $token = ! empty( $_POST['wpforms']['recaptcha'] ) ? $_POST['wpforms']['recaptcha'] : false; + } + + $verify_query_arg = [ + 'secret' => $captcha_settings['secret_key'], + 'response' => $token, + 'remoteip' => wpforms_get_ip(), + ]; + + if ( ! $token ) { + $this->errors[ $this->form_data['id'] ]['recaptcha'] = $error; + + return; + } + + /* + * hCaptcha uses user IP to better detect bots and their attacks on a form. + * Majority of our users have GDPR disabled. + * So we remove this data from the request only when it's unnecessary, + * depending on wpforms_is_collecting_ip_allowed($this->form_data) check. + */ + if ( ! wpforms_is_collecting_ip_allowed( $this->form_data ) ) { + unset( $verify_query_arg['remoteip'] ); + } + + /** + * Change query arguments for remote call to the captcha API. + * + * @since 1.8.0 + * + * @param array $verify_query_arg The query arguments for verify URL. + * @param array $form_data Form data and settings. + */ + $verify_query_arg = apply_filters( 'wpforms_process_captcha_verify_query_arg', $verify_query_arg, $this->form_data ); + + /** + * Filter the CAPTCHA verify URL. + * + * @since 1.6.4 + * @since 1.8.0 Added $form_data argument. + * + * @param string $verify_url The full `CAPTCHA verify URL`. + * @param string $verify_url_raw The `CAPTCHA verify URL` without query. + * @param array $verify_query_arg The query arguments for verify URL. + * @param array $form_data Form data and settings. + */ + $verify_url = apply_filters( 'wpforms_process_captcha_verify_url', $verify_url_raw, $verify_url_raw, $verify_query_arg, $this->form_data ); + + $response = wp_safe_remote_post( $verify_url, [ 'body' => $verify_query_arg ] ); + + $response_body = json_decode( wp_remote_retrieve_body( $response ), false ); + + if ( + empty( $response_body->success ) || + ( $is_recaptcha_v3 && $response_body->score <= wpforms_setting( 'recaptcha-v3-threshold', '0.4' ) ) + ) { + if ( $is_recaptcha_v3 && isset( $response_body->score ) ) { + $error .= ' (' . esc_html( $response_body->score ) . ')'; + } + + $this->spam_errors[ $this->form_data['id'] ]['recaptcha'] = $error; + + $this->log_spam_entry( $entry, $error ); + + $this->spam_reason = $captcha_provider; + } + } + + /** + * Check if CAPTCHA processing is allowed. + * + * @since 1.8.3 + * + * @param array $entry Form entry data. + * @param array $captcha_settings CAPTCHA settings. + * + * @return bool + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + private function allow_process_captcha( $entry, $captcha_settings ) { + + // Skip captcha processing if an AMP form. + if ( isset( $_POST['__amp_form_verify'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing + return false; + } + + // Skip captcha processing if the provider is not set. + if ( empty( $captcha_settings['provider'] ) ) { + return false; + } + + $provider = $captcha_settings['provider']; + + // Skip captcha processing if the provider is set to none. + if ( $provider === 'none' ) { + return false; + } + + // Skip captcha processing if a site key or secret key is empty. + if ( empty( $captcha_settings['site_key'] ) || empty( $captcha_settings['secret_key'] ) ) { + return false; + } + + $form_data_settings = $this->form_data['settings'] ?? []; + $is_recaptcha = isset( $form_data_settings['recaptcha'] ) && (int) $form_data_settings['recaptcha'] === 1; + + // Skip captcha processing if reCAPTCHA is disabled for this form. + if ( ! $is_recaptcha ) { + return false; + } + + $recaptcha_type = $captcha_settings['recaptcha_type']; + $is_recaptcha_v3 = $provider === 'recaptcha' && $recaptcha_type === 'v3'; + + // Skip captcha processing on AMP if not using reCAPTCHA v3. AMP requires Google reCAPTCHA v3. + return $is_recaptcha_v3 || ! wpforms_is_amp(); + } + + /** + * Get all available CAPTCHA providers. + * + * @since 1.8.3 + * + * @return array + */ + private function get_captcha_providers() { + + /** + * Filter the CAPTCHA providers. + * + * @since 1.8.3 + * + * @param array $providers The CAPTCHA providers. + */ + return apply_filters( + 'wpforms_process_captcha_providers', + [ + 'hcaptcha' => [ + 'verify_url_raw' => 'https://hcaptcha.com/siteverify', + 'provider' => 'hCaptcha', + 'post_key' => 'h-captcha-response', + ], + 'recaptcha' => [ + 'verify_url_raw' => 'https://www.google.com/recaptcha/api/siteverify', + 'provider' => 'Google reCAPTCHA', + 'post_key' => 'g-recaptcha-response', + ], + 'turnstile' => [ + 'verify_url_raw' => 'https://challenges.cloudflare.com/turnstile/v0/siteverify', + 'provider' => 'Cloudflare Turnstile', + 'post_key' => 'cf-turnstile-response', // The key is specified by the API. + ], + ] + ); + } + + /** + * Get CAPTCHA provider data. + * + * @since 1.8.3 + * + * @param string $provider CAPTCHA provider. + * + * @return array + */ + private function get_captcha( $provider ) { + + $captcha_providers = $this->get_captcha_providers(); + + return $captcha_providers[ $provider ] ?? []; + } + + /** + * Check if combined upload size exceeds allowed maximum. + * + * @since 1.6.0 + * + * @param WP_Post $form Form post object. + */ + public function validate_combined_upload_size( $form ): void { + + $form_id = (int) $form->ID; + $upload_fields = wpforms_get_form_fields( $form, [ 'file-upload' ] ); + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + if ( ! empty( $upload_fields ) && ! empty( $_FILES ) ) { + + // Get $_FILES keys generated by WPForms only. + $files_keys = preg_filter( '/^/', 'wpforms_' . $form_id . '_', array_keys( $upload_fields ) ); + + // Filter uploads without errors. Individual errors are handled by WPForms\Pro\Forms\Fields\FileUpload\Field class. + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $files = wp_list_filter( wp_array_slice_assoc( $_FILES, $files_keys ), [ 'error' => 0 ] ); + $files_size = array_sum( wp_list_pluck( $files, 'size' ) ); + $files_size_max = wpforms_max_upload( true ); + + if ( $files_size > $files_size_max ) { + + // Add a new header error preserving previous ones. + $this->errors[ $form_id ]['header'] = ! empty( $this->errors[ $form_id ]['header'] ) ? $this->errors[ $form_id ]['header'] . '
              ' : ''; + $this->errors[ $form_id ]['header'] .= esc_html__( 'Uploaded files combined size exceeds allowed maximum.', 'wpforms-lite' ); + } + } + } + + /** + * Validate the form return hash. + * + * @since 1.0.0 + * + * @param string $hash Base64-encoded hash of form and entry IDs. + * + * @return array|false False for invalid or form id. + */ + public function validate_return_hash( $hash = '' ) { + + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode + $query_args = base64_decode( $hash ); + + parse_str( $query_args, $output ); + + // Verify hash matches. + if ( wp_hash( $output['form_id'] . ',' . $output['entry_id'] ) !== $output['hash'] ) { + return false; + } + + // Get lead and verify it is attached to the form we received with it. + $entry = wpforms()->obj( 'entry' )->get( $output['entry_id'], [ 'cap' => false ] ); + + if ( empty( $entry->form_id ) ) { + return false; + } + + if ( $output['form_id'] !== $entry->form_id ) { + return false; + } + + return [ + 'form_id' => absint( $output['form_id'] ), + 'entry_id' => absint( $output['form_id'] ), + 'fields' => $entry !== null && isset( $entry->fields ) ? $entry->fields : [], + ]; + } + + /** + * Check if the confirmation data are valid. + * + * @since 1.6.4 + * + * @param array $data The confirmation data. + * + * @return bool + */ + protected function is_valid_confirmation( $data ) { + + if ( empty( $data['type'] ) ) { + return false; + } + + // Confirmation type: redirect, page or message. + $type = $data['type']; + + return isset( $data[ $type ] ) && ! wpforms_is_empty_string( $data[ $type ] ); + } + + /** + * Redirect the user to a page or URL specified in the form confirmation settings. + * + * @since 1.0.0 + * + * @param array $form_data Form data and settings. + * @param string $hash Base64-encoded hash of form and entry IDs. + */ + public function entry_confirmation_redirect( $form_data = [], $hash = '' ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh, WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Maybe process return hash. + if ( ! empty( $hash ) ) { + + $hash_data = $this->validate_return_hash( $hash ); + + if ( ! $hash_data || ! is_array( $hash_data ) ) { + return; + } + + $this->valid_hash = true; + $this->entry_id = absint( $hash_data['entry_id'] ); + $this->fields = json_decode( $hash_data['fields'], true ); + $this->form_data = wpforms()->obj( 'form' )->get( + absint( $hash_data['form_id'] ), + [ + 'content_only' => true, + ] + ); + + } else { + + $this->form_data = $form_data; + } + + // Backward compatibility. + if ( empty( $this->form_data['settings']['confirmations'] ) ) { + $this->form_data['settings']['confirmations'][1]['type'] = ! empty( $this->form_data['settings']['confirmation_type'] ) ? $this->form_data['settings']['confirmation_type'] : 'message'; + $this->form_data['settings']['confirmations'][1]['message'] = ! empty( $this->form_data['settings']['confirmation_message'] ) ? $this->form_data['settings']['confirmation_message'] : esc_html__( 'Thanks for contacting us! We will be in touch with you shortly.', 'wpforms-lite' ); + $this->form_data['settings']['confirmations'][1]['message_scroll'] = ! empty( $this->form_data['settings']['confirmation_message_scroll'] ) ? $this->form_data['settings']['confirmation_message_scroll'] : 1; + $this->form_data['settings']['confirmations'][1]['page'] = ! empty( $this->form_data['settings']['confirmation_page'] ) ? $this->form_data['settings']['confirmation_page'] : ''; + $this->form_data['settings']['confirmations'][1]['redirect'] = ! empty( $this->form_data['settings']['confirmation_redirect'] ) ? $this->form_data['settings']['confirmation_redirect'] : ''; + } + + if ( empty( $this->form_data['settings']['confirmations'] ) || ! is_array( $this->form_data['settings']['confirmations'] ) ) { + return; + } + + $confirmations = $this->form_data['settings']['confirmations']; + + /** + * Filter confirmations before processing. + * + * Allows addons to replace confirmations with their own data. + * + * @since 1.9.8.6 + * + * @param array $confirmations Confirmations data. + * @param array $form_data Form data and settings. + * @param array $fields Submitted form fields. + * @param int $entry_id Entry ID. + */ + $confirmations = (array) apply_filters( 'wpforms_process_entry_confirmation_redirect_confirmations', $confirmations, $this->form_data, $this->fields, $this->entry_id ); + + // Reverse sort confirmations by id to process newer ones first. + krsort( $confirmations ); + + $confirmation_id = $this->get_confirmation_id( $confirmations ); + + $this->confirmation = $confirmations[ $confirmation_id ] ?? []; + + $url = ''; + // Redirect, if needed, to either a page or URL, after form processing. + if ( ! empty( $confirmations[ $confirmation_id ]['type'] ) && $confirmations[ $confirmation_id ]['type'] !== 'message' ) { + + if ( $confirmations[ $confirmation_id ]['type'] === 'redirect' ) { + + $rawurlencode_callback = static function ( $value ) { + return $value === null ? null : rawurlencode( $value ); + }; + + add_filter( 'wpforms_smarttags_process_field_id_value', $rawurlencode_callback ); + + $url = wpforms_process_smart_tags( + $confirmations[ $confirmation_id ]['redirect'], + $this->form_data, + $this->fields, + $this->entry_id, + 'confirmation_redirect' + ); + + remove_filter( 'wpforms_smarttags_process_field_id_value', $rawurlencode_callback ); + } + + if ( $confirmations[ $confirmation_id ]['type'] === 'page' ) { + $url = $this->get_confirmation_redirect_page( (array) $confirmations[ $confirmation_id ] ); + } + } + + if ( ! empty( $url ) ) { + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + $url = apply_filters( 'wpforms_process_redirect_url', $url, $this->form_data['id'], $this->fields, $this->form_data, $this->entry_id ); + + if ( wpforms_is_amp() ) { + /** This filter is documented in wp-includes/pluggable.php */ + // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + $url = apply_filters( 'wp_redirect', $url, 302 ); + $url = wp_sanitize_redirect( $url ); + + header( sprintf( 'AMP-Redirect-To: %s', $url ) ); + header( 'Access-Control-Expose-Headers: AMP-Redirect-To', false ); + wp_send_json( + [ + 'message' => __( 'Redirecting…', 'wpforms-lite' ), + 'redirecting' => true, + ], + 200 + ); + } else { + wp_redirect( esc_url_raw( $url ) ); // phpcs:ignore + } + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + do_action( 'wpforms_process_redirect', $this->form_data['id'] ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + do_action( "wpforms_process_redirect_{$this->form_data['id']}", $this->form_data['id'] ); + + exit; + } + + // Pass a message to a frontend if no redirection happened. + if ( ! empty( $confirmations[ $confirmation_id ]['type'] ) && $confirmations[ $confirmation_id ]['type'] === 'message' ) { + $this->confirmation_message = $confirmations[ $confirmation_id ]['message']; + + if ( ! empty( $confirmations[ $confirmation_id ]['message_scroll'] ) ) { + wpforms()->obj( 'frontend' )->confirmation_message_scroll = true; + } + } + } + + /** + * Get redirect URL for page type confirmation. + * + * @since 1.9.8 + * + * @param array $confirmation Confirmation. + * + * @return string + */ + private function get_confirmation_redirect_page( array $confirmation ): string { + + if ( empty( $confirmation['page'] ) ) { + return ''; + } + + if ( $confirmation['page'] !== 'previous_page' ) { + $url = (string) get_permalink( (int) $confirmation['page'] ); + + return $this->add_url_params_page_confirmation( $confirmation, $url ); + } + + $url = wpforms_process_smart_tags( + '{url_referer}', + $this->form_data, + $this->fields, + $this->entry_id, + 'confirmation_redirect' + ); + + /** + * Filter the previous page URL for the redirect confirmation. + * + * @since 1.9.8 + * + * @param string $url Previous page URL. + * @param array $confirmation Confirmation data. + * @param array $form_data Form data and settings. + */ + $url = (string) apply_filters( 'wpforms_process_confirmation_previous_page_url', $url, $confirmation, $this->form_data ); + + // Double-check if the referer exists and it's not an external website. + if ( $url && wp_validate_redirect( $url ) ) { + return $this->add_url_params_page_confirmation( $confirmation, $url ); + } + + /** + * Filter the fallback URL when the previous page URL is invalid. + * + * @since 1.9.8 + * + * @param string $fallback_url Default homepage URL. + * @param array $confirmation Confirmation data. + * @param array $form_data Form data and settings. + */ + $fallback_url = (string) apply_filters( 'wpforms_process_confirmation_fallback_url', home_url(), $confirmation, $this->form_data ); + + return $this->add_url_params_page_confirmation( $confirmation, $fallback_url ); + } + + /** + * Determine which confirmation to process. + * + * @since 1.9.2 + * + * @param array $confirmations List of confirmations. + * + * @return int Confirmation ID. + */ + private function get_confirmation_id( array $confirmations ) { + + $default_confirmation_key = min( array_keys( $confirmations ) ); + + $confirmation_id = 0; + + foreach ( $confirmations as $confirmation_id => $confirmation ) { + // Last confirmation should execute in any case. + if ( $default_confirmation_key === $confirmation_id ) { + break; + } + + if ( ! $this->is_valid_confirmation( $confirmation ) ) { + continue; + } + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Process confirmation filter. + * + * @since 1.4.8 + * + * @param bool $process Whether to process the logic or not. + * @param array $fields List of submitted fields. + * @param array $form_data Form data and settings. + * @param int $id Confirmation ID. + */ + $process_confirmation = apply_filters( 'wpforms_entry_confirmation_process', true, $this->fields, $this->form_data, $confirmation_id ); + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + if ( $process_confirmation ) { + break; + } + } + + return $confirmation_id; + } + + /** + * Add URL parameters to the page confirmation URL. + * + * @since 1.9.8 + * + * @param array $confirmation Confirmation data. + * @param string $url Page URL. + * + * @return string Modified URL with parameters. + */ + private function add_url_params_page_confirmation( array $confirmation, string $url ): string { + + if ( empty( $confirmation['page_url_parameters'] ) ) { + return $url; + } + + parse_str( $confirmation['page_url_parameters'], $url_params ); + + if ( empty( $url_params ) ) { + return $url; + } + + /** + * Filter the URL parameters before adding them to the URL for page confirmation. + * + * @since 1.9.8 + * + * @param array $url_params Array of URL parameters. + * @param array $confirmation Confirmation data. + * @param array $form_data Form data and settings. + */ + $url_params = apply_filters( 'wpforms_process_confirmation_url_parameters', $url_params, $confirmation, $this->form_data ); + + return add_query_arg( $url_params, $url ); + } + + /** + * Get a confirmation message. + * + * @since 1.5.3 + * + * @param array $form_data Form data and settings. + * @param array $fields Sanitized field data. + * @param int $entry_id Entry id. + * + * @return string Confirmation message. + */ + public function get_confirmation_message( $form_data, $fields, $entry_id ) { + + if ( empty( $this->confirmation_message ) ) { + return ''; + } + + $confirmation_message = wpforms_process_smart_tags( $this->confirmation_message, $form_data, $fields, $entry_id, 'confirmation' ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + return apply_filters( 'wpforms_frontend_confirmation_message', wpautop( $confirmation_message ), $form_data, $fields, $entry_id ); + } + + /** + * Get current confirmation. + * + * @since 1.6.9 + * + * @return array + */ + public function get_current_confirmation() { + + return ! empty( $this->confirmation ) ? $this->confirmation : []; + } + + /** + * Catch the post_max_size overflow. + * + * @since 1.5.2 + * + * @return bool + */ + public function post_max_size_overflow() { + + // phpcs:disable WordPress.Security.NonceVerification + if ( empty( $_SERVER['CONTENT_LENGTH'] ) || empty( $_GET['wpforms_form_id'] ) ) { + return false; + } + + $form_id = (int) $_GET['wpforms_form_id']; + $total_size = (int) $_SERVER['CONTENT_LENGTH']; + $post_max_size = wpforms_size_to_bytes( ini_get( 'post_max_size' ) ); + + if ( ! ( $total_size > $post_max_size && empty( $_POST ) && $form_id > 0 ) ) { + return false; + } + // phpcs:enable WordPress.Security.NonceVerification + + $error_msg = esc_html__( 'Form has not been submitted, please see the errors below.', 'wpforms-lite' ); + $error_msg .= '
              ' . sprintf( /* translators: %1$.3f - total size of the selected files in megabytes, %2$.3f - allowed file upload limit in megabytes.*/ + esc_html__( 'The total size of the selected files %1$.3f MB exceeds the allowed limit %2$.3f MB.', 'wpforms-lite' ), + esc_html( $total_size / 1048576 ), + esc_html( $post_max_size / 1048576 ) + ); + + $this->errors[ $form_id ]['header'] = $error_msg; + + return true; + } + + /** + * Send entry email notifications. + * + * @since 1.0.0 + * + * @param array $fields List of fields. + * @param array $entry Submitted form entry. + * @param array $form_data Form data and settings. + * @param int $entry_id Saved entry id. + * @param string $context In which context this email is sent. + */ + public function entry_email( $fields, $entry, $form_data, $entry_id, $context = '' ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Check that the form was configured for email notifications. + if ( empty( $form_data['settings']['notification_enable'] ) ) { + return; + } + + /** + * Allow entry email notifications to be disabled. + * + * @since 1.0.0 + * + * @param bool $enabled Whether to send the email. + * @param array $fields List of fields. + * @param array $entry Form submission raw data. + * @param array $form_data Form data and settings. + */ + if ( ! apply_filters( 'wpforms_entry_email', true, $fields, $entry, $form_data ) ) { // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + return; + } + + // Make sure we have an entry id. + if ( empty( $this->entry_id ) ) { + $this->entry_id = (int) $entry_id; + } + + /** + * Filter entry email notifications data. + * + * @since 1.0.0 + * + * @param array $fields List of fields. + * @param array $entry Form submission raw data. + * @param array $form_data Form data and settings. + */ + $fields = apply_filters( 'wpforms_entry_email_data', $fields, $entry, $form_data ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + // Backwards compatibility for notifications before v1.4.3. + if ( empty( $form_data['settings']['notifications'] ) && ! empty( $form_data['settings']['notification_email'] ) ) { + $notifications[1] = [ + 'email' => $form_data['settings']['notification_email'], + 'subject' => $form_data['settings']['notification_subject'], + 'sender_name' => $form_data['settings']['notification_fromname'], + 'sender_address' => $form_data['settings']['notification_fromaddress'], + 'replyto' => $form_data['settings']['notification_replyto'], + 'message' => '{all_fields}', + ]; + } else { + $notifications = $form_data['settings']['notifications']; + } + + $notifications_count = count( $notifications ); + $is_pro = wpforms()->is_pro(); + + foreach ( $notifications as $notification_id => $notification ) : + + if ( empty( $notification['email'] ) ) { + continue; + } + + // You can disable the email notification for a specific notification only if there are more than one notification. + // BC: The notification should be enabled even when the `enabled` key doesn't exist. + // The key is missed for old forms or forms created using the Lite version. + if ( $is_pro && $notifications_count > 1 && isset( $notification['enable'] ) && (int) $notification['enable'] === 0 ) { + continue; + } + + /** + * Allow entry email notifications to be disabled for a specific notification. + * + * @since 1.0.0 + * + * @param bool $enabled Whether to send the email. + * @param array $fields List of fields. + * @param array $form_data Form data and settings. + * @param int $notification_id Notification ID. + * @param string $context In which context this email is sent. + */ + $process_email = apply_filters( 'wpforms_entry_email_process', true, $fields, $form_data, $notification_id, $context ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + if ( ! $process_email ) { + continue; + } + + $email = []; + $is_carboncopy_enabled = wpforms_setting( 'email-carbon-copy' ); + + // Setup email properties. + $email['subject'] = ! empty( $notification['subject'] ) ? + $notification['subject'] : + sprintf( /* translators: %s - form name. */ + esc_html__( 'New %s Entry', 'wpforms-lite' ), + $form_data['settings']['form_title'] + ); + $email['address'] = explode( ',', wpforms_process_smart_tags( $notification['email'], $form_data, $fields, $this->entry_id, 'notification-send-to-email' ) ); + $email['address'] = array_filter( array_map( 'sanitize_email', $email['address'] ) ); + $email['sender_address'] = ! empty( $notification['sender_address'] ) ? $notification['sender_address'] : get_option( 'admin_email' ); + $email['sender_name'] = ! empty( $notification['sender_name'] ) ? $notification['sender_name'] : get_bloginfo( 'name' ); + $email['replyto'] = ! empty( $notification['replyto'] ) ? $notification['replyto'] : false; + $email['message'] = ! empty( $notification['message'] ) ? $notification['message'] : '{all_fields}'; + $email['template'] = ! empty( $notification['template'] ) ? $notification['template'] : ''; + + if ( $is_carboncopy_enabled && ! empty( $notification['carboncopy'] ) ) { + $email['carboncopy'] = explode( ',', wpforms_process_smart_tags( $notification['carboncopy'], $form_data, $fields, $this->entry_id, 'notification-carboncopy' ) ); + $email['carboncopy'] = array_filter( array_map( 'sanitize_email', $email['carboncopy'] ) ); + } + + /** + * Filter entry email notifications attributes. + * + * @since 1.0.0 + * + * @param array $email Email attributes. + * @param array $fields List of fields. + * @param array $entry Form submission raw data. + * @param array $form_data Form data and settings. + * @param int $notification_id Notification ID. + */ + $email = apply_filters( 'wpforms_entry_email_atts', $email, $fields, $entry, $form_data, $notification_id ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + // Create a new email. + $emails = ( new Notifications() )->init( $email['template'] ); + + $emails->__set( 'form_data', $form_data ); + $emails->__set( 'fields', $fields ); + $emails->__set( 'notification_id', $notification_id ); + $emails->__set( 'entry_id', $this->entry_id ); + $emails->__set( 'from_name', $email['sender_name'] ); + $emails->__set( 'from_address', $email['sender_address'] ); + $emails->__set( 'reply_to', $email['replyto'] ); + + // Reset headers to support multiple notifications. They will be set on sending. + $emails->__set( 'headers', null ); + + // Maybe include CC. + if ( $is_carboncopy_enabled && ! empty( $email['carboncopy'] ) ) { + $emails->__set( 'cc', $email['carboncopy'] ); + } + + /** + * Filter entry email notifications before sending. + * + * @since 1.0.0 + * + * @param object $emails WPForms_WP_Emails instance. + */ + $emails = apply_filters( 'wpforms_entry_email_before_send', $emails ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $this->email_handler = $emails; + + // Go. + foreach ( $email['address'] as $address ) { + $emails->send( trim( $address ), $email['subject'], $email['message'] ); + } + endforeach; + } + + /** + * Save entry to a database. + * + * @since 1.0.0 + * + * @param array $fields List of form fields. + * @param array $entry User submitted data. + * @param int $form_id Form ID. + * @param array $form_data Prepared form settings. + * + * @return int + */ + public function entry_save( $fields, $entry, $form_id, $form_data = [] ) { + + $fields = $this->remove_raw_data_before_save( $fields ); + + /** + * Fires on entry save. + * + * @since 1.0.0 + * + * @param array $fields List of form fields. + * @param array $entry Form submission raw data. + * @param int $form_id Form ID. + * @param array $form_data Prepared form settings. + */ + do_action( 'wpforms_process_entry_save', $fields, $entry, $form_id, $form_data ); + + return $this->entry_id; + } + + /** + * Remove raw data from fields before saving. + * This is needed to prevent raw password data from being saved to the database. + * + * @since 1.8.6 + * + * @param array $fields List of form fields. + * + * @return array + */ + private function remove_raw_data_before_save( array $fields ): array { + + foreach ( $fields as $key => $field ) { + if ( ! empty( $field['type'] ) && $field['type'] === 'password' ) { + unset( $fields[ $key ]['value_raw'] ); + } + } + + return $fields; + } + + /** + * Save payment to the database. + * + * @since 1.8.2 + * + * @param array $entry User submitted data. + * + * @return int Payment ID. + */ + private function payment_save( $entry ) { + + if ( ! wpforms_has_payment( 'entry', $this->fields ) ) { + return 0; + } + + $entry['entry_id'] = $this->entry_id; + + $form_submission = wpforms()->obj( 'submission' )->register( $this->fields, $entry, $this->form_data['id'], $this->form_data ); + + // Prepare the payment data. + $payment_data = $form_submission->prepare_payment_data(); + + // Bail early in case the payment field exists, + // but no payment data was provided (e.g., old payment addon is used). + if ( empty( $payment_data['gateway'] ) ) { + return 0; + } + + // Create payment. + $payment_id = wpforms()->obj( 'payment' )->add( $payment_data ); + + if ( ! $payment_id ) { + return 0; + } + + // Insert payment meta. + wpforms()->obj( 'payment_meta' )->bulk_add( $payment_id, $form_submission->prepare_payment_meta() ); + + /** + * Fire after payment was saved to a database. + * + * @since 1.8.2 + * + * @param int $payment_id Payment id. + * @param array $fields Form fields. + * @param array $form_data Form data. + */ + do_action( 'wpforms_process_payment_saved', $payment_id, $this->fields, $this->form_data ); + + return $payment_id; + } + + /** + * Process AJAX form submit. + * + * @since 1.5.3 + */ + public function ajax_submit() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // phpcs:disable WordPress.Security.NonceVerification.Missing + $form_id = isset( $_POST['wpforms']['id'] ) ? absint( $_POST['wpforms']['id'] ) : 0; + + if ( empty( $form_id ) ) { + wp_send_json_error(); + } + + if ( isset( $_POST['wpforms']['post_id'] ) ) { + // We don't have a global $post when processing ajax requests. + // Therefore, it's necessary to set a global $post manually for compatibility with functions used in smart tag processing. + global $post; + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + $post = WP_Post::get_instance( absint( $_POST['wpforms']['post_id'] ) ); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing + + add_filter( 'wp_redirect', [ $this, 'ajax_process_redirect' ], 999 ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + do_action( 'wpforms_ajax_submit_before_processing', $form_id ); + + // If redirect happens in listen(), ajax_process_redirect() gets executed because of the filter on `wp_redirect`. + // The code, that is below listen(), runs only if no redirect happened. + $this->listen(); + + $form_data = $this->form_data; + + if ( empty( $form_data ) ) { + $form_data = wpforms()->obj( 'form' )->get( $form_id, [ 'content_only' => true ] ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $form_data = apply_filters( 'wpforms_frontend_form_data', $form_data ); + } + + if ( ! empty( $this->errors[ $form_id ] ) ) { + $this->ajax_process_errors( $form_id, $form_data ); + wp_send_json_error(); + } + + ob_start(); + + wpforms()->obj( 'frontend' )->confirmation( $form_data ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $response = apply_filters( 'wpforms_ajax_submit_success_response', [ 'confirmation' => ob_get_clean() ], $form_id, $form_data ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + do_action( 'wpforms_ajax_submit_completed', $form_id, $response ); + + wp_send_json_success( $response ); + } + + /** + * Process AJAX errors. + * + * @since 1.5.3 + * + * @todo This should be re-used/combined for AMP verify-xhr requests. + * + * @param int $form_id Form ID. + * @param array $form_data Form data and settings. + */ + protected function ajax_process_errors( $form_id, $form_data ) { + + $errors = $this->errors[ $form_id ] ?? []; + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $errors = apply_filters( 'wpforms_ajax_submit_errors', $errors, $form_id, $form_data ); + + if ( empty( $errors ) ) { + wp_send_json_error(); + } + + // General errors are errors that cannot be populated with the jQuery Validate plugin. + $general_errors = array_intersect_key( $errors, array_flip( [ 'header', 'footer', 'header_styled', 'footer_styled', 'recaptcha' ] ) ); + + foreach ( $general_errors as $key => $error ) { + ob_start(); + wpforms()->obj( 'frontend' )->form_error( $key, $error, $form_data ); + $general_errors[ $key ] = ob_get_clean(); + } + + $fields = $form_data['fields'] ?? []; + + // Get registered fields errors only. + $field_errors = array_intersect_key( $errors, $fields ); + + // Transform field ids to field names for jQuery Validate plugin. + foreach ( $field_errors as $key => $error ) { + + $name = $this->ajax_error_field_name( $fields[ $key ], $form_data, $error ); + + if ( $name ) { + $field_errors[ $name ] = $error; + } + + unset( $field_errors[ $key ] ); + } + + $response = []; + + if ( $general_errors ) { + $response['errors']['general'] = $general_errors; + } + + if ( $field_errors ) { + $response['errors']['field'] = $field_errors; + } + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $response = apply_filters( 'wpforms_ajax_submit_errors_response', $response, $form_id, $form_data ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + do_action( 'wpforms_ajax_submit_completed', $form_id, $response ); + + wp_send_json_error( $response ); + } + + /** + * Get a field name for an ajax error message. + * + * @since 1.6.3 + * + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * @param string|string[] $error Error message. + * + * @return string + */ + private function ajax_error_field_name( array $field, array $form_data, $error ): string { + + $props = wpforms()->obj( 'frontend' )->get_field_properties( $field, $form_data ); + + /** + * Filter the field name for an ajax error message. + * + * @since 1.6.3 + * + * @param string $name Error field name. + * @param array $field Field. + * @param array $props Field properties. + * @param string|string[] $error Error message. + */ + return (string) apply_filters( 'wpforms_process_ajax_error_field_name', '', $field, $props, $error ); + } + + /** + * Process AJAX redirect. + * + * @since 1.5.3 + * + * @param string $url Redirect URL. + */ + public function ajax_process_redirect( $url ) { + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $form_id = isset( $_POST['wpforms']['id'] ) ? absint( $_POST['wpforms']['id'] ) : 0; + + if ( empty( $form_id ) ) { + wp_send_json_error(); + } + + $response = [ + 'form_id' => $form_id, + 'redirect_url' => $url, + ]; + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $response = apply_filters( 'wpforms_ajax_submit_redirect', $response, $form_id, $url ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + do_action( 'wpforms_ajax_submit_completed', $form_id, $response ); + + wp_send_json_success( $response ); + } + + /** + * Conditionally add a new_tab key to the AJAX response. + * + * @since 1.9.2 + * + * @param array $response AJAX response. + * + * @return array AJAX response. + */ + public function maybe_open_in_new_tab( array $response ): array { + + $open_in_new_tab = $this->confirmation['redirect_new_tab'] ?? false; + + if ( $open_in_new_tab ) { + $response['new_tab'] = true; + } + + return $response; + } + + /** + * Validate action value for ajax form submission. + * + * @since 1.9.3 + * + * @return bool + */ + private function is_valid_ajax_submit_action(): bool { + + // In the case of AMP form submission, the action is not set. + if ( wpforms_is_amp( false ) ) { + return true; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + return ! empty( $_POST['action'] ) && $_POST['action'] === 'wpforms_submit'; + } + + /** + * Get current email handler. + * + * @since 1.9.4 + * + * @return mixed|Mailer|WPForms_WP_Emails|null + */ + public function get_email_handler() { + + return $this->email_handler; + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/class-providers.php b/wp-content/plugins/wpforms-lite/includes/class-providers.php new file mode 100755 index 00000000..e45f0865 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-providers.php @@ -0,0 +1,86 @@ +init(); + } + + /** + * Load and init the base provider class. + * + * @since 1.3.6 + */ + public function init() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Parent class template. + require_once WPFORMS_PLUGIN_DIR . 'includes/providers/class-base.php'; + + // Load default templates on WP init. + add_action( 'wpforms_loaded', [ $this, 'load' ] ); + } + + /** + * Load default marketing providers. + * + * @since 1.3.6 + */ + public function load() { + + $providers = []; + + if ( ConstantContact::get_current_version() === 2 ) { + $providers[] = 'constant-contact'; + } + + /** + * Allow third-party plugins to load their own providers. + * + * @since 1.7.0 + * + * @param array $providers Array of providers to load. + */ + $providers = (array) apply_filters( 'wpforms_load_providers', $providers ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + foreach ( $providers as $provider ) { + + $provider = sanitize_file_name( $provider ); + $path = WPFORMS_PLUGIN_DIR . 'includes/providers/class-' . $provider . '.php'; + + if ( file_exists( $path ) ) { + require_once $path; + } + + /** + * Allow third-party plugins to load their own providers. + * + * @since 1.7.0 + */ + do_action( "wpforms_load_{$provider}_provider" ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + } +} + +new WPForms_Providers(); diff --git a/wp-content/plugins/wpforms-lite/includes/class-templates.php b/wp-content/plugins/wpforms-lite/includes/class-templates.php new file mode 100755 index 00000000..ddd67ddd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-templates.php @@ -0,0 +1,66 @@ +init(); + } + + /** + * Load and init the base form template class. + * + * @since 1.2.8 + */ + public function init() { + + // Parent class template. + require_once WPFORMS_PLUGIN_DIR . 'includes/templates/class-base.php'; + + // Load default templates on WP init. + add_action( 'init', [ $this, 'load' ] ); + } + + /** + * Load default form templates. + * + * @since 1.0.0 + */ + public function load() { + + $templates = apply_filters( + 'wpforms_load_templates', + [ + 'blank', + 'simple-contact-form', + ] + ); + + foreach ( $templates as $template ) { + + $template = sanitize_file_name( $template ); + + if ( file_exists( WPFORMS_PLUGIN_DIR . 'includes/templates/class-' . $template . '.php' ) ) { + require_once WPFORMS_PLUGIN_DIR . 'includes/templates/class-' . $template . '.php'; + } elseif ( file_exists( WPFORMS_PLUGIN_DIR . 'pro/includes/templates/class-' . $template . '.php' ) && wpforms()->is_pro() ) { + require_once WPFORMS_PLUGIN_DIR . 'pro/includes/templates/class-' . $template . '.php'; + } + } + } +} + +new WPForms_Templates; diff --git a/wp-content/plugins/wpforms-lite/includes/class-widget.php b/wp-content/plugins/wpforms-lite/includes/class-widget.php new file mode 100755 index 00000000..1ef12744 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/class-widget.php @@ -0,0 +1,192 @@ +defaults = [ + 'title' => '', + 'form_id' => '', + 'show_title' => false, + 'show_desc' => false, + ]; + + // Widget Slug. + $widget_slug = 'wpforms-widget'; + + // Widget basics. + $widget_ops = [ + 'classname' => $widget_slug, + 'description' => esc_html_x( 'Display a form.', 'Widget', 'wpforms-lite' ), + 'show_instance_in_rest' => false, + ]; + + // Widget controls. + $control_ops = [ + 'id_base' => $widget_slug, + ]; + + // Load widget. + parent::__construct( $widget_slug, esc_html_x( 'WPForms', 'Widget', 'wpforms-lite' ), $widget_ops, $control_ops ); + } + + /** + * Output the HTML for this widget. + * + * @since 1.0.2 + * + * @param array $args An array of standard parameters for widgets in this theme. + * @param array $instance An array of settings for this widget instance. + */ + public function widget( $args, $instance ) { + + // Merge with defaults. + $instance = wp_parse_args( (array) $instance, $this->defaults ); + $args = wp_parse_args( + $args, + [ + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + ] + ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $args['before_widget']; + + if ( ! empty( $instance['title'] ) ) { + // phpcs:ignore + echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base ) . $args['after_title']; + } + + if ( ! empty( $instance['form_id'] ) ) { + wpforms()->obj( 'frontend' )->output( absint( $instance['form_id'] ), (bool) $instance['show_title'], (bool) $instance['show_desc'] ); + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $args['after_widget']; + } + + /** + * Deal with the settings when they are saved by the admin. Here is + * where any validation should be dealt with. + * + * @since 1.0.2 + * + * @param array $new_instance An array of new settings as submitted by the admin. + * @param array $old_instance An array of the previous settings. + * + * @return array The validated and (if necessary) amended settings + */ + public function update( $new_instance, $old_instance ) { + + $new_instance['title'] = wp_strip_all_tags( $new_instance['title'] ); + $new_instance['form_id'] = ! empty( $new_instance['form_id'] ) ? (int) $new_instance['form_id'] : 0; + $new_instance['show_title'] = isset( $new_instance['show_title'] ) && $new_instance['show_title'] ? '1' : false; + $new_instance['show_desc'] = isset( $new_instance['show_desc'] ) && $new_instance['show_desc'] ? '1' : false; + + return $new_instance; + } + + /** + * Display the form for this widget on the Widgets page of the WP Admin area. + * + * @since 1.0.2 + * + * @param array $instance An array of the current settings for this widget. + */ + public function form( $instance ) { + + // Merge with defaults. + $instance = wp_parse_args( (array) $instance, $this->defaults ); + ?> +

              + + +

              +

              + + +

              +

              + > + +
              + > + +

              + version. + * + * @since 1.8.0 + */ + const CLASSES = [ + 'WPForms\Pro\Admin\Entries\DefaultScreen' => '1.8.2', + 'WPForms\Pro\Integrations\AI\AI' => '1.9.4', + 'WPForms\Pro\Integrations\AI\Helpers' => '1.9.4', + 'WPForms_Install_Skin' => '1.9.5', + 'WPForms_Install_Silent_Skin' => '1.5.6.1', + 'WPForms\Helpers\PluginSilentUpgraderSkin' => '1.9.5', + ]; + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + */ + public function __construct() { + + self::trigger_error(); + } + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + * + * @param string $name Property name. + */ + public function __get( $name ) { + + self::trigger_error( $name ); + } + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + * + * @param string $name Property name. + * @param mixed $value Property value. + */ + public function __set( $name, $value ) { + + self::trigger_error( $name ); + } + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + * + * @param string $name Property name. + */ + public function __isset( $name ) { + + self::trigger_error( $name ); + } + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + * + * @param string $name Method name. + * @param array $arguments List of arguments. + */ + public function __call( $name, $arguments ) { + + self::trigger_error( $name ); + } + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + * + * @param string $name Method name. + * @param array $arguments List of arguments. + */ + public static function __callStatic( $name, $arguments ) { + + self::trigger_error( $name ); + } + + /** + * Inform clients that the class is removed. + * + * @since 1.8.0 + * + * @param string $element_name Property or method name. + */ + private static function trigger_error( $element_name = '' ) { + + $current_class = static::class; + $removed_element = $current_class; + + if ( $element_name ) { + $removed_element .= '::' . $element_name; + } + + $version = ! empty( self::CLASSES[ $current_class ] ) ? self::CLASSES[ $current_class ] : WPFORMS_VERSION; + + trigger_error( + sprintf( + '%1$s has been removed in %2$s of the WPForms plugin', + esc_html( $removed_element ), + esc_html( $version ) + ), + E_USER_WARNING + ); + } + } +} + +namespace WPForms\Forms { + + use WPForms\Removed; + + class Loader extends Removed {} +} + +namespace { + /** + * Legacy `WPForms_Addons` class was refactored and moved to the new `WPForms\Pro\Admin\Pages\Addons` class. + * This alias is a safeguard to those developers who use our internal class WPForms_Addons, + * which we deleted. + * + * @since 1.6.7 + */ + class_alias( wpforms()->is_pro() ? 'WPForms\Pro\Admin\Pages\Addons' : 'WPForms\Lite\Admin\Pages\Addons', 'WPForms_Addons' ); + + /** + * This alias is a safeguard to those developers who decided to use our internal class WPForms_Smart_Tags, + * which we deleted. + * + * @since 1.6.7 + */ + class_alias( wpforms()->is_pro() ? 'WPForms\Pro\SmartTags\SmartTags' : 'WPForms\SmartTags\SmartTags', 'WPForms_Smart_Tags' ); + + /** + * This alias is a safeguard to those developers who decided to use our internal class \WPForms\Providers\Loader, + * which we deleted. + * + * @since 1.7.3 + */ + class_alias( '\WPForms\Providers\Providers', '\WPForms\Providers\Loader' ); + + /** + * Legacy `\WPForms\Admin\Notifications` class was refactored and moved to the new `\WPForms\Admin\Notifications\Notifications` class. + * This alias is a safeguard to those developers who use our internal class \WPForms\Admin\Notifications, + * which we deleted. + * + * @since 1.7.5 + */ + class_alias( '\WPForms\Admin\Notifications\Notifications', '\WPForms\Admin\Notifications' ); + + /** + * Legacy `\WPForms_Field_Payment_Checkbox` class was refactored and moved to the new `\WPForms\Forms\Fields\PaymentCheckbox\Field` class. + * This alias is a safeguard to those developers who use our internal class \WPForms_Field_Payment_Checkbox, + * which we deleted. + * + * @since 1.8.2 + */ + class_alias( '\WPForms\Forms\Fields\PaymentCheckbox\Field', '\WPForms_Field_Payment_Checkbox' ); + + /** + * Legacy `\WPForms_Field_Payment_Multiple` class was refactored and moved to the new `\WPForms\Forms\Fields\PaymentMultiple\Field` class. + * This alias is a safeguard to those developers who use our internal class \WPForms_Field_Payment_Multiple, + * which we deleted. + * + * @since 1.8.2 + */ + class_alias( '\WPForms\Forms\Fields\PaymentMultiple\Field', '\WPForms_Field_Payment_Multiple' ); + + /** + * Legacy `\WPForms_Field_Payment_Single` class was refactored and moved to the new `\WPForms\Forms\Fields\PaymentSingle\Field` class. + * This alias is a safeguard to those developers who use our internal class \WPForms_Field_Payment_Single, + * which we deleted. + * + * @since 1.8.2 + */ + class_alias( '\WPForms\Forms\Fields\PaymentSingle\Field', '\WPForms_Field_Payment_Single' ); + + /** + * Legacy `\WPForms_Field_Payment_Total` class was refactored and moved to the new `\WPForms\Forms\Fields\PaymentTotal\Field` class. + * This alias is a safeguard to those developers who use our internal class \WPForms_Field_Payment_Total, + * which we deleted. + * + * @since 1.8.2 + */ + class_alias( '\WPForms\Forms\Fields\PaymentTotal\Field', '\WPForms_Field_Payment_Total' ); + + /** + * Legacy `\WPForms_Field_Payment_Select` class was refactored and moved to the new `\WPForms\Forms\Fields\PaymentSelect\Field` class. + * This alias is a safeguard to those developers who use our internal class \WPForms_Field_Payment_Select, + * which we deleted. + * + * @since 1.8.2 + */ + class_alias( '\WPForms\Forms\Fields\PaymentSelect\Field', '\WPForms_Field_Payment_Select' ); + + /** + * Legacy `\WPForms\Migrations` class was refactored and moved to the new `\WPForms\Migrations\Migrations` class. + * This alias is a safeguard to those developers who use our internal class \WPForms\Migrations, which we deleted. + * + * @since 1.7.5 + */ + class_alias( '\WPForms\Migrations\Migrations', '\WPForms\Migrations' ); + + /** + * Legacy `\WPForms_Frontend` class was refactored and moved to the new `\WPForms\Frontend\Frontend` class. + * This alias is a safeguard to those developers who use our internal class \WPForms_Frontend, which we deleted. + * + * @since 1.8.1 + */ + class_alias( '\WPForms\Frontend\Frontend', '\WPForms_Frontend' ); + + /** + * This alias is a safeguard to those developers who use our internal class \WPForms_Overview, which we deleted. + * + * @since 1.8.6 + */ + class_alias( '\WPForms\Admin\Forms\Page', '\WPForms_Overview' ); + + /** + * This alias is a safeguard to those developers who use our internal class \WPForms_Overview_Table, which we deleted. + * + * @since 1.8.6 + */ + class_alias( '\WPForms\Admin\Forms\ListTable', '\WPForms_Overview_Table' ); + + /** + * This alias is a safeguard to those developers who use our internal + * class \WPForms\Emails\FetchInfoBlocksTask, which we deleted. + * + * @since 1.9.8 + */ + class_alias( '\WPForms\Emails\Tasks\FetchInfoBlocksTask', '\WPForms\Emails\FetchInfoBlocksTask' ); + + // Pro specific aliases. + if ( wpforms()->is_pro() ) { + /** + * Legacy `\WPForms\Pro\Migrations` class was refactored and moved to the new `\WPForms\Pro\Migrations\Migrations` class. + * This alias is a safeguard to those developers who use our internal class \WPForms\Migrations, which we deleted. + * + * @since 1.7.5 + */ + class_alias( '\WPForms\Pro\Migrations\Migrations', '\WPForms\Pro\Migrations' ); + + /** + * Legacy `\WPForms\Pro\Integrations\TranslationsPress\Translations` class was refactored and moved to the new + * `\WPForms\Pro\Integrations\Translations\Translations` class. + * This alias is a safeguard to those developers who use our internal class \WPForms\Pro\Integrations\TranslationsPress, which we deleted. + * + * @since 1.8.2.2 + */ + class_alias( '\WPForms\Pro\Integrations\Translations\Translations', '\WPForms\Pro\Integrations\TranslationsPress\Translations' ); + + /** + * This alias is a safeguard to those developers who use our internal class \WPForms_Entries_List, which we deleted. + * + * @since 1.8.6 + */ + class_alias( '\WPForms\Pro\Admin\Entries\Page', '\WPForms_Entries_List' ); + + /** + * This alias is a safeguard to those developers who use our internal class \WPForms_Entries_Table, which we deleted. + * + * @since 1.8.6 + */ + class_alias( '\WPForms\Pro\Admin\Entries\ListTable', '\WPForms_Entries_Table' ); + + /** + * This alias is a safeguard to those developers who use our internal class \WPForms_Field_Layout, which we deleted. + * + * @since 1.8.9 + */ + class_alias( '\WPForms\Pro\Forms\Fields\Layout\Field', '\WPForms_Field_Layout' ); + + /** + * These aliases are a safeguard to those developers who use our internal legacy field classes, which we deleted. + * + * @since 1.9.4 + */ + class_alias( '\WPForms\Pro\Forms\Fields\Address\Field', '\WPForms_Field_Address' ); + class_alias( '\WPForms\Pro\Forms\Fields\Content\Field', '\WPForms_Field_Content' ); + class_alias( '\WPForms\Pro\Forms\Fields\DateTime\Field', '\WPForms_Field_Date_Time' ); + class_alias( '\WPForms\Pro\Forms\Fields\Divider\Field', '\WPForms_Field_Divider' ); + class_alias( '\WPForms\Pro\Forms\Fields\EntryPreview\Field', '\WPForms_Entry_Preview' ); + class_alias( '\WPForms\Pro\Forms\Fields\FileUpload\Field', '\WPForms_Field_File_Upload' ); + class_alias( '\WPForms\Pro\Forms\Fields\Hidden\Field', '\WPForms_Field_Hidden' ); + class_alias( '\WPForms\Pro\Forms\Fields\Html\Field', '\WPForms_Field_HTML' ); + class_alias( '\WPForms\Pro\Forms\Fields\Pagebreak\Field', '\WPForms_Field_Page_Break' ); + class_alias( '\WPForms\Pro\Forms\Fields\Password\Field', '\WPForms_Field_Password' ); + class_alias( '\WPForms\Pro\Forms\Fields\CreditCard\Field', '\WPForms_Field_CreditCard' ); + class_alias( '\WPForms\Pro\Forms\Fields\Phone\Field', '\WPForms_Field_Phone' ); + class_alias( '\WPForms\Pro\Forms\Fields\Rating\Field', '\WPForms_Rating_Text' ); + class_alias( '\WPForms\Pro\Forms\Fields\Richtext\Field', '\WPForms_Field_Richtext' ); + class_alias( '\WPForms\Pro\Forms\Fields\Url\Field', '\WPForms_Field_URL' ); + + /** + * This alias is a safeguard to those developers who use our internal + * class \WPForms\Pro\Integrations\AI\API\Forms, which we deleted. + * + * @since 1.9.4 + */ + class_alias( '\WPForms\Integrations\AI\API\Forms', '\WPForms\Pro\Integrations\AI\API\Forms' ); + + /** + * This alias is a safeguard to those developers who use our internal + * class \WPForms\Pro\Integrations\AI\Admin\Ajax\Forms, which we deleted. + * + * @since 1.9.4 + */ + class_alias( '\WPForms\Integrations\AI\Admin\Ajax\Forms', '\WPForms\Pro\Integrations\AI\Admin\Ajax\Forms' ); + + /** + * This alias is a safeguard to those developers who use our internal + * class \WPForms\Pro\Integrations\AI\Admin\Builder\Enqueues, which we deleted. + * + * @since 1.9.4 + */ + class_alias( '\WPForms\Integrations\AI\Admin\Builder\Forms', '\WPForms\Pro\Integrations\AI\Admin\Builder\Enqueues' ); + + /** + * This alias is a safeguard to those developers who use our internal + * class \WPForms\Pro\Integrations\AI\Admin\Pages\Templates, which we deleted. + * + * @since 1.9.4 + */ + class_alias( '\WPForms\Integrations\AI\Admin\Pages\Templates', '\WPForms\Pro\Integrations\AI\Admin\Pages\Templates' ); + } + + /** + * This adds backwards compatibility after scoping the stripe lib and using our own prefix `\WPForms\Vendor\Stripe`. + * This alias is a safeguard for the users who update core plugin to 1.8.5 but have an older version of stripe pro addon. + * Fire this right before autoloading of legacy classes so that there is no conflict with other stripe libs when aliasing. + * + * @since 1.8.5 + */ + spl_autoload_register( + static function ( $class_name ) { + static $stripe_check_done = false; + + static $aliases = [ + '\WPForms\Vendor\Stripe\Charge' => 'Stripe\Charge', + '\WPForms\Vendor\Stripe\Customer' => 'Stripe\Customer', + '\WPForms\Vendor\Stripe\Subscription' => 'Stripe\Subscription', + '\WPForms\Vendor\Stripe\Invoice' => 'Stripe\Invoice', + '\WPForms\Vendor\Stripe\Exception\CardException' => 'Stripe\Exception\CardException', + '\WPForms\Vendor\Stripe\Source' => 'Stripe\Source', + ]; + + if ( $stripe_check_done ) { + return; + } + + // If class not for aliasing, bail. + if ( ! in_array( $class_name, $aliases, true ) ) { + return; + } + + $stripe_check_done = true; + + // If no Stripe Pro addon bail. + if ( ! defined( 'WPFORMS_STRIPE_VERSION' ) ) { + return; + } + + // Version 3.2.0 has prefixed lib. + // Versions 2.11.0 and below already have the lib bundled, so they don't require alias. + if ( + version_compare( WPFORMS_STRIPE_VERSION, '3.2.0', '>=' ) || + version_compare( WPFORMS_STRIPE_VERSION, '2.11.0', '<=' ) + ) { + return; + } + + // We only need to alias if we are using the legacy API version. + if ( ! \WPFormsStripe\Helpers::is_legacy_api_version() ) { + return; + } + + // If a lib is already loaded by a third party plugin, + // checking the CardException class here as a niche to make sure it is the correct library. + if ( class_exists( '\Stripe\Exception\CardException', false ) ) { + return; + } + + foreach ( $aliases as $prefixed => $alias ) { + class_alias( $prefixed, '\\' . $alias ); + } + } + ); +} + +namespace WPForms\Pro\Admin\Entries { + + /** + * The default Entries screen showed a chart and the form entries stats. + * Replaced with "WPForms\Pro\Admin\Entries\Overview". + * + * @since 1.5.5 + * @deprecated 1.8.2 + */ + class DefaultScreen extends \WPForms\Removed {} +} diff --git a/wp-content/plugins/wpforms-lite/includes/emails/class-emails.php b/wp-content/plugins/wpforms-lite/includes/emails/class-emails.php new file mode 100755 index 00000000..7390d718 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/emails/class-emails.php @@ -0,0 +1,893 @@ +get_template() ) { + $this->html = false; + } + + add_action( 'wpforms_email_send_before', [ $this, 'send_before' ] ); + add_action( 'wpforms_email_send_after', [ $this, 'send_after' ] ); + } + + /** + * Set a property. + * + * @since 1.1.3 + * + * @param string $key Object property key. + * @param mixed $value Object property value. + */ + public function __set( $key, $value ) { + + $this->$key = $value; + } + + /** + * Get the email from name. + * + * @since 1.1.3 + * + * @return string The email from name + */ + public function get_from_name() { + + if ( ! empty( $this->from_name ) ) { + $this->from_name = $this->process_tag( $this->from_name ); + } else { + $this->from_name = get_bloginfo( 'name' ); + } + + return apply_filters( 'wpforms_email_from_name', wpforms_decode_string( $this->from_name ), $this ); + } + + /** + * Get the email from address. + * + * @since 1.1.3 + * + * @return string The email from address. + */ + public function get_from_address() { + + if ( ! empty( $this->from_address ) ) { + $this->from_address = $this->process_tag( $this->from_address ); + } else { + $this->from_address = get_option( 'admin_email' ); + } + + return apply_filters( 'wpforms_email_from_address', wpforms_decode_string( $this->from_address ), $this ); + } + + /** + * Get the email reply-to. + * + * @since 1.1.3 + * + * @return string The email reply-to address. + */ + public function get_reply_to() { + + if ( ! empty( $this->reply_to ) ) { + + $email = $this->reply_to; + + // Optional custom format with a Reply-to Name specified: John Doe + // - starts with anything, + // - followed by space, + // - ends with (expected to be an email, validated later). + $regex = '/^(.+) (<.+>)$/'; + $matches = []; + + if ( preg_match( $regex, $this->reply_to, $matches ) ) { + $this->reply_to_name = wpforms_decode_string( $this->process_tag( $matches[1] ) ); + $email = trim( $matches[2], '<> ' ); + } + + $this->reply_to = $this->process_tag( $email ); + + if ( ! is_email( $this->reply_to ) ) { + $this->reply_to = false; + $this->reply_to_name = false; + } + } + + return apply_filters( 'wpforms_email_reply_to', wpforms_decode_string( $this->reply_to ), $this ); + } + + /** + * Get the email carbon copy addresses. + * + * @since 1.3.1 + * + * @return string The email reply-to address. + */ + public function get_cc() { + + if ( is_array( $this->cc ) ) { + $this->cc = implode( ',', $this->cc ); + } + + if ( ! empty( $this->cc ) ) { + + $this->cc = $this->process_tag( $this->cc ); + + $addresses = array_map( 'trim', explode( ',', $this->cc ) ); + + foreach ( $addresses as $key => $address ) { + if ( ! is_email( $address ) ) { + unset( $addresses[ $key ] ); + } + } + + $this->cc = implode( ',', $addresses ); + } + + return apply_filters( 'wpforms_email_cc', wpforms_decode_string( $this->cc ), $this ); + } + + /** + * Get the email content type. + * + * @since 1.1.3 + * + * @return string The email content type. + */ + public function get_content_type() { + + if ( ! $this->content_type && $this->html ) { + $this->content_type = apply_filters( 'wpforms_email_default_content_type', 'text/html', $this ); + } elseif ( ! $this->html ) { + $this->content_type = 'text/plain'; + } + + return apply_filters( 'wpforms_email_content_type', $this->content_type, $this ); + } + + /** + * Get the email headers. + * + * @since 1.1.3 + * + * @return string The email headers. + */ + public function get_headers() { + + if ( ! $this->headers ) { + $this->headers = "From: {$this->get_from_name()} <{$this->get_from_address()}>\r\n"; + + if ( $this->get_reply_to() ) { + $this->headers .= $this->reply_to_name ? + "Reply-To: {$this->reply_to_name} <{$this->get_reply_to()}>\r\n" : + "Reply-To: {$this->get_reply_to()}\r\n"; + } + + if ( $this->get_cc() ) { + $this->headers .= "Cc: {$this->get_cc()}\r\n"; + } + + $this->headers .= "Content-Type: {$this->get_content_type()}; charset=utf-8\r\n"; + } + + return apply_filters( 'wpforms_email_headers', $this->headers, $this ); + } + + /** + * Build the email. + * + * @since 1.1.3 + * + * @param string $message The email message. + * + * @return string + */ + public function build_email( $message ) { + + // Plain text email shortcut. + if ( false === $this->html ) { + $message = $this->process_tag( $message ); + $message = str_replace( '{all_fields}', $this->wpforms_html_field_value( false ), $message ); + + return apply_filters( 'wpforms_email_message', wpforms_decode_string( $message ), $this ); + } + + /* + * Generate an HTML email. + */ + + ob_start(); + + $this->get_template_part( 'header', $this->get_template(), true ); + + // Hooks into the email header. + do_action( 'wpforms_email_header', $this ); + + $this->get_template_part( 'body', $this->get_template(), true ); + + // Hooks into the email body. + do_action( 'wpforms_email_body', $this ); + + $this->get_template_part( 'footer', $this->get_template(), true ); + + // Hooks into the email footer. + do_action( 'wpforms_email_footer', $this ); + + $message = $this->process_tag( $message ); + $message = nl2br( $message ); + + $body = ob_get_clean(); + + $message = str_replace( '{email}', $message, $body ); + $message = str_replace( '{all_fields}', $this->wpforms_html_field_value( true ), $message ); + $message = make_clickable( $message ); + + return apply_filters( 'wpforms_email_message', $message, $this ); + } + + /** + * Send the email. + * + * @since 1.1.3 + * + * @param string $to The To address. + * @param string $subject The subject line of the email. + * @param string $message The body of the email. + * @param array $attachments Attachments to the email. + * + * @return bool + */ + public function send( $to, $subject, $message, $attachments = [] ) { + + if ( ! did_action( 'init' ) && ! did_action( 'admin_init' ) ) { + _doing_it_wrong( __FUNCTION__, esc_html__( 'You cannot send emails with WPForms_WP_Emails() until init/admin_init has been reached.', 'wpforms-lite' ), null ); + + return false; + } + + // Don't send anything if emails have been disabled. + if ( $this->is_email_disabled() ) { + return false; + } + + // Don't send if email address is invalid. + if ( ! is_email( $to ) ) { + return false; + } + + // Hooks before email is sent. + do_action( 'wpforms_email_send_before', $this ); + + // Deprecated filter for $attachments. + $attachments = apply_filters_deprecated( + 'wpforms_email_attachments', + [ $attachments, $this ], + '1.5.7 of the WPForms plugin', + 'wpforms_emails_send_email_data' + ); + + /* + * Allow to filter data on per-email basis, + * useful for localizations based on recipient email address, form settings, + * or for specific notifications - whatever available in WPForms_WP_Emails class. + */ + $data = apply_filters( + 'wpforms_emails_send_email_data', + [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $this->get_headers(), + 'attachments' => $attachments, + ], + $this + ); + + $entry_obj = wpforms()->obj( 'entry' ); + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $send_same_process = apply_filters( + 'wpforms_tasks_entry_emails_trigger_send_same_process', + false, + $this->fields, + $entry_obj ? $entry_obj->get( $this->entry_id ) : [], + $this->form_data, + $this->entry_id, + 'entry' + ); + + if ( + $send_same_process || + ! empty( $this->form_data['settings']['disable_entries'] ) + ) { + // Let's do this NOW. + $result = wp_mail( + $data['to'], + $this->get_prepared_subject( $data['subject'] ), + $this->build_email( $data['message'] ), + $data['headers'], + $data['attachments'] + ); + } else { + // Schedule the email. + $result = (bool) ( new EntryEmailsTask() ) + ->params( + $data['to'], + $this->get_prepared_subject( $data['subject'] ), + $this->build_email( $data['message'] ), + $data['headers'], + $data['attachments'] + ) + ->register(); + } + + /** + * Hooks after the email is sent. + * + * @since 1.1.3 + * + * @param WPForms_WP_Emails $this Current instance of this object. + */ + do_action( 'wpforms_email_send_after', $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + return $result; + } + + /** + * Add filters/actions before the email is sent. + * + * @since 1.1.3 + */ + public function send_before() { + + add_filter( 'wp_mail_from', [ $this, 'get_from_address' ] ); + add_filter( 'wp_mail_from_name', [ $this, 'get_from_name' ] ); + add_filter( 'wp_mail_content_type', [ $this, 'get_content_type' ] ); + } + + /** + * Remove filters/actions after the email is sent. + * + * @since 1.1.3 + */ + public function send_after() { + + remove_filter( 'wp_mail_from', [ $this, 'get_from_address' ] ); + remove_filter( 'wp_mail_from_name', [ $this, 'get_from_name' ] ); + remove_filter( 'wp_mail_content_type', [ $this, 'get_content_type' ] ); + } + + /** + * Convert text formatted HTML. This is primarily for turning line breaks + * into

              and
              tags. + * + * @since 1.1.3 + * + * @param string $message Text to convert. + * + * @return string + */ + public function text_to_html( $message ) { + + if ( 'text/html' === $this->content_type || true === $this->html ) { + $message = wpautop( $message ); + } + + return $message; + } + + /** + * Process a smart tag. + * Decodes entities and sanitized (keeping line breaks) by default. + * + * @uses wpforms_decode_string() + * + * @since 1.1.3 + * @since 1.6.0 Deprecated 2 params: $sanitize, $linebreaks. + * + * @param string $string String that may contain tags. + * + * @return string + */ + public function process_tag( $string = '' ) { + + return wpforms_process_smart_tags( $string, $this->form_data, $this->fields, $this->entry_id, 'email' ); + } + + /** + * Process the all fields smart tag if present. + * + * @since 1.1.3 + * + * @param bool $is_html_email Toggle to use HTML or plaintext. + * + * @return string + */ + public function wpforms_html_field_value( $is_html_email = true ) { // phpcs:ignore + + if ( empty( $this->fields ) ) { + return ''; + } + + if ( empty( $this->form_data['fields'] ) ) { + $is_html_email = false; + } + + $message = ''; + + if ( $is_html_email ) { + /* + * HTML emails. + */ + ob_start(); + + // Hooks into the email field. + do_action( 'wpforms_email_field', $this ); + + $this->get_template_part( 'field', $this->get_template(), true ); + + $field_template = ob_get_clean(); + + // Check to see if user has added support for field type. + $other_fields = apply_filters( 'wpforms_email_display_other_fields', [], $this ); + + $x = 1; + + foreach ( $this->form_data['fields'] as $field_id => $field ) { + + $field_name = ''; + $field_val = ''; + + // If the field exists in the form_data but not in the final + // field data, then it's a non-input based field, "other fields". + if ( empty( $this->fields[ $field_id ] ) ) { + + // Check if the field type is in $other_fields, otherwise skip. + // Skip if the field is conditionally hidden. + if ( + empty( $other_fields ) || + ! in_array( $field['type'], $other_fields, true ) || + ( + wpforms()->is_pro() && + wpforms_conditional_logic_fields()->field_is_hidden( $this->form_data, $field_id ) + ) + ) { + continue; + } + + if ( $field['type'] === 'divider' ) { + $field_name = ! empty( $field['label'] ) ? str_repeat( '—', 3 ) . ' ' . $field['label'] . ' ' . str_repeat( '—', 3 ) : null; + $field_val = ! empty( $field['description'] ) ? $field['description'] : ''; + } elseif ( $field['type'] === 'pagebreak' ) { + if ( ! empty( $field['position'] ) && $field['position'] === 'bottom' ) { + continue; + } + $title = ! empty( $field['title'] ) ? $field['title'] : esc_html__( 'Page Break', 'wpforms-lite' ); + $field_name = str_repeat( '—', 6 ) . ' ' . $title . ' ' . str_repeat( '—', 6 ); + } elseif ( $field['type'] === 'html' ) { + + $field_name = ! empty( $field['name'] ) ? $field['name'] : esc_html__( 'HTML / Code Block', 'wpforms-lite' ); + $field_val = $field['code']; + } elseif ( $field['type'] === 'content' ) { + + $field_name = esc_html__( 'Content', 'wpforms-lite' ); + $field_val = $field['content']; + } + } else { + + if ( + ! apply_filters( 'wpforms_email_display_empty_fields', false ) && + ( ! isset( $this->fields[ $field_id ]['value'] ) || (string) $this->fields[ $field_id ]['value'] === '' ) + ) { + /** This filter is documented in wpforms/includes/emails/class-emails.php */ + $message .= apply_filters( 'wpforms_wp_emails_html_field_value_message_html', '' , $field, $this->form_data ); + + continue; + } + + if ( $field['type'] === 'payment-total' ) { + + $field_name = isset( $this->fields[ $field_id ]['name'] ) ? $this->fields[ $field_id ]['name'] : ''; + + // Replace the payment total value if an order summary is enabled. + // Ideally, it could be done through the `wpforms_html_field_value` filter, + // but needed data is missed there, e.g. entry data ($this->fields). + if ( ! empty( $field['summary'] ) ) { + $field_val = $this->process_tag( '{order_summary}' ); + } else { + $field_val = $this->fields[ $field_id ]['value']; + } + } else { + $field_name = isset( $this->fields[ $field_id ]['name'] ) ? $this->fields[ $field_id ]['name'] : ''; + $field_val = empty( $this->fields[ $field_id ]['value'] ) && ! is_numeric( $this->fields[ $field_id ]['value'] ) ? '' . esc_html__( '(empty)', 'wpforms-lite' ) . '' : $this->fields[ $field_id ]['value']; + } + } + + if ( empty( $field_name ) && null !== $field_name ) { + $field_name = sprintf( /* translators: %d - field ID. */ + esc_html__( 'Field ID #%s', 'wpforms-lite' ), + wpforms_validate_field_id( $field['id'] ) + ); + } + + $field_item = $field_template; + + if ( 1 === $x ) { + $field_item = str_replace( 'border-top:1px solid #dddddd;', '', $field_item ); + } + + /** + * Filter the field name before it is added to the email message. + * + * @since 1.9.1 + * + * @param string $field_name Field name. + * @param array $field Field data. + * @param array $form_data Form data and settings. + * @param string $context Context of the field name. + */ + $field_name = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_html_field_name', + $field_name, + $this->fields[ $field_id ] ?? $field, + $this->form_data, + 'email-html' + ); + + $field_item = str_replace( '{field_name}', $field_name, $field_item ); + $field_item = str_replace( + '{field_value}', + apply_filters( + 'wpforms_html_field_value', + $field_val, + isset( $this->fields[ $field_id ] ) ? $this->fields[ $field_id ] : $field, + $this->form_data, + 'email-html' + ), + $field_item + ); + + /** + * Filter the field item before it is added to the email message. + * + * @since 1.9.3 + * + * @param string $field_message Field message. + * @param array $field Field data. + * @param array $form_data Form data and settings. + */ + $message .= apply_filters( 'wpforms_wp_emails_html_field_value_message_html', wpautop( $field_item ), $field, $this->form_data ); + + $x ++; + } + } else { + /* + * Plain Text emails. + */ + foreach ( $this->fields as $field ) { + + if ( + ! apply_filters( 'wpforms_email_display_empty_fields', false ) && + ( ! isset( $field['value'] ) || (string) $field['value'] === '' ) + ) { + continue; + } + + $field_val = empty( $field['value'] ) && ! is_numeric( $field['value'] ) ? esc_html__( '(empty)', 'wpforms-lite' ) : $field['value']; + $field_name = $field['name']; + + if ( empty( $field_name ) ) { + $field_name = sprintf( /* translators: %d - field ID. */ + esc_html__( 'Field ID #%s', 'wpforms-lite' ), + wpforms_validate_field_id( $field['id'] ) + ); + } + + $message .= '--- ' . $field_name . " ---\r\n\r\n"; + $field_value = $field_val . "\r\n\r\n"; + $message .= apply_filters( 'wpforms_plaintext_field_value', $field_value, $field, $this->form_data ); + } + } + + if ( empty( $message ) ) { + $empty_message = esc_html__( 'An empty form was submitted.', 'wpforms-lite' ); + $message = $is_html_email ? wpautop( $empty_message ) : $empty_message; + } + + return $message; + } + + /** + * Email kill switch if needed. + * + * @since 1.1.3 + * + * @return bool + */ + public function is_email_disabled() { + + return (bool) apply_filters( 'wpforms_disable_all_emails', false, $this ); + } + + /** + * Get the enabled email template. + * + * @since 1.1.3 + * + * @return string When filtering return 'none' to switch to text/plain email. + */ + public function get_template() { + + if ( ! $this->template ) { + $this->template = wpforms_setting( 'email-template', 'default' ); + } + + return apply_filters( 'wpforms_email_template', $this->template ); + } + + /** + * Retrieve a template part. Taken from bbPress. + * + * @since 1.1.3 + * + * @param string $slug Template file slug. + * @param string $name Optional. Default null. + * @param bool $load Maybe load. + * + * @return string + */ + public function get_template_part( $slug, $name = null, $load = true ) { + + // Setup possible parts. + $templates = []; + + if ( isset( $name ) ) { + $templates[] = $slug . '-' . $name . '.php'; + } + + $templates[] = $slug . '.php'; + + // Return the part that is found. + return $this->locate_template( $templates, $load, false ); + } + + /** + * Retrieve the name of the highest priority template file that exists. + * + * Search in the STYLESHEETPATH before TEMPLATEPATH so that themes which + * inherit from a parent theme can just overload one file. If the template is + * not found in either of those, it looks in the theme-compat folder last. + * + * Taken from bbPress. + * + * @since 1.1.3 + * + * @param string|array $template_names Template file(s) to search for, in order. + * @param bool $load If true the template file will be loaded if it is found. + * @param bool $require_once Whether to require_once or require. Default true. + * Has no effect if $load is false. + * + * @return string The template filename if one is located. + */ + public function locate_template( $template_names, $load = false, $require_once = true ) { + + // No file found yet. + $located = false; + + // Try to find a template file. + foreach ( (array) $template_names as $template_name ) { + + // Continue if template is empty. + if ( empty( $template_name ) ) { + continue; + } + + // Trim off any slashes from the template name. + $template_name = ltrim( $template_name, '/' ); + + // Try locating this template file by looping through the template paths. + foreach ( $this->get_theme_template_paths() as $template_path ) { + $validated_path = Templates::validate_safe_path( + $template_path . $template_name, + [ 'theme', 'plugins' ] + ); + + if ( $validated_path ) { + $located = $validated_path; + + break; + } + } + } + + if ( ( true === $load ) && ! empty( $located ) ) { + load_template( $located, $require_once ); + } + + return $located; + } + + /** + * Return a list of paths to check for template locations + * + * @since 1.1.3 + * + * @return array + */ + public function get_theme_template_paths() { + + $template_dir = 'wpforms-email'; + + $file_paths = [ + 1 => trailingslashit( get_stylesheet_directory() ) . $template_dir, + 10 => trailingslashit( get_template_directory() ) . $template_dir, + 100 => WPFORMS_PLUGIN_DIR . 'includes/emails/templates', + ]; + + $file_paths = apply_filters( 'wpforms_email_template_paths', $file_paths ); + + // Sort the file paths based on priority. + ksort( $file_paths, SORT_NUMERIC ); + + return array_map( 'trailingslashit', $file_paths ); + } + + /** + * Perform email subject preparation: process tags, remove new lines, etc. + * + * @since 1.6.1 + * + * @param string $subject Email subject to post-process. + * + * @return string + */ + private function get_prepared_subject( $subject ) { + + $subject = $this->process_tag( $subject ); + + $subject = trim( str_replace( [ "\r\n", "\r", "\n" ], ' ', $subject ) ); + + return wpforms_decode_string( $subject ); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/emails/templates/body-default.php b/wp-content/plugins/wpforms-lite/includes/emails/templates/body-default.php new file mode 100755 index 00000000..890c2b05 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/emails/templates/body-default.php @@ -0,0 +1,16 @@ + +{email} diff --git a/wp-content/plugins/wpforms-lite/includes/emails/templates/default.php b/wp-content/plugins/wpforms-lite/includes/emails/templates/default.php new file mode 100755 index 00000000..7ec7e37b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/emails/templates/default.php @@ -0,0 +1,328 @@ + + + + + + + + + + + + +

              + + + + +
              + + + + '; + } + ?> + + + + + + +
              '; + echo '' . esc_attr( get_bloginfo( 'name' ) ) . ''; + echo '
              + + + + + + +
              + + + + + + +
              + + +

              Content.

              + +
              +
              +
              + + + + + + +
              + + + + + + +
              + + + Footer + +
              +
              +
              + + +
              +
              + + diff --git a/wp-content/plugins/wpforms-lite/includes/emails/templates/field-default.php b/wp-content/plugins/wpforms-lite/includes/emails/templates/field-default.php new file mode 100755 index 00000000..c92197ad --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/emails/templates/field-default.php @@ -0,0 +1,18 @@ + + + + +
              {field_name}
              {field_value}
              diff --git a/wp-content/plugins/wpforms-lite/includes/emails/templates/footer-default.php b/wp-content/plugins/wpforms-lite/includes/emails/templates/footer-default.php new file mode 100755 index 00000000..046c258c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/emails/templates/footer-default.php @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + +
              + + + + + + +
              + + + ' . wp_specialchars_decode( get_bloginfo( 'name' ) ) . '' ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo apply_filters( 'wpforms_email_footer_text', $footer ); + ?> + +
              +
              + + + + + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/includes/emails/templates/header-default.php b/wp-content/plugins/wpforms-lite/includes/emails/templates/header-default.php new file mode 100755 index 00000000..8ca329eb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/emails/templates/header-default.php @@ -0,0 +1,376 @@ + + + + + + + + + <?php echo esc_html( get_bloginfo( 'name' ) ); ?> + + + + +
              + + + + +
              + + + + '; + } + ?> + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/emails/classic-footer.php b/wp-content/plugins/wpforms-lite/templates/emails/classic-footer.php new file mode 100755 index 00000000..994958e8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/emails/classic-footer.php @@ -0,0 +1,50 @@ + + + + + + + +
              '; + echo '' . esc_attr( get_bloginfo( 'name' ) ) . ''; + echo '
              + + + + + + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/forms/search-box.php b/wp-content/plugins/wpforms-lite/templates/admin/forms/search-box.php new file mode 100755 index 00000000..17f74769 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/forms/search-box.php @@ -0,0 +1,27 @@ + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/forms/search-reset.php b/wp-content/plugins/wpforms-lite/templates/admin/forms/search-reset.php new file mode 100755 index 00000000..de466a95 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/forms/search-reset.php @@ -0,0 +1,26 @@ + +
              + [], + 'em' => [], + ] + ); + ?> + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/notifications.php b/wp-content/plugins/wpforms-lite/templates/admin/notifications.php new file mode 100755 index 00000000..84cfe650 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/notifications.php @@ -0,0 +1,50 @@ + +
              +
              +
              + + +
              +
              +
              + +
              + + + + + 1 ) : ?> + + + +
              + +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/pages/constant-contact.php b/wp-content/plugins/wpforms-lite/templates/admin/pages/constant-contact.php new file mode 100755 index 00000000..1c4c516a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/pages/constant-contact.php @@ -0,0 +1,139 @@ + + +
              +

              +
              +

              +

              +

              + $44 back for every $1 spent according to DMA.', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +

              +

              + + ', + esc_url( WPFORMS_PLUGIN_URL . 'assets/images/constant-contact/cc-about-logo.png' ), + esc_url( WPFORMS_PLUGIN_URL . 'assets/images/constant-contact/cc-about-logo@2x.png' ) + ); + ?> + +
                +
              1. + Email is still #1 - At least 91% of consumers check their email on a daily basis. You get direct access to your subscribers, without having to play by social media\'s rules and algorithms.', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +
              2. +
              3. + You own your email list - Unlike with social media, your list is your property and no one can revoke your access to it.', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +
              4. +
              5. + Email converts - People who buy products marketed through email spend 138% more than those who don\'t receive email offers.', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +
              6. +
              +

              +

              + why building your email list is so important.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( $wpbeginners_guide_link ) + ); + ?> +

              +
              +

              +

              +
                +
              1. +
              2. +
              3. +
              +

              +

              + + + +

              +

              +

              +
                +
              • +
              • +
              • +
              +

              + + + +

              +
              +

              +

              +

              +

              +
              + $item + ) { + ++ $index; + ?> +
              +
              %2$d. %3$s
              ', + esc_url( WPFORMS_PLUGIN_URL . 'assets/images/constant-contact/cc-about-step' . $index . '.png' ), + absint( $index ), + esc_html( $item ) + ); + ?> + + +
              +

              +

              +
              + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/hidden-field.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/hidden-field.php new file mode 100755 index 00000000..49760641 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/hidden-field.php @@ -0,0 +1,27 @@ + + + + + + + > + + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/reports.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/reports.php new file mode 100755 index 00000000..2e319148 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/reports.php @@ -0,0 +1,54 @@ + + + + +
              + %d payment', + 'Found %d payments', + $total, + 'wpforms-lite' + ), + [ + 'strong' => [], + ] + ), + (int) $total + ); + + $is_more_than_one_filter = count( $applied_filters ) > 1; + $last_applied_filter = end( $applied_filters ); + + // Display applied filters in a safe way. + foreach ( $applied_filters as $filter ) : + + // Skip empty filters with no results. + if ( empty( $filter['results'] ) ) { + continue; + } + + echo wp_kses( $filter['results'], [ 'em' => [] ] ); + ?> + + +
              + + + +
              + +
              +

              + +

              +
              + +
              + + + +
              + +

              + +

              + +
              + + + + + + + +
              +
              + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/details.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/details.php new file mode 100755 index 00000000..e537c1e7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/details.php @@ -0,0 +1,85 @@ + +
              + +
              +

              + +

              +
              + +
              + +
              + +

              + + + + + +

              + +

              + + + +

              + +

              + + [ + 'href' => [], + 'class' => [], + ], + 'span' => [ 'class' => [] ], + ] + ); + ?> +

              + + +

              + + + +

              + +
              + +
              +
              +
              + + + +
              +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/entry-details.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/entry-details.php new file mode 100755 index 00000000..fe0242c0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/entry-details.php @@ -0,0 +1,85 @@ + +
              + +
              +

              + + + + +

              +
              + +
              + $field ) { + + $field_type = $field['type']; + + if ( in_array( $field_type, [ 'repeater', 'layout' ], true ) && wpforms()->is_pro() ) { + if ( $field_type === 'repeater' ) { + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/payments/single/repeater', + [ + 'field' => $field, + 'form_data' => $form_data, + 'entry_fields' => $entry_fields, + ], + true + ); + } + + if ( $field_type === 'layout' ) { + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/payments/single/layout', + [ + 'field' => $field, + 'form_data' => $form_data, + 'entry_fields' => $entry_fields, + ], + true + ); + } + } else { + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/payments/single/field', + [ + 'field' => $field, + ], + true + ); + } + } + ?> +
              + + +
              +
              +
              + + + +
              +
              +
              + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/field.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/field.php new file mode 100755 index 00000000..9d6c4bd4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/field.php @@ -0,0 +1,25 @@ + + +
              + +

              + +

              + +
              + +
              +
              \ No newline at end of file diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/heading-navigation.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/heading-navigation.php new file mode 100755 index 00000000..c9dbe283 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/heading-navigation.php @@ -0,0 +1,59 @@ + + + + + + + + +
              +
              + +
              +
              + + + + + + + + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/log.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/log.php new file mode 100755 index 00000000..59b45e41 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/log.php @@ -0,0 +1,56 @@ + + +
              + +
              +

              + +

              +
              + +
              + + + + + + date, 'M j, Y', true ), + wpforms_time_format( $item->date, '', true ) + ); + + if ( empty( $item->value ) ) { + continue; + } + ?> + +
              + + + value ); ?> + + + + + +
              + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/no-payment.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/no-payment.php new file mode 100755 index 00000000..4623a9b6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/no-payment.php @@ -0,0 +1,27 @@ + +
              + +

              + +

              + + + + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-details.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-details.php new file mode 100755 index 00000000..d219ef74 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-details.php @@ -0,0 +1,86 @@ + + +
              + +
              +

              + + + + +

              +
              + +
              +
                + $stat_card ) : ?> +
              • + +
              • + +
              +
              + +
              +
              + + [] ] ); ?> +
              + +
              + + + + + + + + +
              + +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-history.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-history.php new file mode 100755 index 00000000..151fa029 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/single/payment-history.php @@ -0,0 +1,66 @@ + + +
              +
              +

              + +

              +
              +
              + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/challenge-popup-footer.php b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/challenge-popup-footer.php new file mode 100755 index 00000000..ed93a93b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/challenge-popup-footer.php @@ -0,0 +1,33 @@ + + + diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/dashboard-widget-before.php b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/dashboard-widget-before.php new file mode 100755 index 00000000..959a736b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/lite-connect/dashboard-widget-before.php @@ -0,0 +1,29 @@ + + +
              +
              + +
              +
              + + + + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/admin/notice-bar.php b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/notice-bar.php new file mode 100755 index 00000000..98065348 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/notice-bar.php @@ -0,0 +1,36 @@ + +
              + + You\'re using WPForms Lite. To unlock more features consider upgrading to Pro for 50%% off.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + 'strong' => [], + ] + ), + esc_url( $upgrade_link ) + ); + ?> + + +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/admin/settings/integrations-item.php b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/settings/integrations-item.php new file mode 100755 index 00000000..df217dcb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/settings/integrations-item.php @@ -0,0 +1,43 @@ + +
              +
              + +
              +

              +

              + +

              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/builder/did-you-know.php b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/did-you-know.php new file mode 100755 index 00000000..5c232c84 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/did-you-know.php @@ -0,0 +1,34 @@ + +
              +
              +
              +
              + +
              +
              + ' . esc_html__( 'Learn More', 'wpforms-lite' ) . ''; + } + ?> + + +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/ai-modal.php b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/ai-modal.php new file mode 100755 index 00000000..0c399f96 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/ai-modal.php @@ -0,0 +1,76 @@ + + diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/top-bar.php b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/top-bar.php new file mode 100755 index 00000000..834cf6b7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/lite-connect/top-bar.php @@ -0,0 +1,27 @@ + +
              +
              +
              + +
              +
              + + +
              +

              + +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/builder/providers-item.php b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/providers-item.php new file mode 100755 index 00000000..eb8b6faf --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/providers-item.php @@ -0,0 +1,38 @@ + + + <?php echo esc_attr( $modal_name ); ?> + + + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/builder/settings-item.php b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/settings-item.php new file mode 100755 index 00000000..c8a78017 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/builder/settings-item.php @@ -0,0 +1,29 @@ + + + + + diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/lite-connect-modal.php b/wp-content/plugins/wpforms-lite/lite/templates/education/lite-connect-modal.php new file mode 100755 index 00000000..b1623829 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/lite-connect-modal.php @@ -0,0 +1,83 @@ + + diff --git a/wp-content/plugins/wpforms-lite/lite/wpforms-lite.php b/wp-content/plugins/wpforms-lite/lite/wpforms-lite.php new file mode 100755 index 00000000..c74addd7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/wpforms-lite.php @@ -0,0 +1,1165 @@ + Payment::class, + 'wpforms_payment_meta' => PaymentsMeta::class, + 'wpforms_tasks_meta' => TasksMeta::class, + 'wpforms_logs' => Repository::class, + ]; + + /** + * Primary class constructor. + * + * @since 1.2.2 + */ + public function __construct() { + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.9 + */ + private function hooks() { + + add_action( 'wpforms_install', [ $this, 'install' ] ); + add_action( 'wpforms_form_settings_notifications', [ $this, 'form_settings_notifications' ], 8 ); + add_action( 'wpforms_form_settings_confirmations', [ $this, 'form_settings_confirmations' ] ); + add_action( 'wpforms_builder_enqueues_before', [ $this, 'builder_enqueues' ] ); + add_action( 'wpforms_admin_page', [ $this, 'entries_page' ] ); + add_action( 'wpforms_admin_settings_after', [ $this, 'settings_cta' ] ); + add_action( 'wp_ajax_wpforms_lite_settings_upgrade', [ $this, 'settings_cta_dismiss' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueues' ] ); + add_filter( 'wpforms_helpers_templates_get_theme_template_paths', [ $this, 'add_templates' ] ); + + // Entries count logging for WPForms Lite. + add_action( 'wpforms_process_entry_saved', [ $this, 'entry_submit' ], 10, 5 ); + add_action( 'wpforms_process_entry_saved', [ $this, 'update_entry_count' ], 10, 5 ); + + // Upgrade to Pro WPForms menu bar item. + add_action( 'admin_bar_menu', [ $this, 'upgrade_to_pro_menu' ], 1000 ); + } + + /** + * Form notification settings, supports multiple notifications. + * + * @since 1.2.3 + * + * @param object $settings Settings. + * + * @noinspection HtmlUnknownTarget + */ + public function form_settings_notifications( $settings ) { + + $cc = wpforms_setting( 'email-carbon-copy' ); + $from_email = '{admin_email}'; + $from_name = sanitize_text_field( get_option( 'blogname' ) ); + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + /** + * Allow filtering of text after the `From Name` field. + * + * @since 1.2.3 + * @since 1.7.6 Added $form_data and $id arguments. + * + * @param string $value Value to be filtered. + * @param array $form_data Form data. + * @param int $id Notification ID. + */ + $from_name_after = apply_filters( 'wpforms_builder_notifications_from_name_after', '', $settings->form_data, 1 ); + + /** + * Allow filtering of a text after the `From Email` field. + * + * @since 1.2.3 + * @since 1.7.6 Added $form_data and $id arguments. + * + * @param array $value Value to be filtered. + * @param array $form_data Form data. + * @param int $id Notification ID. + */ + $from_email_after = apply_filters( 'wpforms_builder_notifications_from_email_after', '', $settings->form_data, 1 ); + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + // Handle backwards compatibility. + if ( empty( $settings->form_data['settings']['notifications'] ) ) { + $settings->form_data['settings']['notifications'][1]['subject'] = ! empty( $settings->form_data['settings']['notification_subject'] ) ? + $settings->form_data['settings']['notification_subject'] : + sprintf( /* translators: %s - form name. */ + esc_html__( 'New %s Entry', 'wpforms-lite' ), + $settings->form->post_title + ); + $settings->form_data['settings']['notifications'][1]['email'] = ! empty( $settings->form_data['settings']['notification_email'] ) ? $settings->form_data['settings']['notification_email'] : '{admin_email}'; + $settings->form_data['settings']['notifications'][1]['sender_name'] = ! empty( $settings->form_data['settings']['notification_fromname'] ) ? $settings->form_data['settings']['notification_fromname'] : $from_name; + $settings->form_data['settings']['notifications'][1]['sender_address'] = ! empty( $settings->form_data['settings']['notification_fromaddress'] ) ? $settings->form_data['settings']['notification_fromaddress'] : $from_email; + $settings->form_data['settings']['notifications'][1]['replyto'] = ! empty( $settings->form_data['settings']['notification_replyto'] ) ? $settings->form_data['settings']['notification_replyto'] : ''; + } + + $id = 1; + + echo '
              '; + echo ''; + esc_html_e( 'Notifications', 'wpforms-lite' ); + echo ''; + echo ''; + echo '
              '; + + $dismissed = get_user_meta( get_current_user_id(), 'wpforms_dismissed', true ); + + if ( empty( $dismissed['edu-builder-notifications-description'] ) ) { + echo '
              '; + echo ''; + echo '

              '; + printf( + wp_kses( /* translators: %s - link to the WPForms.com doc article. */ + __( 'Notifications are emails sent when a form is submitted. By default, these emails include entry details. For setup and customization options, including a video overview, please see our tutorial.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/setup-form-notification-wpforms/', 'Builder Notifications', 'Form Notifications Documentation' ) ) + ); + echo '

              '; + echo '

              '; + printf( + wp_kses( /* translators: 1$s, %2$s - links to the WPForms.com doc articles. */ + __( 'After saving these settings, be sure to test a form submission. This lets you see how emails will look, and to ensure that they are delivered successfully.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + 'br' => [], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-properly-test-your-wordpress-forms-before-launching-checklist/', 'Builder Notifications', 'Testing A Form Documentation' ) ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/troubleshooting-email-notifications/', 'Builder Notifications', 'Troubleshoot Notifications Documentation' ) ) + ); + echo '

              '; + echo '
              '; + } + + wpforms_panel_field( + 'toggle', + 'settings', + 'notification_enable', + $settings->form_data, + esc_html__( 'Enable Notifications', 'wpforms-lite' ) + ); + ?> + +
              + +
              + +
              + +
              + + form_data, + esc_html__( 'Send To Email Address', 'wpforms-lite' ), + [ + 'default' => '{admin_email}', + 'tooltip' => esc_html__( 'Enter the email address to receive form entry notifications. For multiple notifications, separate email addresses with a comma.', 'wpforms-lite' ), + 'smarttags' => [ + 'type' => 'all', + 'fields' => 'email', + 'allowed' => 'admin_email,user_email', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'class' => 'email-recipient', + 'input_class' => 'wpforms-smart-tags-enabled', + ] + ); + if ( $cc ) : + wpforms_panel_field( + 'text', + 'notifications', + 'carboncopy', + $settings->form_data, + esc_html__( 'CC', 'wpforms-lite' ), + [ + 'smarttags' => [ + 'type' => 'all', + 'fields' => 'email', + 'allowed' => 'admin_email,user_email', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'input_class' => 'wpforms-smart-tags-enabled', + ] + ); + endif; + wpforms_panel_field( + 'text', + 'notifications', + 'subject', + $settings->form_data, + esc_html__( 'Email Subject Line', 'wpforms-lite' ), + [ + 'default' => sprintf( /* translators: %s - form name. */ + esc_html__( 'New Entry: %s', 'wpforms-lite' ), + $settings->form->post_title + ), + 'smarttags' => [ + 'type' => 'all', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'input_class' => 'wpforms-smart-tags-enabled', + ] + ); + wpforms_panel_field( + 'text', + 'notifications', + 'sender_name', + $settings->form_data, + esc_html__( 'From Name', 'wpforms-lite' ), + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + /** + * Allow modifying the "From Name" field settings in the builder on Settings > Notifications panel. + * + * @since 1.7.6 + * + * @param array $args Field settings. + * @param array $form_data Form data. + * @param int $id Notification ID. + */ + apply_filters( + 'wpforms_builder_notifications_sender_name_settings', + [ + 'default' => $from_name, + 'smarttags' => [ + 'type' => 'fields', + 'fields' => 'name,text', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'input_class' => 'wpforms-smart-tags-enabled', + ], + $settings->form_data, + $id + ) + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + ); + wpforms_panel_field( + 'text', + 'notifications', + 'sender_address', + $settings->form_data, + esc_html__( 'From Email', 'wpforms-lite' ), + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + /** + * Allow modifying the "From Email" field settings in the builder on the Settings > Notifications panel. + * + * @since 1.7.6 + * + * @param array $args Field settings. + * @param array $form_data Form data. + * @param int $id Notification ID. + */ + apply_filters( + 'wpforms_builder_notifications_sender_address_settings', + [ + 'default' => $from_email, + 'smarttags' => [ + 'type' => 'all', + 'fields' => 'email', + 'allowed' => 'admin_email,user_email', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'input_class' => 'wpforms-smart-tags-enabled', + ], + $settings->form_data, + $id + ) + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + ); + wpforms_panel_field( + 'text', + 'notifications', + 'replyto', + $settings->form_data, + esc_html__( 'Reply-To', 'wpforms-lite' ), + [ + 'tooltip' => esc_html( + sprintf( /* translators: %s - . */ + __( 'Enter the email address or email address with recipient\'s name in "First Last %s" format.', 'wpforms-lite' ), + // ​ is a zero-width space character. Without it, Tooltipster thinks it's an HTML tag + // and closes it at the end of the string, hiding everything after this value. + '<​email@example.com​>' + ) + ), + 'smarttags' => [ + 'type' => 'all', + 'fields' => 'email,name', + 'allowed' => 'admin_email,user_email', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'input_class' => 'wpforms-smart-tags-enabled', + ] + ); + wpforms_panel_field( + 'textarea', + 'notifications', + 'message', + $settings->form_data, + esc_html__( 'Email Message', 'wpforms-lite' ), + [ + 'rows' => 6, + 'default' => '{all_fields}', + 'smarttags' => [ + 'type' => 'all', + ], + 'parent' => 'settings', + 'subsection' => $id, + 'class' => 'email-msg', + 'input_class' => 'wpforms-smart-tags-enabled', + 'after' => '

              ' . + sprintf( + /* translators: %s - {all_fields} Smart Tag. */ + esc_html__( 'To display all form fields, use the %s Smart Tag.', 'wpforms-lite' ), + '{all_fields}' + ) . + '

              ', + ] + ); + + /** + * Fires after notification block content on the lite version. + * + * @since 1.7.7 + * + * @param array $settings Current confirmation data. + * @param int $id Notification id. + */ + do_action( 'wpforms_lite_form_settings_notifications_block_content_after', $settings, $id ); + ?> +
              +
              + + form_data['settings']['confirmations'] ) ) { + $settings->form_data['settings']['confirmations'][1]['type'] = ! empty( $settings->form_data['settings']['confirmation_type'] ) ? $settings->form_data['settings']['confirmation_type'] : 'message'; + $settings->form_data['settings']['confirmations'][1]['message'] = ! empty( $settings->form_data['settings']['confirmation_message'] ) ? $settings->form_data['settings']['confirmation_message'] : esc_html__( 'Thanks for contacting us! We will be in touch with you shortly.', 'wpforms-lite' ); + $settings->form_data['settings']['confirmations'][1]['message_scroll'] = ! empty( $settings->form_data['settings']['confirmation_message_scroll'] ) ? $settings->form_data['settings']['confirmation_message_scroll'] : 1; + $settings->form_data['settings']['confirmations'][1]['page'] = ! empty( $settings->form_data['settings']['confirmation_page'] ) ? $settings->form_data['settings']['confirmation_page'] : ''; + $settings->form_data['settings']['confirmations'][1]['redirect'] = ! empty( $settings->form_data['settings']['confirmation_redirect'] ) ? $settings->form_data['settings']['confirmation_redirect'] : ''; + } + $field_id = 1; + + echo '
              '; + esc_html_e( 'Confirmations', 'wpforms-lite' ); + echo ''; + echo '
              '; + ?> + +
              + +
              + +
              + +
              + + form_data, + esc_html__( 'Confirmation Type', 'wpforms-lite' ), + [ + 'default' => 'message', + 'options' => [ + 'message' => esc_html__( 'Message', 'wpforms-lite' ), + 'page' => esc_html__( 'Show Page', 'wpforms-lite' ), + 'redirect' => esc_html__( 'Go to URL (Redirect)', 'wpforms-lite' ), + ], + 'class' => 'wpforms-panel-field-confirmations-type-wrap', + 'input_class' => 'wpforms-panel-field-confirmations-type', + 'parent' => 'settings', + 'subsection' => $field_id, + ] + ); + wpforms_panel_field( + 'textarea', + 'confirmations', + 'message', + $settings->form_data, + esc_html__( 'Confirmation Message', 'wpforms-lite' ), + [ + 'default' => esc_html__( 'Thanks for contacting us! We will be in touch with you shortly.', 'wpforms-lite' ), + 'tinymce' => [ + 'editor_height' => '200', + ], + 'input_id' => 'wpforms-panel-field-confirmations-message-' . $field_id, + 'input_class' => 'wpforms-panel-field-confirmations-message', + 'parent' => 'settings', + 'subsection' => $field_id, + 'class' => 'wpforms-panel-field-tinymce', + 'smarttags' => [ + 'type' => 'all', + ], + ] + ); + wpforms_panel_field( + 'toggle', + 'confirmations', + 'message_scroll', + $settings->form_data, + esc_html__( 'Automatically scroll to the confirmation message', 'wpforms-lite' ), + [ + 'input_class' => 'wpforms-panel-field-confirmations-message_scroll', + 'parent' => 'settings', + 'subsection' => $field_id, + ] + ); + + wpforms_panel_field( + 'select', + 'confirmations', + 'page', + $settings->form_data, + esc_html__( 'Confirmation Page', 'wpforms-lite' ), + [ + 'class' => 'wpforms-panel-field-confirmations-page-choicesjs', + 'options' => wpforms_builder_form_settings_confirmation_get_pages( $settings->form_data, $field_id ), + 'input_class' => 'wpforms-panel-field-confirmations-page', + 'parent' => 'settings', + 'subsection' => $field_id, + 'choicesjs' => [ + 'use_ajax' => true, + 'callback_fn' => 'select_pages', + ], + ] + ); + + wpforms_panel_field( + 'text', + 'confirmations', + 'page_url_parameters', + $settings->form_data, + esc_html__( 'URL Parameters', 'wpforms-lite' ), + [ + 'input_id' => 'wpforms-panel-field-confirmations-page-url-parameters-' . $field_id, + 'input_class' => 'wpforms-panel-field-confirmations-page-url-parameters', + 'parent' => 'settings', + 'subsection' => $field_id, + 'tooltip' => esc_html__( 'Add query string parameters to append to the URL when the form is submitted. Separate multiple parameters with an ampersand (&).', 'wpforms-lite' ), + ] + ); + + wpforms_panel_field( + 'text', + 'confirmations', + 'redirect', + $settings->form_data, + esc_html__( 'Confirmation Redirect URL', 'wpforms-lite' ) . ' *', + [ + 'input_class' => 'wpforms-panel-field-confirmations-redirect', + 'parent' => 'settings', + 'subsection' => $field_id, + ] + ); + + wpforms_panel_field( + 'toggle', + 'confirmations', + 'redirect_new_tab', + $settings->form_data, + esc_html__( 'Open confirmation in new tab', 'wpforms-lite' ), + [ + 'input_id' => 'wpforms-panel-field-confirmations-redirect_new_tab-' . $field_id, + 'input_class' => 'wpforms-panel-field-confirmations-redirect_new_tab', + 'parent' => 'settings', + 'subsection' => $field_id, + ] + ); + + /** + * Fires after each confirmation to add custom fields. + * + * @since 1.6.9 + * + * @param WPForms_Builder_Panel_Settings $settings Builder panel settings. + * @param int $field_id Field ID. + */ + do_action( 'wpforms_lite_form_settings_confirmations_single_after', $settings, $field_id ); + ?> +
              +
              + + sprintf( + wp_kses( /* translators: %s - WPForms.com docs page URL. */ + __( 'You\'ve just turned off notification emails for this form. Since entries are not stored in WPForms Lite, notification emails are recommended for collecting entry details. For setup steps, please see our notification tutorial.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/setup-form-notification-wpforms/', 'Builder Notifications', 'Disable Notifications Alert' ) ) + ), + ]; + + $strings = apply_filters( 'wpforms_lite_builder_strings', $strings ); + + wp_localize_script( + 'wpforms-builder-lite', + 'wpforms_builder_lite', + $strings + ); + } + + /** + * Display upgrade notice at the bottom on the plugin settings pages. + * + * @since 1.4.7 + * + * @param string $view Current view inside the plugin settings page. + */ + public function settings_cta( $view ) { + + if ( get_option( 'wpforms_lite_settings_upgrade', false ) || apply_filters( 'wpforms_lite_settings_upgrade', false ) ) { + return; + } + ?> +
              + +
              +

              +

              + [ + 'class' => [], + 'aria-hidden' => [], + ], + ] + ), + str_repeat( '', 5 ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + ?> +

              +
              +
              +
                +
              • + +
              • +
              • +
              • +
              • +
              • +
              • +
              +
                +
              • +
              • +
              • +
              • +
              • +
              • +
              +
              +

              + + + + +

              +

              + Bonus: WPForms Lite users get 50% off regular price, automatically applied at checkout.', 'wpforms-lite' ), + [ + 'strong' => [], + 'span' => [ + 'class' => [], + ], + ] + ); + ?> +

              +
              + + entry_single_page(); + + return; + } + + if ( wpforms_is_admin_page( 'entries' ) ) { + $this->entries_list_page(); + } + } + + /** + * Display the Entries List page with sample data. + * + * @since 1.8.9 + */ + private function entries_list_page() { + + $is_lite_connect_enabled = LiteConnect::is_enabled(); + $is_lite_connect_allowed = LiteConnect::is_allowed(); + + wp_enqueue_style( 'wpforms-admin-entry-list' ); + wp_enqueue_script( 'wpforms-admin-entry-list' ); + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/entries/overview/entry-list', + [ + 'is_lite_connect_enabled' => $is_lite_connect_enabled, + 'is_lite_connect_allowed' => $is_lite_connect_allowed, + 'entries_count' => LiteConnectIntegration::get_new_entries_count(), + 'enabled_since' => LiteConnectIntegration::get_enabled_since(), + 'sample_entries' => $this->get_entries_list_data(), + 'utm' => $this->get_entries_utm(), + ], + true + ); + } + + /** + * Display the Single Entry page with sample data. + * + * @since 1.8.9 + */ + private function entry_single_page() { + + wp_enqueue_style( 'wpforms-admin-view-entry' ); + wp_enqueue_script( 'wpforms-admin-view-entry' ); + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/entries/single/entry', + [ + 'utm' => $this->get_entries_utm(), + ], + true + ); + } + + /** + * Increase entries count once a form is submitted. + * + * @since 1.5.9 + * @since 1.8.2 Added Payment ID. + * + * @param array $fields Set of form fields. + * @param array $entry Entry contents. + * @param array $form_data Form data. + * @param int $entry_id Entry ID. + * @param int $payment_id Payment ID for the payment form. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function update_entry_count( $fields, $entry, $form_data, $entry_id, $payment_id ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + if ( ! empty( $form_data['spam_reason'] ) ) { + return; + } + + global $wpdb; + + /** + * Filters whether to allow counting entries for Lite users. + * + * @since 1.5.9 + * + * @param bool $allow_entries_count True to allow, false to disallow. Default: true. + */ + if ( ! apply_filters( 'wpforms_dash_widget_allow_entries_count_lite', true ) ) { // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + return; + } + + $form_id = absint( $form_data['id'] ); + + if ( empty( $form_id ) ) { + return; + } + + if ( wpforms_is_form_template( $form_id ) ) { + return; + } + + if ( add_post_meta( $form_id, 'wpforms_entries_count', 1, true ) ) { + return; + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( + $wpdb->prepare( + "UPDATE $wpdb->postmeta + SET meta_value = meta_value + 1 + WHERE post_id = %d AND meta_key = 'wpforms_entries_count'", + $form_id + ) + ); + } + + /** + * Submit entry to the Lite Connect API. + * + * @since 1.7.4 + * @since 1.8.2 Added Payment ID. + * + * @param array $fields Set of form fields. + * @param array $entry Entry contents. + * @param array $form_data Form data. + * @param int $entry_id Entry ID. + * @param int $payment_id Payment ID for the payment form. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function entry_submit( $fields, $entry, $form_data, $entry_id, $payment_id ) { + + $submission = wpforms()->obj( 'submission' ); + + $submission->register( $fields, $entry, $form_data['id'], $form_data ); + + // Prepare the entry args. + $entry_args = $submission->prepare_entry_data(); + + if ( $payment_id ) { + $entry_args['type'] = 'payment'; + $entry_args['payment_id'] = $payment_id; + } + + if ( ! empty( $form_data['spam_reason'] ) ) { + $entry_args['status'] = 'spam'; + } + + // Submit entry args and form data to the Lite Connect API. + if ( + ! empty( $entry_args ) && + LiteConnect::is_allowed() && + LiteConnect::is_enabled() + ) { + ( new LiteConnectIntegration() )->submit( $entry_args, $form_data ); + } + } + + /** + * Add Lite-specific templates to the list of searchable template paths. + * + * @since 1.6.6 + * + * @param array $paths Paths to templates. + * + * @return array + */ + public function add_templates( $paths ) { + + $paths = (array) $paths; + + $paths[102] = trailingslashit( __DIR__ . '/templates' ); + + return $paths; + } + + /** + * Render Upgrade to Pro admin bar menu item. + * + * @since 1.7.4 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function upgrade_to_pro_menu( WP_Admin_Bar $wp_admin_bar ) { + + $current_screen = is_admin() ? get_current_screen() : null; + $upgrade_utm_content = $current_screen === null ? 'Upgrade to Pro' : 'Upgrade to Pro - ' . $current_screen->base; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $upgrade_utm_content = empty( $_GET['view'] ) ? $upgrade_utm_content : $upgrade_utm_content . ': ' . sanitize_key( $_GET['view'] ); + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-upgrade', + 'title' => esc_html__( 'Upgrade to Pro', 'wpforms-lite' ), + 'href' => esc_url( $this->admin_upgrade_link( 'admin-bar', $upgrade_utm_content ) ), + 'meta' => [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + ], + ] + ); + } + + /** + * Upgrade link used within the various admin pages. + * + * TODO: This is a duplicate of the function in the WPForms class. We should refactor this to use the same function. + * + * @since 1.8.5.1 + * + * @param string $medium URL parameter: utm_medium. + * @param string $content URL parameter: utm_content. + * + * @return string + */ + private function admin_upgrade_link( string $medium = 'link', string $content = '' ): string { + + $url = 'https://wpforms.com/lite-upgrade/'; + + if ( wpforms()->is_pro() ) { + $license_key = wpforms_get_license_key(); + $url = add_query_arg( + 'license_key', + sanitize_text_field( $license_key ), + 'https://wpforms.com/pricing/' + ); + } + + $upgrade = wpforms_utm_link( $url, apply_filters( 'wpforms_upgrade_link_medium', $medium ), $content ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + + /** + * Modify upgrade link. + * + * @since 1.5.1 + * + * @param string $upgrade Upgrade links. + */ + return apply_filters( 'wpforms_upgrade_link', $upgrade ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Handle plugin installation upon activation. + * + * @since 1.7.4 + */ + public function install() { + + // Restart the import flags for Lite Connect if needed. + if ( class_exists( LiteConnectIntegration::class ) ) { + LiteConnectIntegration::maybe_restart_import_flag(); + } + + // Wipe templates content cache. + if ( class_exists( TemplatesCache::class ) ) { + ( new TemplatesCache() )->wipe_content_cache(); + } + } + + /** + * Retrieve UTM parameters for Entries pages. + * + * @since 1.8.9 + * + * @return array + */ + private function get_entries_utm(): array { + + return [ + 'entries_list_button' => 'https://wpforms.com/lite-upgrade/?utm_campaign=liteplugin&utm_source=WordPress&utm_medium=entries&utm_content=Upgrade%20Now%20-%20Entries%20list', + 'entries_list_link' => 'https://wpforms.com/lite-upgrade/?utm_campaign=liteplugin&utm_source=WordPress&utm_medium=entries&utm_content=Upgrade%20to%20Pro%20-%20Entries%20list', + 'entry_single_button' => 'https://wpforms.com/lite-upgrade/?utm_campaign=liteplugin&utm_source=WordPress&utm_medium=entries&utm_content=Upgrade%20to%20Pro%20-%20Single%20Entry', + 'entry_single_link' => 'https://wpforms.com/lite-upgrade/?utm_campaign=liteplugin&utm_source=WordPress&utm_medium=entries&utm_content=Upgrade%20to%20Pro%20-%20Single%20Entry', + ]; + } + + /** + * Retrieve dummy data for the Entries List page. + * + * @since 1.8.9 + * + * return array + */ + private function get_entries_list_data(): array { + + return [ + [ + 'name' => 'Michael Johnson', + 'read' => true, + ], + [ + 'name' => 'David Thompson', + 'read' => true, + ], + [ + 'name' => 'Sarah Parker', + 'read' => true, + ], + [ + 'name' => 'Brian Anderson', + 'read' => true, + 'star' => true, + ], + [ + 'name' => 'Emily Davis', + 'read' => true, + 'star' => true, + ], + [ + 'name' => 'Laura White', + 'read' => true, + ], + [ + 'name' => 'Kevin Wilson', + 'read' => true, + ], + [ + 'name' => 'Megan Clark', + 'read' => true, + ], + [ + 'name' => 'Nicole Allen', + 'read' => true, + 'star' => true, + ], + [ + 'name' => 'Jason Miller', + ], + [ + 'name' => 'Rachel Moore', + ], + [ + 'name' => 'Chris Taylor', + 'star' => true, + ], + ]; + } +} + +new WPForms_Lite(); diff --git a/wp-content/plugins/wpforms-lite/readme.txt b/wp-content/plugins/wpforms-lite/readme.txt new file mode 100755 index 00000000..cfc9b677 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/readme.txt @@ -0,0 +1,888 @@ +=== WPForms - Easy Form Builder for WordPress - Contact Forms, Payment Forms, Surveys, & More === +Contributors: wpforms, jaredatch, smub, slaFFik +Tags: contact form, contact form plugin, forms, form builder, custom form +Requires at least: 5.5 +Tested up to: 6.8 +Stable tag: 1.9.8.7 +Requires PHP: 7.2 +License: GNU General Public License v2.0 or later + +The best WordPress contact form plugin. Drag & Drop form builder to create beautiful contact forms, payment forms, & other custom forms. 7000+ integrations including Stripe and more. + + + +== Description == + += WordPress Contact Form Builder Plugin = + +[WPForms](https://wpforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) is a drag & drop WordPress form builder that's EASY and POWERFUL. Create contact forms, feedback forms, subscription forms, payment forms (including Stripe, Square & PayPal), and other types of forms for your site in minutes with just a few clicks! + +At WPForms, user experience is our #1 priority. Our pre-built form templates and workflows make WPForms the most beginner-friendly contact form plugin on the market. You don't have to hire a developer. Create a form in less than 5 minutes with our drag & drop form builder or use a template to get a head start. + +> WPForms Pro
              +> This plugin is the Lite version of WPForms Pro, which comes with email subscription forms, multi-page contact forms, file uploads, conditional logic, and extra payment integrations. [Click here to purchase the best premium WordPress contact form plugin now!](https://wpforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) + +https://www.youtube.com/watch?v=Ypl0XcGphw8&rel=0 + += Drag & Drop Contact Form Builder = + +Create custom contact forms in minutes with our easy-to-use [drag and drop online form builder](https://wpforms.com/features/drag-drop-online-form-builder/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin). But don't just take our word for it. See what WordPress experts are saying: + +> WPForms is by far the easiest form plugin to use. My clients love WPForms and it's one of the few plugins they can use without any training. As a developer I appreciate how fast, modern, clean and extensible it is.
              +> Bill Erickson - Expert WordPress Consultant + += Pre-built Form Templates = + +WPForms comes with [2000+ pre-built form templates](https://wpforms.com/templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin). + +Whether you're looking to create a simple contact form, marketing form, request a quote form, donation form, payment order form, registration form, Stripe payment form, or a subscription form, we have a form template already prepared and ready to use. + += Mobile Ready, SEO Friendly, and Optimized for Speed = + +WPForms contact forms are 100% responsive and mobile-friendly. We optimized every query on the frontend and the backend to ensure that it's one of the fastest WordPress contact form plugins. + +You can embed your contact form on any page with an optimized title and description, so WPForms is one of the most SEO friendly contact form plugins too. + += Fields & Features You Need to Succeed = + +With star ratings, file uploads, repeater fields, survey fields, and multi-page contact forms, you can easily build the right custom form for your site's needs. Plus, integrate your contact forms with an email marketing service in just a few steps and collect payments with Stripe, PayPal, and Square for bookings and orders without the need for a dedicated eCommerce plugin. + +See what one business owner has to say about their WPForms contact form: + +>As a business owner, time is my most valuable asset. WPForms allows me to create smart contact forms with just a few clicks. With their pre-built form templates and the drag & drop builder, I can create a new form that works in less than 2 minutes without writing a single line of code. Well worth the investment.
              +> David Henzel - Co-founder of MaxCDN + += Surveys & Polls = + +Create custom survey forms like Survey Monkey. Our [WordPress survey plugin addon](https://wpforms.com/features/surveys-and-polls-addon?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) comes with smart survey fields including Likert scale, star ratings, and NPS. Embed your surveys and polls anywhere in WordPress. + +Use our survey reporting tools to customize graphs, export them for presentations, and display aggregate results. You can also share poll results instantly when collecting votes. + += Default WordPress Forms = + +Aside from building simple contact forms, WPForms also helps you create better default WordPress forms, like custom WordPress login forms and custom WordPress user registration forms. Create a password-protected contact form or even a members-only contact form. + +Bloggers and publishers can use our WordPress post submission forms to accept guest posts, testimonials, and more. + += Payment Forms, Donation Forms, Booking Forms, and More = + +While WPForms started out as a contact form plugin, it has evolved into a powerful custom forms solution for any type of payment or booking form. + +WPForms integrates with PayPal, Stripe, Square Payments, and Authorize.Net so you can easily accept credit card payments or take payments via PayPal. Bonus: you can also take signatures. + +We're proud to be a Stripe Verified Partner. This partnership allows us to build the best Stripe integration with early access to features. You can use our Stripe integration to accept both one-time payments as well as recurring payments while syncing all form data to your Stripe account. + += Custom Calculator Forms = + +Using the [WPForms Calculations addon](https://wpforms.com/features/calculations-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin), you can build custom formulas and display results on the frontend. + +Create simple arithmetic calculations or build complex conditional calculations with rounded values, averages, time ranges, and more! It's the best calculator plugin for WordPress. + += Forms Optimized for Conversions = + +With our Form Pages addon, you can create distraction-free custom form landing pages to increase conversions. + +To improve form completion rates, we created Conversational Forms which helps you make your feedback forms feel more human by adding an interactive layout. ([See Conversational Forms Demo](https://wpforms.com/features/conversational-forms-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin)). + += Easy to Customize and Extend = + +You can easily customize your contact forms with our section dividers, HTML blocks, and CSS. Embedding forms in Elementor and Divi has never been easier thanks to our native integrations. + +We also know that our developer friends may want more control, so we added tons of hooks and filters. + += Full WPForms Feature List = + +* [Online form builder](https://wpforms.com/features/drag-drop-online-form-builder/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) - powerful drag & drop contact form builder. Create WordPress contact forms, payment forms, and other online forms without writing any code. +* 100% mobile responsive. +* GDPR friendly. +* Payment Forms - Take payments, donations, down payments, recurring payments, service payments with our Stripe (FREE) integration. +* [Form templates](https://wpforms.com/templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) pre-built and ready to import. +* [Form styling](https://wpforms.com/docs/styling-your-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) for fields, labels, and buttons. +* [Spam protection](https://wpforms.com/features/spam-protection/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) built in, plus integrations with hCaptcha, Google reCAPTCHA, and Cloudflare Turnstile. +* [AI Forms](https://wpforms.com/features/wpforms-ai/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to automatically create and refine forms through natural conversation. +* [Instant form notifications](https://wpforms.com/features/instant-notifications/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) via email. +* [Custom form confirmations](https://wpforms.com/features/form-confirmation/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) with success messages or thank you pages. +* [Smart phone field](https://wpforms.com/docs/how-to-choose-the-right-form-field-for-your-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin#phone) that adapts to your visitor's location. +* [AI Choices](https://wpforms.com/features/wpforms-ai/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to automatically populate Multiple Choice, Checkboxes, and Dropdown field options. +* [Coupons](https://wpforms.com/features/coupons-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) for free shipping and sale discounts. +* [Calculator forms](https://wpforms.com/features/calculations-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) for payment, shipping, billing, and more. +* [File upload fields](https://wpforms.com/features/file-uploads/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) for user submissions. +* [Multi-page forms](https://wpforms.com/features/multi-page-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) with progress bars. +* [Smart conditional logic](https://wpforms.com/features/conditional-logic/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to show or hide fields. +* [Repeater field](https://wpforms.com/features/repeater-field/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) that enables the person filling out the form to easily add another field or group of fields to fill out. Perfect for group registration forms, custom order forms, and more. +* [Signatures](https://wpforms.com/features/digital-signatures/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) for agreements or payment forms. +* [User registration forms](https://wpforms.com/features/user-registration/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) and custom login forms. +* [Post submission forms](https://wpforms.com/features/post-submissions/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to collect user-generated content. +* [Geolocation](https://wpforms.com/features/geolocation-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to collect location data along with submissions. +* [Surveys and Polls](https://wpforms.com/features/surveys-and-polls-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) with interactive reports. +* [Form abandonment detection](https://wpforms.com/features/form-abandonment/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to collect partial form submissions. +* [Form locker](https://wpforms.com/features/form-locker-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to control access using passwords, dates, and more. +* [Offline forms](https://wpforms.com/features/offline-forms-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to collect submissions without an internet connection. +* [Form landing pages](https://wpforms.com/features/form-pages-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to boost conversions. +* [Conversational forms](https://wpforms.com/features/conversational-forms-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to boost overall completion rates. +* [Lead forms](https://wpforms.com/features/lead-forms-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to get more submissions with multi-step layouts. +* [Webhooks](https://wpforms.com/features/webhooks-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to send data without third party connectors. +* [User Journey reports](https://wpforms.com/features/user-journey-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) so you know which content is driving form conversions. +* [Save and Resume](https://wpforms.com/features/save-and-resume-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to let visitors save and come back later. +* [Entry Automation](https://wpforms.com/features/entry-automation-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to export and delete form entries on a daily, weekly, or monthly basis. + += Integrations = + +* [Google Sheets](https://wpforms.com/features/google-sheets-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Zapier](https://wpforms.com/features/zapier-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [PayPal Commerce](https://wpforms.com/features/paypal-commerce/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Stripe](https://wpforms.com/features/stripe-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) - We're a Stripe Verified Partner for Payments. +* [Square](https://wpforms.com/features/square-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Authorize.Net](https://wpforms.com/features/authorize-net-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Mailchimp](https://wpforms.com/features/mailchimp-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [AWeber](https://wpforms.com/features/aweber-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Campaign Monitor](https://wpforms.com/features/campaign-monitor-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [GetResponse](https://wpforms.com/features/getresponse-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Constant Contact](https://wpforms.com/features/constant-contact/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Airtable](https://wpforms.com/features/airtable-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Notion](https://wpforms.com/features/notion-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Drip](https://wpforms.com/features/drip-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [ActiveCampaign](https://wpforms.com/features/activecampaign-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [HubSpot](https://wpforms.com/features/hubspot-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Brevo](https://wpforms.com/features/brevo-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [MailerLite](https://wpforms.com/features/mailerlite-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [MailPoet](https://wpforms.com/features/mailpoet-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [ConvertKit](https://wpforms.com/features/convertkit-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Salesforce](https://wpforms.com/features/salesforce-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Slack](https://wpforms.com/features/slack-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Dropbox](https://wpforms.com/features/dropbox-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Google Calendar](https://wpforms.com/features/google-calendar-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Google Drive](https://wpforms.com/features/google-drive-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Twilio](https://wpforms.com/features/twilio-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Pipedrive](https://wpforms.com/features/pipedrive-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Make](https://wpforms.com/features/make-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) +* [Zoho CRM](https://wpforms.com/features/zoho-crm-addon//?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) + +You can see why WPForms is the best WordPress contact form plugin on the market! Want to unlock these features? [Upgrade to our Pro version](https://wpforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin). + += Credits = + +This plugin is created by [Jared Atchison](https://www.jaredatchison.com/) and [Syed Balkhi](https://syedbalkhi.com/). + += Branding Guidelines = + +WPForms® is a registered trademark of WPForms LLC. When writing about the contact form plugin by WPForms, please make sure to uppercase the initial 3 letters. + +* WPForms (correct) +* WP Forms (incorrect) +* wpforms (incorrect) +* wpform (incorrect) + +== Installation == + +1. Install WPForms Lite either via the WordPress.org plugin repository or by uploading the files to your server. (See instructions on [how to install a WordPress plugin](https://www.wpbeginner.com/beginners-guide/step-by-step-guide-to-install-a-wordpress-plugin-for-beginners)) +2. Activate WPForms Lite. +3. Navigate to the WPForms tab at the bottom of your admin menu and click the "Add New" button to begin creating your new WordPress contact form. +4. Want more features? [Purchase the full version of WPForms](https://wpforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin)! + +== Screenshots == + +1. WPForms Drag & Drop Form Builder +2. Adding New Fields +3. Generate choices using AI +4. Form Templates +5. WPForms Block With Style Options +6. Payments Overview +7. Single Payment +8. Form Preview +9. Form Pages with Multiple Styles +10. Conversational Form + +== Frequently Asked Questions == + += Who should use WPForms? = + +WPForms is perfect for business owners, bloggers, designers, developers, photographers, and basically everyone else. If you want to create a custom WordPress form, then you need to use the WPForms drag & drop form builder. + += Do I need to have coding skills to use WPForms? = + +Absolutely not. You can create and manage forms without any coding knowledge (100% drag & drop form builder). WPForms is the most beginner-friendly contact form plugin on the market. + += What type of WordPress forms can I build with WPForms? = + +WPForms drag & drop form builder combined with our addons is the most powerful WordPress contact form plugin on the market. Here are some types of WordPress forms you can create: + +* Simple Contact Forms +* Job Application Contact Form +* Feedback Survey Contact Form +* Make a Suggestion Contact Form +* Change Request Forms +* Online Booking Forms +* Event Booking Form +* Video Release Forms +* PTO Request Contact Form +* Maintenance Request Contact Form +* Scholarship Application Forms +* File Download Forms +* Employment Verification Forms +* Make a Referral Contact Form +* Volunteer Registration Contact Form +* Offline Contact Form + +To see a full list, visit our [Form Template Gallery](https://wpforms.com/templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin), which has over 2000+ pre-made contact form templates. + += Which Form Fields Does WPForms offer? = + +We made the WPForms form builder to be both easy and powerful. + +Here are the contact form fields that come with WPForms Form Builder (also known as Standard Fields): + +* Text Field +* Paragraph Text (Textarea) +* Dropdown Field +* Multiple Choice (Radio Buttons) +* Checkboxes +* Numbers Field +* Name Field +* Email Address Field +* Number Slider Field + +Here is a list of our advanced contact form builder fields (Fancy Fields): + +* Smart Phone Field with international format verification +* Address Field +* Date / Time Field +* Website / URL Field +* File Upload - Great for File Upload Form +* Password Field +* Rich Text - Add a WYSIWYG field, perfect for guest blog post forms +* Layout Field - Position form fields inside columns using custom or premade layouts +* Repeater Field - Allow users to duplicate fields or groups of fields in your forms +* Page Break Field - Great for Multi-Page Contact Form with Progress Bar +* Section Divider - Great for Long Contact Forms +* HTML Field - add Custom HTML inside your form +* Content Field - Add headings, lists, and media to your forms without writing code +* Entry Preview - Allow your form users to preview their form entries before they've submitted them +* Star Rating - Great for Survey Forms and Polls +* Hidden Field +* Questions CAPTCHA - Great for Preventing Contact Form Spam +* Math CAPTCHA - Great for Preventing Contact Form Spam +* Likert Scale - Great for Survey Forms +* hCAPTCHA - Great for Preventing Contact Form Spam +* Cloudflare Turnstile - Great for Preventing Contact Form Spam +* Signature Field - Great for Contracts and Booking Forms +* Net Promoter Score (NPS Field) - Great for Survey Forms +* Google ReCAPTCHA - Great for Preventing Contact Form Spam + + +Here is a list of our Payment Fields that will help you create an order form, donation form, booking form, and other payment forms: + +* Single Item +* Multiple Items +* Checkbox Items +* Dropdown Items +* Total (Calculation Field) +* Credit Card (Stripe, Square, and Authorize.Net) +* PayPal + += Can I integrate WPForms with my CRM or Email Marketing Service? = + +Yes, WPForms offers seamless integration with over 1,000+ popular [email marketing](https://www.wpbeginner.com/showcase/best-email-marketing-services/) and [CRM software](https://www.wpbeginner.com/showcase/best-crm-software-for-small-businesses-compared/). + +You can easily send data from your contact form and other WordPress forms to your favorite CRM, email newsletter, and other marketing platforms. + +Here is a list of our popular marketing integrations: + +* Mailchimp +* Constant Contact +* AWeber +* Drip +* Campaign Monitor +* GetResponse +* ActiveCampaign +* Zapier +* Salesforce CRM +* Brevo (ex Sendinblue) +* MailerLite +* MailPoet + +Using our Zapier integration, you can easily connect WPForms with over 7,000+ marketing apps including: + +* PipeDrive CRM +* Google Sheets +* Active Campaign +* Zoho CRM +* Zoho Mail +* Zoho Invoice +* Agile CRM +* Slack +* Trello +* Infusionsoft by Keap +* Microsoft Excel +* Dropbox +* HelpScout +* Zendesk +* Freshbooks +* Freshsales +* Intercom +* Click Funnels +* Microsoft Dynamics 365 CRM +* Capsule CRM +* Insightly CRM +* Printfection +* Acuity Scheduling +* Quickbooks Online + +See all [WPForms Zapier Integrations](https://zapier.com/apps/wpforms/integrations). + +Note: WPForms was voted Zapier's 6th fastest-growing app in the world. + += Can I create a Payment Form with WPForms? = + +Yes, WPForms is not your average contact form plugin. You can use it to create any type of form including payment forms. + +We make it easy for you to accept payments using Stripe, Square, Authorize.Net, and PayPal Commerce. + +Both our Stripe and Authorize.Net integrations help you easily accept credit card payments online. + +Our PayPal integration allows you to accept PayPal payments online. + += Can I Import / Export Forms with WPForms? + +Yes, WPForms makes it easy to import / export your contact forms and other WordPress forms created with the WPForms form builder. This is incredibly useful for developers and agencies who are building websites for clients. + +You can also create custom form templates that you can use on client websites. For more see our documentation. + +Aside from that, WPForms also allows you to import forms from other WordPress Contact Form plugins such as Contact Form 7, Ninja Forms, and Pirate Forms. + +If you're not happy with your WordPress contact form plugin, then definitely give WPForms a try! + += I'd like access to all features. How can I get them? = + +You can get access to more features, addons, and support by [upgrading to our Pro version](https://wpforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin). Purchasing a Pro license gets you access to the full version of WPForms, automatic updates, priority support, and all WPForms Addons! + += Is WPForms translation ready? = + +Yes, WPForms has full translation and localization support via the wpforms textdomain. Based on your site language, required .mo and .po translation files will be downloaded and placed into the default WordPress languages directory. The same is true for every WPForms Addon, as well. + += Does WPForms include spam protection? = + +Yes, WPForms includes spam protection which is enabled on all forms by default in the form settings. + +Additionally, Google reCAPTCHA, hCaptcha, and Cloudflare Turnstile are also supported and can be set up at WPForms > Settings > CAPTCHA. + +WPForms is fully compatible with all versions of Google reCAPTCHA: + +* Checkbox reCAPTCHA v2 +* Invisible reCAPTCHA v2 +* reCAPTCHA v3 + +Lastly, [Custom Captchas](https://wpforms.com/features/spam-protection//?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) are available which allow you to create math- or question-based CAPTCHAs for your contact forms. + +== Notes == + +WPForms is absolutely, positively the most [beginner-friendly WordPress contact form plugin](https://wpforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) on the market. It is both easy and powerful. + +We took the pain out of creating online forms and made it easy. Check out all [WPForms features](https://wpforms.com/features/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin). + +Also, I'm the founder of [WPBeginner](https://www.wpbeginner.com/), the largest WordPress resource site for beginners. It was a huge priority for me to make a WordPress contact form plugin that beginners can use without any training. + +I feel that we have done that here. I hope you enjoy using WPForms. + +Thank you, + +Syed Balkhi + +== Changelog == + += 1.9.8.7 = +- Fixed: A fatal error occurred on the admin dashboard with some third-party plugins. + += 1.9.8.6 = +- Fixed: Prevented loading of Divi assets on pages not containing a form. +- Fixed: Compatibility with the LeadConnector plugin. +- Fixed: Integration icons were misaligned on the Form Builder page. + += 1.9.8.4 = +- Added: Ability to hide choice images notifications. +- Added: Ability to set a user-defined choice for the Multiple Choice field. +- Changed: Updated DOMPurify library to 3.2.7. +- Changed: Updated Font Awesome library to 7.0.1. +- Changed: Validation of Custom Meta Keys on the Form Builder > Payments > Stripe screen. +- Fixed: Form Builder preview container height in empty state. +- Fixed: A conflict occurred when a non-Google captcha was used in the form and the Google reCAPTCHA API was loaded on the same page. +- Fixed: A fatal error in `wpforms_is_admin_page()` that occurred when the page request parameter was passed as an array instead of a string. +- Fixed: Console error when installing WPForms via a Block in the Block Editor. + += 1.9.8.2 = +- Fixed: Form Builder preview container height with empty state. + += 1.9.8.1 = +- Added: Ability to disconnect Stripe accounts through the Settings > Payments admin page. +- Added: Ability to set how many times a Stripe recurring payment will be repeated. +- Added: Back To Previous Page option for Confirmation Page Redirect. +- Changed: Improved accessibility for the Modern Dropdown field by adding ARIA attributes to support VoiceOver navigation. +- Changed: Notification email fields in the Form Builder now only display email-compatible Smart Tags. +- Fixed: PHP warnings might be generated for new forms created from a template by non-admin users. +- Fixed: Disabled fields (read-only) didn't look disabled. +- Fixed: Smart Tag fields in the sidebar had incorrect height. +- Fixed: The last step of the WPForms Challenge wasn't shown up for users in some cases. +- Fixed: Header Menu Links position has been adjusted to be on the same level on every screen. +- Fixed: Duplicated Square field button existed in the Form Builder. +- Fixed: Form authors with no capabilities to install addons did not get information about missing privileges. +- Fixed: HTMLPurifier threw a deprecated API call notice. +- Fixed: Users with no sufficient access permissions were able to display a broken Themes settings panel. +- Fixed: Custom CSS with quotes in selectors now displays correctly instead of showing broken HTML entities. +- Fixed: Pinned AI Chat layout in the Form Builder. +- Fixed: Log titles having apostrophes in them were not displayed correctly in the Log Viewer. +- Fixed: There might be errors when processing Stripe payments with customer metadata containing empty keys. + += 1.9.7.2 = +- Fixed: JS errors might affect the form submission on some environments with installed plugins for caching. + += 1.9.7.1 = +- Added: Ability to apply Styles and Themes directly within the WPForms Form Builder. +- Added: Ability to copy whole Smart Tags input content if it contains smart tags. +- Added: Number field validation messages control on the Settings > Validation page. +- Added: The Choices Limit option for the Payment Checkbox Items field. +- Added: Warning message in case corrupted form data is detected in the form builder. +- Changed: Optimized the calculation process of the total amount on payment forms. +- Changed: Improved compatibility with PHP 8.4. +- Changed: Improved error message in case 403 error occurred while saving a form. +- Changed: Improved compatibility with the Paid Memberships Pro plugin. +- Fixed: The spacing between the template badge and the form name was too small. +- Fixed: Square Credit Card field error was still displayed after entering valid details. +- Fixed: Various RTL problems on the form builder screen. + += 1.9.6.2 = +- Fixed: "Please enable JavaScript" message was displayed over a form even when JavaScript was enabled. + += 1.9.6.1 = +- Added: Smart Tags support in the Default Value setting for Name field subfields. +- Fixed: WPForms updates did not work consistently with the WP Umbrella plugin. +- Fixed: The layout of the Order Summary table was broken on Windows operating systems. +- Fixed: The layout of the Stripe custom fields mapping table was broken in the form builder. + += 1.9.6 = +- Added: Form Themes for Elementor. +- Added: Customer phone, Payment, and Customer metadata can now be configured on the Form Builder > Payments > Stripe screen. +- Changed: Improved styles on Tools > Scheduled Actions page with reset search filter. +- Changed: Improved Form Builder loading. +- Changed: Required select fields have default placeholder text to prevent the submission of default values. +- Changed: Improved message about missing PHP extensions. +- Changed: Updated DOMPurify library to 3.2.6. +- Fixed: Captcha verification was skipped for payment forms. +- Fixed: Email notification was malformed when a form had a Total field with the "Order Summary" enabled. +- Fixed: The marketing provider's name was not specified in the warning popup when a field with conditional logic was removed. +- Fixed: An error occurred when installing a plugin through the Gutenberg block. +- Fixed: Addon fields were not rendered on the front-end on multisite if addons were not activated site-wide. +- Fixed: Missing popup about unsaved changes when closing the form from the Marketing tab. +- Fixed: Compatibility with Elementor editor. +- Fixed: The "Plugin is in the Latest Version" error occurred when updating several addons using bulk update on the Plugins page. +- Fixed: There was no popup about unsaved changes displayed after typing into the MCE editor. +- Fixed: Layout issues of the Square credit card field. +- Fixed: JavaScript error occurred when a form was added in the Elementor popup. +- Fixed: Fields were added to the form in the wrong order under some conditions. + += 1.9.5.2 = +- Fixed: Issue sending form notifications using email fields that had ID=0. + += 1.9.5.1 = +- Fixed: AJAX request for Stripe payments was sent twice, which might lead to missed entries and payment records. +- Fixed: `{field_id="#"}` smart tag didn't work for CC field in email notifications. +- Fixed: Email notification was misformatted when the form had a Total field with the "Order Summary" enabled. + += 1.9.5 = +- IMPORTANT: Support for PHP 7.1 has been discontinued. If you are running PHP 7.1, you MUST upgrade PHP before installing WPForms 1.9.5. Failure to do that will disable WPForms core functionality. +- Added: Users can connect their Square accounts and receive payments via their payment forms. +- Added: New design for Smart Tags. +- Added: The ability to activate and deactivate email notifications through a status button in the form builder. +- Changed: Enhancing the prevention of duplicate form submissions. +- Changed: Improved the error messaging when creating new provider connections in the form builder. +- Changed: Improved the "From Email" setting validation in the Notifications screen. +- Changed: AI Chat Modal can be docked to the right of the builder. +- Changed: The order of the admin bar menu items. +- Changed: Improved compatibility with PHP 8.1. +- Changed: Improved UX for Dropdown and Dropdown Items fields. +- Fixed: Hidden by conditional logic items in the Order Summary table were shown in the Editors. +- Fixed: Stripe settings were active when the credit card field was removed from the form. +- Fixed: The notice for the minimum and maximum valid values of the Number Slider field is now correct. +- Fixed: WPForms Challenge RTL issues. +- Fixed: Incorrect wpforms_htaccess_file transient name generation. +- Fixed: Console error when users tried to embed a form into an existing page on the last step of the WPForms Challenge. +- Fixed: The submit button stays disabled after Stripe payment fails in some cases. +- Fixed: The Dropdown and Dropdown Items fields displayed placeholders instead of default values in the Form Builder. +- Fixed: Wrong paddings in the Form Builder sidebar on Windows in the RTL mode. +- Fixed: Improved the From Email notification setting. The Email field is detected now by a smart tag. +- Fixed: Improved notification template for the {entry_geolocation} smart tag. + += 1.9.4.2 = +- Fixed: Fatal error when trying to delete the plugin. +- Fixed: Character encoding issues in Email notifications when viewed on some Apple devices. + += 1.9.4.1 = +- Added: Minimum and maximum value validation for the Numbers field. +- Added: Implemented password protection and user access restrictions for uploaded files. +- Added: Automatic preview page reload was added after saving. +- Changed: Improved Gutenberg block UI by hiding settings when no form is selected. +- Changed: Updated stripe/stripe-php library to 16.5.0. +- Changed: Enhanced Tools > Scheduled Actions visibility for better compatibility with Action Scheduler, WooCommerce, and WP Rocket plugins. +- Changed: Improved Stripe payments customer address handling. +- Changed: Optimized number slider calculations for better decimal precision. +- Changed: Improved Numbers and Number Slider fields settings interface in the form builder. +- Fixed: Stripe Credit Card field payment element console warnings. +- Fixed: Resolved form submission debug log warnings. +- Fixed: URL referer smart tag functionality for external websites. +- Fixed: Addressed GDPR enhancements setting flashings on refresh. +- Fixed: Resolved Stripe payments processing for Indian accounts. +- Fixed: Corrected Payments Summary chart tooltip display. +- Fixed: Improved decimal precision in number slider field calculations. +- Fixed: Enhanced WPForms admin pages performance. +- Fixed: Backslash handling in form data after saving. +- Fixed: Prevented duplicate entry submissions with reCAPTCHA v3. +- Fixed: Restored missing Order Summary item names for hidden label fields. +- Fixed: Improved Order Summary performance with conditional Multiple Items fields. +- Fixed: Dynamic Choice fields button behavior. +- Fixed: Display of zero-price Payment Checkbox items. +- Fixed: Stripe Credit Card field styling in Divi builder. +- Fixed: Fatal error with a custom country address scheme. + += 1.9.3.2 = +- Fixed: GDPR enhancements sub-setting briefly flashed on the WPForms > Settings admin page after refresh. + += 1.9.3.1 = +- IMPORTANT: Support for PHP 7.0 has been discontinued. If you are running PHP 7.0, you MUST upgrade PHP before installing WPForms 1.9.3. Failure to do that will disable WPForms core functionality. +- Added: Ability to open the Form Builder with a specific section via URL parameter. +- Added: Support for Block API versions 2 and 3. +- Added: Support for the Constant Contact API v3. +- Added: Quick page navigation on the Forms Overview page. +- Added: Direct access to Tools sections from WPForms top admin menu. +- Changed: Updated stripe/stripe-php library to 16.3.0. +- Changed: Updated DOMPurify library to 3.2.3. +- Changed: Optimized Order Summary table display on mobile devices. +- Changed: Improved date formatting consistency in payments table. +- Changed: Removed dynamic missing translation fix to improve performance. +- Fixed: Tooltip text overlap in Choices.js dropdowns with long tags. +- Fixed: Default payment choice label visibility in order summary table. +- Fixed: Hidden single item field visibility in Order Summary table. +- Fixed: Unnecessary CSS variables output on pages without forms. +- Fixed: Toggle icon status glitch on the payments settings section. +- Fixed: Submit button text handling with empty values. +- Fixed: Non-Latin characters have been stripped from the URL when used in {page_url} and {url_referer} smart tags. +- Fixed: Block Editor field compatibility. +- Fixed: Warning appeared in the debug.log when non-string data were erroneously sent to translation. +- Fixed: Custom validation message display for sub-fields. +- Fixed: Stripe Credit Card field in Elementor popups. +- Fixed: Submit button default label handling. +- Fixed: An error was happening when removing “Copy / Paste Style Settings†in Elementor and Block editor. +- Fixed: The “Copy / Paste Style Settings†field default value was empty when adding an Elementor WPForms block. +- Fixed: Error handler improvements. +- Fixed: Some emails were not added to Constant Contact integration. +- Fixed: The WPForms Challenge steps were shown in the AI Form Generator panel. +- Fixed: PHP 7.1 and 7.2 compatibility. + += 1.9.2.3 = +- Changed: Creating a custom form theme is now available only to Administrators. +- Fixed: Translated form action notices had an "s" letter appended to the form/template translated name. +- Fixed: The Minimum time to submit setting consistently blocked form submissions on sites created in WordPress Studio. +- Fixed: The '_load_textdomain_just_in_time was called incorrectly' error with child themes. +- Fixed: In rare cases, a fatal error could happen on plugin activation. + += 1.9.2.2 = +- Fixed: _load_textdomain_just_in_time notice with WordPress 6.7. +- Fixed: Some translations were empty with WordPress 6.5+. + += 1.9.2.1 = +- Added: The Settings section in the WPForms admin bar menu. +- Added: Update Stripe payments status after canceling a refund in the Stripe dashboard. +- Added: Open the URL in the new tab for Confirmations. +- Added: New `$row_id` parameter to the `wpforms_pre_update_{$type}` and `wpforms_post_update_{$type}` actions. +- Added: AI chat warning messages if prohibited code has been removed. +- Changed: Updated jquery.validate library to 1.21.0. +- Changed: Updated stripe/stripe-php library to 16.1.0. +- Changed: Updated DOMPurify library to 3.1.7. +- Changed: Updated woocommerce/action-scheduler library to 3.8.2. +- Changed: Updated Chart.js library to v4.4.4. +- Changed: Smart tags are no longer processed in WordPress builders, such as Gutenberg, Elementor, Divi Builder, etc. +- Fixed: There was a potential infinite recursion in error handling. +- Fixed: Improved performance on the Templates page in the Form Builder. +- Fixed: Field labels were printed in the Order Summary table when the Hide Label option was enabled. +- Fixed: In some cases, adding a new account in Form Builder did not load the account data correctly. +- Fixed: Improved translation handling for addon names and descriptions. +- Fixed: Order Summary performance issue on large forms containing numerous payment conditional logic fields. +- Fixed: Mapped First/Last Name sub-fields were replaced by another after the initial field was deleted. +- Fixed: An extra field was displayed when WPForms were embedded using a shortcode in the Footer. +- Fixed: The non-Latin characters were not supported for the AI Choices prompt. + += 1.9.1.6 = +- Fixed: The Dropdown field placeholder was disabled on the Divi Builder preview screen. +- Fixed: When sending a form with an incorrect nonce field, no error was displayed. +- Fixed: An extra field was displayed when a form was embedded using a shortcode in the Footer. + += 1.9.1.5 = +- Fixed: PHP warnings appeared with WordPress widgets. + += 1.9.1.4 = +- Fixed: Multiple sending of weekly summary emails. + += 1.9.1.3 = +- Fixed: HTML tags didn't work in an agreement text of the GDPR field when a field's label was hidden. +- Fixed: HTML tags in choices of the Checkboxes, Multiple Choice, and Dropdown fields were escaped and didn't work as expected. + += 1.9.1.2 = +- Fixed: There was a conflict with the WooCommerce Subscriptions plugin. + += 1.9.1.1 = +- Added: State-of-the-art generative AI can help to build forms even faster. +- Added: New supported currencies. +- Added: New `wpforms_html_field_name` filter that allows modifying field labels in email notifications. +- Changed: Improved the UI for multiple dropdown elements in various places of the admin area. +- Changed: Updated Stripe Subscription to use the plan name as the description. +- Changed: Notice in the WPForms > Settings > Payments admin page when a selected currency is not supported by Stripe. +- Changed: WPForms admin notices are now sorted by type. +- Changed: Improved the Modern Dropdown field UI across the Block and Elementor editors. +- Changed: Updated DOMPurify library to 3.1.6. +- Changed: Updated `stripe/stripe-php` library to 15.8.0. +- Changed: Improved RTL support of plugin admin pages. +- Changed: Improved compatibility with Full Site Editor and Gutenberg plugin. +- Changed: Improved performance on admin pages. +- Changed: Form Builder: Alt+S shortcut toggles the sidebar on Windows and Linux. Ctrl+F shortcut has been improved to always open search field. +- Fixed: Resolved W3C validation error for the Order Summary table. +- Fixed: Fixed RTL display issues for submit spinner and payment fields with quantity enabled. +- Fixed: Resolved pagination button issues for WordPress versions 6.6 and higher. +- Fixed: Incorrect price was displayed in the Order Summary table for some currencies when the Single Item field with 'user defined' type was used. +- Fixed: Improved mobile responsiveness of the price column in the Order Summary table. +- Fixed: "The cron event list could not be saved" error could appear in the debug.log file in certain cases. +- Fixed: WPForms script was not defined in the Elementor popup. +- Fixed: Compatibility with the Jetpack Boost plugin. +- Fixed: PHP notice generated on the Single Payment screen in some cases. +- Fixed: Search on WPForms –> Tools –> Scheduled Actions page redirected users to the Import Screen. +- Fixed: The `wpforms_weekly_entries_count_cron` task was reporting an error in the debug log. +- Fixed: Resolved W3C errors and warnings reported for the Standard fields. +- Fixed: The browser tab could crash if the WPForms block was used with patterns. +- Fixed: The Order Summary text was not readable in some form themes when the `{order_summary}` smart tag was used in the Confirmation message. +- Fixed: Submit button hover styles were overridden in some themes and Elementor. +- Fixed: The "Missing 'wpforms' dependency" error appeared on pages without a form. + += 1.9.0.4 = +- Fixed: Unable to send a form with Constant Contact integration and fatal errors in the admin. + += 1.9.0.3 = +- Fixed: Compatibility issues with menus and popups on Elementor. +- Fixed: A fatal error with wp_remote_retrieve_headers occurred in CacheBase.php in some cases. +- Fixed: Compatibility with the Jetpack Boost plugin. + += 1.9.0.2 = +- Added: Modern Antispam protection for new forms. +- Added: Support conditional logic in the Layout field and add the ability to render the label and description for this field. +- Added: The notification to check prices is added when the currency is switched. +- Added: The new filter `wpforms_sanitize_amount_before` to filter a raw price amount before sanitization. +- Added: The new filter `wpforms_sanitize_amount` to filter a sanitized price amount. +- Added: The new filter `wpforms_enable_form_data_slashing` to enable the form data slashing. +- Added: The new filter `wpforms_frontend_js_header_force_load`allows the loading of JS assets in the header. +- Changed: Improved automatic recreation of custom database tables. +- Changed: Improved RTL support of plugin admin pages on desktop and mobile screens. +- Changed: Smart Tags for the Name field now allow retrieving partial data, such as Last Name. +- Changed: Improved layout of the Settings > Integrations page on small screens. +- Changed: Added notices for the Default value and Allowlist/Denylist settings on the Email field in case some values were invalid and have been removed. +- Changed: Improved the multi-select dropdowns UI across the Builder UI. +- Changed: Updated `stripe/stripe-php` library to v15.1.0. +- Changed: Updated `woocommerce/action-scheduler` library to v3.8.1. +- Changed: Allowed using the `&` symbol in Modern style Dropdown field choices. +- Changed: Improved compatibility with the WP JobSearch plugin. +- Changed: Updated `jQuery.Validate` library to v1.20.1. +- Changed: Updated `inputmask` library to v5.0.9. +- Fixed: Stripe payment form couldn't be submitted in the Elementor popup preview. +- Fixed: The Trash, Duplicate, Restore, and Delete actions for templates and forms now display a notice with the correct type. +- Fixed: Multiple Choice, Checkboxes, and Dropdown fields with empty values were displayed incorrectly in email notifications. +- Fixed: Database error on a single network site after creating a form if the plugin was network activated. +- Fixed: Fields reacted by hovering over them with the cursor on the Elementor editor screen. +- Fixed: Modern Dropdown fields were not appropriately loaded on Block (Gutenberg) and Elementor editors. +- Fixed: Forms with hidden labels had a big horizontal scrollbar when displayed on mobile with RTL languages. +- Fixed: Conditional logic affected the print page, which did not display hidden fields. +- Fixed: The RTE field was broken in the Elementor editor preview when the left menu was collapsed. +- Fixed: Rare exception with how we registered translations for download using the respective transient. +- Fixed: Pre-populating fields from another form with confirmation redirect URL was not handling multi-select fields. +- Fixed: The Gutenberg editor was not displaying the page title using Smart Tags. +- Fixed: The {page_url}Smart Tag value was wrong on the Gutenberg editor's page. +- Fixed: When all the provider's connections were removed, the check icon remained in the provider title. +- Fixed: The `{page_url}`Smart Tag was incorrect in the Divi builder. +- Fixed: Modern Dropdown fields didn't preview correctly for multiple instances of WPForms block on the Gutenberg editor's page. +- Fixed: The choice-based payment field Smart Tags didn't work in the prefilled URL. +- Fixed: In Dropdown, the & symbol was rendered as the corresponding HTML entity `&` for Modern Style. +- Fixed: The modern dropdown field was not loading correctly on the Elementor popup. +- Fixed: Empty forms couldn't be submitted without enabling the "Minimum time for submit" setting. +- Fixed: Switching to Live mode on the Payments Overview screen was impossible when all test payments were deleted. +- Fixed: Dropdown and Checkbox fields with multiple values were inline in email notifications. +- Fixed: Pressing the Enter key triggered the WPForms Insert Form modal in the Classic editor. +- Fixed: Dropdown field in forms with the `inline-fields` class had cropped dropdowns on Safari. +- Fixed: Payment quantity text was not centered on some themes. +- Fixed: Some fields were visible in the email notifications even if they were hidden by Conditional Logic. +- Fixed: The Robots.txt file wasn't valid due to the WPForms disallow rule. +- Fixed: After embedding to the new page, the `{page_title}` Smart Tag was empty in the Block Editor (Gutenberg). + += 1.8.9.6 = +- Changed: Improved compatibility with OceanWP theme. +- Fixed: Dropdown fields in forms with the `inline-fields` class had cropped dropdowns. +- Fixed: Button's hover color was wrong on the Ocean WP theme. +- Fixed: Form couldn't be submitted when Cloudflare Turnstile anti-spam integration was configured. + += 1.8.9.5 = +- Fixed: Stripe payment wasn't created when the Credit Card field was optional and users paid through Google Pay / Apple Pay. + += 1.8.9.4 = +- Added: New filter wpforms_sanitize_amount_before to filter a raw price amount before sanitization. +- Added: New filter wpforms_sanitize_amount to filter a sanitized price amount. + += 1.8.9.2 = +- Fixed: Reply-to field was not returning the correct email address. + += 1.8.9.1 = +- Added: Complex fields now can have separate error messages for each field. +- Added: Recommended, New, and Featured addons are now displayed first on the addons page. +- Changed: The Campaign Monitor, ConstantContact, GetResponse and ConvertKit logos were updated. +- Changed: Users can now see the category and subcategory of the selected template on the Setup panel. +- Changed: If Akismet is installed and configured for the form, marking entries as spam or not spam helps Akismet learn. +- Changed: Improved the behavior of Tools > Logs page and settings controls. +- Changed: Improved compatibility with the Hello Elementor theme. +- Changed: Process empty selected values for Choices, Checkbox, and Dropdown fields when Show Values option is selected. +- Changed: Choices.js library has been updated to v10.2.0. +- Changed: Modern multiple select field with search enabled now is more user-friendly across the admin area. +- Changed: Improved rendering of Payment Fields according to W3C requirements. +- Changed: Always display templates added by addons, even if the addon is not installed or activated. +- Changed: The form builder now hides the placeholder label for Image and Icon choices when left empty, while retaining the placeholder for Payment Choices and Checkboxes to maintain consistency with frontend behavior. +- Fixed: Incorrect alert modal was shown on the subscription plan removal in some cases. +- Fixed: Various RTL problems on the form builder screen. +- Fixed: The minimum payment amount for the Single Item field was not functioning correctly with currencies that use a comma as a decimal separator. +- Fixed: Validation error for the Postal code of the Stripe Credit Card field displayed twice. +- Fixed: Inconsistent spacing of Dropdown field in different browsers on desktop and mobile. +- Fixed: Stripe Credit Card field had incorrect placeholder color with Classic Markup. +- Fixed: Updated the WPForms Challenge to only start counting when you actually begin creating a form on the Forms Overview page. +- Fixed: User templates were not deleted on plugin uninstall. +- Fixed: The radio of the Multiple Choice field wasn't centered in Firefox. +- Fixed: Stripe processing error occurred on a multi-payments form when all credit card fields were hidden by conditional logic. +- Fixed: Color of validation errors was incorrect for the Stripe Credit Card field when Payment Element mode was used. +- Fixed: Additional padding was added for the form title on the Forms Overview page on mobile. +- Fixed: The plugin update process redirected to the Update page and did not redirect back to the Plugins page after the update. +- Fixed: The fetching of the new plugin version number and new plugin description has been run not-synchronously. +- Fixed: MySQL errors occurred when creating a table in some unique configurations. +- Fixed: Multiple Choice field with Icon Choices could not be selected in Firefox after reloading the page. +- Fixed: Inline javascript code could be parsed improperly and displayed as text on top pages for some configurations. +- Fixed: Cached token was not updated properly. +- Fixed: The Spinner layout of the Save button in the Form Builder was not centered. +- Fixed: In some exceptions, one-time payments appeared in the Stripe dashboard even though a payment form wasn't submitted. +- Fixed: Email notifications were not sent when a subject was empty after smart tag processing. +- Fixed: PHP warnings might have occurred in some cases on PHP 8.0+. +- Fixed: Upgrade to the Pro link had wrong styling on Bluehost hosted sites. +- Fixed: WPForms block in the editor showed an error when the selected form was trashed or deleted. +- Fixed: Some Stripe transactions were refunded almost immediately as the transactions were labeled fraudulent. +- Fixed: The validation process of Number Slider field could throw a fatal error on PHP 8.0+. + += 1.8.8.3 = +- Changed: Updated jQuery.Validate library to v1.20.0. +- Fixed: Screen Options on the Forms Overview and Entries Overview pages could cause PHP error in rare cases due to conflict with 3rd-party code. +- Fixed: Post Statuses on legacy Nav Menu management page could cause PHP error in rare cases due to conflict with 3rd-party code. +- Fixed: users couldn't duplicate their forms. + += 1.8.8.2 = +- Added: Forms can now be saved as user templates for future use. +- Added: New `Price Display` option was added for Single Item payment field. +- Added: Shipping and Billing addresses can now be configured on the Form Builder > Payments > Stripe screen. +- Added: New filter `wpforms_integrations_stripe_api_common_create_plan_name` to filter Stripe subscription plan name. +- Added: New filter `wpforms_integrations_lite_connect_api_request_timeout` to filter Lite Connect request timeout. +- Added: New styling/theming settings in the Block editor. +- Added: New context menu in the Form Builder for quick actions. +- Changed: New design for the Email Summaries email template with a weekly total and entry submission trends. +- Changed: The state of selected stat cards on the Payments Overview chart is preserved when applying date filtering. +- Changed: Updated `stripe/stripe-php` library to v13.15.0. +- Changed: Updated `woocommerce/action-scheduler` library to v3.7.2. +- Changed: Updated DOMPurify library to 3.0.9. +- Changed: Adjusted notifications on the empty forms screen. +- Changed: HTML tags are allowed in the Order Summary for the Total payment field. +- Changed: When the entry is marked as not spam, submit data to Akismet for learning and help make the Web a better place for everyone. +- Changed: Improved error handling when creating or updating a form. +- Changed: Improved fields layout on the frontend for better user experience on mobile devices. +- Changed: Bring the frontend markup of the form more in line with the W3C standards to reduce validator errors. +- Fixed: Various RTL problems in the admin dashboard, form builder and a form preview page. +- Fixed: Various responsive issues on admin pages. +- Fixed: The Paragraph field was allowed horizontal resizing. +- Fixed: Make sure we output valid robots.txt file rules if the file is empty. +- Fixed: PHP notices were thrown in some cases when Stripe subscription renewals were created. +- Fixed: Customer email was shown instead of customer name on the Payments Overview screen for Stripe subscription renewals in some cases. +- Fixed: The builder sidebar was hidden on the context menu edit actions. +- Fixed: Fatal error was thrown on the frontend with corrupted form data. +- Fixed: `0` (zero) as a choices field raw value was not saved. +- Fixed: The payment single field had the wrong spacing with enabled quantities. +- Fixed: Long placeholders being broken into multiple lines after Safari 17.3.1 update. +- Fixed: Media upload did not work in some cases on mobile devices. +- Fixed: Placeholder option was hidden for the Single Item field with 'user defined' type. +- Fixed: Incorrect prices in the Order Summary table when items in the Checkbox Items field had the hyphen symbol. +- Fixed: Modern multiple select fields with long placeholder text overlapped a drop-down arrow. +- Fixed: Infinite loading button was shown on mobile devices in some cases. +- Fixed: Multisite activation: plugin should stay activated on a single site after user activated it on a network level. +- Fixed: There was a race condition with invisible reCaptcha v2, preventing form submission in some edge cases. +- Fixed: Elementor widget styles were broken due to a conflict with the Gutenberg block. +- Fixed: Some unnecessary inline styles were applied for email notifications with HTML tags. +- Fixed: Payment fields weren't reflected properly in the Order Summary table in some cases. +- Fixed: WPCode Install/Activate modal and Entries Education Modal now look better on mobile screens. +- Fixed: `{author_*}` smart tags were returning incorrect results in some cases. +- Fixed: Incorrect styles were applied for "Order Summary" table in some cases. +- Fixed: Improved handling of corrupted payment submission data. + += 1.8.7.2 = +- Changed: "What's New" modal should be displayed based on the major version of the plugin. +- Changed: Improved Akismet integration efficiency. +- Fixed: Antispam token was passed as a simple form field, not protected from spam bots. +- Fixed: PHP warning was thrown in case of anonymous form submission when User ID smart tag was used. +- Fixed: Image positioning in the "What's New" blocks wasn't always correct. +- Fixed: Modal windows were not displayed on small screens. +- Fixed: The animation for opening the "What's New" modal worked improperly when the modal had small content. +- Fixed: The background was not entirely dimmed when scrolling the "What's New" popup. + += 1.8.7.1 = +- Added: The Announcements block in the Community page. +- Added: New way to expand the Form Templates subcategories list in the templates list sidebar. +- Added: New splash screen outlining notable features and changes in the release. +- Added: The user can see an overview of what they are purchasing by enabling the Order Summary for the Total payment field. +- Added: New `{order_summary}` smart tag. +- Changed: Improved compatibility with Twenty Twenty-Three theme. +- Changed: Improved plugin activation on WordPress multisite setups with both Lite and Pro versions installed. +- Changed: Improved support of sites hosted in the Azure platform using IIS. +- Changed: Updated DOMPurify library to 3.0.8. +- Changed: Removed `jquery-confirm` library in favor of jQuery.Confirm Reloaded drop-in replacement. +- Changed: Spam protection token is valid now for 3 days instead of 2. +- Changed: Spam protection token is no longer loaded with JS to avoid fails caused by script errors. +- Changed: Storing spam entries is now enabled by default for new forms. +- Changed: Users with limited capabilities are allowed to view the Forms Templates and Addons pages. +- Updated: `tijsverkoyen/css-to-inline-style` library to v2.2.7. +- Updated: `symphony/polyfill-iconv` library to v1.19.0. +- Updated: `symphony/polyfill-mbstring` library to v1.19.0. +- Updated: `woocommerce/action-scheduler` library to v3.7.1. +- Updated: `stripe/stripe-php` library to v13.9.0. +- Fixed: Some background actions could fail if triggered by WP-CLI via server cron. +- Fixed: Fatal error may occur in rare cases during migrations if they were triggered manually. +- Fixed: Read-only Number fields should not display spin buttons. +- Fixed: The Icons Choices field with a Large size was not centered in the Block Editor and Elementor. +- Fixed: Two messages appeared when clicking on the reCAPTCHA field after searching the fields in the Builder. +- Fixed: A form with a long title expanded the form selector dropdown in the Block Editor. +- Fixed: CSS Styles were not applied if Global Colors were already selected in Elementor Builder. +- Fixed: Payment method details were not stored for Stripe renewals. +- Fixed: The template page had style issues in the German language. +- Fixed: The Elementor popup preview had broken WPForms styles. +- Fixed: In some situations, payment amounts were improperly sanitized. +- Fixed: Some modals across the admin area were not responsive and did not fit on smaller screen sizes. +- Fixed: Templates' cache wasn't updated after the plugin update. +- Fixed: RTL support for WPForms Settings page. +- Fixed: RTL support for the Form Builder. +- Fixed: Some frontend fields were improperly rendered for RTL. +- Fixed: The user interface had different other issues when RTL language was in use. +- Fixed: The Form Builder settings screen had multiple visual issues when RTL language was used. +- Fixed: AJAX calls didn't work on servers with empty `$_SERVER['HTTP_REFERER']` value. +- Fixed: Improved Forms overview page display on mobile devices. +- Fixed: Improved Tools pages display on mobile devices. +- Fixed: Custom Captcha settings were duplicated on the Form Builder when the field was added through the Settings > Spam and Security screen. +- Fixed: Localization issues were present on the Get Started screen. +- Fixed: Subscriptions made by the Stripe Link payment method before 1.8.6. +- Fixed: Some non-optimized MySQL requests locked the database for seconds on huge sites with thousands of tables. +- Fixed: The Appearance of multiple dropdown values was incorrect. +- Fixed: Some information was missing if Smart Tags were processed in the background via cron. +- Fixed: The recent Chrome version for Windows was not displaying the custom scrollbars correctly. +- Fixed: `wpforms_plaintext_field_value` filter was unavailable since 1.8.5 version. +- Fixed: The form submission triggered an error on sites with long-term page caching. + +[See changelog for all versions](https://plugins.svn.wordpress.org/wpforms-lite/trunk/changelog.txt). diff --git a/wp-content/plugins/wpforms-lite/src/API.php b/wp-content/plugins/wpforms-lite/src/API.php new file mode 100755 index 00000000..5d166d01 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/API.php @@ -0,0 +1,52 @@ +get( 'class' ). + * + * @todo Add non-static methods processing. + * + * @since 1.8.6 + * + * @var array[] + */ + private $registry = [ + 'import_forms' => [ + 'class' => Import::class, + 'method' => 'import_forms', + ], + ]; + + /** + * Magic method to call a method from registry. + * + * @since 1.8.6 + * + * @param string $name Method name. + * @param array $args Arguments. + * + * @return mixed|null + */ + public function __call( string $name, array $args ) { + + $callback = $this->registry[ $name ] ?? null; + + if ( $callback === null ) { + return null; + } + + return call_user_func( [ $callback['class'], $callback['method'] ], ...$args ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Access/Capabilities.php b/wp-content/plugins/wpforms-lite/src/Access/Capabilities.php new file mode 100755 index 00000000..9015d28a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Access/Capabilities.php @@ -0,0 +1,62 @@ +allow_load() ) { + return; + } + + $this->cache = wpforms()->obj( 'addons_cache' ); + + global $pagenow; + + // Force update addons cache if we are on the update-core.php page. + // This is necessary to update addons data while checking for all available updates. + if ( $pagenow === 'update-core.php' ) { + $this->cache->update( true ); + } + + $this->addons = $this->cache->get(); + + $this->populate_addons_data(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.6.6 + */ + protected function hooks() { + + global $pagenow; + + /** + * Fire before admin addons init. + * + * @since 1.6.7 + */ + do_action( 'wpforms_admin_addons_init' ); + + // Filter Gettext only on Plugin list and Updates pages. + if ( $pagenow === 'update-core.php' || $pagenow === 'plugins.php' ) { + add_action( 'gettext', [ $this, 'filter_gettext' ], 10, 3 ); + } + } + + /** + * Get all addons data as array. + * + * @since 1.6.6 + * + * @param bool $force_cache_update Determine if we need to update cache. Default is `false`. + * + * @return array + */ + public function get_all( bool $force_cache_update = false ) { + + if ( ! $this->allow_load() ) { + return []; + } + + if ( $force_cache_update ) { + $this->cache->update( true ); + + $this->addons = $this->cache->get(); + } + + // WPForms 1.8.7 core includes Custom Captcha. + // The Custom Captcha addon will only work on WPForms 1.8.6 and earlier versions. + unset( $this->addons['wpforms-captcha'] ); + + return $this->get_sorted_addons(); + } + + /** + * Get sorted addons data. + * Recommended addons will be displayed first, + * then new addons, then featured addons, + * and then all other addons. + * + * @since 1.8.9 + * + * @return array + */ + private function get_sorted_addons(): array { + + if ( empty( $this->addons ) ) { + return []; + } + + $recommended = array_filter( + $this->addons, + static function ( $addon ) { + + return ! empty( $addon['recommended'] ); + } + ); + + $new = array_filter( + $this->addons, + static function ( $addon ) { + + return ! empty( $addon['new'] ); + } + ); + + $featured = array_filter( + $this->addons, + static function ( $addon ) { + + return ! empty( $addon['featured'] ); + } + ); + + return array_merge( $recommended, $new, $featured, $this->addons ); + } + + /** + * Get filtered addons data. + * + * Usage: + * ->get_filtered( $this->addons, [ 'category' => 'payments' ] ) - addons for the payments panel. + * ->get_filtered( $this->addons, [ 'license' => 'elite' ] ) - addons available for 'elite' license. + * + * @since 1.6.6 + * + * @param array $addons Raw addons data. + * @param array $args Arguments array. + * + * @return array Addons data filtered according to given arguments. + */ + private function get_filtered( array $addons, array $args ): array { + + $args = wp_parse_args( + $args, + [ + 'category' => '', + 'license' => '', + ] + ); + + $args = array_map( 'strtolower', $args ); + + $filtered_addons = []; + + foreach ( $addons as $addon ) { + foreach ( $args as $arg_key => $arg_value ) { + $addon_value = wpforms_array_get_by_path( $addon, $arg_key, '' ); + + if ( + is_array( $addon_value ) && + // We cannot use preg_quote here, as $arg_value could contain regex like 'crm|email-marketing|integration'. + preg_grep( '/^' . $arg_value . '$/', $addon_value ) + ) { + $filtered_addons[] = $addon; + } + } + } + + return $filtered_addons; + } + + /** + * Get available addons data by category. + * + * @since 1.6.6 + * + * @param string $category Addon category. + * + * @return array. + */ + public function get_by_category( string $category ) { + + return $this->get_by_path( 'category', $category ); + } + + /** + * Get available addons data by path. + * + * @since 1.9.8.6 + * + * @param string $path Path in addons multidimensional array. + * May be 'category' or 'form_builder.category' or 'settings_integrations.category', etc. + * @param string $value Addons multidimensional array value we are looking for in the path. + * + * @return array + */ + public function get_by_path( string $path, $value ): array { + + return $this->get_filtered( $this->get_available(), [ $path => $value ] ); + } + + /** + * Get available addons data by license. + * + * @since 1.6.6 + * + * @param string $license Addon license. + * + * @return array. + * @noinspection PhpUnused + */ + public function get_by_license( string $license ) { + + return $this->get_filtered( $this->get_available(), [ 'license' => $license ] ); + } + + /** + * Get available addons data by slugs. + * + * @since 1.6.8 + * + * @param array|mixed $slugs Addon slugs. + * + * @return array + */ + public function get_by_slugs( $slugs ) { + + if ( empty( $slugs ) || ! is_array( $slugs ) ) { + return []; + } + + $result_addons = []; + + foreach ( $slugs as $slug ) { + $addon = $this->get_addon( $slug ); + + if ( ! empty( $addon ) ) { + $result_addons[] = $addon; + } + } + + return $result_addons; + } + + /** + * Get available addon data by slug. + * + * @since 1.6.6 + * + * @param string|bool $slug Addon slug can be both "wpforms-drip" and "drip". + * + * @return array Single addon data. Empty array if addon is not found. + */ + public function get_addon( $slug ) { + + $slug = (string) $slug; + $slug = 'wpforms-' . str_replace( 'wpforms-', '', sanitize_key( $slug ) ); + + $addon = $this->get_available()[ $slug ] ?? []; + + // In case if addon is "not available" let's try to get and prepare addon data from all addons. + if ( empty( $addon ) ) { + $addon = ! empty( $this->addons[ $slug ] ) ? $this->prepare_addon_data( $this->addons[ $slug ] ) : []; + } + + return $addon; + } + + /** + * Check if addon is active. + * + * @since 1.8.9 + * + * @param string $slug Addon slug. + * + * @return bool + */ + public function is_active( string $slug ): bool { + + $addon = $this->get_addon( $slug ); + + return isset( $addon['status'] ) && $addon['status'] === 'active'; + } + + /** + * Get license level of the addon. + * + * @since 1.6.6 + * + * @param array|string $addon Addon data array OR addon slug. + * + * @return string License level: pro | elite. + */ + private function get_license_level( $addon ) { + + if ( empty( $addon ) ) { + return ''; + } + + $levels = [ self::BASIC, self::PLUS, self::PRO, self::ELITE, self::AGENCY, self::ULTIMATE ]; + $license = ''; + $addon_license = $this->get_addon_license( $addon ); + + foreach ( $levels as $level ) { + if ( in_array( $level, $addon_license, true ) ) { + $license = $level; + + break; + } + } + + if ( empty( $license ) ) { + return ''; + } + + return in_array( $license, [ self::BASIC, self::PLUS, self::PRO ], true ) ? self::PRO : self::ELITE; + } + + /** + * Get addon license. + * + * @since 1.8.2 + * + * @param array|string $addon Addon data array OR addon slug. + * + * @return array + */ + private function get_addon_license( $addon ) { + + $addon = is_string( $addon ) ? $this->get_addon( $addon ) : $addon; + + return $this->default_data( $addon, 'license', [] ); + } + + /** + * Determine if a user's license level has access. + * + * @since 1.6.6 + * + * @param array|string $addon Addon data array OR addon slug. + * + * @return bool + */ + protected function has_access( $addon ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + return false; + } + + /** + * Return array of addons available to display. All data is prepared and normalized. + * "Available to display" means that addon needs to be displayed as an education item (addon is not installed or not activated). + * + * @since 1.6.6 + * + * @return array + */ + public function get_available() { + + static $available_addons = []; + + if ( $available_addons ) { + return $available_addons; + } + + if ( empty( $this->addons ) || ! is_array( $this->addons ) ) { + return []; + } + + $available_addons = array_map( [ $this, 'prepare_addon_data' ], $this->addons ); + $available_addons = array_filter( + $available_addons, + static function ( $addon ) { + + return isset( $addon['status'], $addon['plugin_allow'] ) && ( $addon['status'] !== 'active' || ! $addon['plugin_allow'] ); + } + ); + + return $available_addons; + } + + /** + * Prepare addon data. + * + * @since 1.6.6 + * + * @param array|mixed $addon Addon data. + * + * @return array Extended addon data. + */ + protected function prepare_addon_data( $addon ) { + + if ( empty( $addon ) ) { + return []; + } + + $addon['title'] = $this->default_data( $addon, 'title', '' ); + $addon['slug'] = $this->default_data( $addon, 'slug', '' ); + + // We need the cleared name of the addon, without the 'addon' suffix, for further use. + $addon['name'] = preg_replace( '/ addon$/i', '', $addon['title'] ); + + $addon['modal_name'] = sprintf( /* translators: %s - addon name. */ + esc_html__( '%s addon', 'wpforms-lite' ), + $addon['name'] + ); + $addon['clear_slug'] = str_replace( 'wpforms-', '', $addon['slug'] ); + $addon['utm_content'] = ucwords( str_replace( '-', ' ', $addon['clear_slug'] ) ); + $addon['license'] = $this->default_data( $addon, 'license', [] ); + $addon['license_level'] = $this->get_license_level( $addon ); + $addon['icon'] = $this->default_data( $addon, 'icon', '' ); + $addon['path'] = sprintf( '%1$s/%1$s.php', $addon['slug'] ); + $addon['video'] = $this->default_data( $addon, 'video', '' ); + $addon['plugin_allow'] = $this->has_access( $addon ); + $addon['status'] = 'missing'; + $addon['action'] = 'upgrade'; + $addon['page_url'] = $this->default_data( $addon, 'url', '' ); + $addon['doc_url'] = $this->default_data( $addon, 'doc', '' ); + $addon['url'] = ''; + + static $nonce = ''; + $nonce = empty( $nonce ) ? wp_create_nonce( 'wpforms-admin' ) : $nonce; + $addon['nonce'] = $nonce; + + return $addon; + } + + /** + * Get default data. + * + * @since 1.8.2 + * + * @param array|mixed $addon Addon data. + * @param string $key Key. + * @param mixed $default_data Default data. + * + * @return array|string|mixed + */ + private function default_data( $addon, string $key, $default_data ) { + + if ( is_string( $default_data ) ) { + return ! empty( $addon[ $key ] ) ? $addon[ $key ] : $default_data; + } + + if ( is_array( $default_data ) ) { + return ! empty( $addon[ $key ] ) ? (array) $addon[ $key ] : $default_data; + } + + return $addon[ $key ] ?? ''; + } + + /** + * Populate addons data. + * + * @since 1.9.2 + * + * @return void + */ + private function populate_addons_data() { + + foreach ( $this->addons as $addon ) { + $this->addons_text_domains[] = $addon['slug']; + $this->addons_titles[] = 'WPForms ' . str_replace( ' Addon', '', $addon['title'] ); + } + } + + /** + * Filter Gettext. + * + * This filter allows us to prevent empty translations from being returned + * on the `plugins` page for addon name and description. + * + * @since 1.9.2 + * + * @param string|mixed $translation Translated text. + * @param string|mixed $text Text to translate. + * @param string|mixed $domain Text domain. + * + * @return string Translated text. + */ + public function filter_gettext( $translation, $text, $domain ): string { + + $translation = (string) $translation; + $text = (string) $text; + $domain = (string) $domain; + + if ( ! in_array( $domain, $this->addons_text_domains, true ) ) { + return $translation; + } + + // Prevent empty translations from being returned and don't translate addon names. + if ( ! trim( $translation ) || in_array( $text, $this->addons_titles, true ) ) { + $translation = $text; + } + + return $translation; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Addons/AddonsCache.php b/wp-content/plugins/wpforms-lite/src/Admin/Addons/AddonsCache.php new file mode 100755 index 00000000..7dff3610 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Addons/AddonsCache.php @@ -0,0 +1,137 @@ + $this->get_remote_source(), + + // Addons cache file name. + 'cache_file' => 'addons.json', + + /** + * Time-to-live of the addons cache file in seconds. + * + * This applies to `uploads/wpforms/cache/addons.json` file. + * + * @since 1.6.8 + * + * @param integer $cache_ttl Cache time-to-live, in seconds. + * Default value: WEEK_IN_SECONDS. + */ + 'cache_ttl' => (int) apply_filters( 'wpforms_admin_addons_cache_ttl', WEEK_IN_SECONDS ), + + // Scheduled update action. + 'update_action' => 'wpforms_admin_addons_cache_update', + ]; + } + + /** + * Get remote source URL. + * + * @since 1.8.9 + * + * @return string + */ + protected function get_remote_source(): string { + + return defined( 'WPFORMS_ADDONS_REMOTE_SOURCE' ) ? WPFORMS_ADDONS_REMOTE_SOURCE : self::REMOTE_SOURCE; + } + + /** + * Prepare addons data to store in a local cache - + * generate addons icon image file name for further use. + * + * @since 1.6.6 + * + * @param array $data Raw addons data. + * + * @return array Prepared data for caching (with icons). + */ + protected function prepare_cache_data( $data ): array { + + if ( empty( $data ) || ! is_array( $data ) ) { + return []; + } + + $addons_cache = []; + + foreach ( $data as $addon ) { + + // Addon icon. + $addon['icon'] = str_replace( 'wpforms-', 'addon-icon-', $addon['slug'] ) . '.png'; + + // Special case when plugin addon renamed, for instance: + // Sendinblue to Brevo, or ConvertKit to Kit, + // but we keep the old slug for compatibility. + foreach ( + [ + 'wpforms-sendinblue' => [ + 'old' => 'sendinblue', + 'new' => 'brevo', + ], + 'wpforms-convertkit' => [ + 'old' => 'convertkit', + 'new' => 'kit', + ], + ] as $slug => $renamed + ) { + if ( $addon['slug'] === $slug ) { + $addon['icon'] = str_replace( $renamed['old'], $renamed['new'], $addon['icon'] ); + } + } + + // Use slug as a key for further usage. + $addons_cache[ $addon['slug'] ] = $addon; + } + + return $addons_cache; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/AdminBarMenu.php b/wp-content/plugins/wpforms-lite/src/Admin/AdminBarMenu.php new file mode 100755 index 00000000..0fdc5dc1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/AdminBarMenu.php @@ -0,0 +1,712 @@ +has_access() ) { + return; + } + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.6.0 + */ + public function hooks() { + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_css' ] ); + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_css' ] ); + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_js' ] ); + + add_action( 'admin_bar_menu', [ $this, 'register' ], 999 ); + add_action( 'wpforms_wp_footer_end', [ $this, 'menu_forms_data_html' ] ); + } + + /** + * Determine whether the current user has access to see the admin bar menu. + * + * @since 1.6.0 + * + * @return bool + */ + public function has_access(): bool { + + $access = false; + + if ( + is_admin_bar_showing() && + wpforms_current_user_can() && + ! wpforms_setting( 'hide-admin-bar', false ) + ) { + $access = true; + } + + /** + * Filters whether the current user has access to see the admin bar menu. + * + * @since 1.6.0 + * + * @param bool $access Whether the current user has access to see the admin bar menu. + */ + return (bool) apply_filters( 'wpforms_admin_adminbarmenu_has_access', $access ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Determine whether new notifications are available. + * + * @since 1.6.0 + * + * @return bool + */ + public function has_notifications() { + + return wpforms()->obj( 'notifications' )->get_count(); + } + + /** + * Enqueue CSS styles. + * + * @since 1.6.0 + */ + public function enqueue_css() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-admin-bar', + WPFORMS_PLUGIN_URL . "assets/css/admin-bar{$min}.css", + [], + WPFORMS_VERSION + ); + + // Apply WordPress pre/post 5.7 accent color, only when admin bar is displayed on the frontend or we're + // inside the Form Builder - it does not load some WP core admin styles, including themes. + if ( wpforms_is_admin_page( 'builder' ) || ! is_admin() ) { + wp_add_inline_style( + 'wpforms-admin-bar', + sprintf( + '#wpadminbar .wpforms-menu-notification-counter, #wpadminbar .wpforms-menu-notification-indicator { + background-color: %s !important; + color: #ffffff !important; + }', + version_compare( get_bloginfo( 'version' ), '5.7', '<' ) ? '#ca4a1f' : '#d63638' + ) + ); + } + } + + /** + * Enqueue JavaScript files. + * + * @since 1.6.5 + */ + public function enqueue_js() { + + wp_add_inline_script( + 'admin-bar', + "( function() { + function wpforms_admin_bar_menu_init() { + var template = document.getElementById( 'tmpl-wpforms-admin-menubar-data' ), + notifications = document.getElementById( 'wp-admin-bar-wpforms-notifications' ); + + if ( ! template ) { + return; + } + + if ( ! notifications ) { + var menu = document.getElementById( 'wp-admin-bar-wpforms-menu-default' ); + + if ( ! menu ) { + return; + } + + menu.insertAdjacentHTML( 'afterBegin', template.innerHTML ); + } else { + notifications.insertAdjacentHTML( 'afterend', template.innerHTML ); + } + }; + document.addEventListener( 'DOMContentLoaded', wpforms_admin_bar_menu_init ); + }() );", + 'before' + ); + } + + /** + * Register and render admin bar menu items. + * + * @since 1.6.0 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function register( WP_Admin_Bar $wp_admin_bar ) { + + $items = (array) apply_filters( + 'wpforms_admin_adminbarmenu_register', + [ + 'main_menu', + 'notification_menu', + 'all_forms_menu', + 'add_new_menu', + 'all_payments_menu', + 'settings_menu', + 'tools_menu', + 'community_menu', + 'support_menu', + ], + $wp_admin_bar + ); + + foreach ( $items as $item ) { + + $this->{ $item }( $wp_admin_bar ); + + do_action( "wpforms_admin_adminbarmenu_register_{$item}_after", $wp_admin_bar ); + } + + $this->register_settings_submenu( $wp_admin_bar ); + $this->register_tools_submenu( $wp_admin_bar ); + } + + /** + * Register Settings submenu. + * + * @since 1.9.2 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + private function register_settings_submenu( WP_Admin_Bar $wp_admin_bar ) { + + /** + * Filters the Settings submenu items. + * + * @since 1.9.2 + * + * @param array $items Array of submenu items. + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + $items = (array) apply_filters( + 'wpforms_admin_bar_menu_register_settings_submenu', + [ + 'wpforms-general-settings' => [ + 'title' => __( 'General', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=general', + ], + 'wpforms-email-settings' => [ + 'title' => __( 'Email', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=email', + ], + 'wpforms-captcha-settings' => [ + 'title' => __( 'CAPTCHA', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=captcha', + ], + 'wpforms-validation-settings' => [ + 'title' => __( 'Validation', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=validation', + ], + 'wpforms-payments-settings' => [ + 'title' => __( 'Payments', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=payments', + ], + 'wpforms-integrations-settings' => [ + 'title' => __( 'Integrations', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=integrations', + ], + 'wpforms-geolocation-settings' => [ + 'title' => __( 'Geolocation', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=geolocation', + ], + 'wpforms-access-settings' => [ + 'title' => __( 'Access Control', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=access', + ], + 'wpforms-misc-settings' => [ + 'title' => __( 'Misc', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-settings&view=misc', + ], + ], + $wp_admin_bar + ); + + foreach ( $items as $item_id => $args ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-settings', + 'id' => sanitize_key( $item_id ), + 'title' => esc_html( $args['title'] ), + 'href' => admin_url( $args['path'] ), + ] + ); + + /** + * Fires after the Settings submenu item is registered. + * + * @since 1.9.2 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + do_action( "wpforms_admin_bar_menu_register_settings_submenu_{$item_id}_after", $wp_admin_bar ); + } + } + + /** + * Register Tools submenu. + * + * @since 1.9.3 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + private function register_tools_submenu( WP_Admin_Bar $wp_admin_bar ) { + + /** + * Filters the Tools submenu items. + * + * @since 1.9.3 + * + * @param array $items Array of submenu items. + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + * + * @return array + */ + $items = (array) apply_filters( + 'wpforms_admin_bar_menu_register_tools_submenu', + [ + 'wpforms-tools-import' => [ + 'title' => esc_html__( 'Import', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=import', + ], + 'wpforms-tools-export' => [ + 'title' => esc_html__( 'Export', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=export', + ], + 'wpforms-tools-entry-automation' => [ + 'title' => esc_html__( 'Entry Automation', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=entry-automation', + ], + 'wpforms-tools-system' => [ + 'title' => esc_html__( 'System Info', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=system', + ], + 'wpforms-tools-action-scheduler' => [ + 'title' => esc_html__( 'Scheduled Actions', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=action-scheduler&s=wpforms', + ], + 'wpforms-tools-logs' => [ + 'title' => esc_html__( 'Logs', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=logs', + ], + 'wpforms-tools-wpcode' => [ + 'title' => esc_html__( 'Code Snippets', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=wpcode', + ], + ], + $wp_admin_bar + ); + + foreach ( $items as $item_id => $args ) { + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-tools', + 'id' => sanitize_key( $item_id ), + 'title' => esc_html( $args['title'] ), + 'href' => admin_url( $args['path'] ), + ] + ); + + /** + * Fires after the Tools submenu item is registered. + * + * @since 1.9.2 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + do_action( "wpforms_admin_bar_menu_register_tools_submenu_{$item_id}_after", $wp_admin_bar ); + } + + $this->register_action_scheduler_submenu( $wp_admin_bar ); + } + + /** + * Register Action Scheduler submenu. + * + * @since 1.9.3 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + private function register_action_scheduler_submenu( WP_Admin_Bar $wp_admin_bar ) { + + /** + * Filters the Action Scheduler submenu items. + * + * @since 1.9.3 + * + * @param array $items Array of submenu items. + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + * + * @return array + */ + $items = apply_filters( + 'wpforms_admin_bar_menu_register_action_scheduler_submenu', + [ + 'wpforms-tools-action-scheduler-all' => [ + 'title' => esc_html__( 'View All', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=action-scheduler&s=wpforms&orderby=hook&order=desc', + ], + 'wpforms-tools-action-scheduler-complete' => [ + 'title' => esc_html__( 'Completed Actions', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=action-scheduler&s=wpforms&status=complete&orderby=hook&order=desc', + ], + 'wpforms-tools-action-scheduler-failed' => [ + 'title' => esc_html__( 'Failed Actions', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=action-scheduler&s=wpforms&status=failed&orderby=hook&order=desc', + ], + 'wpforms-tools-action-scheduler-pending' => [ + 'title' => esc_html__( 'Pending Actions', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=action-scheduler&s=wpforms&status=pending&orderby=hook&order=desc', + ], + 'wpforms-tools-action-scheduler-past-due' => [ + 'title' => esc_html__( 'Past Due Actions', 'wpforms-lite' ), + 'path' => 'admin.php?page=wpforms-tools&view=action-scheduler&s=wpforms&status=past-due&orderby=hook&order=desc', + ], + ], + $wp_admin_bar + ); + + foreach ( $items as $item_id => $args ) { + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-tools-action-scheduler', + 'id' => sanitize_key( $item_id ), + 'title' => esc_html( $args['title'] ), + 'href' => admin_url( $args['path'] ), + ] + ); + + /** + * Fires after the Action Scheduler submenu item is registered. + * + * @since 1.9.3 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + do_action( "wpforms_admin_bar_menu_register_action_scheduler_submenu_{$item_id}_after", $wp_admin_bar ); + } + } + + /** + * Render primary top-level admin bar menu item. + * + * @since 1.6.0 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function main_menu( WP_Admin_Bar $wp_admin_bar ) { + + $indicator = ''; + $notifications = $this->has_notifications(); + + if ( $notifications ) { + $count = $notifications < 10 ? $notifications : '!'; + $indicator = '
              ' . $count . '
              '; + } + + $wp_admin_bar->add_menu( + [ + 'id' => 'wpforms-menu', + 'title' => 'WPForms' . $indicator, + 'href' => admin_url( 'admin.php?page=wpforms-overview' ), + ] + ); + } + + /** + * Render Notifications admin bar menu item. + * + * @since 1.6.0 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function notification_menu( WP_Admin_Bar $wp_admin_bar ) { + + if ( ! $this->has_notifications() ) { + return; + } + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-notifications', + 'title' => esc_html__( 'Notifications', 'wpforms-lite' ) . '
              ', + 'href' => admin_url( 'admin.php?page=wpforms-overview' ), + ] + ); + } + + /** + * Render All Forms admin bar menu item. + * + * @since 1.6.0 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function all_forms_menu( WP_Admin_Bar $wp_admin_bar ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-forms', + 'title' => esc_html__( 'All Forms', 'wpforms-lite' ), + 'href' => admin_url( 'admin.php?page=wpforms-overview' ), + ] + ); + } + + /** + * Render All Payments admin bar menu item. + * + * @since 1.8.4 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function all_payments_menu( WP_Admin_Bar $wp_admin_bar ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-payments', + 'title' => esc_html__( 'Payments', 'wpforms-lite' ), + 'href' => add_query_arg( + [ + 'page' => 'wpforms-payments', + ], + admin_url( 'admin.php' ) + ), + ] + ); + } + + /** + * Render Add New admin bar menu item. + * + * @since 1.6.0 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function add_new_menu( WP_Admin_Bar $wp_admin_bar ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-add-new', + 'title' => esc_html__( 'Add New Form', 'wpforms-lite' ), + 'href' => admin_url( 'admin.php?page=wpforms-builder' ), + ] + ); + } + + /** + * Render Settings admin bar menu item. + * + * @since 1.9.2 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function settings_menu( WP_Admin_Bar $wp_admin_bar ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-settings', + 'title' => esc_html__( 'Settings', 'wpforms-lite' ), + 'href' => admin_url( 'admin.php?page=wpforms-settings' ), + ] + ); + } + + /** + * Add Tools menu to the admin bar. + * + * @since 1.9.3 + * + * @param WP_Admin_Bar $wp_admin_bar The admin bar object. + */ + public function tools_menu( WP_Admin_Bar $wp_admin_bar ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-tools', + 'title' => esc_html__( 'Tools', 'wpforms-lite' ), + 'href' => admin_url( 'admin.php?page=wpforms-tools' ), + ] + ); + } + + /** + * Render Community admin bar menu item. + * + * @since 1.6.0 + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function community_menu( WP_Admin_Bar $wp_admin_bar ) { + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-community', + 'title' => esc_html__( 'Community', 'wpforms-lite' ), + 'href' => 'https://www.facebook.com/groups/wpformsvip/', + 'meta' => [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + ], + ] + ); + } + + /** + * Render Support admin bar menu item. + * + * @since 1.6.0 + * @since 1.7.4 Update the `Support` item title to `Help Docs`. + * + * @param WP_Admin_Bar $wp_admin_bar WordPress Admin Bar object. + */ + public function support_menu( WP_Admin_Bar $wp_admin_bar ) { + + $href = add_query_arg( + [ + 'utm_campaign' => wpforms()->is_pro() ? 'plugin' : 'liteplugin', + 'utm_medium' => 'admin-bar', + 'utm_source' => 'WordPress', + 'utm_content' => 'Documentation', + ], + 'https://wpforms.com/docs/' + ); + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wpforms-menu', + 'id' => 'wpforms-help-docs', + 'title' => esc_html__( 'Help Docs', 'wpforms-lite' ), + 'href' => $href, + 'meta' => [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + ], + ] + ); + } + + /** + * Get form data for JS to modify the admin bar menu. + * + * @since 1.6.5 + * @since 1.8.4 Added the View Payments link. + * + * @param array $forms Forms array. + * + * @return array + */ + protected function get_forms_data( $forms ) { + + $data = [ + 'has_notifications' => $this->has_notifications(), + 'edit_text' => esc_html__( 'Edit Form', 'wpforms-lite' ), + 'entry_text' => esc_html__( 'View Entries', 'wpforms-lite' ), + 'payment_text' => esc_html__( 'View Payments', 'wpforms-lite' ), + 'survey_text' => esc_html__( 'Survey Results', 'wpforms-lite' ), + 'forms' => [], + ]; + + $admin_url = admin_url( 'admin.php' ); + + foreach ( $forms as $form ) { + $form_id = absint( $form['id'] ); + + if ( empty( $form_id ) ) { + continue; + } + + /* translators: %d - form ID. */ + $form_title = sprintf( esc_html__( 'Form ID: %d', 'wpforms-lite' ), $form_id ); + + if ( ! empty( $form['settings']['form_title'] ) ) { + $form_title = wp_html_excerpt( + sanitize_text_field( $form['settings']['form_title'] ), + 99, + '…' + ); + } + + $has_payments = wpforms()->obj( 'payment' )->get_by( 'form_id', $form_id ); + + $data['forms'][] = apply_filters( + 'wpforms_admin_adminbarmenu_get_form_data', + [ + 'form_id' => $form_id, + 'title' => $form_title, + 'edit_url' => add_query_arg( + [ + 'page' => 'wpforms-builder', + 'view' => 'fields', + 'form_id' => $form_id, + ], + $admin_url + ), + 'payments_url' => $has_payments ? add_query_arg( + [ + 'page' => 'wpforms-payments', + 'form_id' => $form_id, + ], + $admin_url + ) : '', + ] + ); + } + + return $data; + } + + /** + * Add form(s) data to the page. + * + * @since 1.6.5 + * + * @param array $forms Forms array. + */ + public function menu_forms_data_html( $forms ) { + + if ( empty( $forms ) ) { + return; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'admin-bar-menu', + [ + 'forms_data' => $this->get_forms_data( $forms ), + ], + true + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/DataObjects/ColumnBase.php b/wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/DataObjects/ColumnBase.php new file mode 100755 index 00000000..6d7f6811 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/DataObjects/ColumnBase.php @@ -0,0 +1,155 @@ +id = $id; + $this->label = $settings['label'] ?? ''; + $this->label_html = empty( $settings['label_html'] ) ? $this->label : $settings['label_html']; + $this->is_draggable = $settings['draggable'] ?? true; + $this->type = empty( $settings['type'] ) ? $id : $settings['type']; + $this->readonly = $settings['readonly'] ?? false; + } + + /** + * Get column ID. + * + * @since 1.8.6 + * + * @return string|int + */ + public function get_id() { + + return $this->id; + } + + /** + * Get column label. + * + * @since 1.8.6 + * + * @return string + */ + public function get_label(): string { + + return $this->label; + } + + /** + * Get column label HTML. + * + * @since 1.8.6 + * + * @return string + */ + public function get_label_html(): string { + + return $this->label_html; + } + + /** + * Get the column type. + * + * @since 1.8.6 + * + * @return string + */ + public function get_type(): string { + + return $this->type; + } + + /** + * Is column draggable. + * + * @since 1.8.6 + * + * @return bool + */ + public function is_draggable(): bool { + + return $this->is_draggable; + } + + /** + * Is column readonly. + * + * @since 1.8.6 + * + * @return bool + */ + public function is_readonly(): bool { + + return $this->readonly; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/Facades/ColumnsBase.php b/wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/Facades/ColumnsBase.php new file mode 100755 index 00000000..d827557a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Base/Tables/Facades/ColumnsBase.php @@ -0,0 +1,85 @@ +'; + + foreach ( $links as $slug => $link ) { + self::render_link( $slug, $link ); + } + + echo ''; + } + + /** + * Render a single link. + * + * @since 1.9.7 + * + * @param string $slug The slug for the link. + * @param array $link The link data. + */ + private static function render_link( string $slug, array $link ): void { + + $url = $link['url'] ?? '#'; + $text = $link['text'] ?? ''; + $class = $link['class'] ?? ''; + $target = $link['target'] ?? '_self'; + $icon = $link['icon'] ?? ''; + + printf( + '%6$s%5$s', + esc_url( $url ), + esc_attr( $target ), + esc_attr( $slug ), + esc_attr( $class ), + esc_html( $text ), + wp_kses( + $icon, + [ + 'svg' => [ + 'xmlns' => true, + 'width' => true, + 'height' => true, + 'viewbox' => true, + 'fill' => true, + ], + 'path' => [ + 'd' => true, + 'fill' => true, + ], + ] + ) + ); + } + + /** + * Get links. + * + * @since 1.9.7 + * + * @param array $utm_params UTM parameters to append to links. + * + * @return array + */ + private static function get_links( array $utm_params ): array { + + return [ + 'docs' => [ + 'url' => self::get_utm_link( + 'https://wpforms.com/docs/', + $utm_params['docs'] ?? [] + ), + 'text' => esc_html__( 'Docs', 'wpforms-lite' ), + 'target' => '_blank', + 'icon' => '', + ], + 'videos' => [ + 'url' => 'https://www.youtube.com/@wpforms/videos', + 'text' => esc_html__( 'Videos', 'wpforms-lite' ), + 'target' => '_blank', + 'icon' => '', + ], + 'support' => [ + 'url' => wpforms()->is_pro() ? + self::get_utm_link( + 'https://wpforms.com/account/support/', + $utm_params['support'] ?? [] + ) : 'https://wordpress.org/support/plugin/wpforms-lite/', + 'text' => wpforms()->is_pro() ? esc_html__( 'Support', 'wpforms-lite' ) : esc_html__( 'Support Forum', 'wpforms-lite' ), + 'target' => '_blank', + 'icon' => wpforms()->is_pro() ? + '' : + '', + ], + 'whats-new' => [ + 'text' => esc_html__( 'What’s New', 'wpforms-lite' ), + 'class' => 'wpforms-splash-modal-open', + 'icon' => '', + ], + ]; + } + + /** + * Get UTM link. + * + * @since 1.9.7 + * + * @param string $url The URL to which UTM parameters will be added. + * @param array $utm_params UTM parameters to append to the URL. + * + * @return string + */ + private static function get_utm_link( string $url, array $utm_params ): string { + + return wpforms_utm_link( + $url, + $utm_params['medium'] ?? '', + $utm_params['content'] ?? '', + $utm_params['term'] ?? '' + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Addons.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Addons.php new file mode 100755 index 00000000..41906df9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Addons.php @@ -0,0 +1,338 @@ + [ + 'calculation_code', + 'calculation_code_js', + 'calculation_code_php', + 'calculation_is_enabled', + ], + 'form-locker' => [ + 'unique_answer', + ], + 'geolocation' => [ + 'display_map', + 'enable_address_autocomplete', + 'map_position', + ], + 'surveys-polls' => [ + 'survey', + ], + ]; + + /** + * Initialize. + * + * @since 1.9.2 + * + * @noinspection ReturnTypeCanBeDeclaredInspection + */ + public function init() { + + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.2 + */ + private function hooks(): void { + + add_filter( 'wpforms_save_form_args', [ $this, 'save_disabled_addons_options' ], 10, 3 ); + } + + + /** + * Field's options added by an addon can be deleted when the addon is deactivated or have incompatible status. + * The options are fully controlled by the addon when addon is active and compatible. + * + * @since 1.9.2 + * + * @param array|mixed $post_data Post data. + * + * @return array + */ + public function save_disabled_addons_options( $post_data ): array { + + $post_data = (array) $post_data; + $form_obj = wpforms()->obj( 'form' ); + $form_data = json_decode( stripslashes( $post_data['post_content'] ?? '' ), true ); + $form_id = $form_data['id'] ?? ''; + + if ( ! $form_obj || ! $form_id ) { + return $post_data; + } + + $previous_form_data = $form_obj->get( $form_id, [ 'content_only' => true ] ); + $not_validated_addons = Requirements::get_instance()->get_not_validated_addons(); + + if ( empty( $previous_form_data ) || empty( $not_validated_addons ) ) { + return $post_data; + } + + foreach ( $not_validated_addons as $path ) { + $slug = str_replace( 'wpforms-', '', basename( $path, '.php' ) ); + + $this->preserve_addon( $slug, $form_data, $previous_form_data ); + } + + $this->preserve_providers( $form_data, $previous_form_data ); + $this->preserve_payments( $form_data, $previous_form_data ); + + $post_data['post_content'] = wpforms_encode( $form_data ); + + return $post_data; + } + + /** + * Preserve addon fields, settings, panels, notifications, etc. + * + * @since 1.9.3 + * + * @param string $slug Addon slug. + * @param array $form_data Form data. + * @param array $previous_form_data Previous form data. + * + * @return void + */ + private function preserve_addon( string $slug, array &$form_data, array $previous_form_data ): void { + + if ( ! empty( $form_data['fields'] ) && ! empty( $previous_form_data['fields'] ) ) { + $this->preserve_addon_fields_settings( $slug, $form_data['fields'], $previous_form_data['fields'] ); + } + + $this->preserve_addon_panel( $slug, $form_data, $previous_form_data ); + + if ( ! empty( $form_data['settings'] ) && ! empty( $previous_form_data['settings'] ) ) { + $this->preserve_addon_settings( $slug, $form_data['settings'], $previous_form_data['settings'] ); + } + + if ( ! empty( $form_data['settings']['notifications'] ) && ! empty( $previous_form_data['settings']['notifications'] ) ) { + $this->preserve_addon_notifications( + $slug, + $form_data['settings']['notifications'], + $previous_form_data['settings']['notifications'] + ); + } + } + + /** + * Preserve addon fields. + * + * @since 1.9.5 + * + * @param string $slug Addon slug. + * @param array $new_fields Form fields settings. + * @param array $previous_fields Previous form fields settings. + * + * @return void + */ + private function preserve_addon_fields_settings( string $slug, array &$new_fields, array $previous_fields ): void { + + foreach ( $previous_fields as $field_id => $previous_field ) { + $new_field = $new_fields[ $field_id ] ?? []; + + if ( empty( $new_field ) ) { + continue; + } + + $this->preserve_addon_field_settings( $slug, $new_field, $previous_field ); + + $new_fields[ $field_id ] = $new_field; + } + } + + /** + * Preserve addon field. + * + * @since 1.9.5 + * + * @param string $slug Addon slug. + * @param array $new_field Previous form fields settings. + * @param array $previous_field Form fields settings. + * + * @return void + */ + private function preserve_addon_field_settings( string $slug, array &$new_field, array $previous_field ): void { + + $prefix = $this->prepare_prefix( $slug ); + $changed_settings = array_diff_key( $previous_field, $new_field ); + $preserve_fields = self::FIELD_OPTIONS[ $slug ] ?? []; + + foreach ( $changed_settings as $setting_name => $setting_value ) { + if ( + strpos( $setting_name, $prefix ) === 0 || + in_array( $setting_name, $preserve_fields, true ) + ) { + $new_field[ $setting_name ] = $setting_value; + } + } + } + + /** + * Preserve addon panel. + * + * @since 1.9.3 + * + * @param string $slug Addon slug. + * @param array $form_data Form data. + * @param array $previous_form_data Previous form data. + */ + private function preserve_addon_panel( string $slug, array &$form_data, array $previous_form_data ): void { + + $panel = $this->prepare_prefix( $slug ); + + // The addon settings stored its own panel, e.g., $form_data[lead_forms], $form_data[webhooks], etc. + if ( ! empty( $previous_form_data[ $panel ] ) ) { + $form_data[ $panel ] = $previous_form_data[ $panel ]; + } + } + + /** + * Preserve addon settings stored inside the settings panel with a specific prefix. + * e.g. $form_data[settings][{$prefix}_enabled], $form_data[settings][{$prefix}_email], etc. + * + * @since 1.9.4 + * + * @param string $slug Addon option prefix. + * @param array $new_settings Form settings. + * @param array $previous_settings Previous form settings. + */ + private function preserve_addon_settings( string $slug, array &$new_settings, array $previous_settings ): void { + + $prefix = $this->prepare_prefix( $slug ); + + static $legacy_options = [ + 'offline_forms' => [ 'offline_form' ], + 'user_registration' => [ 'user_login_hide', 'user_reset_hide' ], + 'surveys_polls' => [ 'survey_enable', 'poll_enable' ], + ]; + + // BC: User Registration addon has `registration_` prefix instead of `user_registration`. + if ( $prefix === 'user_registration' ) { + $prefix = 'registration'; + } + + foreach ( $previous_settings as $setting_name => $value ) { + if ( strpos( $setting_name, $prefix ) === 0 ) { + $new_settings[ $setting_name ] = $value; + + continue; + } + + // BC: The options don't have a prefix and hard-coded in the `$legacy_options` variable. + if ( isset( $legacy_options[ $prefix ] ) && in_array( $setting_name, $legacy_options[ $prefix ], true ) ) { + $new_settings[ $setting_name ] = $value; + } + } + } + + /** + * Preserve addon notifications. + * + * @since 1.9.4 + * + * @param string $slug Addon slug. + * @param array $new_notifications List of form notifications. + * @param array $previous_notifications Previously saved list of form notifications. + * + * @return void + */ + private function preserve_addon_notifications( string $slug, array &$new_notifications, array $previous_notifications ): void { + + $prefix = $this->prepare_prefix( $slug ); + + foreach ( $previous_notifications as $notification_id => $notification_settings ) { + if ( empty( $new_notifications[ $notification_id ] ) ) { + continue; + } + + $changed_notification_settings = array_diff_key( $notification_settings, $new_notifications[ $notification_id ] ); + + foreach ( $changed_notification_settings as $setting_name => $value ) { + if ( strpos( $setting_name, $prefix ) === 0 ) { + $new_notifications[ $notification_id ][ $setting_name ] = $value; + } + } + } + } + + /** + * Preserve Providers that are not active. + * + * @since 1.9.4 + * + * @param array $form_data Form data. + * @param array $previous_form_data Previous form data. + */ + private function preserve_providers( array &$form_data, array $previous_form_data ): void { + + if ( empty( $previous_form_data['providers'] ) ) { + return; + } + + $active_providers = wpforms_get_providers_available(); + + foreach ( $previous_form_data['providers'] as $slug => $provider ) { + if ( ! empty( $active_providers[ $slug ] ) ) { + continue; + } + + $form_data['providers'][ $slug ] = $provider; + } + } + + /** + * Preserve Payments providers that are not active. + * + * @since 1.9.4 + * + * @param array $form_data Form data. + * @param array $previous_form_data Previous form data. + */ + private function preserve_payments( array &$form_data, array $previous_form_data ): void { + + if ( empty( $previous_form_data['payments'] ) ) { + return; + } + + foreach ( $previous_form_data['payments'] as $slug => $value ) { + if ( ! empty( $form_data['payments'][ $slug ] ) ) { + continue; + } + + $form_data['payments'][ $slug ] = $value; + } + } + + /** + * Convert slug to a addon prefix. + * + * @since 1.9.4 + * + * @param string $slug Addon slug. + * + * @return string + */ + private function prepare_prefix( string $slug ): string { + + return str_replace( '-', '_', $slug ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/PanelLoader.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/PanelLoader.php new file mode 100755 index 00000000..a231909f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/PanelLoader.php @@ -0,0 +1,146 @@ +allow_load() ) { + return; + } + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.6 + */ + private function hooks(): void { + + add_action( 'wp_ajax_wpforms_builder_load_panel', [ $this, 'load_panel_content' ] ); + } + + /** + * Save tags. + * + * @since 1.8.6 + */ + public function load_panel_content(): void { + + check_ajax_referer( 'wpforms-builder', 'nonce' ); + + $form_id = absint( filter_input( INPUT_POST, 'form_id', FILTER_SANITIZE_NUMBER_INT ) ); + + if ( ! wpforms_current_user_can( 'edit_forms', $form_id ) ) { + wp_send_json_error( esc_html__( 'You do not have permission to perform this action.', 'wpforms-lite' ) ); + } + + $data = $this->get_prepared_data( 'load_panel' ); + $panel = $data['panel'] ?? ''; + $panel_class = '\WPForms_Builder_Panel_' . ucfirst( $panel ); + $panel_obj = $this->get_panel_obj( $panel_class, $panel ); + + ob_start(); + $panel_obj->panel_output( [], $panel ); + + $panel_content = ob_get_clean(); + + wp_send_json_success( $panel_content ); + } + + /** + * Get panel object. + * + * @since 1.9.4 + * + * @param string $panel_class Panel class name. + * @param string $panel Panel name. + * + * @return object + */ + private function get_panel_obj( string $panel_class, string $panel ) { + + if ( ! class_exists( $panel_class ) ) { + // Load panel base class. + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/builder/panels/class-base.php'; + + $file = WPFORMS_PLUGIN_DIR . "includes/admin/builder/panels/class-{$panel}.php"; + $file_pro = WPFORMS_PLUGIN_DIR . "pro/includes/admin/builder/panels/class-{$panel}.php"; + + if ( file_exists( $file_pro ) && wpforms()->is_pro() ) { + require_once $file_pro; + } elseif ( file_exists( $file ) ) { + require_once $file; + } + } + + $panel_obj = $panel_class::instance(); + + if ( ! method_exists( $panel_obj, 'panel_content' ) ) { + wp_send_json_error( esc_html__( 'Invalid panel.', 'wpforms-lite' ) ); + } + + return $panel_obj; + } + + /** + * Get prepared data before perform ajax action. + * + * @since 1.8.6 + * + * @param string $action Action: `save` OR `delete`. + * + * @return array + * @noinspection PhpSameParameterValueInspection + */ + private function get_prepared_data( string $action ): array { + + // Run a security check. + if ( ! check_ajax_referer( 'wpforms-builder', 'nonce', false ) ) { + wp_send_json_error( esc_html__( 'Most likely, your session expired. Please reload the page.', 'wpforms-lite' ) ); + } + + // Check for permissions. + if ( ! wpforms_current_user_can( 'edit_forms' ) ) { + wp_send_json_error( esc_html__( 'You are not allowed to perform this action.', 'wpforms-lite' ) ); + } + + $data = []; + + if ( $action === 'load_panel' ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $data['panel'] = ! empty( $_POST['panel'] ) ? sanitize_key( $_POST['panel'] ) : ''; + } + + return $data; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/SaveForm.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/SaveForm.php new file mode 100755 index 00000000..bd615dd0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Ajax/SaveForm.php @@ -0,0 +1,51 @@ +obj( 'form' ); + + if ( ! $form_obj || empty( $fields ) || empty( $form_data['id'] ) ) { + return $fields; + } + + $saved_form_data = $form_obj->get( $form_data['id'], [ 'content_only' => true ] ); + + foreach ( $fields as $field_id => $field_data ) { + if ( empty( $field_data['type'] ) ) { + continue; + } + + /** + * Filter field settings before saving the form. + * + * @since 1.9.4 + * + * @param array $field_data Field data. + * @param array $form_data Forms data. + * @param array $saved_form_data Saved form data. + */ + $fields[ $field_id ] = apply_filters( "wpforms_admin_builder_ajax_save_form_field_{$field_data['type']}", $field_data, $form_data, $saved_form_data ); + } + + return $fields; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/AntiSpam.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/AntiSpam.php new file mode 100755 index 00000000..cd93b702 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/AntiSpam.php @@ -0,0 +1,423 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.7.8 + */ + protected function hooks() { + + add_action( 'wpforms_form_settings_panel_content', [ $this, 'panel_content' ], 10, 2 ); + } + + /** + * Add a content for `Spam Protection and Security` panel. + * + * @since 1.7.8 + * + * @param WPForms_Builder_Panel_Settings $instance Settings panel instance. + */ + public function panel_content( $instance ) { + + $this->form_data = $this->update_settings_form_data( $instance->form_data ); + + echo '
              '; + echo '
              '; + esc_html_e( 'Spam Protection and Security', 'wpforms-lite' ); + echo '
              '; + + $antispam = wpforms_panel_field( + 'toggle', + 'settings', + 'antispam_v3', + $this->form_data, + __( 'Enable modern anti-spam protection', 'wpforms-lite' ), + [ + 'value' => (int) ! empty( $this->form_data['settings']['antispam_v3'] ), + 'tooltip' => __( 'Turn on invisible modern spam protection.', 'wpforms-lite' ), + ], + false + ); + + wpforms_panel_fields_group( + $antispam, + [ + 'description' => __( 'Behind-the-scenes spam filtering that\'s invisible to your visitors.', 'wpforms-lite' ), + 'title' => __( 'Protection', 'wpforms-lite' ), + ] + ); + + if ( ! empty( $this->form_data['settings']['antispam'] ) && empty( $this->form_data['settings']['antispam_v3'] ) ) { + wpforms_panel_field( + 'toggle', + 'settings', + 'antispam', + $this->form_data, + __( 'Enable anti-spam protection', 'wpforms-lite' ), + [ + 'tooltip' => __( 'Turn on invisible spam protection.', 'wpforms-lite' ), + ] + ); + } + + if ( ! empty( $this->form_data['settings']['honeypot'] ) && empty( $this->form_data['settings']['antispam_v3'] ) ) { + wpforms_panel_field( + 'toggle', + 'settings', + 'honeypot', + $this->form_data, + __( 'Enable anti-spam honeypot', 'wpforms-lite' ) + ); + } + + $this->akismet_settings(); + $this->store_spam_entries_settings(); + $this->time_limit_settings(); + $this->captcha_settings(); + + // Hidden setting to store blocked entries by filtering as a spam. + // This setting is needed to keep backward compatibility with old forms. + wpforms_panel_field( + 'checkbox', + 'anti_spam', + 'filtering_store_spam', + $this->form_data, + '', + [ + 'parent' => 'settings', + 'class' => 'wpforms-hidden', + ] + ); + + /** + * Fires once in the end of content panel before Also Available section. + * + * @since 1.7.8 + * + * @param array $form_data Form data and settings. + */ + do_action( 'wpforms_admin_builder_anti_spam_panel_content', $this->form_data ); + + wpforms_panel_fields_group( + $this->get_also_available_block(), + [ + 'unfoldable' => true, + 'default' => 'opened', + 'group' => 'also_available', + 'title' => __( 'Also Available', 'wpforms-lite' ), + 'borders' => [ 'top' ], + ] + ); + + echo '
              '; + } + + /** + * Update the form data on the builder settings panel. + * + * @since 1.9.2 + * + * @param array $form_data Form data. + * + * @return array + */ + private function update_settings_form_data( array $form_data ): array { + + if ( ! $form_data ) { + return $form_data; + } + + // Update `Filtering` store spam entries behaviour. + // Enable for new forms and old forms without any `Filtering` setting enabled. + if ( + empty( $form_data['settings']['anti_spam']['filtering_store_spam'] ) && + empty( $form_data['settings']['anti_spam']['country_filter']['enable'] ) && + empty( $form_data['settings']['anti_spam']['keyword_filter']['enable'] ) + ) { + $form_data['settings']['anti_spam']['filtering_store_spam'] = true; + } + + return $form_data; + } + + /** + * Output the *CAPTCHA settings. + * + * @since 1.7.8 + */ + private function captcha_settings() { + + $captcha_settings = wpforms_get_captcha_settings(); + + if ( empty( $captcha_settings['provider'] ) || $captcha_settings['provider'] === 'none' ) { + return; + } + + if ( + $captcha_settings['provider'] !== 'hcaptcha' && ( + empty( $captcha_settings['site_key'] ) || empty( $captcha_settings['secret_key'] ) + ) + ) { + return; + } + + if ( $captcha_settings['provider'] === 'hcaptcha' && empty( $captcha_settings['site_key'] ) ) { + return; + } + + $captcha_types = [ + 'hcaptcha' => __( 'Enable hCaptcha', 'wpforms-lite' ), + 'turnstile' => __( 'Enable Cloudflare Turnstile', 'wpforms-lite' ), + 'recaptcha' => [ + 'v2' => __( 'Enable Google Checkbox v2 reCAPTCHA', 'wpforms-lite' ), + 'invisible' => __( 'Enable Google Invisible v2 reCAPTCHA', 'wpforms-lite' ), + 'v3' => __( 'Enable Google v3 reCAPTCHA', 'wpforms-lite' ), + ], + ]; + + $is_recaptcha = $captcha_settings['provider'] === 'recaptcha'; + $captcha_types = $is_recaptcha ? $captcha_types['recaptcha'] : $captcha_types; + $captcha_key = $is_recaptcha ? $captcha_settings['recaptcha_type'] : $captcha_settings['provider']; + $label = ! empty( $captcha_types[ $captcha_key ] ) ? $captcha_types[ $captcha_key ] : ''; + + $recaptcha = wpforms_panel_field( + 'toggle', + 'settings', + 'recaptcha', + $this->form_data, + $label, + [ + 'data' => [ + 'provider' => $captcha_settings['provider'], + ], + 'tooltip' => __( 'Enable third-party CAPTCHAs to prevent form submissions from bots.', 'wpforms-lite' ), + ], + false + ); + + wpforms_panel_fields_group( + $recaptcha, + [ + 'description' => __( 'Automated tests that help to prevent bots from submitting your forms.', 'wpforms-lite' ), + 'title' => __( 'CAPTCHA', 'wpforms-lite' ), + 'borders' => [ 'top' ], + ] + ); + } + + /** + * Output the Spam Entries Store settings. + * + * @since 1.8.3 + */ + public function store_spam_entries_settings() { + + if ( ! wpforms()->is_pro() ) { + return; + } + + $disable_entries = $this->form_data['settings']['disable_entries'] ?? 0; + + wpforms_panel_field( + 'toggle', + 'settings', + 'store_spam_entries', + $this->form_data, + __( 'Store spam entries in the database', 'wpforms-lite' ), + [ + 'value' => $this->form_data['settings']['store_spam_entries'] ?? 0, + 'class' => $disable_entries ? 'wpforms-hidden' : '', + ] + ); + } + + /** + * Output the Time Limit settings. + * + * @since 1.8.3 + */ + private function time_limit_settings() { + + wpforms_panel_field( + 'toggle', + 'anti_spam', + 'enable', + $this->form_data, + __( 'Enable minimum time to submit', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'subsection' => 'time_limit', + 'tooltip' => __( 'Set a minimum amount of time a user must spend on a form before submitting.', 'wpforms-lite' ), + 'input_class' => 'wpforms-panel-field-toggle-next-field', + ] + ); + + wpforms_panel_field( + 'text', + 'anti_spam', + 'duration', + $this->form_data, + __( 'Minimum time to submit', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'subsection' => 'time_limit', + 'type' => 'number', + 'min' => 1, + 'default' => 2, + 'after' => sprintf( '%s', __( 'seconds', 'wpforms-lite' ) ), + ] + ); + } + + /** + * Output the Akismet settings. + * + * @since 1.7.8 + */ + private function akismet_settings() { + + if ( ! Akismet::is_installed() ) { + return; + } + + $args = []; + + if ( ! Akismet::is_configured() ) { + $args['data']['akismet-status'] = 'akismet_no_api_key'; + } + + if ( ! Akismet::is_activated() ) { + $args['data']['akismet-status'] = 'akismet_not_activated'; + } + + // If Akismet isn't available, disable the Akismet toggle. + if ( isset( $args['data'] ) ) { + $args['input_class'] = 'wpforms-akismet-disabled'; + $args['value'] = '0'; + } + + wpforms_panel_field( + 'toggle', + 'settings', + 'akismet', + $this->form_data, + __( 'Enable Akismet anti-spam protection', 'wpforms-lite' ), + $args + ); + } + + /** + * Get the Also Available block. + * + * @since 1.7.8 + * + * @return string + */ + private function get_also_available_block() { + + $get_started_button_text = __( 'Get Started →', 'wpforms-lite' ); + $upgrade_to_pro_text = __( 'Upgrade to Pro', 'wpforms-lite' ); + $captcha_settings = wpforms_get_captcha_settings(); + $upgrade_url = 'https://wpforms.com/lite-upgrade/'; + $utm_medium = 'Builder Settings'; + + $blocks = [ + 'country_filter' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/country-filter.svg', + 'title' => __( 'Country Filter', 'wpforms-lite' ), + 'description' => __( 'Stop spam at its source. Allow or deny entries from specific countries.', 'wpforms-lite' ), + 'link' => wpforms_utm_link( $upgrade_url, $utm_medium, 'Country Filter Feature' ), + 'link_text' => $upgrade_to_pro_text, + 'class' => 'wpforms-panel-content-also-available-item-upgrade-to-pro', + 'show' => ! wpforms()->is_pro(), + ], + 'keyword_filter' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/keyword-filter.svg', + 'title' => __( 'Keyword Filter', 'wpforms-lite' ), + 'description' => __( 'Block form entries that contain specific words or phrases that you define.', 'wpforms-lite' ), + 'link' => wpforms_utm_link( $upgrade_url, $utm_medium, 'Keyword Filter Feature' ), + 'link_text' => $upgrade_to_pro_text, + 'class' => 'wpforms-panel-content-also-available-item-upgrade-to-pro', + 'show' => ! wpforms()->is_pro(), + ], + 'custom_captcha' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/custom-captcha.svg', + 'title' => __( 'Custom Captcha', 'wpforms-lite' ), + 'description' => __( 'Ask custom questions or require your visitor to answer a random math puzzle.', 'wpforms-lite' ), + 'link' => wpforms()->is_pro() ? '#' : wpforms_utm_link( $upgrade_url, $utm_medium, 'Custom Captcha Addon' ), + 'link_text' => wpforms()->is_pro() ? __( 'Add to Form', 'wpforms-lite' ) : $upgrade_to_pro_text, + 'class' => wpforms()->is_pro() ? 'wpforms-panel-content-also-available-item-add-captcha' : 'wpforms-panel-content-also-available-item-upgrade-to-pro', + 'show' => true, + ], + 'reCAPTCHA' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/recaptcha.svg', + 'title' => 'reCAPTCHA', + 'description' => __( 'Add Google\'s free anti-spam service and choose between visible or invisible CAPTCHAs.','wpforms-lite' ), + 'link' => wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-recaptcha-in-wpforms/', $utm_medium, 'reCAPTCHA Feature' ), + 'link_text' => $get_started_button_text, + 'show' => $captcha_settings['provider'] !== 'recaptcha' || empty( wpforms_setting( 'captcha-provider' ) ), + ], + 'hCaptcha' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/hcaptcha.svg', + 'title' => 'hCaptcha', + 'description' => __( 'Turn on free, privacy-oriented spam prevention that displays a visual CAPTCHA.','wpforms-lite' ), + 'link' => wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-hcaptcha-in-wpforms/', $utm_medium, 'hCaptcha Feature' ), + 'link_text' => $get_started_button_text, + 'show' => $captcha_settings['provider'] !== 'hcaptcha', + ], + 'turnstile' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/cloudflare.svg', + 'title' => 'Cloudflare Turnstile', + 'description' => __( 'Enable free, CAPTCHA-like spam protection that protects data privacy.','wpforms-lite' ), + 'link' => wpforms_utm_link( 'https://wpforms.com/docs/setting-up-cloudflare-turnstile/', $utm_medium, 'Cloudflare Turnstile Feature' ), + 'link_text' => $get_started_button_text, + 'show' => $captcha_settings['provider'] !== 'turnstile', + ], + 'akismet' => [ + 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/akismet.svg', + 'title' => 'Akismet', + 'description' => __( 'Integrate the powerful spam-fighting service trusted by millions of sites.','wpforms-lite' ), + 'link' => wpforms_utm_link( 'https://wpforms.com/docs/setting-up-akismet-anti-spam-protection/', $utm_medium, 'Akismet Feature' ), + 'link_text' => $get_started_button_text, + 'show' => ! Akismet::is_installed(), + ], + ]; + + return wpforms_render( + 'builder/antispam/also-available', + [ 'blocks' => $blocks ], + true + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/ContextMenu.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/ContextMenu.php new file mode 100755 index 00000000..b8158e4a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/ContextMenu.php @@ -0,0 +1,61 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.6 + */ + protected function hooks() { + + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues' ] ); + add_action( 'wpforms_admin_page', [ $this, 'output' ], 20 ); + } + + /** + * Enqueue assets. + * + * @since 1.8.6 + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-context-menu', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/context-menu{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + } + + /** + * Output context menu markup. + * + * @since 1.8.6 + */ + public function output() { + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( 'builder/field-context-menu' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Help.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Help.php new file mode 100755 index 00000000..0bac1e31 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Help.php @@ -0,0 +1,1377 @@ +obj( 'builder_help_cache' ); + $this->docs = $builder_help_cache ? $builder_help_cache->get() : []; + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.6.3 + */ + private function hooks() { + + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues' ] ); + add_action( 'wpforms_admin_page', [ $this, 'output' ], 20 ); + } + + /** + * Enqueue assets. + * + * @since 1.6.3 + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-help', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/help{$min}.js", + [ 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-builder-help', + 'wpforms_builder_help', + $this->get_localized_data() + ); + } + + /** + * Get localized data. + * + * @since 1.6.3 + * + * @return array Localized data. + */ + public function get_localized_data() { + + return [ + 'docs' => $this->docs, + 'categories' => $this->get_categories(), + 'context' => [ + 'terms' => $this->get_context_terms(), + 'docs' => $this->get_context_docs(), + ], + ]; + } + + /** + * Get categories. + * + * @return array Categories data. + * @since 1.6.3 + * + */ + public function get_categories() { + + return [ + 'getting-started' => esc_html__( 'Getting Started', 'wpforms-lite' ), + 'form-creation' => esc_html__( 'Form Creation', 'wpforms-lite' ), + 'entry-management' => esc_html__( 'Entry Management', 'wpforms-lite' ), + 'form-management' => esc_html__( 'Form Management', 'wpforms-lite' ), + 'marketing-integrations' => esc_html__( 'Marketing Integrations', 'wpforms-lite' ), + 'payment-forms' => esc_html__( 'Payment Forms', 'wpforms-lite' ), + 'payment-processing' => esc_html__( 'Payment Processing', 'wpforms-lite' ), + 'spam-prevention-and-security' => esc_html__( 'Spam Prevention and Security', 'wpforms-lite' ), + 'extending-functionality' => esc_html__( 'Extending Functionality', 'wpforms-lite' ), + 'troubleshooting-and-support' => esc_html__( 'Troubleshooting and Support', 'wpforms-lite' ), + ]; + } + + /** + * Get context search terms. + * + * @since 1.6.3 + * + * @return array Search terms by context. + */ + public function get_context_terms() { + + return [ + 'new_form' => 'add form', + 'setup' => 'form template', + 'fields/add_fields' => 'add fields', + 'fields/field_options' => 'field options', + 'fields/field_options/text' => 'single line text', + 'fields/field_options/textarea' => 'paragraph text', + 'fields/field_options/number-slider' => 'number slider', + 'fields/field_options/select' => 'dropdown', + 'fields/field_options/radio' => 'multiple choice', + 'fields/field_options/checkbox' => 'checkboxes', + 'fields/field_options/gdpr-checkbox' => 'gdpr agreement', + 'fields/field_options/email' => 'email', + 'fields/field_options/address' => 'address', + 'fields/field_options/url' => 'website/url', + 'fields/field_options/name' => 'name', + 'fields/field_options/hidden' => 'hidden', + 'fields/field_options/html' => 'html', + 'fields/field_options/content' => 'content', + 'fields/field_options/pagebreak' => 'page break', + 'fields/field_options/entry-preview' => 'entry preview', + 'fields/field_options/password' => 'password', + 'fields/field_options/date-time' => 'date time', + 'fields/field_options/divider' => 'section divider', + 'fields/field_options/phone' => 'phone', + 'fields/field_options/number' => 'numbers', + 'fields/field_options/file-upload' => 'file upload', + 'fields/field_options/captcha' => 'custom captcha', + 'fields/field_options/rating' => 'rating', + 'fields/field_options/richtext' => 'rich text', + 'fields/field_options/layout' => 'layout', + 'fields/field_options/likert_scale' => 'likert scale', + 'fields/field_options/payment-single' => 'single item', + 'fields/field_options/payment-multiple' => 'multiple items', + 'fields/field_options/payment-checkbox' => 'checkbox items', + 'fields/field_options/payment-select' => 'dropdown items', + 'fields/field_options/payment-total' => 'total', + 'fields/field_options/paypal-commerce' => 'paypal checkout', + 'fields/field_options/stripe-credit-card' => 'stripe credit card', + 'fields/field_options/authorize_net' => 'authorize.net credit card', + 'fields/field_options/square' => 'square credit card', + 'fields/field_options/signature' => 'signature', + 'fields/field_options/net_promoter_score' => 'net promoter score', + 'fields/field_options/payment-coupon' => 'coupon', + 'fields/field_options/repeater' => 'repeater', + 'settings/general' => 'settings', + 'settings/anti_spam' => 'spam', + 'settings/themes' => 'themes', + 'settings/notifications' => 'notification emails', + 'settings/confirmation' => 'confirmation message', + 'settings/lead_forms' => 'lead forms', + 'settings/form_abandonment' => 'form abandonment', + 'settings/post_submissions' => 'post submissions', + 'settings/user_registration' => 'user registration', + 'settings/surveys_polls' => 'surveys and polls', + 'settings/conversational_forms' => 'conversational forms', + 'settings/form_locker' => 'form locker', + 'settings/form_pages' => 'form pages', + 'settings/save_resume' => 'save and resume', + 'settings/google_sheets' => 'google sheets', + 'settings/dropbox' => 'dropbox', + 'settings/google_calendar' => 'google calendar', + 'settings/airtable' => 'airtable', + 'settings/google_drive' => 'google drive', + 'settings/notion' => 'notion', + 'settings/webhooks' => 'webhooks', + 'settings/entry_automation' => 'entry automation', + 'settings/pdf' => 'pdf', + 'providers' => '', + 'providers/aweber' => 'aweber', + 'providers/activecampaign' => 'activecampaign', + 'providers/campaign_monitor' => 'campaign monitor', + 'providers/constant_contact' => 'constant contact', + 'providers/convertkit' => 'kit', + 'providers/drip' => 'drip', + 'providers/getresponse' => 'getresponse', + 'providers/getresponse_v3' => 'getresponse', + 'providers/mailchimp' => 'mailchimp', + 'providers/mailchimpv3' => 'mailchimp', + 'providers/mailerlite' => 'mailerlite', + 'providers/mailpoet' => 'mailpoet', + 'providers/make' => 'make', + 'providers/n8n' => 'n8n', + 'providers/zapier' => 'zapier', + 'providers/salesforce' => 'salesforce', + 'providers/sendinblue' => 'brevo', + 'providers/slack' => 'slack', + 'providers/hubspot' => 'hubspot', + 'providers/twilio' => 'twilio', + 'providers/pipedrive' => 'pipedrive', + 'providers/zoho_crm' => 'zoho crm', + 'providers/zoho-crm' => 'zoho crm', + 'payments' => '', + 'payments/paypal_commerce' => 'paypal commerce', + 'payments/paypal_standard' => 'paypal standard', + 'payments/stripe' => 'stripe', + 'payments/authorize_net' => 'authorize.net', + 'payments/square' => 'square', + 'revisions' => 'revisions', + ]; + } + + /** + * Get context (recommended) docs links. + * + * @since 1.6.3 + * + * @return array Docs links by search terms. + */ + public function get_context_docs_links() { + + return [ + 'add form' => [ + '/docs/creating-first-form/', + '/docs/how-to-choose-the-right-form-field-for-your-forms/', + '/docs/how-to-customize-the-submit-button/', + '/docs/generating-forms-with-wpforms-ai/', + ], + 'new form' => [ + '/docs/creating-first-form/', + '/docs/how-to-choose-the-right-form-field-for-your-forms/', + '/docs/how-to-customize-the-submit-button/', + '/docs/generating-forms-with-wpforms-ai/', + ], + 'create form' => [ + '/docs/creating-first-form/', + '/docs/how-to-choose-the-right-form-field-for-your-forms/', + '/docs/how-to-customize-the-submit-button/', + '/docs/generating-forms-with-wpforms-ai/', + ], + 'form template' => [ + '/docs/how-to-create-a-custom-form-template/', + '/docs/generating-forms-with-wpforms-ai/', + ], + 'add fields' => [ + '/docs/how-to-choose-the-right-form-field-for-your-forms/', + ], + 'recaptcha' => [ + '/docs/setup-captcha-wpforms/', + ], + 'spam' => [ + '/docs/how-to-prevent-spam-in-wpforms/', + '/docs/setup-captcha-wpforms/', + '/docs/how-to-install-and-use-custom-captcha-addon-in-wpforms/', + '/docs/setting-up-akismet-anti-spam-protection/', + '/docs/viewing-and-managing-spam-entries/', + ], + 'themes' => [ + '/docs/styling-your-forms/', + ], + 'fields' => [ + '/docs/how-to-choose-the-right-form-field-for-your-forms/', + ], + 'field options' => [ + '/docs/how-to-customize-form-field-options/', + ], + 'field settings' => [ + '/docs/how-to-customize-form-field-options/', + ], + 'conditional logic' => [ + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/setup-form-notification-wpforms/', + '/docs/setup-form-confirmation-wpforms/', + ], + 'single line text' => [ + '/docs/how-to-limit-words-or-characters-in-a-form-field/', + '/docs/how-to-use-custom-input-masks/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/calculations-addon/', + ], + 'paragraph' => [ + '/docs/how-to-limit-words-or-characters-in-a-form-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/calculations-addon/', + ], + 'paragraph text' => [ + '/docs/how-to-limit-words-or-characters-in-a-form-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/calculations-addon/', + ], + 'textarea' => [ + '/docs/how-to-limit-words-or-characters-in-a-form-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/calculations-addon/', + ], + 'input mask' => [ + '/docs/how-to-use-custom-input-masks/', + ], + 'limit words' => [ + '/docs/how-to-limit-words-or-characters-in-a-form-field/', + ], + 'limit characters' => [ + '/docs/how-to-limit-words-or-characters-in-a-form-field/', + ], + 'style' => [ + '/docs/how-to-style-wpforms-with-custom-css-beginners-guide/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-add-custom-css-to-your-wpforms/', + ], + 'custom css' => [ + '/docs/how-to-style-wpforms-with-custom-css-beginners-guide/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-add-custom-css-to-your-wpforms/', + ], + 'css' => [ + '/docs/how-to-style-wpforms-with-custom-css-beginners-guide/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-add-custom-css-to-your-wpforms/', + ], + 'dropdown' => [ + '/docs/how-to-allow-multiple-selections-to-a-dropdown-field-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'select' => [ + '/docs/how-to-allow-multiple-selections-to-a-dropdown-field-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'multiple options' => [ + '/docs/how-to-allow-multiple-selections-to-a-dropdown-field-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'bulk add' => [ + '/docs/how-to-bulk-add-choices-for-multiple-choice-checkbox-and-dropdown-fields/', + ], + 'multiple columns' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/how-to-create-a-multi-column-layout-for-radio-buttons-and-checkboxes/', + ], + 'columns' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/how-to-create-a-multi-column-layout-for-radio-buttons-and-checkboxes/', + ], + 'randomize' => [ + '/docs/how-to-randomize-checkbox-and-multiple-choice-options/', + ], + 'image choices' => [ + '/docs/how-to-add-image-choices-to-fields/', + ], + 'icon choices' => [ + '/docs/using-icon-choices/', + ], + 'multiple choice' => [ + '/docs/how-to-bulk-add-choices-for-multiple-choice-checkbox-and-dropdown-fields/', + '/docs/how-to-create-a-multi-column-layout-for-radio-buttons-and-checkboxes/', + '/docs/how-to-randomize-checkbox-and-multiple-choice-options/', + '/docs/how-to-add-image-choices-to-fields/', + '/docs/using-icon-choices/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'radio' => [ + '/docs/how-to-bulk-add-choices-for-multiple-choice-checkbox-and-dropdown-fields/', + '/docs/how-to-create-a-multi-column-layout-for-radio-buttons-and-checkboxes/', + '/docs/how-to-randomize-checkbox-and-multiple-choice-options/', + '/docs/how-to-add-image-choices-to-fields/', + '/docs/using-icon-choices/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'checkboxes' => [ + '/docs/how-to-bulk-add-choices-for-multiple-choice-checkbox-and-dropdown-fields/', + '/docs/how-to-add-a-terms-of-service-checkbox-to-a-form/', + '/docs/how-to-create-a-multi-column-layout-for-radio-buttons-and-checkboxes/', + '/docs/how-to-randomize-checkbox-and-multiple-choice-options/', + '/docs/how-to-add-image-choices-to-fields/', + '/docs/using-icon-choices/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'checkbox' => [ + '/docs/how-to-bulk-add-choices-for-multiple-choice-checkbox-and-dropdown-fields/', + '/docs/how-to-add-a-terms-of-service-checkbox-to-a-form/', + '/docs/how-to-create-a-multi-column-layout-for-radio-buttons-and-checkboxes/', + '/docs/how-to-randomize-checkbox-and-multiple-choice-options/', + '/docs/how-to-add-image-choices-to-fields/', + '/docs/using-icon-choices/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/generating-form-choices-with-wpforms-ai/', + ], + 'gdpr' => [ + '/docs/how-to-create-gdpr-compliant-forms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'gdpr agreement' => [ + '/docs/how-to-create-gdpr-compliant-forms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'number slider' => [ + '/docs/how-to-add-a-number-slider-field-to-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'range' => [ + '/docs/how-to-add-a-number-slider-field-to-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'email' => [ + '/docs/setup-form-notification-wpforms/', + '/docs/customizing-form-notification-emails/', + '/docs/how-to-create-conditional-form-notifications-in-wpforms/', + '/docs/troubleshooting-email-notifications/', + '/docs/how-to-fix-wordpress-contact-form-not-sending-email-with-smtp/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'address' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'field' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'state' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'province' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'region' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'city' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'country' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'zip code' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'postal code' => [ + '/docs/how-to-customize-the-address-field/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'hidden' => [ + '/docs/how-to-choose-the-right-form-field-for-your-forms/', + '/docs/how-to-use-smart-tags-in-wpforms/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/calculations-addon/', + ], + 'rating' => [ + '/docs/how-to-add-a-rating-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'star' => [ + '/docs/how-to-add-a-rating-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'rich text' => [ + '/docs/how-to-use-the-rich-text-field-in-wpforms/', + ], + 'wysiwyg' => [ + '/docs/how-to-use-the-rich-text-field-in-wpforms/', + ], + 'editor' => [ + '/docs/how-to-use-the-rich-text-field-in-wpforms/', + ], + 'rich editor' => [ + '/docs/how-to-use-the-rich-text-field-in-wpforms/', + ], + 'layout' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + ], + 'two columns' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/using-the-repeater-field/', + ], + 'three columns' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/using-the-repeater-field/', + ], + 'four columns' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/using-the-repeater-field/', + ], + 'fields horizontally' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/using-the-repeater-field/', + ], + 'fields in a row' => [ + '/docs/how-to-use-the-layout-field-in-wpforms/', + '/docs/using-the-repeater-field/', + ], + 'repeater' => [ + '/docs/using-the-repeater-field/', + ], + 'repeatable' => [ + '/docs/using-the-repeater-field/', + ], + 'replicate fields' => [ + '/docs/using-the-repeater-field/', + ], + 'page break' => [ + '/docs/how-to-create-multi-page-forms-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'page' => [ + '/docs/how-to-create-multi-page-forms-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'entry preview' => [ + '/docs/how-to-show-entry-previews-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'break' => [ + '/docs/how-to-create-multi-page-forms-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'multi-page' => [ + '/docs/how-to-create-multi-page-forms-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'password' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'name' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'first' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'last' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'surname' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'custom captcha' => [ + '/docs/how-to-install-and-use-custom-captcha-addon-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'numbers' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/calculations-addon/', + ], + 'website/url' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'website' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'url' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'html' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'content' => [ + 'docs/using-the-content-field/', + ], + 'code' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'date/time' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-customize-the-date-time-field-in-wpforms/', + ], + 'date' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-customize-the-date-time-field-in-wpforms/', + ], + 'time' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-customize-the-date-time-field-in-wpforms/', + ], + 'calendar' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/how-to-customize-the-date-time-field-in-wpforms/', + ], + 'section divider' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'section' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'divider' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'header' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'phone' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'telephone' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'mobile' => [ + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'file upload' => [ + '/docs/a-complete-guide-to-the-file-upload-field/', + '/docs/how-to-allow-additional-file-upload-types/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'file' => [ + '/docs/a-complete-guide-to-the-file-upload-field/', + '/docs/how-to-allow-additional-file-upload-types/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'upload' => [ + '/docs/a-complete-guide-to-the-file-upload-field/', + '/docs/how-to-allow-additional-file-upload-types/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'signature' => [ + '/docs/how-to-install-and-use-the-signature-addon-in-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'likert scale' => [ + '/docs/how-to-add-a-likert-scale-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'likert' => [ + '/docs/how-to-add-a-likert-scale-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'scale' => [ + '/docs/how-to-add-a-likert-scale-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'net promoter score' => [ + '/docs/how-to-add-a-net-promoter-score-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'net' => [ + '/docs/how-to-add-a-net-promoter-score-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'promoter' => [ + '/docs/how-to-add-a-net-promoter-score-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'score' => [ + '/docs/how-to-add-a-net-promoter-score-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'nps' => [ + '/docs/how-to-add-a-net-promoter-score-field-to-wpforms/', + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'coupon' => [ + '/docs/coupons-addon/', + ], + 'discount' => [ + '/docs/coupons-addon/', + ], + 'payment' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + ], + 'price' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + ], + 'cost' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + ], + 'single item' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + '/docs/calculations-addon/', + ], + 'multiple items' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + '/docs/how-to-add-image-choices-to-fields/', + '/docs/using-icon-choices/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'checkbox items' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + '/docs/how-to-add-image-choices-to-fields/', + '/docs/using-icon-choices/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'dropdown items' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'total' => [ + '/docs/viewing-and-managing-payments/', + '/docs/how-to-require-payment-total-with-a-wordpress-form/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/paypal-commerce-addon/', + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-create-a-donation-form-with-multiple-amounts/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/how-to-customize-the-style-of-individual-form-fields/', + ], + 'paypal checkout' => [ + '/docs/paypal-commerce-addon/', + '/docs/testing-payments-with-the-paypal-commerce-addon/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/viewing-and-managing-payments/', + ], + 'stripe credit card' => [ + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/how-to-test-stripe-payments-on-your-site/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/viewing-and-managing-payments/', + ], + 'authorize.net credit card' => [ + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/viewing-and-managing-payments/', + ], + 'square credit card' => [ + '/docs/how-to-install-and-use-the-square-addon-with-wpforms/', + '/docs/how-to-test-square-payments-on-your-site/', + '/docs/how-to-customize-form-field-options/', + '/docs/how-to-use-conditional-logic-with-wpforms/', + '/docs/viewing-and-managing-payments/', + ], + 'settings' => [ + '/docs/creating-first-form/', + '/docs/setup-form-notification-wpforms/', + '/docs/setup-form-confirmation-wpforms/', + ], + 'submit' => [ + '/docs/how-to-customize-the-submit-button/', + ], + 'button' => [ + '/docs/how-to-customize-the-submit-button/', + ], + 'dynamic population' => [ + '/developers/how-to-enable-dynamic-field-population/', + ], + 'offline' => [ + '/docs/how-to-enable-ajax-form-submissions/', + ], + 'offline forms' => [ + '/docs/how-to-enable-ajax-form-submissions/', + ], + 'notification' => [ + '/docs/setup-form-notification-wpforms/', + '/docs/customizing-form-notification-emails/', + '/docs/how-to-create-conditional-form-notifications-in-wpforms/', + '/docs/troubleshooting-email-notifications/', + '/docs/how-to-fix-wordpress-contact-form-not-sending-email-with-smtp/', + '/docs/pdf-addon/', + ], + 'notifications' => [ + '/docs/setup-form-notification-wpforms/', + '/docs/customizing-form-notification-emails/', + '/docs/how-to-create-conditional-form-notifications-in-wpforms/', + '/docs/troubleshooting-email-notifications/', + '/docs/how-to-fix-wordpress-contact-form-not-sending-email-with-smtp/', + '/docs/pdf-addon/', + ], + 'notification email' => [ + '/docs/setup-form-notification-wpforms/', + '/docs/customizing-form-notification-emails/', + '/docs/how-to-create-conditional-form-notifications-in-wpforms/', + '/docs/troubleshooting-email-notifications/', + '/docs/how-to-fix-wordpress-contact-form-not-sending-email-with-smtp/', + '/docs/pdf-addon/', + ], + 'notification emails' => [ + '/docs/setup-form-notification-wpforms/', + '/docs/customizing-form-notification-emails/', + '/docs/how-to-create-conditional-form-notifications-in-wpforms/', + '/docs/troubleshooting-email-notifications/', + '/docs/how-to-fix-wordpress-contact-form-not-sending-email-with-smtp/', + '/docs/pdf-addon/', + ], + 'confirmation' => [ + '/docs/setup-form-confirmation-wpforms/', + '/docs/how-to-create-conditional-form-confirmations/', + ], + 'confirmation message' => [ + '/docs/setup-form-confirmation-wpforms/', + '/docs/how-to-create-conditional-form-confirmations/', + ], + 'redirect' => [ + '/docs/setup-form-confirmation-wpforms/', + '/docs/how-to-create-conditional-form-confirmations/', + ], + 'go to url (redirect)' => [ + '/docs/setup-form-confirmation-wpforms/', + '/docs/how-to-create-conditional-form-confirmations/', + ], + 'confirmation page' => [ + '/docs/setup-form-confirmation-wpforms/', + '/docs/how-to-create-conditional-form-confirmations/', + ], + 'conditional confirmation' => [ + '/docs/setup-form-confirmation-wpforms/', + '/docs/how-to-create-conditional-form-confirmations/', + ], + 'calculation' => [ + '/docs/calculations-addon/', + '/docs/building-formulas-with-the-calculations-addon/', + '/calculations-formula-cheatsheet/', + ], + 'calculations' => [ + '/docs/calculations-addon/', + '/docs/building-formulas-with-the-calculations-addon/', + '/calculations-formula-cheatsheet/', + ], + 'formula' => [ + '/docs/calculations-addon/', + '/docs/building-formulas-with-the-calculations-addon/', + '/calculations-formula-cheatsheet/', + ], + 'conditional calculation' => [ + '/docs/calculations-addon/', + '/docs/building-formulas-with-the-calculations-addon/', + '/calculations-formula-cheatsheet/', + ], + 'lead forms' => [ + '/docs/lead-forms-addon/', + ], + 'form abandonment' => [ + '/docs/how-to-install-and-use-form-abandonment-with-wpforms/', + ], + 'abandonment' => [ + '/docs/how-to-install-and-use-form-abandonment-with-wpforms/', + ], + 'abandon' => [ + '/docs/how-to-install-and-use-form-abandonment-with-wpforms/', + ], + 'lead capture' => [ + '/docs/how-to-install-and-use-form-abandonment-with-wpforms/', + ], + 'post submissions' => [ + '/docs/how-to-install-and-use-the-post-submissions-addon-in-wpforms/', + ], + 'guest post' => [ + '/docs/how-to-install-and-use-the-post-submissions-addon-in-wpforms/', + ], + 'user submission' => [ + '/docs/how-to-install-and-use-the-post-submissions-addon-in-wpforms/', + ], + 'blog' => [ + '/docs/how-to-install-and-use-the-post-submissions-addon-in-wpforms/', + ], + 'post' => [ + '/docs/how-to-install-and-use-the-post-submissions-addon-in-wpforms/', + ], + 'user registration' => [ + '/docs/how-to-install-and-use-user-registration-addon-with-wpforms/', + '/docs/how-to-set-up-custom-user-meta-fields/', + ], + 'register' => [ + '/docs/how-to-install-and-use-user-registration-addon-with-wpforms/', + '/docs/how-to-set-up-custom-user-meta-fields/', + ], + 'registration' => [ + '/docs/how-to-install-and-use-user-registration-addon-with-wpforms/', + '/docs/how-to-set-up-custom-user-meta-fields/', + ], + 'user meta' => [ + '/docs/how-to-install-and-use-user-registration-addon-with-wpforms/', + '/docs/how-to-set-up-custom-user-meta-fields/', + ], + 'user' => [ + '/docs/how-to-install-and-use-user-registration-addon-with-wpforms/', + '/docs/how-to-set-up-custom-user-meta-fields/', + ], + 'surveys' => [ + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + ], + 'polls' => [ + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + ], + 'surveys and polls' => [ + '/docs/how-to-install-and-use-the-surveys-and-polls-addon/', + ], + 'conversational forms' => [ + '/docs/how-to-install-and-use-the-conversational-forms-addon/', + ], + 'conversational' => [ + '/docs/how-to-install-and-use-the-conversational-forms-addon/', + ], + 'form locker' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'password protection' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'entry limit' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'scheduling' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'restrict access' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'limit' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'schedule' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'restrict' => [ + '/docs/how-to-install-and-use-the-form-locker-addon-in-wpforms/', + '/developers/how-to-display-remaining-entry-limit-number/', + ], + 'form pages' => [ + '/docs/how-to-install-and-use-the-form-pages-addon/', + ], + 'save' => [ + '/docs/how-to-install-and-use-the-save-and-resume-addon-with-wpforms/', + ], + 'resume' => [ + '/docs/how-to-install-and-use-the-save-and-resume-addon-with-wpforms/', + ], + 'continue' => [ + '/docs/how-to-install-and-use-the-save-and-resume-addon-with-wpforms/', + ], + 'save and resume' => [ + '/docs/how-to-install-and-use-the-save-and-resume-addon-with-wpforms/', + ], + 'save and continue' => [ + '/docs/how-to-install-and-use-the-save-and-resume-addon-with-wpforms/', + ], + 'webhooks' => [ + '/docs/how-to-install-and-use-the-webhooks-addon-with-wpforms/', + ], + 'aweber' => [ + '/docs/install-use-aweber-addon-wpforms/', + ], + 'campaign monitor' => [ + '/docs/how-to-install-and-use-campaign-monitor-addon-with-wpforms/', + ], + 'constant contact' => [ + '/docs/how-to-connect-constant-contact-with-wpforms/', + ], + 'convertkit' => [ + '/docs/convertkit-addon/', + ], + 'drip' => [ + '/docs/how-to-install-and-use-the-drip-addon-in-wpforms/', + ], + 'dropbox' => [ + '/docs/dropbox-addon/', + ], + 'google-calendar' => [ + '/docs/google-calendar-addon/', + ], + 'google-drive' => [ + '/docs/google-drive-addon/', + ], + 'getresponse' => [ + '/docs/how-to-install-and-use-getresponse-addon-with-wpforms/', + ], + 'google sheets' => [ + '/docs/google-sheets-addon/', + '/docs/google-permissions/', + ], + 'mailchimp' => [ + '/docs/install-use-mailchimp-addon-wpforms/', + ], + 'mailerlite' => [ + '/docs/install-use-mailerlite-addon-wpforms/', + ], + 'mailpoet' => [ + '/docs/mailpoet-addon/', + ], + 'make' => [ + '/docs/make-addon/', + ], + 'zapier' => [ + '/docs/how-to-install-and-use-zapier-addon-with-wpforms/', + ], + 'pipedrive' => [ + '/docs/pipedrive-addon/', + ], + 'salesforce' => [ + '/docs/how-to-install-and-use-the-salesforce-addon-with-wpforms/', + ], + 'sendinblue' => [ + '/docs/how-to-install-and-use-the-sendinblue-addon-with-wpforms/', + ], + 'slack' => [ + '/docs/slack-addon/', + ], + 'hubspot' => [ + '/docs/how-to-install-and-use-the-hubspot-addon-in-wpforms/', + ], + 'twilio' => [ + '/docs/twilio-addon/', + ], + 'zoho crm' => [ + '/docs/zoho-crm-addon/', + ], + 'integrate' => [ + '/docs/how-to-install-and-use-zapier-addon-with-wpforms/', + '/docs/how-to-install-and-use-the-webhooks-addon-with-wpforms/', + '/docs/google-sheets-addon/', + '/docs/n8n-addon/', + ], + 'integration' => [ + '/docs/how-to-install-and-use-zapier-addon-with-wpforms/', + '/docs/how-to-install-and-use-the-webhooks-addon-with-wpforms/', + '/docs/google-sheets-addon/', + '/docs/n8n-addon/', + ], + 'crm' => [ + '/docs/how-to-install-and-use-zapier-addon-with-wpforms/', + '/docs/how-to-install-and-use-the-webhooks-addon-with-wpforms/', + ], + 'api' => [ + '/docs/how-to-install-and-use-zapier-addon-with-wpforms/', + '/docs/how-to-install-and-use-the-webhooks-addon-with-wpforms/', + '/docs/google-sheets-addon/', + '/docs/n8n-addon/', + ], + 'paypal commerce' => [ + '/docs/paypal-commerce-addon/', + '/docs/testing-payments-with-the-paypal-commerce-addon/', + ], + 'paypal standard' => [ + '/docs/install-use-paypal-addon-wpforms/', + '/docs/how-to-test-paypal-payments-before-accepting-real-payments/', + '/docs/how-to-allow-users-to-choose-a-payment-method-on-your-form/', + ], + 'stripe' => [ + '/docs/using-stripe-with-wpforms-lite/', + '/docs/how-to-install-and-use-the-stripe-addon-with-wpforms/', + '/docs/how-to-test-stripe-payments-on-your-site/', + ], + 'authorize' => [ + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + ], + 'authorize.net' => [ + '/docs/how-to-install-and-use-the-authorize-net-addon-with-wpforms/', + ], + 'square' => [ + '/docs/how-to-install-and-use-the-square-addon-with-wpforms/', + '/docs/how-to-test-square-payments-on-your-site/', + ], + 'revisions' => [ + '/docs/how-to-use-form-revisions-in-wpforms/', + ], + 'ai' => [ + '/docs/generating-form-choices-with-wpforms-ai/', + '/docs/generating-forms-with-wpforms-ai/', + ], + 'entry automation' => [ + '/docs/entry-automation-addon/', + ], + 'pdf' => [ + '/docs/pdf-addon/', + ], + 'n8n' => [ + '/docs/n8n-addon/', + ], + 'notion' => [ + '/docs/notion-addon/', + ], + 'airtable' => [ + '/docs/airtable-addon/', + ], + ]; + } + + /** + * Get context (recommended) docs. + * + * @since 1.6.3 + * + * @return array Docs recommended by search terms. + */ + public function get_context_docs() { + + if ( empty( $this->docs ) ) { + return []; + } + + $docs_links = $this->get_context_docs_links(); + $docs = []; + + foreach ( $docs_links as $word => $links ) { + $docs[ $word ] = $this->get_doc_ids( $links ); + } + + return $docs; + } + + /** + * Get doc id. + * + * @since 1.8.3 + * + * @param string $link Absolute link to the doc without the domain part. + * + * @return int Doc id. + */ + private function get_doc_id_int( $link ) { + + if ( empty( $this->docs ) ) { + return 0; + } + + foreach ( $this->docs as $id => $doc ) { + if ( ! empty( $doc['url'] ) && $doc['url'] === 'https://wpforms.com' . $link ) { + return $id; + } + } + + return 0; + } + + /** + * Get doc ids. + * + * @since 1.6.3 + * + * @param array $links Array of the doc links. + * + * @return array Doc ids. + */ + public function get_doc_ids( $links ) { + + $ids = []; + + foreach ( $links as $link ) { + $ids[] = $this->get_doc_id_int( $link ); + } + + return $ids; + } + + /** + * Output help modal markup. + * + * @since 1.6.3 + */ + public function output() { + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'builder/help', + [ + 'settings' => [ + 'docs_url' => 'https://wpforms.com/docs/', + 'support_ticket_url' => 'https://wpforms.com/account/support/', + 'upgrade_url' => 'https://wpforms.com/pricing/', + ], + ], + true + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/HelpCache.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/HelpCache.php new file mode 100755 index 00000000..029a037c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/HelpCache.php @@ -0,0 +1,64 @@ + self::REMOTE_SOURCE, + 'cache_file' => 'docs.json', + /** + * Allow modifying Help Docs cache TTL (time to live). + * + * @since 1.6.3 + * + * @param int $cache_ttl Cache TTL in seconds. Defaults to 1 week. + */ + 'cache_ttl' => (int) apply_filters( 'wpforms_admin_builder_help_cache_ttl', WEEK_IN_SECONDS ), + 'update_action' => 'wpforms_builder_help_cache_update', + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/ImageUpload.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/ImageUpload.php new file mode 100755 index 00000000..b15f0bf7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/ImageUpload.php @@ -0,0 +1,49 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.7.3 + */ + public function hooks(): void { + + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues' ] ); + } + + /** + * Enqueue assets for the Form Builder. + * + * @since 1.9.7.3 + */ + public function enqueues(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-settings-image-upload', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/image-upload{$min}.js", + [ 'wp-util', 'wpforms-builder-settings' ], + WPFORMS_VERSION, + true + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Notifications/Advanced/EmailTemplate.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Notifications/Advanced/EmailTemplate.php new file mode 100755 index 00000000..d6a18320 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Notifications/Advanced/EmailTemplate.php @@ -0,0 +1,189 @@ +hooks(); + } + + /** + * Hooks. + * + * @since 1.8.5 + */ + private function hooks() { + + add_action( 'wpforms_builder_enqueues', [ $this, 'builder_assets' ] ); + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'builder_footer_scripts' ] ); + add_filter( 'wpforms_lite_admin_education_builder_notifications_advanced_settings_content', [ $this, 'settings' ], 5, 3 ); + add_filter( 'wpforms_pro_admin_builder_notifications_advanced_settings_content', [ $this, 'settings' ], 5, 3 ); + } + + /** + * Enqueue assets for the builder. + * + * @since 1.8.5 + */ + public function builder_assets() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-email-template', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/email-template{$min}.js", + [ 'jquery', 'jquery-confirm', 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-builder-email-template', + 'wpforms_builder_email_template', + [ + 'is_pro' => wpforms()->is_pro(), + 'templates' => Helpers::get_email_template_choices( false ), + ] + ); + } + + /** + * Output Email Template modal. + * + * @since 1.8.5 + */ + public function builder_footer_scripts() { + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'builder/notifications/email-template-modal', + [ + 'pro_badge' => ! wpforms()->is_pro() ? EducationHelpers::get_badge( 'Pro' ) : '', + ], + true + ); + } + + /** + * Add Email Template settings. + * + * @since 1.8.5 + * + * @param string $content Notification → Advanced content. + * @param WPForms_Builder_Panel_Settings $settings Builder panel settings. + * @param int $id Notification id. + * + * @return string + */ + public function settings( $content, $settings, $id ) { + + // Retrieve email template choices and disabled choices. + // A few of the email templates are only available in the Pro version and will be disabled for non-Pro users. + // The disabled choices will be added to the select field with a "(Pro)" label appended to the name. + list( $options, $disabled_options ) = $this->get_email_template_options(); + + // Add Email Template field. + $content .= wpforms_panel_field( + 'select', + 'notifications', + 'template', + $settings->form_data, + esc_html__( 'Email Template', 'wpforms-lite' ), + [ + 'default' => '', + 'options' => $options, + 'disabled_options' => $disabled_options, + 'class' => 'wpforms-panel-field-email-template-wrap', + 'input_class' => 'wpforms-panel-field-email-template', + 'parent' => 'settings', + 'subsection' => $id, + 'after' => $this->get_template_modal_link_content(), + 'tooltip' => esc_html__( 'Override the default email template for this specific notification.', 'wpforms-lite' ), + ], + false + ); + + return $content; + } + + /** + * Get Email template choices. + * + * This function will return an array of email template choices and an array of disabled choices. + * The disabled choices are templates that are only available in the Pro version. + * + * @since 1.8.5 + * + * @return array + */ + private function get_email_template_options() { + + // Retrieve the available email template choices. + $choices = Helpers::get_email_template_choices( false ); + + // If there are no templates or the choices are not an array, return empty arrays. + if ( empty( $choices ) || ! is_array( $choices ) ) { + return [ [], [] ]; + } + + // Check if the Pro version is active. + $is_pro = wpforms()->is_pro(); + + // Initialize arrays for options and disabled options. + $options = []; + $disabled_options = []; + + // Iterate through the templates and build the $options array. + foreach ( $choices as $key => $choice ) { + $value = esc_attr( $key ); + $name = esc_html( $choice['name'] ); + $is_disabled = ! $is_pro && isset( $choice['is_pro'] ) && $choice['is_pro']; + + // If the option is disabled for non-Pro users, add it to the disabled options array. + if ( $is_disabled ) { + $disabled_options[] = $value; + } + + // Build the $options array with appropriate labels. + // Pro badge labels are not meant to be translated. + $options[ $key ] = $is_disabled ? sprintf( '%s (Pro)', $name ) : $name; + } + + // Add an empty option to the beginning of the $options array. + // This is a placeholder option that will be replaced with the default template name. + $options = array_merge( [ '' => esc_html__( 'Default Template', 'wpforms-lite' ) ], $options ); + + // Return the options and disabled options arrays. + return [ $options, $disabled_options ]; + } + + /** + * Get Email template modal link content. + * + * @since 1.8.5 + * + * @return string + */ + private function get_template_modal_link_content() { + + return wpforms_render( 'builder/notifications/email-template-link' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Settings/Themes.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Settings/Themes.php new file mode 100755 index 00000000..686e0463 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Settings/Themes.php @@ -0,0 +1,1256 @@ +css_vars_obj = wpforms()->obj( 'css_vars' ); + $this->is_admin = current_user_can( 'manage_options' ); + $this->is_modern = wpforms_get_render_engine() === 'modern'; + $this->is_full_styles = (int) wpforms_setting( 'disable-css', '1' ) === 1; + + $this->size_options = [ + 'small' => esc_html__( 'Small', 'wpforms-lite' ), + 'medium' => esc_html__( 'Medium', 'wpforms-lite' ), + 'large' => esc_html__( 'Large', 'wpforms-lite' ), + ]; + + $this->border_options = [ + 'none' => esc_html__( 'None', 'wpforms-lite' ), + 'solid' => esc_html__( 'Solid', 'wpforms-lite' ), + 'dashed' => esc_html__( 'Dashed', 'wpforms-lite' ), + 'dotted' => esc_html__( 'Dotted', 'wpforms-lite' ), + ]; + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.8 + */ + protected function hooks(): void { + + // If the current user can't add posts, he can't save themes either. Enqueue no-access assets. + if ( ! current_user_can( 'edit_posts' ) ) { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues_no_access' ] ); + add_filter( 'wpforms_builder_panel_sidebar_section_classes', [ $this, 'add_pro_class' ], 10, 3 ); + + return; + } + + add_action( 'wpforms_form_settings_panel_content', [ $this, 'panel_content' ] ); + add_action( 'wpforms_builder_panel_sidebar_after', [ $this, 'sidebar_content' ], 10, 2 ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); + } + + /** + * Enqueue assets for the builder themes. + * + * @since 1.9.7 + */ + public function enqueues(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-themes', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/themes/builder-themes{$min}.js", + [ 'wpforms-builder', 'wp-api-fetch' ], + WPFORMS_VERSION, + true + ); + + wp_enqueue_style( + 'wpforms-full', + WPFORMS_PLUGIN_URL . 'assets/css/frontend/modern/wpforms-full.css', + [], + WPFORMS_VERSION + ); + + wp_localize_script( + 'wpforms-builder-themes', + 'wpforms_builder_themes', + $this->get_localize_data() + ); + + wp_add_inline_style( 'wpforms-full', $this->css_vars_obj->get_root_vars_css() ); + } + + /** + * Enqueue assets for the builder themes for the users who don't have access to the theme settings. + * + * @since 1.9.8 + */ + public function enqueues_no_access(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-builder-themes-no-access', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/themes/builder-themes-no-access{$min}.js", + [ 'wpforms-builder', 'wp-api-fetch' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-builder-themes-no-access', + 'wpforms_builder_themes_no_access', + $this->get_localize_data() + ); + } + + /** + * Add a class to the themes section if the user doesn't have access to it. + * + * @since 1.9.8 + * + * @param array $classes Sidebar section classes. + * @param string $name Sidebar section name. + * @param string $slug Sidebar section slug. + * + * @return array + */ + public function add_pro_class( array $classes, string $name, string $slug ): array { + + if ( $slug !== 'themes' ) { + return $classes; + } + + return array_merge( $classes, [ 'wpforms-panel-sidebar-section-no-access' ] ); + } + + /** + * Get localize data. + * + * @since 1.9.7 + * + * @return array + */ + protected function get_localize_data(): array { + + return [ + 'modules' => $this->get_modules(), + 'sizes' => [ + 'field-size' => CSSVars::FIELD_SIZE, + 'label-size' => CSSVars::LABEL_SIZE, + 'button-size' => CSSVars::BUTTON_SIZE, + 'container-shadow-size' => CSSVars::CONTAINER_SHADOW_SIZE, + ], + 'strings' => [ + 'heads_up' => esc_html__( 'Heads Up!', 'wpforms-lite' ), + 'themes_error' => esc_html__( 'Error loading themes. Please try again later.', 'wpforms-lite' ), + 'button_background' => esc_html__( 'Button Background', 'wpforms-lite' ), + 'button_text' => esc_html__( 'Button Text', 'wpforms-lite' ), + 'copy_paste_error' => esc_html__( 'There was an error parsing your JSON code. Please check your code and try again.', 'wpforms-lite' ), + 'field_label' => esc_html__( 'Field Label', 'wpforms-lite' ), + 'field_sublabel' => esc_html__( 'Field Sublabel', 'wpforms-lite' ), + 'field_border' => esc_html__( 'Field Border', 'wpforms-lite' ), + 'theme_delete_title' => esc_html__( 'Delete Form Theme', 'wpforms-lite' ), + // Translators: %1$s: Theme name. + 'theme_delete_confirm' => esc_html__( 'Are you sure you want to delete the %1$s theme?', 'wpforms-lite' ), + 'theme_delete_cant_undone' => esc_html__( 'This cannot be undone.', 'wpforms-lite' ), + 'theme_delete_yes' => esc_html__( 'Yes, Delete', 'wpforms-lite' ), + 'theme_copy' => esc_html__( 'Copy', 'wpforms-lite' ), + 'theme_custom' => esc_html__( 'Custom Theme', 'wpforms-lite' ), + 'theme_noname' => esc_html__( 'Noname Theme', 'wpforms-lite' ), + 'pro_sections' => [ + 'background' => esc_html__( 'Background Styles', 'wpforms-lite' ), + 'container' => esc_html__( 'Container Styles', 'wpforms-lite' ), + 'themes' => esc_html__( 'Themes', 'wpforms-lite' ), + ], + 'permission_modal' => [ + 'title' => esc_html__( 'Insufficient Permissions', 'wpforms-lite' ), + 'content' => esc_html__( 'Sorry, your user role doesn\'t have permission to access this feature.', 'wpforms-lite' ), + 'confirm' => esc_html__( 'OK', 'wpforms-lite' ), + ], + ], + 'isAdmin' => $this->is_admin, + 'isPro' => wpforms()->is_pro(), + 'isModern' => $this->is_modern, + 'isFullStyles' => $this->is_full_styles, + 'route_namespace' => RestApi::ROUTE_NAMESPACE, + ]; + } + + /** + * Get Form Builder themes modules. + * + * @since 1.9.7 + * + * @return array Modules list. + */ + public function get_modules(): array { + + $min = wpforms_get_min_suffix(); + + return [ + [ + 'name' => 'common', + 'path' => "./modules/common{$min}.js", + ], + [ + 'name' => 'themes', + 'path' => "./modules/themes{$min}.js", + ], + [ + 'name' => 'stockPhotos', + 'path' => "./modules/stock-photos{$min}.js", + ], + [ + 'name' => 'background', + 'path' => "./modules/background{$min}.js", + ], + [ + 'name' => 'advancedSettings', + 'path' => "./modules/advanced-settings{$min}.js", + ], + ]; + } + + /** + * Add a content for `Themes` panel. + * + * @since 1.8.8 + * + * @param WPForms_Builder_Panel_Settings $instance Settings panel instance. + * + * @noinspection HtmlUnknownTarget + */ + public function panel_content( WPForms_Builder_Panel_Settings $instance ): void { + + $this->form_data = $instance->form_data; + $url = wpforms_utm_link( 'https://wpforms.com/docs/styling-your-forms/', 'Builder Themes', 'Description Link' ); + + ?> +
              +
              +
              +
              + +
              + +
              +

              + Learn more about styling your forms.', 'wpforms-lite' ), + $url + ) + ); + ?> +

              + +
              +

              + +

              +

              + +

              +
              + + $this->is_modern, + 'is_full_styles' => $this->is_full_styles, + ], + true + ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( 'builder/themes/preview' ); + ?> +
              + +
              +
              +
              + obj( 'form' ); + + if ( ! $form_obj || ! isset( $form->ID ) ) { + return; + } + + $form_data = $form_obj->get( $form->ID, [ 'content_only' => true ] ); + + $this->form_data = $form_data; + + $this->show_sidebar_html(); + } + + /** + * Show sidebar HTML. + * + * @since 1.9.7 + */ + private function show_sidebar_html(): void { + ?> +
              +
              + +
              +
              + + is_admin ) : ?> + + +
              +
              + +
              + show_sidebar_themes(); ?> +
              + show_sidebar_field_styles(); ?> + show_sidebar_label_styles(); ?> + show_sidebar_button_styles(); ?> + show_sidebar_container_styles(); ?> + show_sidebar_background_styles(); ?> + show_sidebar_other_styles(); ?> +
              +
              +
              + show_sidebar_advanced(); ?> +
              + +
              +
              + +
              + + + + +
              + form_data, + esc_html__( 'Theme', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'hidden', + 'value' => $this->form_data['settings']['themes']['wpformsTheme'] ?? 'default', + 'class' => 'wpforms-hidden', + ] + ); + + wpforms_panel_field( + 'text', + 'themes', + 'isCustomTheme', + $this->form_data, + false, + [ + 'parent' => 'settings', + 'type' => 'hidden', + 'value' => $this->form_data['settings']['themes']['isCustomTheme'] ?? '', + 'class' => 'wpforms-hidden', + ] + ); + + ?> + +
              + + form_data, + esc_html__( 'Theme Name', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'text', + 'value' => $this->form_data['settings']['themes']['themeName'] ?? '', + 'class' => 'wpforms-hidden', + ] + ); + + ?> + + +
              +
              + +
              + + + + +
              +
              + form_data, + esc_html__( 'Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => $this->size_options, + 'value' => $this->form_data['settings']['themes']['fieldSize'] ?? 'medium', + ] + ); + + wpforms_panel_field( + 'select', + 'themes', + 'fieldBorderStyle', + $this->form_data, + esc_html__( 'Border', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => $this->border_options, + 'value' => $this->form_data['settings']['themes']['fieldBorderStyle'] ?? 'solid', + ] + ); + ?> +
              + +
              + form_data, + esc_html__( 'Border Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['fieldBorderSize'] ?? '1', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + wpforms_panel_field( + 'text', + 'themes', + 'fieldBorderRadius', + $this->form_data, + esc_html__( 'Border Radius', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['fieldBorderRadius'] ?? '3', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + ?> +
              + +
              + form_data, + esc_html__( 'Background', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['fieldBackgroundColor'] ?? CSSVars::ROOT_VARS['field-background-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'fieldBorderColor', + $this->form_data, + esc_html__( 'Border', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['fieldBorderColor'] ?? CSSVars::ROOT_VARS['field-border-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'fieldTextColor', + $this->form_data, + esc_html__( 'Text', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['fieldTextColor'] ?? CSSVars::ROOT_VARS['field-text-color'], + ] + ); + + ?> +
              +
              +
              + +
              + + + + +
              +
              + form_data, + esc_html__( 'Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => $this->size_options, + 'value' => $this->form_data['settings']['themes']['labelSize'] ?? 'medium', + ] + ); + + ?> +
              + +
              + form_data, + esc_html__( 'Label', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['labelColor'] ?? CSSVars::ROOT_VARS['label-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'labelSublabelColor', + $this->form_data, + esc_html__( 'Sublabel', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['labelSublabelColor'] ?? CSSVars::ROOT_VARS['label-sublabel-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'labelErrorColor', + $this->form_data, + esc_html__( 'Error', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['labelErrorColor'] ?? CSSVars::ROOT_VARS['label-error-color'], + ] + ); + + ?> +
              +
              +
              + +
              + + + + +
              +
              + form_data, + esc_html__( 'Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => $this->size_options, + 'value' => $this->form_data['settings']['themes']['buttonSize'] ?? 'medium', + ] + ); + + wpforms_panel_field( + 'select', + 'themes', + 'buttonBorderStyle', + $this->form_data, + esc_html__( 'Border', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => $this->border_options, + 'value' => $this->form_data['settings']['themes']['buttonBorderStyle'] ?? CSSVars::ROOT_VARS['button-border-style'], + ] + ); + + ?> +
              + +
              + form_data, + esc_html__( 'Border Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['buttonBorderSize'] ?? '1', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + wpforms_panel_field( + 'text', + 'themes', + 'buttonBorderRadius', + $this->form_data, + esc_html__( 'Border Radius', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['buttonBorderRadius'] ?? '3', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + ?> +
              + +
              + form_data, + esc_html__( 'Background', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['buttonBackgroundColor'] ?? CSSVars::ROOT_VARS['button-background-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'buttonBorderColor', + $this->form_data, + esc_html__( 'Border', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['buttonBorderColor'] ?? CSSVars::ROOT_VARS['button-border-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'buttonTextColor', + $this->form_data, + esc_html__( 'Text', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['buttonTextColor'] ?? CSSVars::ROOT_VARS['button-text-color'], + ] + ); + + ?> +
              +
              +
              + +
              + + + + +
              +
              + form_data, + esc_html__( 'Padding', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['containerPadding'] ?? '0', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + wpforms_panel_field( + 'select', + 'themes', + 'containerBorderStyle', + $this->form_data, + esc_html__( 'Border', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => $this->border_options, + 'value' => $this->form_data['settings']['themes']['containerBorderStyle'] ?? CSSVars::ROOT_VARS['container-border-style'], + ] + ); + + ?> +
              +
              + form_data, + esc_html__( 'Border Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['containerBorderWidth'] ?? '1', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + wpforms_panel_field( + 'text', + 'themes', + 'containerBorderRadius', + $this->form_data, + esc_html__( 'Border Radius', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['containerBorderRadius'] ?? '3', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + ?> +
              + +
              + form_data, + esc_html__( 'Border', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['containerBorderColor'] ?? CSSVars::ROOT_VARS['container-border-color'], + ] + ); + + wpforms_panel_field( + 'select', + 'themes', + 'containerShadowSize', + $this->form_data, + esc_html__( 'Shadow', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => [ + 'none' => esc_html__( 'None', 'wpforms-lite' ), + 'small' => esc_html__( 'Small', 'wpforms-lite' ), + 'medium' => esc_html__( 'Medium', 'wpforms-lite' ), + 'large' => esc_html__( 'Large', 'wpforms-lite' ), + ], + 'value' => $this->form_data['settings']['themes']['containerShadowSize'] ?? CSSVars::CONTAINER_SHADOW_SIZE['none']['box-shadow'], + ] + ); + + ?> +
              +
              +
              + +
              + +
              +
              + form_data, + esc_html__( 'Color', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['backgroundColor'] ?? CSSVars::ROOT_VARS['background-color'], + ] + ); + ?> +
              + +
              + form_data, + esc_html__( 'Image', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => [ + 'none' => esc_html__( 'None', 'wpforms-lite' ), + 'library' => esc_html__( 'Media Library', 'wpforms-lite' ), + 'stock' => esc_html__( 'Stock Photo', 'wpforms-lite' ), + ], + 'value' => $this->form_data['settings']['themes']['backgroundImage'] ?? 'none', + ] + ); + + wpforms_panel_field( + 'select', + 'themes', + 'backgroundPosition', + $this->form_data, + esc_html__( 'Position', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => [ + 'top left' => esc_html__( 'Top Left', 'wpforms-lite' ), + 'top center' => esc_html__( 'Top Center', 'wpforms-lite' ), + 'top right' => esc_html__( 'Top Right', 'wpforms-lite' ), + 'center left' => esc_html__( 'Center Left', 'wpforms-lite' ), + 'center center' => esc_html__( 'Center Center', 'wpforms-lite' ), + 'center right' => esc_html__( 'Center Right', 'wpforms-lite' ), + 'bottom left' => esc_html__( 'Bottom Left', 'wpforms-lite' ), + 'bottom center' => esc_html__( 'Bottom Center', 'wpforms-lite' ), + 'bottom right' => esc_html__( 'Bottom Right', 'wpforms-lite' ), + ], + 'value' => $this->form_data['settings']['themes']['backgroundPosition'] ?? CSSVars::ROOT_VARS['background-position'], + ] + ); + ?> + +
              +
              + form_data, + esc_html__( 'Repeat', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => [ + 'no-repeat' => esc_html__( 'No Repeat', 'wpforms-lite' ), + 'repeat' => esc_html__( 'Tile', 'wpforms-lite' ), + 'repeat-x' => esc_html__( 'Repeat X', 'wpforms-lite' ), + 'repeat-y' => esc_html__( 'Repeat Y', 'wpforms-lite' ), + ], + 'value' => $this->form_data['settings']['themes']['backgroundRepeat'] ?? CSSVars::ROOT_VARS['background-repeat'], + ] + ); + + wpforms_panel_field( + 'select', + 'themes', + 'backgroundSizeMode', + $this->form_data, + esc_html__( 'Size', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'options' => [ + 'dimensions' => esc_html__( 'Dimensions', 'wpforms-lite' ), + 'cover' => esc_html__( 'Cover', 'wpforms-lite' ), + ], + 'value' => $this->form_data['settings']['themes']['backgroundSizeMode'] ?? CSSVars::ROOT_VARS['background-size'], + ] + ); + + wpforms_panel_field( + 'text', + 'themes', + 'backgroundSize', + $this->form_data, + false, + [ + 'parent' => 'settings', + 'type' => 'hidden', + 'value' => $this->form_data['settings']['themes']['backgroundSize'] ?? CSSVars::ROOT_VARS['background-size'], + 'class' => 'wpforms-hidden', + ] + ); + ?> + +
              +
              + form_data, + esc_html__( 'Width', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['backgroundWidth'] ?? '100', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + + wpforms_panel_field( + 'text', + 'themes', + 'backgroundHeight', + $this->form_data, + esc_html__( 'Height', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'type' => 'number', + 'min' => 0, + 'value' => $this->form_data['settings']['themes']['backgroundHeight'] ?? '100', + 'input_class' => 'wpforms-builder-themes-number-input', + 'class' => 'wpforms-builder-themes-number-input-wrapper', + ] + ); + ?> + +
              + +
              + form_data, + false, + [ + 'parent' => 'settings', + 'type' => 'hidden', + 'value' => $this->form_data['settings']['themes']['backgroundUrl'] ?? CSSVars::ROOT_VARS['background-url'], + 'class' => 'wpforms-hidden', + ] + ); + + ?> + +
              + +
              + +
              +
              + +
              + +
              + form_data, + false, + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['fieldMenuColor'] ?? CSSVars::ROOT_VARS['field-menu-color'], + ] + ); + + wpforms_panel_field( + 'color', + 'themes', + 'pageBreakColor', + $this->form_data, + false, + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['pageBreakColor'] ?? CSSVars::ROOT_VARS['page-break-color'], + ] + ); + ?> +
              +
              + is_admin ) { + return; + } + + ?> + form_data, + esc_html__( 'Custom CSS', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['customCss'] ?? '', + 'after' => sprintf( '%s', __( 'Further customize the look of this form without having to edit theme files.', 'wpforms-lite' ) ), + ] + ); + + wpforms_panel_field( + 'textarea', + 'themes', + 'copyPasteJsonValue', + $this->form_data, + esc_html__( 'Copy / Paste Style Settings', 'wpforms-lite' ), + [ + 'parent' => 'settings', + 'value' => $this->form_data['settings']['themes']['copyPasteJsonValue'] ?? '', + 'after' => sprintf( '%s', __( 'If you\'ve copied style settings from another form, you can paste them here to add the same styling to this form. Any current style settings will be overwritten.', 'wpforms-lite' ) ), + ] + ); + ?> + hooks(); + } + + /** + * Hooks. + * + * @since 1.6.9 + */ + private function hooks() { + + add_filter( 'wpforms_builder_strings', [ $this, 'builder_strings' ], 10, 2 ); + add_action( 'wpforms_admin_page', [ $this, 'output' ], 30 ); + } + + /** + * Get shortcuts list. + * + * @since 1.6.9 + * + * @return array + */ + private function get_list() { + + return [ + 'left' => [ + 'ctrl s' => __( 'Save Form', 'wpforms-lite' ), + 'ctrl p' => __( 'Preview Form', 'wpforms-lite' ), + 'ctrl b' => __( 'Embed Form', 'wpforms-lite' ), + 'ctrl f' => __( 'Search Fields', 'wpforms-lite' ), + ], + 'right' => [ + 'ctrl h' => __( 'Open Help', 'wpforms-lite' ), + 'ctrl t' => __( 'Toggle Sidebar', 'wpforms-lite' ), // It is 'alt s' on Windows/Linux, dynamically changed in the modal in admin-builder.js openKeyboardShortcutsModal(). + 'ctrl e' => __( 'View Entries', 'wpforms-lite' ), + 'ctrl q' => __( 'Close Builder', 'wpforms-lite' ), + ], + ]; + } + + /** + * Add Form builder strings. + * + * @since 1.6.9 + * + * @param array $strings Form Builder strings. + * @param \WP_Post|bool $form Form object. + * + * @return array + */ + public function builder_strings( $strings, $form ) { + + $strings['shortcuts_modal_title'] = esc_html__( 'Keyboard Shortcuts', 'wpforms-lite' ); + $strings['shortcuts_modal_msg'] = esc_html__( 'Handy shortcuts for common actions in the builder.', 'wpforms-lite' ); + + return $strings; + } + + /** + * Generate and output shortcuts modal content as the wp.template. + * + * @since 1.6.9 + */ + public function output() { + + echo ' + '; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplateSingleCache.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplateSingleCache.php new file mode 100755 index 00000000..3ac79dbd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplateSingleCache.php @@ -0,0 +1,247 @@ +id = $template_id; + $this->license = $license; + + $this->init(); + + return $this; + } + + /** + * Provide settings. + * + * @since 1.6.8 + * + * @return array Settings array. + */ + protected function setup() { + + return [ + + // Remote source URL. + 'remote_source' => $this->remote_source(), + + // Cache file. + 'cache_file' => $this->get_cache_file_name(), + + // This filter is documented in wpforms/src/Admin/Builder/TemplatesCache.php. + // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WPForms.Comments.PHPDocHooks.RequiredHookDocumentation + 'cache_ttl' => (int) apply_filters( 'wpforms_admin_builder_templates_cache_ttl', WEEK_IN_SECONDS ), + ]; + } + + /** + * Generate single template remote URL. + * + * @since 1.6.8 + * + * @param bool $cache True if the cache arg should be appended to the URL. + * + * @return string + */ + private function remote_source( $cache = false ) { + + if ( ! isset( $this->license['key'] ) ) { + return ''; + } + + $args = [ + 'license' => $this->license['key'], + 'site' => site_url(), + ]; + + if ( $cache ) { + $args['cache'] = 1; + } + + return add_query_arg( + $args, + 'https://wpforms.com/templates/api/get/' . $this->id + ); + } + + /** + * Get cached data. + * + * @since 1.8.2 + * + * @return array Cached data. + */ + public function get() { + + $data = parent::get(); + + if ( ! $this->updated ) { + $this->update_usage_tracking(); + } + + return $data; + } + + /** + * Sends a request to update the form template usage tracking database. + * + * @since 1.7.5 + */ + private function update_usage_tracking() { + + $tasks = wpforms()->obj( 'tasks' ); + + if ( ! $tasks ) { + return; + } + + $url = $this->remote_source( true ); + $args = [ 'blocking' => false ]; + + $tasks->create( AsyncRequestTask::ACTION )->async()->params( $url, $args )->register(); + } + + /** + * Get cache directory path. + * + * @since 1.6.8 + */ + protected function get_cache_dir() { + + return parent::get_cache_dir() . 'templates/'; + } + + /** + * Generate single template cache file name. + * + * @since 1.6.8 + * + * @return string. + */ + private function get_cache_file_name() { + + return sanitize_key( $this->id ) . '.json'; + } + + /** + * Prepare data to store in a local cache. + * + * @since 1.6.8 + * + * @param array $data Raw data received by the remote request. + * + * @return array Prepared data for caching. + */ + protected function prepare_cache_data( $data ): array { + + if ( + empty( $data ) || + ! is_array( $data ) || + empty( $data['status'] ) || + $data['status'] !== 'success' || + empty( $data['data'] ) + ) { + return []; + } + + $cache_data = $data['data']; + $cache_data['data'] = empty( $cache_data['data'] ) ? [] : $cache_data['data']; + $cache_data['data']['settings'] = empty( $cache_data['data']['settings'] ) ? [] : $cache_data['data']['settings']; + $cache_data['data']['settings']['ajax_submit'] = '1'; + + // Strip the word "Template" from the end of the template name and form title setting. + $cache_data['name'] = preg_replace( '/\sTemplate$/', '', $cache_data['name'] ); + $cache_data['data']['settings']['form_title'] = $cache_data['name']; + + // Unset `From Name` field of the notification settings. + // By default, the builder will use the `blogname` option value. + unset( $cache_data['data']['settings']['notifications'][1]['sender_name'] ); + + return $cache_data; + } + + /** + * Wipe cache of an empty templates. + * + * @since 1.7.5 + */ + public function wipe_empty_templates_cache() { + + $cache_dir = $this->get_cache_dir(); + $files = glob( $cache_dir . '*.json' ); + + foreach ( $files as $filename ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + $content = file_get_contents( $filename ); + + if ( empty( $content ) || trim( $content ) === '[]' ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.unlink_unlink + unlink( $filename ); + } + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/Templates.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Templates.php new file mode 100755 index 00000000..bd1c4c6f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/Templates.php @@ -0,0 +1,1308 @@ +allow_load() ) { + return; + } + + $this->init_license_data(); + $this->init_templates_data(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.6.8 + */ + protected function hooks() { + + add_action( 'admin_init', [ $this, 'create_form_on_request' ], 100 ); + add_filter( 'wpforms_form_templates_core', [ $this, 'add_templates_to_setup_panel' ], 20 ); + add_filter( 'wpforms_create_form_args', [ $this, 'apply_to_new_form' ], 10, 2 ); + add_filter( 'wpforms_save_form_args', [ $this, 'apply_to_existing_form' ], 10, 3 ); + add_action( 'admin_print_scripts', [ $this, 'upgrade_banner_template' ] ); + add_action( 'admin_print_scripts', [ $this, 'upgrade_lite_banner_template' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); + add_action( 'wp_ajax_wpforms_templates_favorite', [ $this, 'ajax_save_favorites' ] ); + add_filter( 'wpforms_form_templates', [ $this, 'add_addons_templates' ] ); + } + + /** + * Enqueue assets for the Setup panel. + * + * @since 1.7.7 + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'listjs', + WPFORMS_PLUGIN_URL . 'assets/lib/list.min.js', + [ 'jquery' ], + '2.3.0', + false + ); + + wp_enqueue_script( + 'wpforms-form-templates', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/form-templates{$min}.js", + [ 'underscore', 'wp-util', 'listjs' ], + WPFORMS_VERSION, + true + ); + + $strings = [ + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'admin_nonce' => wp_create_nonce( 'wpforms-admin' ), + 'nonce' => wp_create_nonce( 'wpforms-form-templates' ), + 'can_install_addons' => wpforms_can_install( 'addon' ), + 'activating' => esc_html__( 'Activating', 'wpforms-lite' ), + 'cancel' => esc_html__( 'Cancel', 'wpforms-lite' ), + 'heads_up' => esc_html__( 'Heads Up!', 'wpforms-lite' ), + 'install_confirm' => esc_html__( 'Install and activate', 'wpforms-lite' ), + 'activate_confirm' => esc_html__( 'Activate', 'wpforms-lite' ), + 'ok' => esc_html__( 'Ok', 'wpforms-lite' ), + 'template_addons_error' => esc_html__( 'Could not install OR activate all the required addons. Please download from wpforms.com and install them manually. Would you like to use the template anyway?', 'wpforms-lite' ), + 'use_template' => esc_html__( 'Yes, use template', 'wpforms-lite' ), + 'delete_template' => esc_html__( 'Yes, Delete', 'wpforms-lite' ), + 'delete_template_title' => esc_html__( 'Delete Form Template', 'wpforms-lite' ), + 'delete_template_content' => esc_html__( 'Are you sure you want to delete this form template? This cannot be undone.', 'wpforms-lite' ), + ]; + + if ( $strings['can_install_addons'] ) { + /* translators: %1$s - template name, %2$s - addon name(s). */ + $strings['template_addon_prompt'] = esc_html( sprintf( __( 'The %1$s template requires the %2$s. Would you like to install and activate it?', 'wpforms-lite' ), '%template%', '%addons%' ) ); + /* translators: %1$s - template name, %2$s - addon name(s). */ + $strings['template_addons_prompt'] = esc_html( sprintf( __( 'The %1$s template requires the %2$s. Would you like to install and activate all the required addons?', 'wpforms-lite' ), '%template%', '%addons%' ) ); + /* translators: %1$s - template name, %2$s - addon name(s). */ + $strings['template_addon_activate'] = esc_html( sprintf( __( 'The %1$s template requires the %2$s. Would you like to activate it?', 'wpforms-lite' ), '%template%', '%addons%' ) ); + } else { + /* translators: %s - addon name(s). */ + $single_form = esc_html( sprintf( __( "To use all of the features in this template, you'll need the %s. Contact your site administrator to install it, then try opening this template again.", 'wpforms-lite' ), '%addons%' ) ); + $strings['template_addon_prompt'] = $single_form; + $strings['template_addon_activate'] = $single_form; + /* translators: %s - addon name(s). */ + $strings['template_addons_prompt'] = esc_html( sprintf( __( "To use all of the features in this template, you'll need the %s. Contact your site administrator to install them, then try opening this template again.", 'wpforms-lite' ), '%addons%' ) ); + } + + wp_localize_script( + 'wpforms-form-templates', + 'wpforms_form_templates', + $strings + ); + + wp_localize_script( + 'wpforms-form-templates', + 'wpforms_addons', + $this->get_localized_addons() + ); + } + + /** + * Get localized addons. + * + * @since 1.8.2 + * + * @return array + */ + private function get_localized_addons() { + + return wpforms_chain( wpforms()->obj( 'addons' )->get_available() ) + ->map( + static function( $addon ) { + + return [ + 'title' => $addon['title'], + 'action' => $addon['action'], + 'url' => $addon['url'], + ]; + } + ) + ->value(); + } + + /** + * Init license data. + * + * @since 1.6.8 + */ + private function init_license_data() { + + $this->all_licenses = [ 'lite', 'basic', 'plus', 'pro', 'elite', 'agency', 'ultimate' ]; + + // User license data. + $this->license['key'] = wpforms_get_license_key(); + $this->license['type'] = wpforms_get_license_type(); + $this->license['type'] = in_array( $this->license['type'], [ 'agency', 'ultimate' ], true ) ? 'elite' : $this->license['type']; + $this->license['type'] = empty( $this->license['type'] ) ? 'lite' : $this->license['type']; + $this->license['index'] = array_search( $this->license['type'], $this->all_licenses, true ); + } + + /** + * Init templates and categories data. + * + * @since 1.6.8 + */ + private function init_templates_data() { + + // Get cached templates data. + $cache_obj = wpforms()->obj( 'builder_templates_cache' ); + + if ( ! $cache_obj ) { + return; + } + + $cache_data = $cache_obj->get(); + $templates_all = ! empty( $cache_data['templates'] ) ? $this->sort_templates_by_created_at( $cache_data['templates'] ) : []; + $this->categories = ! empty( $cache_data['categories'] ) ? $cache_data['categories'] : []; + $this->subcategories = ! empty( $cache_data['subcategories'] ) ? $cache_data['subcategories'] : []; + + $this->init_api_templates( $templates_all ); + } + + /** + * Sort templates by their created_at value in ascending order. + * + * @since 1.8.4 + * + * @param array $templates Templates to be sorted. + * + * @return array Sorted templates. + */ + private function sort_templates_by_created_at( array $templates ): array { + + uasort( + $templates, + static function ( $template_a, $template_b ) { + + if ( $template_a['created_at'] === $template_b['created_at'] ) { + return 0; + } + + return $template_a['created_at'] < $template_b['created_at'] ? -1 : 1; + } + ); + + return $templates; + } + + /** + * Determine if user's license level has access to the template. + * + * @since 1.6.8 + * + * @param array $template Template data. + * + * @return bool + */ + private function has_access( $template ) { + + if ( ! empty( $template['has_access'] ) ) { + return true; + } + + $template_licenses = empty( $template['license'] ) ? [] : array_map( 'strtolower', (array) $template['license'] ); + $has_access = true; + + foreach ( $template_licenses as $template_license ) { + + $has_access = $this->license['index'] >= array_search( $template_license, $this->all_licenses, true ); + + if ( $has_access ) { + break; + } + } + + return $has_access; + } + + /** + * Get favorites templates list. + * + * @since 1.7.7 + * + * @param bool $all Optional. True for getting all favorites lists. False by default. + * + * @return array + */ + public function get_favorites_list( $all = false ) { + + $favorites_list = (array) get_option( self::FAVORITE_TEMPLATES_OPTION, [] ); + + if ( $all ) { + return $favorites_list; + } + + $user_id = get_current_user_id(); + + return isset( $favorites_list[ $user_id ] ) ? $favorites_list[ $user_id ] : []; + } + + /** + * Update favorites templates list. + * + * @since 1.8.6 + */ + public function update_favorites_list() { + + $this->favorites_list = $this->get_favorites_list(); + } + + /** + * Determine if template is marked as favorite. + * + * @since 1.7.7 + * + * @param string $template_slug Template slug. + * + * @return bool + */ + public function is_favorite( $template_slug ) { + + if ( $this->favorites_list === null ) { + $this->update_favorites_list(); + } + + return isset( $this->favorites_list[ $template_slug ] ); + } + + /** + * Save favorites templates. + * + * @since 1.7.7 + */ + public function ajax_save_favorites(): void { + + if ( ! $this->is_valid_ajax_request() ) { + wp_send_json_error(); + } + + [ $template_slug, $favorite ] = $this->get_ajax_input(); + + $favorites = $this->get_favorites_list( true ); + $user_id = get_current_user_id(); + $is_favorite = $favorite === 'true'; + $is_exists = isset( $favorites[ $user_id ][ $template_slug ] ); + + if ( $is_favorite && $is_exists ) { + wp_send_json_success(); + } + + if ( $is_favorite ) { + $favorites[ $user_id ][ $template_slug ] = true; + } elseif ( $is_exists ) { + unset( $favorites[ $user_id ][ $template_slug ] ); + } + + update_option( self::FAVORITE_TEMPLATES_OPTION, $favorites ); + + // Update and save the template content cache. + $templates_cache_obj = wpforms()->obj( 'builder_templates_cache' ); + + if ( $templates_cache_obj ) { + $templates_cache_obj->wipe_content_cache(); + } + + wp_send_json_success(); + } + + /** + * Get AJAX input. + * + * @since 1.9.6 + * + * @return array + */ + protected function get_ajax_input(): array { + + // Nonce is checked in the is_valid_ajax_request() method. + // phpcs:disable WordPress.Security.NonceVerification.Missing + $template_slug = isset( $_POST['slug'] ) ? sanitize_text_field( wp_unslash( $_POST['slug'] ) ) : ''; + $favorite = isset( $_POST['favorite'] ) ? sanitize_key( wp_unslash( $_POST['favorite'] ) ) : ''; + + return [ $template_slug, $favorite ]; + // phpcs:enable WordPress.Security.NonceVerification.Missing + } + + /** + * Determine if the AJAX request is valid. + * + * @since 1.9.5 + * + * @return bool + */ + private function is_valid_ajax_request(): bool { + + return check_ajax_referer( 'wpforms-form-templates', 'nonce', false ) && + wpforms_current_user_can( 'create_forms' ) && + isset( $_POST['slug'], $_POST['favorite'] ); + } + + /** + * Determine if the template exists and the customer has access to it. + * + * @since 1.7.5.3 + * + * @param string $slug Template slug or ID. + * + * @return bool + */ + public function is_valid_template( $slug ) { + + $template = $this->get_template_by_id( $slug ); + + if ( ! $template ) { + return ! empty( $this->get_template_by_slug( $slug ) ); + } + + $has_cache = wpforms()->obj( 'builder_template_single' )->instance( $template['id'], $this->license )->get(); + + return $this->has_access( $template ) && $has_cache; + } + + /** + * Determine license level of the template. + * + * @since 1.6.8 + * + * @param array $template Template data. + * + * @return string + */ + private function get_license_level( $template ) { + + $licenses_pro = [ 'basic', 'plus', 'pro' ]; + $licenses_template = (array) $template['license']; + + if ( + empty( $template['license'] ) || + in_array( 'lite', $licenses_template, true ) + ) { + return ''; + } + + foreach ( $licenses_pro as $license ) { + if ( in_array( $license, $licenses_template, true ) ) { + return 'pro'; + } + } + + return 'elite'; + } + + /** + * Get categories data. + * + * @since 1.6.8 + * + * @return array + */ + public function get_categories() { + + return $this->categories; + } + + /** + * Get subcategories data. + * + * @since 1.8.4 + * + * @return array + */ + public function get_subcategories() { + + return $this->subcategories; + } + + /** + * Get templates data. + * + * @since 1.6.8 + * + * @return array + */ + public function get_templates(): array { + + static $templates = []; + + if ( ! empty( $templates ) ) { + return $templates; + } + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + + /** + * Form templates available in the WPForms core plugin. + * + * @since 1.4.0 + * + * @param array $templates Core templates data. + */ + $core_templates = (array) apply_filters( 'wpforms_form_templates_core', [] ); + + /** + * Form templates available with the WPForms addons. + * Allows developers to provide additional templates with an addons. + * + * @since 1.4.0 + * + * @param array $templates Addons templates data. + */ + $additional_templates = (array) apply_filters( 'wpforms_form_templates', [] ); + + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + $templates = array_merge( $core_templates, $additional_templates ); + + // Generate and store the templates' hash. + $this->hash = wp_hash( wp_json_encode( $templates ) ); + + return $templates; + } + + /** + * Get templates' hash. + * + * @since 1.8.6 + * + * @return string + */ + public function get_hash(): string { + + if ( ! $this->hash ) { + $this->get_templates(); + } + + return $this->hash; + } + + /** + * Get single template data. + * + * @since 1.6.8 + * + * @param string $slug Template slug OR Id. + * + * @return array + */ + public function get_template( $slug ) { + + $template = $this->get_template_by_slug( $slug ); + + if ( ! $template ) { + $template = $this->get_template_by_id( $slug ); + } + + if ( empty( $template ) ) { + return []; + } + + if ( empty( $template['id'] ) ) { + return $template; + } + + // Attempt to get template with form data (if available). + $full_template = wpforms() + ->obj( 'builder_template_single' ) + ->instance( $template['id'], $this->license ) + ->get(); + + if ( ! empty( $full_template['data'] ) ) { + return $full_template; + } + + return $template; + } + + /** + * Get template data by slug. + * + * @since 1.7.5.3 + * + * @param string $slug Template slug. + * + * @return array + */ + private function get_template_by_slug( $slug ) { + + foreach ( $this->get_templates() as $template ) { + if ( ! empty( $template['slug'] ) && $template['slug'] === $slug ) { + return $template; + } + } + + return []; + } + + /** + * Get template data by Id. + * + * @since 1.6.8 + * + * @param string $id Template id. + * + * @return array + */ + private function get_template_by_id( $id ) { + + foreach ( $this->api_templates as $template ) { + if ( ! empty( $template['id'] ) && $template['id'] === $id ) { + return $template; + } + } + + return []; + } + + /** + * Add templates to the list on the Setup panel. + * + * @since 1.6.8 + * + * @param array $templates Templates list. + * + * @return array + */ + public function add_templates_to_setup_panel( $templates ) { + + return array_merge( $templates, $this->api_templates ); + } + + /** + * Add template data when form is created. + * + * @since 1.6.8 + * + * @param array $args Create form arguments. + * @param array $data Template data. + * + * @return array + */ + public function apply_to_new_form( $args, $data ) { + + if ( empty( $data ) || empty( $data['template'] ) ) { + return $args; + } + + $template = $this->get_template( $data['template'] ); + + if ( + empty( $template['data'] ) || + ! $this->has_access( $template ) + ) { + return $args; + } + + $template['data']['meta']['template'] = $template['id'] ?? $template['slug']; + $template['data']['meta']['category'] = $data['category'] ?? 'all'; + $template['data']['meta']['subcategory'] = $data['subcategory'] ?? 'all'; + + // Enable Notifications by default. + $template['data']['settings']['notification_enable'] = isset( $template['data']['settings']['notification_enable'] ) + ? $template['data']['settings']['notification_enable'] + : 1; + + // Unset settings that should be defined locally. + unset( + $template['data']['settings']['form_title'], + $template['data']['settings']['conversational_forms_title'], + $template['data']['settings']['form_pages_title'] + ); + + // Unset certain values for each Notification, since: + // - Email Subject Line field (subject) depends on the form name that is generated from the template name and form_id. + // - From Name field (sender_name) depends on the blog name and can be replaced by WP Mail SMTP plugin. + // - From Email field (sender_address) depends on the internal logic and can be replaced by WP Mail SMTP plugin. + if ( ! empty( $template['data']['settings']['notifications'] ) ) { + foreach ( (array) $template['data']['settings']['notifications'] as $key => $notification ) { + unset( + $template['data']['settings']['notifications'][ $key ]['subject'], + $template['data']['settings']['notifications'][ $key ]['sender_name'], + $template['data']['settings']['notifications'][ $key ]['sender_address'] + ); + } + } + + /** + * Allow modifying form data when a template is applied to the new form. + * + * @since 1.9.0 + * + * @param array $form_data New form data. + * @param array $template Template data. + */ + $template['data'] = (array) apply_filters( 'wpforms_admin_builder_templates_apply_to_new_form_modify_data', $template['data'], $template ); + + // Encode template data to post content. + $args['post_content'] = wpforms_encode( $template['data'] ); + + return $args; + } + + /** + * Add template data when form is updated. + * + * @since 1.6.8 + * + * @param array $form Form post data. + * @param array $data Form data. + * @param array $args Update form arguments. + * + * @return array + */ + public function apply_to_existing_form( $form, $data, $args ) { + + if ( empty( $args ) || empty( $args['template'] ) ) { + return $form; + } + + $template = $this->get_template( $args['template'] ); + + if ( + empty( $template['data'] ) || + ! $this->has_access( $template ) + ) { + return $form; + } + + $form_data = wpforms_decode( wp_unslash( $form['post_content'] ) ); + + // Something is wrong with the form data. + if ( empty( $form_data ) ) { + return $form; + } + + // Compile the new form data preserving needed data from the existing form. + $new = $template['data']; + $new['id'] = $form['ID'] ?? 0; + $new['field_id'] = $form_data['field_id'] ?? 0; + $new['settings'] = $form_data['settings'] ?? []; + $new['payments'] = $form_data['payments'] ?? []; + $new['meta'] = $form_data['meta'] ?? []; + + $template_id = $template['id'] ?? ''; + + // Preserve template ID `wpforms-user-template-{$form_id}` when overwriting it with another template. + if ( wpforms_is_form_template( $form['ID'] ) ) { + $template_id = $form_data['meta']['template'] ?? ''; + } + + $new['meta']['template'] = $template_id; + $new['meta']['category'] = ! empty( $args['category'] ) ? sanitize_text_field( $args['category'] ) : 'all'; + $new['meta']['subcategory'] = ! empty( $args['subcategory'] ) ? sanitize_text_field( $args['subcategory'] ) : 'all'; + + /** + * Allow modifying form data when a new template is applied. + * + * @since 1.7.9 + * + * @param array $new Updated form data. + * @param array $form_data Current form data. + * @param array $template Template data. + */ + $new = (array) apply_filters( 'wpforms_admin_builder_templates_apply_to_existing_form_modify_data', $new, $form_data, $template ); + + // Update the form with new data. + $form['post_content'] = wpforms_encode( $new ); + + return $form; + } + + /** + * Create a form on request. + * + * @since 1.6.8 + */ + public function create_form_on_request() { + + $template = $this->get_template_on_request(); + + // Just return if template not found OR user doesn't have access. + if ( empty( $template['has_access'] ) ) { + return; + } + + // Check if the template requires some addons. + if ( $this->check_template_required_addons( $template ) ) { + return; + } + + // Set form title equal to the template's name. + $form_title = ! empty( $template['name'] ) ? $template['name'] : esc_html__( 'New form', 'wpforms-lite' ); + $title_query = new WP_Query( + [ + 'post_type' => 'wpforms', + 'title' => $form_title, + 'posts_per_page' => 1, + 'fields' => 'ids', + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'no_found_rows' => true, + ] + ); + $title_exists = $title_query->post_count > 0; + $form_id = wpforms()->obj( 'form' )->add( + $form_title, + [], + [ + 'template' => $template['id'], + ] + ); + + // Return if something wrong. + if ( ! $form_id ) { + return; + } + + // Update form title if duplicated. + if ( $title_exists ) { + wpforms()->obj( 'form' )->update( + $form_id, + [ + 'settings' => [ + 'form_title' => $form_title . ' (ID #' . $form_id . ')', + ], + ] + ); + } + + $this->create_form_on_request_redirect( $form_id ); + } + + /** + * Get template data before creating a new form on request. + * + * @since 1.6.8 + * + * @return array|bool Template OR false. + */ + private function get_template_on_request() { + + if ( ! wpforms_is_admin_page( 'builder' ) || ! wpforms_is_admin_page( 'templates' ) ) { + return false; + } + + if ( ! wpforms_current_user_can( 'create_forms' ) ) { + return false; + } + + $form_id = isset( $_GET['form_id'] ) ? (int) $_GET['form_id'] : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + + if ( ! empty( $form_id ) ) { + return false; + } + + $view = isset( $_GET['view'] ) ? sanitize_key( $_GET['view'] ) : 'setup'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + + if ( $view !== 'setup' ) { + return false; + } + + $template_id = isset( $_GET['template_id'] ) ? sanitize_key( $_GET['template_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + + // Attempt to get the template. + $template = $this->get_template( $template_id ); + + // Just return if template is not found. + if ( empty( $template ) ) { + return false; + } + + return $template; + } + + /** + * Redirect after creating the form. + * + * @since 1.6.8 + * + * @param integer $form_id Form ID. + */ + private function create_form_on_request_redirect( $form_id ) { + + // Redirect to the builder if possible. + if ( wpforms_current_user_can( 'edit_form_single', $form_id ) ) { + wp_safe_redirect( + add_query_arg( + [ + 'view' => 'fields', + 'form_id' => $form_id, + 'newform' => '1', + ], + admin_url( 'admin.php?page=wpforms-builder' ) + ) + ); + exit; + } + + // Redirect to the forms overview admin page if possible. + if ( wpforms_current_user_can( 'view_forms' ) ) { + wp_safe_redirect( + admin_url( 'admin.php?page=wpforms-overview' ) + ); + exit; + } + + // Finally, redirect to the admin dashboard. + wp_safe_redirect( admin_url() ); + exit; + } + + /** + * Check if the template requires some addons and then redirect to the builder for further interaction if needed. + * + * @since 1.6.8 + * + * @param array $template Template data. + * + * @return bool True if template requires some addons that are not yet installed and/or activated. + */ + private function check_template_required_addons( $template ) { + + // Return false if none addons required. + if ( empty( $template['addons'] ) ) { + return false; + } + + $required_addons = wpforms()->obj( 'addons' )->get_by_slugs( $template['addons'] ); + + foreach ( $required_addons as $i => $addon ) { + if ( empty( $addon['action'] ) || ! in_array( $addon['action'], [ 'install', 'activate' ], true ) ) { + unset( $required_addons[ $i ] ); + } + } + + // Return false if not need to install or activate any addons. + // We can proceed with creating the form directly in this process. + if ( empty( $required_addons ) ) { + return false; + } + + // Otherwise return true. + return true; + } + + /** + * Render the upgrade banner template. + * + * This method generates the HTML template for the upgrade banner, which includes + * a title, description, and a button that links to the upgrade page. + * + * @param string $title The title to be displayed in the banner. + * @param string $description The description to be displayed in the banner. + * + * @since 1.9.4 + */ + private function render_upgrade_banner_template( string $title, string $description ): void { + + $medium = wpforms_is_admin_page( 'templates' ) ? 'Form Templates Subpage' : 'Builder Templates'; + + ?> + + is_pro() ) { + return; + } + + $title = sprintf( + /* translators: %d - templates count. */ + esc_html__( 'Get Access to Our Complete Library of %d+ Form Templates', 'wpforms-lite' ), + esc_html( floor( count( $this->get_templates() ) / 1000 ) * 1000 ) + ); + $description = esc_html__( 'Save time and reduce effort with our pre-built form templates covering popular use-cases in business operations, customer service, feedback, marketing, registrations, event planning, non-profit, healthcare, and education.', 'wpforms-lite' ); + + $this->render_upgrade_banner_template( $title, $description ); + } + + /** + * Render upgrade banner for lite version. + * + * @since 1.9.4 + */ + public function upgrade_lite_banner_template(): void { + + if ( wpforms()->is_pro() ) { + return; + } + + $title = sprintf( + /* translators: %d - templates count. */ + esc_html__( 'Get Access to Our Library of %d+ Pre-Made Form Templates', 'wpforms-lite' ), + esc_html( floor( count( $this->get_templates() ) / 1000 ) * 1000 ) + ); + $description = esc_html__( 'Never start from scratch again! While WPForms Lite allows you to create any type of form, you can save even more time with WPForms Pro. Upgrade to access hundreds more form templates and advanced form fields.', 'wpforms-lite' ); + + $this->render_upgrade_banner_template( $title, $description ); + } + + /** + * Add additional addons templates. + * + * @since 1.8.9 + * + * @param array $templates Templates list. + * + * @return array + */ + public function add_addons_templates( array $templates ): array { + + // Add User Registration templates only if the addon is not active. + if ( ! wpforms()->obj( 'addons' )->is_active( 'user-registration' ) ) { + $templates = $this->add_user_registration_templates( $templates ); + } + + // Add Post Submissions templates only if the addon is not active. + if ( ! wpforms()->obj( 'addons' )->is_active( 'post-submissions' ) ) { + $templates = $this->add_post_submissions_templates( $templates ); + } + + // Add Survey and Poll templates only if the addon is not active. + if ( ! wpforms()->obj( 'addons' )->is_active( 'surveys-polls' ) ) { + $templates = $this->add_surveys_polls_templates( $templates ); + } + + return $templates; + } + + /** + * Add User Registration templates. + * + * @since 1.8.9 + * + * @param array $templates Templates list. + * + * @return array + */ + private function add_user_registration_templates( array $templates ): array { + + $user_registration_templates = [ + [ + 'name' => esc_html__( 'User Registration Form', 'wpforms-lite' ), + 'slug' => 'user_registration', + 'addons' => [ 'user-registration' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Create customized WordPress user registration forms and add them anywhere on your website.', 'wpforms-lite' ), + ], + [ + 'name' => esc_html__( 'User Login Form', 'wpforms-lite' ), + 'slug' => 'user_login', + 'addons' => [ 'user-registration' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Allow your users to easily log in to your site with their username and password.', 'wpforms-lite' ), + ], + [ + 'name' => esc_html__( 'User Password Reset Form', 'wpforms-lite' ), + 'slug' => 'user_reset', + 'addons' => [ 'user-registration' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Allow your users to easily reset their password.', 'wpforms-lite' ), + ], + ]; + + return array_merge( $templates, $user_registration_templates ); + } + + /** + * Add Post Submissions templates. + * + * @since 1.8.9 + * + * @param array $templates Templates list. + * + * @return array + */ + private function add_post_submissions_templates( array $templates ): array { + + $post_submissions_templates = [ + [ + 'name' => esc_html__( 'Blog Post Submission Form', 'wpforms-lite' ), + 'slug' => 'post_submission', + 'addons' => [ 'post-submissions' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'User-submitted content made easy. Allow your users to submit guest blog posts in WordPress. You can add and remove fields as needed.', 'wpforms-lite' ), + ], + ]; + + return array_merge( $templates, $post_submissions_templates ); + } + + /** + * Add Surveys and Polls templates. + * + * @since 1.8.9 + * + * @param array $templates Templates list. + * + * @return array + */ + private function add_surveys_polls_templates( array $templates ): array { + + $surveys_polls_templates = [ + [ + 'name' => esc_html__( 'Survey Form', 'wpforms-lite' ), + 'slug' => 'survey', + 'addons' => [ 'surveys-polls' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Collect customer feedback, then generate survey reports to determine satisfaction and spot trends.', 'wpforms-lite' ), + ], + [ + 'name' => esc_html__( 'Poll Form', 'wpforms-lite' ), + 'slug' => 'poll', + 'addons' => [ 'surveys-polls' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Ask visitors a question and display the results after they provide an answer.', 'wpforms-lite' ), + ], + [ + 'name' => esc_html__( 'NPS Survey Simple Form', 'wpforms-lite' ), + 'slug' => 'nps-survey-simple', + 'addons' => [ 'surveys-polls' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Find out if your clients or customers would recommend you to someone else with this basic Net Promoter Score survey template.', 'wpforms-lite' ), + ], + [ + 'name' => esc_html__( 'NPS Survey Enhanced Form', 'wpforms-lite' ), + 'slug' => 'nps-survey-enhanced', + 'addons' => [ 'surveys-polls' ], + 'license' => $this->get_license_level( [ 'license' => [ 'pro' ] ] ), + 'has_access' => $this->has_access( [ 'license' => [ 'pro' ] ] ), + 'source' => 'wpforms-addon', + 'description' => esc_html__( 'Measure customer loyalty and find out exactly what they are thinking with this enhanced Net Promoter Score survey template.', 'wpforms-lite' ), + ], + ]; + + return array_merge( $templates, $surveys_polls_templates ); + } + + /** + * Init API templates. + * + * @since 1.9.1 + * + * @param array $templates_all All templates. + * + * @return void + */ + private function init_api_templates( array $templates_all ) { + + // Higher priority templates slugs. + // These remote templates are the replication of the default templates, + // which were previously included with the WPForms plugin. + $higher_templates_slugs = [ + 'simple-contact-form-template', + 'request-a-quote-form-template', + 'donation-form-template', + 'billing-order-form-template', + 'newsletter-signup-form-template', + 'suggestion-form-template', + ]; + + $templates_access_higher = []; + $templates_access = []; + $templates_deny_higher = []; + $templates_deny = []; + + /** + * The form template was moved to wpforms/includes/templates/class-simple-contact-form.php file. + * + * @since 1.7.5.3 + */ + unset( $templates_all['simple-contact-form-template'] ); + + foreach ( $templates_all as $i => $template ) { + $template['has_access'] = $this->has_access( $template ); + $template['favorite'] = $this->is_favorite( $i ); + $template['license'] = $this->get_license_level( $template ); + $template['source'] = 'wpforms-api'; + $template['categories'] = ! empty( $template['categories'] ) ? array_keys( $template['categories'] ) : []; + + $is_higher = in_array( $i, $higher_templates_slugs, true ); + + if ( $template['has_access'] ) { + if ( $is_higher ) { + $templates_access_higher[ $i ] = $template; + } else { + $templates_access[ $i ] = $template; + } + } elseif ( $is_higher ) { + $templates_deny_higher[ $i ] = $template; + } else { + $templates_deny[ $i ] = $template; + } + } + + // Sort higher priority templates according to the slug order. + $templates_access_higher = array_replace( array_flip( $higher_templates_slugs ), $templates_access_higher ); + $templates_access_higher = array_filter( $templates_access_higher, 'is_array' ); + + // Finally, merge templates from API. + $this->api_templates = array_merge( + $templates_access_higher, + $templates_access, + $templates_deny_higher, + $templates_deny + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplatesCache.php b/wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplatesCache.php new file mode 100755 index 00000000..872d70c2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Builder/TemplatesCache.php @@ -0,0 +1,267 @@ + 'templates-admin-page.html', + 'builder' => 'templates-builder.html', + ]; + + /** + * List of plugins that can use the templates cache. + * + * @since 1.8.7 + * + * @var array + */ + const PLUGINS = [ + 'wpforms', + 'wpforms-lite', + ]; + + /** + * Determine if the class is allowed to load. + * + * @since 1.6.8 + * + * @return bool + */ + protected function allow_load(): bool { + + $has_permissions = wpforms_current_user_can( [ 'create_forms', 'edit_forms' ] ); + $allowed_requests = wpforms_is_admin_ajax() || + wpforms_is_admin_page( 'builder' ) || + wpforms_is_admin_page( 'templates' ) || + wpforms_is_admin_page( 'tools', 'action-scheduler' ); + $allow = wp_doing_cron() || wpforms_doing_wp_cli() || ( $has_permissions && $allowed_requests ); + + /** + * Whether to load this class. + * + * @since 1.7.2 + * + * @param bool $allow True or false. + */ + return (bool) apply_filters( 'wpforms_admin_builder_templatescache_allow_load', $allow ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Initialize the class. + * + * @since 1.8.7 + */ + public function init() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + parent::init(); + + // Upgrade cached templates data after the plugin update. + add_action( 'upgrader_process_complete', [ $this, 'upgrade_templates' ] ); + } + + /** + * Upgrade cached templates data after the plugin update. + * + * @since 1.8.7 + * + * @param object $upgrader WP_Upgrader instance. + */ + public function upgrade_templates( $upgrader ) { + + if ( $this->allow_update_cache( $upgrader ) ) { + $this->update( true ); + } + } + + /** + * Determine if allowed to update the cache. + * + * @since 1.8.7 + * + * @param object $upgrader WP_Upgrader instance. + * + * @return bool + */ + private function allow_update_cache( $upgrader ): bool { + + $result = $upgrader->result ?? null; + + // Check if plugin was updated. + if ( ! $result ) { + return false; + } + + // Check if updated plugin is WPForms. + if ( ! in_array( $result['destination_name'], self::PLUGINS, true ) ) { + return false; + } + + return true; + } + + /** + * Provide settings. + * + * @since 1.6.8 + * + * @return array Settings array. + */ + protected function setup() { + + return [ + + // Remote source URL. + 'remote_source' => 'https://wpforms.com/templates/api/get/', + + // Cache file. + 'cache_file' => 'templates.json', + + /** + * Time-to-live of the templates cache files in seconds. + * + * This applies to `uploads/wpforms/cache/templates.json` + * and all *.json files in `uploads/wpforms/cache/templates/` directory. + * + * @since 1.6.8 + * + * @param integer $cache_ttl Cache time-to-live, in seconds. + * Default value: WEEK_IN_SECONDS. + */ + 'cache_ttl' => (int) apply_filters( 'wpforms_admin_builder_templates_cache_ttl', WEEK_IN_SECONDS ), + + // Scheduled update action. + 'update_action' => 'wpforms_admin_builder_templates_cache_update', + ]; + } + + /** + * Prepare data to store in a local cache. + * + * @since 1.6.8 + * + * @param array $data Raw data received by the remote request. + * + * @return array Prepared data for caching. + */ + protected function prepare_cache_data( $data ): array { + + if ( + empty( $data ) || + ! is_array( $data ) || + empty( $data['status'] ) || + $data['status'] !== 'success' || + empty( $data['data'] ) + ) { + return []; + } + + $cache_data = $data['data']; + + // Strip the word "Template" from the end of each template name. + foreach ( $cache_data['templates'] as $slug => $template ) { + $cache_data['templates'][ $slug ]['name'] = preg_replace( '/\sTemplate$/', '', $template['name'] ); + } + + return $cache_data; + } + + /** + * Update the cache. + * + * @since 1.8.6 + * + * @param bool $force Whether to force update the cache. + * + * @return bool + */ + public function update( bool $force = false ): bool { + + $result = parent::update( $force ); + + if ( ! $result ) { + return false; + } + + $this->wipe_content_cache(); + + return $result; + } + + /** + * Get cached templates content. + * + * @since 1.8.6 + * + * @return string + */ + public function get_content_cache(): string { + + // phpcs:ignore Universal.Operators.DisallowShortTernary.Found + return File::get_contents( $this->get_content_cache_file() ) ?: ''; + } + + /** + * Save templates content cache. + * + * @since 1.8.6 + * + * @param string|mixed $content Templates content. + * + * @return bool + */ + public function save_content_cache( $content ): bool { + + return File::put_contents( $this->get_content_cache_file(), (string) $content ); + } + + /** + * Wipe cached templates content. + * + * @since 1.8.6 + */ + public function wipe_content_cache() { + + $cache_dir = $this->get_cache_dir(); + + // Delete the template content cache files. They will be regenerated on the first visit. + foreach ( self::CONTENT_CACHE_FILES as $file ) { + + $cache_file = $cache_dir . $file; + + if ( is_file( $cache_file ) && is_readable( $cache_file ) ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.unlink_unlink + unlink( $cache_file ); + } + } + } + + /** + * Get templates content cache file path. + * + * @since 1.8.6 + * + * @return string + */ + private function get_content_cache_file(): string { + + $context = wpforms_is_admin_page( 'templates' ) ? 'admin-page' : 'builder'; + + return File::get_cache_dir() . self::CONTENT_CACHE_FILES[ $context ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Challenge.php b/wp-content/plugins/wpforms-lite/src/Admin/Challenge.php new file mode 100755 index 00000000..f0fa8c1f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Challenge.php @@ -0,0 +1,772 @@ +hooks(); + } + } + + /** + * Hooks. + * + * @since 1.5.0 + */ + public function hooks() { + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + add_action( 'wpforms_builder_init', [ $this, 'init_challenge' ] ); + add_action( 'admin_footer', [ $this, 'challenge_html' ] ); + add_action( 'wpforms_welcome_intro_after', [ $this, 'welcome_html' ] ); + + add_action( 'wp_ajax_wpforms_challenge_save_option', [ $this, 'save_challenge_option_ajax' ] ); + add_action( 'wp_ajax_wpforms_challenge_send_contact_form', [ $this, 'send_contact_form_ajax' ] ); + } + + /** + * Check if the current page is related to Challenge. + * + * @since 1.5.0 + */ + public function is_challenge_page() { + + return wpforms_is_admin_page() || + $this->is_builder_page() || + $this->is_form_embed_page(); + } + + /** + * Check if the current page is a forms builder page related to Challenge. + * + * @since 1.5.0 + * + * @return bool + */ + public function is_builder_page() { + + if ( ! wpforms_is_admin_page( 'builder' ) ) { + return false; + } + + if ( ! $this->challenge_active() && ! $this->challenge_inited() ) { + return false; + } + + $step = (int) $this->get_challenge_option( 'step' ); + $form_id = (int) $this->get_challenge_option( 'form_id' ); + + if ( $form_id && $step < 2 ) { + return false; + } + + $current_form_id = isset( $_GET['form_id'] ) ? (int) $_GET['form_id'] : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $is_new_form = isset( $_GET['newform'] ) ? (int) $_GET['newform'] : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + + if ( $is_new_form && $step !== 2 ) { + return false; + } + + if ( ! $is_new_form && $form_id !== $current_form_id && $step >= 2 ) { + + // In case if user skipped the Challenge by closing the browser window or exiting the builder, + // we need to set the previous Challenge as `canceled`. + // Otherwise, the Form Embed Wizard will think that the Challenge is active. + $this->set_challenge_option( + [ + 'status' => 'skipped', + 'finished_date_gmt' => current_time( 'mysql', true ), + ] + ); + + return false; + } + + return true; + } + + /** + * Check if the current page is a form embed page edit related to Challenge. + * + * @since 1.5.0 + * + * @return bool + */ + public function is_form_embed_page() { + + if ( ! function_exists( 'get_current_screen' ) || ! is_admin() || ! is_user_logged_in() ) { + return false; + } + + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) || $screen->id !== 'page' || ! $this->challenge_active() ) { + return false; + } + + $step = $this->get_challenge_option( 'step' ); + + if ( ! in_array( $step, [ 3, 4, 5 ], true ) ) { + return false; + } + + $embed_page = $this->get_challenge_option( 'embed_page' ); + $is_embed_page = false; + + if ( isset( $screen->action ) && $screen->action === 'add' && $embed_page === 0 ) { + $is_embed_page = true; + } + + if ( isset( $_GET['post'] ) && $embed_page === (int) $_GET['post'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $is_embed_page = true; + } + + if ( $is_embed_page && $step < 4 ) { + $this->set_challenge_option( [ 'step' => 4 ] ); + } + + return $is_embed_page; + } + + /** + * Load scripts and styles. + * + * @since 1.5.0 + */ + public function enqueue_scripts() { + + if ( ! $this->challenge_can_start() && ! $this->challenge_active() ) { + return; + } + + $min = wpforms_get_min_suffix(); + + if ( $this->is_challenge_page() ) { + + wp_enqueue_style( + 'wpforms-challenge', + WPFORMS_PLUGIN_URL . "assets/css/challenge{$min}.css", + [], + WPFORMS_VERSION + ); + + wp_enqueue_script( + 'wpforms-challenge-admin', + WPFORMS_PLUGIN_URL . "assets/js/admin/challenge/challenge-admin{$min}.js", + [ 'jquery' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-challenge-admin', + 'wpforms_challenge_admin', + [ + 'nonce' => wp_create_nonce( 'wpforms_challenge_ajax_nonce' ), + 'minutes_left' => absint( $this->minutes ), + 'option' => $this->get_challenge_option(), + 'frozen_tooltip' => esc_html__( 'Challenge is frozen.', 'wpforms-lite' ), + ] + ); + } + + if ( $this->is_builder_page() || $this->is_form_embed_page() ) { + + wp_enqueue_style( + 'tooltipster', + WPFORMS_PLUGIN_URL . 'assets/lib/jquery.tooltipster/jquery.tooltipster.min.css', + null, + '4.2.6' + ); + + wp_enqueue_script( + 'tooltipster', + WPFORMS_PLUGIN_URL . 'assets/lib/jquery.tooltipster/jquery.tooltipster.min.js', + [ 'jquery' ], + '4.2.6', + true + ); + + wp_enqueue_script( + 'wpforms-challenge-core', + WPFORMS_PLUGIN_URL . "assets/js/admin/challenge/challenge-core{$min}.js", + [ 'jquery', 'tooltipster', 'wpforms-challenge-admin', 'wpforms-generic-utils' ], + WPFORMS_VERSION, + true + ); + } + + if ( $this->is_builder_page() ) { + + wp_enqueue_script( + 'wpforms-challenge-builder', + WPFORMS_PLUGIN_URL . "assets/js/admin/challenge/challenge-builder{$min}.js", + [ 'jquery', 'tooltipster', 'wpforms-challenge-core', 'wpforms-builder' ], + WPFORMS_VERSION, + true + ); + } + + if ( $this->is_form_embed_page() ) { + + wp_enqueue_style( + 'wpforms-font-awesome', + WPFORMS_PLUGIN_URL . 'assets/lib/font-awesome/css/all.min.css', + null, + '7.0.1' + ); + + // FontAwesome v4 compatibility shims. + wp_enqueue_style( + 'wpforms-font-awesome-v4-shim', + WPFORMS_PLUGIN_URL . 'assets/lib/font-awesome/css/v4-shims.min.css', + null, + '4.7.0' + ); + + wp_enqueue_script( + 'wpforms-challenge-embed', + WPFORMS_PLUGIN_URL . "assets/js/admin/challenge/challenge-embed{$min}.js", + [ 'jquery', 'tooltipster', 'wpforms-challenge-core' ], + WPFORMS_VERSION, + true + ); + } + } + + /** + * Get 'wpforms_challenge' option schema. + * + * @since 1.5.0 + * + * @return array + */ + public function get_challenge_option_schema() { + + return [ + 'status' => '', + 'step' => 0, + 'user_id' => get_current_user_id(), + 'form_id' => 0, + 'embed_page' => 0, + 'embed_page_title' => '', + 'started_date_gmt' => '', + 'finished_date_gmt' => '', + 'seconds_spent' => 0, + 'seconds_left' => 0, + 'feedback_sent' => false, + 'feedback_contact_me' => false, + 'window_closed' => '', + ]; + } + + /** + * Get Challenge parameter(s) from Challenge option. + * + * @since 1.5.0 + * + * @param array|string|null $query Query using 'wpforms_challenge' schema keys. + * + * @return array|mixed + */ + public function get_challenge_option( $query = null ) { + + if ( ! $query ) { + return get_option( 'wpforms_challenge' ); + } + + $return_single = false; + + if ( ! is_array( $query ) ) { + $return_single = true; + $query = [ $query ]; + } + + $query = array_flip( $query ); + + $option = get_option( 'wpforms_challenge' ); + + if ( ! $option || ! is_array( $option ) ) { + return array_intersect_key( $this->get_challenge_option_schema(), $query ); + } + + $result = array_intersect_key( $option, $query ); + + if ( $return_single ) { + $result = reset( $result ); + } + + return $result; + } + + /** + * Set Challenge parameter(s) to Challenge option. + * + * @since 1.5.0 + * + * @param array $query Query using 'wpforms_challenge' schema keys. + */ + public function set_challenge_option( $query ) { + + if ( empty( $query ) || ! is_array( $query ) ) { + return; + } + + $schema = $this->get_challenge_option_schema(); + $replace = array_intersect_key( $query, $schema ); + + if ( ! $replace ) { + return; + } + + // Validate and sanitize the data. + foreach ( $replace as $key => $value ) { + if ( in_array( $key, [ 'step', 'user_id', 'form_id', 'embed_page', 'seconds_spent', 'seconds_left' ], true ) ) { + $replace[ $key ] = absint( $value ); + + continue; + } + if ( in_array( $key, [ 'feedback_sent', 'feedback_contact_me' ], true ) ) { + $replace[ $key ] = wp_validate_boolean( $value ); + + continue; + } + $replace[ $key ] = sanitize_text_field( $value ); + } + + $option = get_option( 'wpforms_challenge' ); + $option = ! $option || ! is_array( $option ) ? $schema : $option; + + update_option( 'wpforms_challenge', array_merge( $option, $replace ) ); + } + + /** + * Check if any forms are present on a site. + * + * @since 1.5.0 + * + * @retun bool + */ + public function website_has_forms() { + + // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters + return (bool) wpforms()->obj( 'form' )->get( + '', + [ + 'numberposts' => 1, + 'nopaging' => false, + 'fields' => 'ids', + 'no_found_rows' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'suppress_filters' => true, // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters + ] + ); + } + + /** + * Check if Challenge was started. + * + * @since 1.5.0 + * + * @return bool + */ + public function challenge_started() { + + return $this->get_challenge_option( 'status' ) === 'started'; + } + + /** + * Check if Challenge was initialized. + * + * @since 1.6.2 + * + * @return bool + */ + public function challenge_inited() { + + return $this->get_challenge_option( 'status' ) === 'inited'; + } + + /** + * Check if Challenge was paused. + * + * @since 1.6.2 + * + * @return bool + */ + public function challenge_paused() { + + return $this->get_challenge_option( 'status' ) === 'paused'; + } + + /** + * Check if Challenge was finished. + * + * @since 1.5.0 + * + * @return bool + */ + public function challenge_finished() { + + $status = $this->get_challenge_option( 'status' ); + + return in_array( $status, [ 'completed', 'canceled', 'skipped' ], true ); + } + + /** + * Check if Challenge is in progress. + * + * @since 1.5.0 + * + * @return bool + */ + public function challenge_active() { + + return ( $this->challenge_inited() || $this->challenge_started() || $this->challenge_paused() ) && ! $this->challenge_finished(); + } + + /** + * Force Challenge to start. + * + * @since 1.6.2 + * + * @return bool + */ + public function challenge_force_start() { + + /** + * Allow force start Challenge for testing purposes. + * + * @since 1.6.2.2 + * + * @param bool $is_forced True if Challenge should be started. False by default. + */ + return (bool) apply_filters( 'wpforms_admin_challenge_force_start', false ); + } + + /** + * Check if Challenge can be started. + * + * @since 1.5.0 + * + * @return bool + */ + public function challenge_can_start() { + + static $can_start = null; + + if ( $can_start !== null ) { + return $can_start; + } + + if ( $this->challenge_force_skip() ) { + $can_start = false; + } + + // Challenge is only available on WPForms admin pages or Builder page. + if ( ! wpforms_is_admin_page() && ! wpforms_is_admin_page( 'builder' ) ) { + $can_start = false; + + // No need to check something else in this case. + return false; + } + + // The challenge should not start if this is the Forms' Overview page. + if ( wpforms_is_admin_page( 'overview' ) ) { + $can_start = false; + + // No need to check something else in this case. + return false; + } + + // Force start the Challenge. + if ( $this->challenge_force_start() && ! $this->is_builder_page() && ! $this->is_form_embed_page() ) { + $can_start = true; + + // No need to check something else in this case. + return true; + } + + if ( $this->challenge_finished() ) { + $can_start = false; + } + + if ( $this->website_has_forms() ) { + $can_start = false; + } + + if ( $can_start === null ) { + $can_start = true; + } + + return $can_start; + } + + /** + * Start the Challenge in Form Builder. + * + * @since 1.5.0 + */ + public function init_challenge() { + + if ( ! $this->challenge_can_start() ) { + return; + } + + $this->set_challenge_option( + wp_parse_args( + [ 'status' => 'inited' ], + $this->get_challenge_option_schema() + ) + ); + } + + /** + * Include Challenge HTML. + * + * @since 1.5.0 + */ + public function challenge_html() { + + if ( $this->challenge_force_skip() || ( $this->challenge_finished() && ! $this->challenge_force_start() ) ) { + return; + } + + if ( wpforms_is_admin_page() && ! wpforms_is_admin_page( 'getting-started' ) && $this->challenge_can_start() ) { + + // Before showing the Challenge in the `start` state we should reset the option. + // In this way we ensure the Challenge will not appear somewhere in the builder where it is not should be. + $this->set_challenge_option( [ 'status' => '' ] ); + $this->challenge_modal_html( 'start' ); + } + + if ( $this->is_builder_page() ) { + $this->challenge_modal_html( 'progress' ); + $this->challenge_builder_templates_html(); + } + + if ( $this->is_form_embed_page() ) { + $this->challenge_modal_html( 'progress' ); + $this->challenge_embed_templates_html(); + } + } + + /** + * Include Challenge main modal window HTML. + * + * @since 1.5.0 + * + * @param string $state State of Challenge ('start' or 'progress'). + */ + public function challenge_modal_html( $state ) { + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/challenge/modal', + [ + 'state' => $state, + 'step' => $this->get_challenge_option( 'step' ), + 'minutes' => $this->minutes, + ], + true + ); + } + + /** + * Include Challenge HTML templates specific to Form Builder. + * + * @since 1.5.0 + */ + public function challenge_builder_templates_html() { + + echo wpforms_render( 'admin/challenge/builder' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + /** + * Include Challenge HTML templates specific to form embed page. + * + * @since 1.5.0 + */ + public function challenge_embed_templates_html() { + + /** + * Filter the content of the Challenge Congrats popup footer. + * + * @since 1.7.4 + * + * @param string $footer Footer markup. + */ + $congrats_popup_footer = apply_filters( 'wpforms_admin_challenge_embed_template_congrats_popup_footer', '' ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'admin/challenge/embed', + [ + 'minutes' => $this->minutes, + 'congrats_popup_footer' => $congrats_popup_footer, + ], + true + ); + } + + /** + * Include Challenge CTA on WPForms welcome activation screen. + * + * @since 1.5.0 + */ + public function welcome_html() { + + if ( $this->challenge_can_start() ) { + echo wpforms_render( 'admin/challenge/welcome' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + } + + /** + * Save Challenge data via AJAX. + * + * @since 1.5.0 + */ + public function save_challenge_option_ajax() { + + check_admin_referer( 'wpforms_challenge_ajax_nonce' ); + + if ( empty( $_POST['option_data'] ) ) { + wp_send_json_error(); + } + + $schema = $this->get_challenge_option_schema(); + $query = []; + + foreach ( $schema as $key => $value ) { + if ( isset( $_POST['option_data'][ $key ] ) ) { + $query[ $key ] = sanitize_text_field( wp_unslash( $_POST['option_data'][ $key ] ) ); + } + } + + if ( empty( $query ) ) { + wp_send_json_error(); + } + + if ( ! empty( $query['status'] ) && $query['status'] === 'started' ) { + $query['started_date_gmt'] = current_time( 'mysql', true ); + } + + if ( ! empty( $query['status'] ) && in_array( $query['status'], [ 'completed', 'canceled', 'skipped' ], true ) ) { + $query['finished_date_gmt'] = current_time( 'mysql', true ); + } + + if ( ! empty( $query['status'] ) && $query['status'] === 'skipped' ) { + $query['started_date_gmt'] = current_time( 'mysql', true ); + $query['finished_date_gmt'] = $query['started_date_gmt']; + } + + $this->set_challenge_option( $query ); + + wp_send_json_success(); + } + + /** + * Send contact form to wpforms.com via AJAX. + * + * @since 1.5.0 + */ + public function send_contact_form_ajax() { + + check_admin_referer( 'wpforms_challenge_ajax_nonce' ); + + $url = 'https://wpforms.com/wpforms-challenge-feedback/'; + $message = ! empty( $_POST['contact_data']['message'] ) ? sanitize_textarea_field( wp_unslash( $_POST['contact_data']['message'] ) ) : ''; + $email = ''; + + if ( + ( ! empty( $_POST['contact_data']['contact_me'] ) && $_POST['contact_data']['contact_me'] === 'true' ) + || wpforms()->is_pro() + ) { + $current_user = wp_get_current_user(); + $email = $current_user->user_email; + $this->set_challenge_option( [ 'feedback_contact_me' => true ] ); + } + + if ( empty( $message ) && empty( $email ) ) { + wp_send_json_error(); + } + + $data = [ + 'body' => [ + 'wpforms' => [ + 'id' => 296355, + 'submit' => 'wpforms-submit', + 'fields' => [ + 2 => $message, + 3 => $email, + 4 => $this->get_challenge_license_type(), + 5 => wpforms()->version, + 6 => wpforms_get_license_key(), + ], + ], + ], + ]; + + $response = wp_remote_post( $url, $data ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error(); + } + + $this->set_challenge_option( [ 'feedback_sent' => true ] ); + wp_send_json_success(); + } + + /** + * Get the current WPForms license type as it pertains to the challenge feedback form. + * + * @since 1.8.1 + * + * @return string The currently active license type. + */ + private function get_challenge_license_type() { + + $license_type = wpforms_get_license_type(); + + if ( $license_type === false ) { + $license_type = wpforms()->is_pro() ? 'Unknown' : 'Lite'; + } + + return ucfirst( $license_type ); + } + + /** + * Force WPForms Challenge to skip. + * + * @since 1.7.6 + * + * @return bool + */ + private function challenge_force_skip() { + + return defined( 'WPFORMS_SKIP_CHALLENGE' ) && WPFORMS_SKIP_CHALLENGE; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Dashboard/Widget.php b/wp-content/plugins/wpforms-lite/src/Admin/Dashboard/Widget.php new file mode 100755 index 00000000..78e945d3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Dashboard/Widget.php @@ -0,0 +1,303 @@ +widget_meta( 'set', $meta, $value ); + + exit(); + } + + /** + * Get/set a widget meta. + * + * @since 1.7.4 + * + * @param string $action Possible value: 'get' or 'set'. + * @param string $meta Meta name. + * @param int $value Value to set. + * + * @return mixed + */ + protected function widget_meta( $action, $meta, $value = 0 ) { + + $allowed_actions = [ 'get', 'set' ]; + + if ( ! in_array( $action, $allowed_actions, true ) ) { + return false; + } + + $defaults = [ + 'timespan' => $this->get_timespan_default(), + 'active_form_id' => 0, + 'hide_recommended_block' => 0, + 'hide_graph' => 0, + 'color_scheme' => 1, // 1 - wpforms, 2 - wp + 'graph_style' => 2, // 1 - bar, 2 - line + ]; + + if ( ! array_key_exists( $meta, $defaults ) ) { + return false; + } + + $meta_key = 'wpforms_' . static::SLUG . '_' . $meta; + $user_id = get_current_user_id(); + + if ( $action === 'get' ) { + $meta_value = absint( get_user_meta( $user_id, $meta_key, true ) ); + // Return a default value from $defaults if $meta_value is empty. + + return empty( $meta_value ) ? $defaults[ $meta ] : $meta_value; + } + + $value = absint( $value ); + + if ( $action === 'set' && ! empty( $value ) ) { + return update_user_meta( $user_id, $meta_key, $value ); + } + + if ( $action === 'set' && empty( $value ) ) { + return delete_user_meta( $user_id, $meta_key ); + } + + return false; + } + + /** + * Get the default timespan option. + * + * @since 1.7.4 + * + * @return int|null + */ + protected function get_timespan_default() { + + $options = $this->get_timespan_options(); + $default = reset( $options ); + + return is_numeric( $default ) ? $default : null; + } + + /** + * Get timespan options (in days). + * + * @since 1.7.4 + * + * @return array + */ + protected function get_timespan_options(): array { + + $default = [ 7, 30 ]; + + $options = $default; + + // Apply deprecated filters. + if ( function_exists( 'apply_filters_deprecated' ) ) { + // phpcs:disable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $options = apply_filters_deprecated( 'wpforms_dash_widget_chart_timespan_options', [ $options ], '5.0', 'wpforms_dash_widget_timespan_options' ); + $options = apply_filters_deprecated( 'wpforms_dash_widget_forms_list_timespan_options', [ $options ], '5.0', 'wpforms_dash_widget_timespan_options' ); + // phpcs:enable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + } else { + // phpcs:disable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $options = apply_filters( 'wpforms_dash_widget_chart_timespan_options', $options ); + $options = apply_filters( 'wpforms_dash_widget_forms_list_timespan_options', $options ); + // phpcs:enable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + } + + if ( ! is_array( $options ) ) { + $options = $default; + } + + $widget_slug = static::SLUG; + + // phpcs:disable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + $options = apply_filters( "wpforms_{$widget_slug}_timespan_options", $options ); + // phpcs:enable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + + if ( ! is_array( $options ) ) { + return []; + } + + $options = array_filter( $options, 'is_numeric' ); + + return empty( $options ) ? $default : $options; + } + + /** + * Widget settings HTML. + * + * @since 1.7.4 + * + * @param bool $enabled Is form fields should be enabled. + */ + protected function widget_settings_html( $enabled = true ) { + + $graph_style = $this->widget_meta( 'get', 'graph_style' ); + $color_scheme = $this->widget_meta( 'get', 'color_scheme' ); + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'admin/dashboard/widget/settings', + [ + 'graph_style' => $graph_style, + 'color_scheme' => $color_scheme, + 'enabled' => $enabled, + ], + true + ); + } + + /** + * Return randomly chosen one of the recommended plugins. + * + * @since 1.7.3 + * + * @return array + */ + final protected function get_recommended_plugin(): array { + + $plugins = [ + 'google-analytics-for-wordpress/googleanalytics.php' => [ + 'name' => __( 'MonsterInsights', 'wpforms-lite' ), + 'slug' => 'google-analytics-for-wordpress', + 'more' => 'https://www.monsterinsights.com/', + 'pro' => [ + 'file' => 'google-analytics-premium/googleanalytics-premium.php', + ], + ], + 'all-in-one-seo-pack/all_in_one_seo_pack.php' => [ + 'name' => __( 'AIOSEO', 'wpforms-lite' ), + 'slug' => 'all-in-one-seo-pack', + 'more' => 'https://aioseo.com/', + 'pro' => [ + 'file' => 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php', + ], + ], + 'coming-soon/coming-soon.php' => [ + 'name' => __( 'SeedProd', 'wpforms-lite' ), + 'slug' => 'coming-soon', + 'more' => 'https://www.seedprod.com/', + 'pro' => [ + 'file' => 'seedprod-coming-soon-pro-5/seedprod-coming-soon-pro-5.php', + ], + ], + 'wp-mail-smtp/wp_mail_smtp.php' => [ + 'name' => __( 'WP Mail SMTP', 'wpforms-lite' ), + 'slug' => 'wp-mail-smtp', + 'more' => 'https://wpmailsmtp.com/', + 'pro' => [ + 'file' => 'wp-mail-smtp-pro/wp_mail_smtp.php', + ], + ], + ]; + + $installed = get_plugins(); + + foreach ( $plugins as $id => $plugin ) { + + if ( isset( $installed[ $id ] ) ) { + unset( $plugins[ $id ] ); + } + + if ( isset( $plugin['pro']['file'], $installed[ $plugin['pro']['file'] ] ) ) { + unset( $plugins[ $id ] ); + } + } + + return $plugins ? $plugins[ array_rand( $plugins ) ] : []; + } + + /** + * Timespan select HTML. + * + * @since 1.7.4 + * + * @param int $active_form_id Currently preselected form ID. + * @param bool $enabled If the select menu items should be enabled. + */ + protected function timespan_select_html( $active_form_id, $enabled = true ) { + ?> + + + widget_meta( 'get', 'timespan' ); + + foreach ( $options as $option ) : + ?> + + allow_load() ) { + return; + } + + // Store the instance of the Education core class. + $this->education = wpforms()->obj( 'education' ); + + // Store the instance of the Education\Addons class. + $this->addons = wpforms()->obj( 'addons' ); + + // Define hooks. + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.6.6 + */ + abstract public function hooks(); + + /** + * Display single addon item. + * + * @since 1.6.6 + * + * @param array $addon Addon data. + * + * @noinspection ReturnTypeCanBeDeclaredInspection + * @noinspection PhpMissingParamTypeInspection + */ + protected function display_single_addon( $addon ) { + + /** + * Filter to disallow addons to be displayed in the Education feature. + * + * @since 1.8.2 + * + * @param bool $display Whether to hide the addon. + * @param array $slug Addon data. + */ + $is_disallowed = (bool) apply_filters( 'wpforms_admin_education_addons_item_base_display_single_addon_hide', false, $addon ); + + if ( empty( $addon ) || $is_disallowed ) { + return; + } + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $this->single_addon_template, + $addon, + true + ); + } + + /** + * Prepare field data-attributes for the education actions. + * E.g., install, activate, incompatible. + * + * @since 1.9.4 + * + * @param array $addon Current addon information. + * + * @return array + */ + protected function prepare_field_action_data( array $addon ): array { + + if ( empty( $addon['plugin_allow'] ) ) { + return []; + } + + if ( $addon['action'] === 'install' ) { + return [ + 'data' => [ + 'action' => 'install', + 'name' => $addon['modal_name'], + 'url' => $addon['url'], + 'nonce' => wp_create_nonce( 'wpforms-admin' ), + 'license' => $addon['license_level'], + ], + 'class' => 'education-modal', + ]; + } + + if ( $addon['action'] === 'activate' ) { + return [ + 'data' => [ + 'action' => 'activate', + 'name' => sprintf( /* translators: %s - addon name. */ + esc_html__( '%s addon', 'wpforms-lite' ), + $addon['name'] + ), + 'path' => $addon['path'], + 'nonce' => wp_create_nonce( 'wpforms-admin' ), + ], + 'class' => 'education-modal', + ]; + } + + if ( $addon['action'] === 'incompatible' ) { + return [ + 'data' => [ + 'action' => 'incompatible', + 'message' => Requirements::get_instance()->get_notice( $addon['path'] ), + ], + 'class' => 'education-modal', + ]; + } + + return []; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/AddonsListBase.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/AddonsListBase.php new file mode 100755 index 00000000..847660fe --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/AddonsListBase.php @@ -0,0 +1,62 @@ +get_addons() ); + } + + /** + * Get addons. + * + * @since 1.6.6 + * + * @return array Addons array. + */ + abstract protected function get_addons(); + + /** + * Ensure that we do not display activated addon items if those addons are not allowed according to the current license. + * + * @since 1.6.6 + * + * @param string $hook Hook name. + */ + protected function filter_not_allowed_addons( $hook ) { + + $edu_addons = wp_list_pluck( $this->get_addons(), 'slug' ); + + foreach ( $edu_addons as $i => $addon ) { + $edu_addons[ $i ] = strtolower( preg_replace( '/[^a-zA-Z0-9]+/', '', $addon ) ); + } + + if ( empty( $GLOBALS['wp_filter'][ $hook ]->callbacks ) ) { + return; + } + + foreach ( $GLOBALS['wp_filter'][ $hook ]->callbacks as $priority => $hooks ) { + foreach ( $hooks as $name => $arr ) { + $class = ! empty( $arr['function'][0] ) && is_object( $arr['function'][0] ) ? strtolower( get_class( $arr['function'][0] ) ) : ''; + $class = explode( '\\', $class )[0]; + $class = preg_replace( '/[^a-zA-Z0-9]+/', '', $class ); + + if ( in_array( $class, $edu_addons, true ) ) { + unset( $GLOBALS['wp_filter'][ $hook ]->callbacks[ $priority ][ $name ] ); + } + } + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/EditPost.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/EditPost.php new file mode 100755 index 00000000..583e9cde --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/EditPost.php @@ -0,0 +1,249 @@ +obj( 'challenge' )->is_form_embed_page() ) { + return false; + } + + $form_embed_wizard = wpforms()->obj( 'form_embed_wizard' ); + + // Skip it if it's the Form Embed Wizard flow. + if ( $form_embed_wizard->is_form_embed_page( 'edit' ) && $form_embed_wizard->get_meta() ) { + return false; + } + + $user_id = get_current_user_id(); + $dismissed = get_user_meta( $user_id, 'wpforms_dismissed', true ); + + return empty( $dismissed['edu-edit-post-notice'] ); + } + + /** + * Initialize. + * + * @since 1.8.1 + */ + public function init() { + + if ( ! $this->allow_load() ) { + return; + } + + // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters + $this->has_forms = (bool) wpforms()->obj( 'form' )->get( + '', + [ + 'numberposts' => 1, + 'nopaging' => false, + 'fields' => 'ids', + 'no_found_rows' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'suppress_filters' => true, // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters + ] + ); + + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + add_action( 'edit_form_after_title', [ $this, 'classic_editor_notice' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + } + + /** + * Is gutenberg Editor. + * + * @since 1.8.1 + * + * @return bool + */ + private function is_gutenberg_editor() { + + return (bool) get_current_screen()->is_block_editor(); + } + + /** + * Enqueue styles. + * + * @since 1.8.1 + */ + public function enqueue_styles() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-edit-post-education', + WPFORMS_PLUGIN_URL . "assets/css/admin/edit-post-education{$min}.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Enqueue scripts. + * + * @since 1.8.1 + */ + public function enqueue_scripts() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-edit-post-education', + WPFORMS_PLUGIN_URL . "assets/js/admin/education/edit-post.es5{$min}.js", + [ 'jquery', 'underscore' ], + WPFORMS_VERSION, + true + ); + + $strings = [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'education_nonce' => wp_create_nonce( 'wpforms-education' ), + ]; + + if ( $this->is_gutenberg_editor() ) { + $strings = array_merge( $strings, $this->get_gutenberg_strings() ); + } + + wp_localize_script( + 'wpforms-edit-post-education', + 'wpforms_edit_post_education', + $strings + ); + } + + /** + * Get Gutenberg i18n strings. + * + * @since 1.8.1 + * + * @return array + */ + private function get_gutenberg_strings() { + + $strings = [ + 'gutenberg_notice' => [ + 'template' => $this->get_gutenberg_notice_template(), + 'button' => __( 'Get Started', 'wpforms-lite' ), + ], + ]; + + if ( ! $this->has_forms ) { + $strings['gutenberg_notice']['url'] = add_query_arg( 'page', 'wpforms-overview', admin_url( 'admin.php' ) ); + + return $strings; + } + + $strings['gutenberg_guide'] = [ + [ + 'image' => WPFORMS_PLUGIN_URL . '/assets/images/edit-post-education-page-1.png', + 'title' => __( 'Easily add your contact form', 'wpforms-lite' ), + 'content' => __( 'Oh hey, it looks like you\'re working on a contact page. Don\'t forget to embed your contact form. Click the plus icon above and search for WPForms.', 'wpforms-lite' ), + ], + [ + 'image' => WPFORMS_PLUGIN_URL . '/assets/images/edit-post-education-page-2.png', + 'title' => __( 'Embed your form', 'wpforms-lite' ), + 'content' => __( 'Then click on the WPForms block to embed your desired contact form.', 'wpforms-lite' ), + ], + ]; + + return $strings; + } + + /** + * Add notice to classic editor. + * + * @since 1.8.1 + * + * @param WP_Post $post Add notice to classic editor. + */ + public function classic_editor_notice( $post ) { + + $message = $this->has_forms + ? __( 'Don\'t forget to embed your contact form. Simply click the Add Form button below.', 'wpforms-lite' ) + : sprintf( /* translators: %1$s - link to create a new form. */ + __( 'Did you know that with WPForms, you can create an easy-to-use contact form in a matter of minutes?', 'wpforms-lite' ), + esc_url( add_query_arg( 'page', 'wpforms-overview', admin_url( 'admin.php' ) ) ) + ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'education/admin/edit-post/classic-notice', + [ + 'message' => $message, + ], + true + ); + } + + /** + * Get Gutenberg notice template. + * + * @since 1.8.1 + * + * @return string + */ + private function get_gutenberg_notice_template() { + + $message = $this->has_forms + ? __( 'You\'ve already created a form, now add it to the page so your customers can get in touch.', 'wpforms-lite' ) + : sprintf( /* translators: %1$s - link to create a new form. */ + __( 'Did you know that with WPForms, you can create an easy-to-use contact form in a matter of minutes?', 'wpforms-lite' ), + esc_url( add_query_arg( 'page', 'wpforms-overview', admin_url( 'admin.php' ) ) ) + ); + + return wpforms_render( + 'education/admin/edit-post/notice', + [ + 'message' => $message, + ], + true + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Geolocation.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Geolocation.php new file mode 100755 index 00000000..0b748281 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Geolocation.php @@ -0,0 +1,152 @@ +addons->get_addon( 'geolocation' ); + + if ( + empty( $addon ) || + empty( $addon['status'] ) || + empty( $addon['action'] ) + ) { + return $settings; + } + + $settings[ self::SLUG ][ self::SLUG . '-page' ] = [ + 'id' => self::SLUG . '-page', + 'content' => wpforms_render( 'education/admin/page', $this->template_data(), true ), + 'type' => 'content', + 'no_label' => true, + 'class' => [ 'wpforms-education-container-page' ], + ]; + + return $settings; + } + + /** + * Get the template data. + * + * @since 1.8.6 + * + * @return array + */ + private function template_data(): array { + + $addon = $this->addons->get_addon( 'geolocation' ); + $images_url = WPFORMS_PLUGIN_URL . 'assets/images/geolocation-education/'; + $params = [ + 'features' => [ + __( 'City', 'wpforms-lite' ), + __( 'Latitude/Longitude', 'wpforms-lite' ), + __( 'Google Places API', 'wpforms-lite' ), + __( 'Country', 'wpforms-lite' ), + __( 'Address Autocomplete', 'wpforms-lite' ), + __( 'Mapbox API', 'wpforms-lite' ), + __( 'Postal/Zip Code', 'wpforms-lite' ), + __( 'Embedded Map in Forms', 'wpforms-lite' ), + ], + 'images' => [ + [ + 'url' => $images_url . 'entry-location.jpg', + 'url2x' => $images_url . 'entry-location@2x.jpg', + 'title' => __( 'Location Info in Entries', 'wpforms-lite' ), + ], + [ + 'url' => $images_url . 'address-autocomplete.jpg', + 'url2x' => $images_url . 'address-autocomplete@2x.jpg', + 'title' => __( 'Address Autocomplete Field', 'wpforms-lite' ), + ], + [ + 'url' => $images_url . 'smart-address-field.jpg', + 'url2x' => $images_url . 'smart-address-field@2x.jpg', + 'title' => __( 'Smart Address Field', 'wpforms-lite' ), + ], + ], + 'utm_medium' => 'Settings - Geolocation', + 'utm_content' => 'Geolocation Addon', + 'heading_title' => __( 'Geolocation', 'wpforms-lite' ), + 'heading_description' => sprintf( + '

              %1$s

              ', + __( 'Do you want to learn more about visitors who fill out your online forms? Our geolocation addon allows you to collect and store your website visitors geolocation data along with their form submission. This insight can help you to be better informed and turn more leads into customers. Furthermore, add a smart address field that autocompletes using the Google Places API.', 'wpforms-lite' ) + ), + 'badge' => __( 'Pro', 'wpforms-lite' ), + 'features_description' => __( 'Powerful location-based insights and features…', 'wpforms-lite' ), + ]; + + return array_merge( $params, $addon ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Integrations.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Integrations.php new file mode 100755 index 00000000..e261e530 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/Integrations.php @@ -0,0 +1,67 @@ +addons->get_by_path( 'settings_integrations.category', 'crm|email-marketing|integration' ); + } + + /** + * Ensure that we do not display activated addon items if those addons are not allowed according to the current license. + * + * @since 1.6.6 + */ + public function filter_addons() { + + $this->filter_not_allowed_addons( 'wpforms_settings_providers' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/SMTP.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/SMTP.php new file mode 100755 index 00000000..aeea74e2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Settings/SMTP.php @@ -0,0 +1,67 @@ +allow_load() ) { + return ''; + } + + return wpforms_render( 'education/admin/settings/smtp-notice' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Tools/EntryAutomation.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Tools/EntryAutomation.php new file mode 100755 index 00000000..c81711ad --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Admin/Tools/EntryAutomation.php @@ -0,0 +1,156 @@ +hooks(); + } + + /** + * Load hooks. + * + * @since 1.9.6.1 + */ + private function hooks(): void { + + add_action( 'wpforms_admin_tools_views_entry_automation_display', [ $this, 'display' ] ); + } + + /** + * Get the template data. + * + * @since 1.9.6.1 + * + * @return array + */ + private function get_template_data(): array { + + $images_url = WPFORMS_PLUGIN_URL . 'assets/images/entry-automation/'; + $utm_medium = 'Tools - Entry Automation'; + $utm_content = 'Entry Automation Addon'; + $addon = wpforms()->obj( 'addons' )->get_addon( 'entry-automation' ); + $upgrade_link = $addon['action'] === 'upgrade' + ? sprintf( /* translators: %1$s - WPForms.com Upgrade page URL. */ + ' %2$s', + esc_url( wpforms_admin_upgrade_link( $utm_medium, $utm_content ) ), + esc_html__( 'Upgrade to WPForms Elite', 'wpforms-lite' ) + ) + : ''; + + $params = [ + 'features' => [ + __( 'Automated Task Scheduling', 'wpforms-lite' ), + __( 'Scheduled Exports', 'wpforms-lite' ), + __( 'Task Chaining', 'wpforms-lite' ), + __( 'Automated Deletions', 'wpforms-lite' ), + __( 'Enhanced Data Management', 'wpforms-lite' ), + __( 'Robust Failsafes', 'wpforms-lite' ), + ], + 'images' => [ + [ + 'url' => $images_url . 'education.png', + 'url2x' => $images_url . 'education.png', + 'title' => '', + ], + ], + 'utm_medium' => $utm_medium, + 'utm_content' => $utm_content, + 'upgrade_link_text' => esc_html__( 'Upgrade to WPForms Elite', 'wpforms-lite' ), + 'heading_title' => __( 'Tired of manually exporting and deleting entries? Wish you could schedule these actions for optimal efficiency?', 'wpforms-lite' ), + /* translators: %1$s - WPForms.com Upgrade page URL. */ + 'heading_description' => '

              ' . esc_html__( 'Entry Automation introduces powerful, automated task chaining, allowing you to seamlessly schedule exports and deletions, ensuring your data is managed precisely how you need it. Chain multiple tasks together for complex workflows – export to CSV, then automatically delete after a specified period, for example. We\'ve built robust failsafes to guarantee data integrity, so you can automate with confidence, knowing your valuable entries are always protected. Take back your time and let our addon handle the heavy lifting, keeping your WPForms data organized and secure, automatically.', 'wpforms-lite' ) . '

              ' + . '

              ' . wp_kses( + $upgrade_link, + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + 'class' => [], + ], + 'strong' => [], + ] + ) . '

              ', + 'features_description' => __( 'Powerful Automation Features', 'wpforms-lite' ), + ]; + + return isset( $addon ) ? array_merge( $params, $addon ) : $params; + } + + /** + * Check if the addon is active. + * + * @since 1.9.6.1 + * + * @return bool + */ + private function is_addon_active(): bool { + + /** + * Check if the addon is active. + * + * @since 1.9.6.1 + * + * @param bool $is_active Whether the addon is active. + */ + return (bool) apply_filters( + 'wpforms_admin_education_admin_tools_entry_automation_is_addon_active', + wpforms()->obj( 'addons' )->is_active( 'entry-automation' ) + ); + } + + /** + * Display education content. + * + * @since 1.9.6.1 + */ + public function display(): void { + + // Display the education content only if the addon is not active. + if ( $this->is_addon_active() ) { + return; + } + + $this->enqueue(); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( 'education/admin/page', $this->get_template_data(), true ); + } + + /** + * Enqueue scripts and styles. + * + * @since 1.9.6.1 + */ + private function enqueue(): void { + + // Lity. + wp_enqueue_style( + 'wpforms-lity', + WPFORMS_PLUGIN_URL . 'assets/lib/lity/lity.min.css', + null, + '3.0.0' + ); + + wp_enqueue_script( + 'wpforms-lity', + WPFORMS_PLUGIN_URL . 'assets/lib/lity/lity.min.js', + [ 'jquery' ], + '3.0.0', + true + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Calculations.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Calculations.php new file mode 100755 index 00000000..4839e48b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Calculations.php @@ -0,0 +1,304 @@ +form_id ?? 0; + $dismiss_section = "builder-form-$form_id-field-options-calculations-notice"; + + // Check whether it is dismissed. + if ( ! empty( $dismissed[ 'edu-' . $dismiss_section ] ) ) { + return; + } + + // Display notice only if Calculations addon is released (available in `addons.json` file). + $addon = $this->addons->get_addon( 'calculations' ); + + if ( ! $addon ) { + return; + } + + if ( + AIHelpers::is_disabled() || + ( + wpforms_version_compare( + $addon['version'] ?? '1.5.0', + '1.5.0', + '<=' + ) + ) + ) { + $this->print_standard_education( $dismiss_section ); + + return; + } + + $badge = esc_html__( 'NEW FEATURE', 'wpforms-lite' ); + $notice_header = esc_html__( 'AI Calculations Are Here!', 'wpforms-lite' ); + + $notice = sprintf( + wp_kses( /* translators: %1$s - link to the WPForms.com doc article. */ + __( 'Easily create advanced calculations with WPForms AI. Head over to the Advanced Tab to get started or read our documentation to learn more.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/generating-calculation-formulas-with-wpforms-ai/', 'Calculations Education', 'Calculations Documentation' ) ) + ); + + printf( + '
              + + %5$s + + +

              %4$s

              +

              %3$s

              +
              ', + esc_html__( 'Dismiss this notice.', 'wpforms-lite' ), + esc_attr( $dismiss_section ), + $notice, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $notice_header, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $badge // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Print standard education notice. + * + * @since 1.9.4 + * + * @param string $dismiss_section Dismiss section. + */ + private function print_standard_education( $dismiss_section ) { + + $notice = sprintf( + wp_kses( /* translators: %1$s - link to the WPForms.com doc article. */ + __( 'Easily perform calculations based on user input. Head over to the Advanced Tab to get started or read our documentation to learn more.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/calculations-addon/', 'Calculations Education', 'Calculations Documentation' ) ) + ); + + printf( + '
              + +

              %3$s

              +
              ', + esc_html__( 'Dismiss this notice.', 'wpforms-lite' ), + esc_attr( $dismiss_section ), + $notice // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Display advanced options. + * + * @since 1.8.4.1 + * + * @param array $field Field data. + * @param object $instance Builder instance. + * + * @noinspection ReturnTypeCanBeDeclaredInspection + * @noinspection PhpMissingParamTypeInspection + */ + public function advanced_options( $field, $instance ) { + + if ( ! in_array( $field['type'], self::ALLOWED_FIELD_TYPES, true ) ) { + return; + } + + $addon = $this->addons->get_addon( 'calculations' ); + + if ( ! $this->is_edu_required_by_status( $addon ) ) { + return; + } + + $row_args = $this->get_row_attributes( $addon ); + $row_args['content'] = $instance->field_element( + 'toggle', + $field, + $this->get_field_attributes( $addon ), + false + ); + + $instance->field_element( 'row', $field, $row_args ); + } + + /** + * Get row attributes. + * + * @since 1.8.4.1 + * + * @param array $addon Addon data. + * + * @return array + */ + private function get_row_attributes( array $addon ): array { + + $data = $this->prepare_field_action_data( $addon ); + $default = [ + 'slug' => 'calculation_is_enabled', + ]; + + if ( ! empty( $data ) ) { + return wp_parse_args( $data, $default ); + } + + return wp_parse_args( + [ + 'data' => [ + 'action' => 'upgrade', + 'name' => esc_html__( 'Calculations', 'wpforms-lite' ), + 'utm-content' => 'Enable Calculations', + 'license' => $addon['license_level'], + ], + 'class' => 'education-modal', + ], + $default + ); + } + + /** + * Get attributes for Enable Calculation field. + * + * @since 1.8.4.1 + * + * @param array $addon Addon data. + * + * @return array + */ + private function get_field_attributes( array $addon ): array { + + $default = [ + 'slug' => 'calculation_is_enabled', + 'value' => '0', + 'desc' => esc_html__( 'Enable Calculation', 'wpforms-lite' ), + ]; + + if ( $addon['plugin_allow'] ) { + return $default; + } + + return wp_parse_args( + [ + 'desc' => sprintf( + '%1$s%2$s', + esc_html__( 'Enable Calculation', 'wpforms-lite' ), + Helpers::get_badge( $addon['license_level'], 'sm', 'inline', 'slate' ) + ), + 'attrs' => [ + 'disabled' => 'disabled', + ], + ], + $default + ); + } + + /** + * Determine if we require displaying educational items according to the addon status. + * + * @since 1.8.4.1 + * + * @param array $addon Addon data. + * + * @return bool + */ + private function is_edu_required_by_status( array $addon ): bool { + + return ! ( + empty( $addon ) || + empty( $addon['action'] ) || + empty( $addon['status'] ) || ( + $addon['status'] === 'active' && $addon['action'] !== 'upgrade' + ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Captcha.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Captcha.php new file mode 100755 index 00000000..deafcfa4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Captcha.php @@ -0,0 +1,192 @@ +allow_load() ) { + return; + } + + // Define hooks. + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.6.6 + */ + public function hooks() { + + add_action( 'wp_ajax_wpforms_update_field_captcha', [ $this, 'captcha_field_callback' ] ); + } + + /** + * Targeting on hCaptcha/reCAPTCHA field button in the builder. + * + * @since 1.6.6 + */ + public function captcha_field_callback() { + + // Run a security check. + check_ajax_referer( 'wpforms-builder', 'nonce' ); + + // Check for form ID. + if ( empty( $_POST['id'] ) ) { + wp_send_json_error( esc_html__( 'No form ID found.', 'wpforms-lite' ) ); + } + + $form_id = absint( $_POST['id'] ); + + // Check for permissions. + if ( ! wpforms_current_user_can( 'edit_form_single', $form_id ) ) { + wp_send_json_error( esc_html__( 'You do not have permission.', 'wpforms-lite' ) ); + } + + // Get an actual form data. + $form_data = wpforms()->obj( 'form' )->get( $form_id, [ 'content_only' => true ] ); + + // Check that CAPTCHA is configured in the settings. + $captcha_settings = wpforms_get_captcha_settings(); + $captcha_name = $this->get_captcha_name( $captcha_settings ); + + if ( empty( $form_data ) || empty( $captcha_name ) ) { + wp_send_json_error( esc_html__( 'Something wrong. Please try again later.', 'wpforms-lite' ) ); + } + + // Prepare a result array. + $data = $this->get_captcha_result_mockup( $captcha_settings ); + + if ( empty( $captcha_settings['site_key'] ) || empty( $captcha_settings['secret_key'] ) ) { + + // If CAPTCHA is not configured in the WPForms plugin settings. + $data['current'] = 'not_configured'; + + } elseif ( ! isset( $form_data['settings']['recaptcha'] ) || $form_data['settings']['recaptcha'] !== '1' ) { + + // If CAPTCHA is configured in WPForms plugin settings, but wasn't set in form settings. + $data['current'] = 'configured_not_enabled'; + + } else { + + // If CAPTCHA is configured in WPForms plugin and form settings. + $data['current'] = 'configured_enabled'; + } + + wp_send_json_success( $data ); + } + + /** + * Retrieve the CAPTCHA name. + * + * @since 1.6.6 + * + * @param array $settings The CAPTCHA settings. + * + * @return string + */ + private function get_captcha_name( $settings ) { + + if ( empty( $settings['provider'] ) ) { + return ''; + } + + if ( empty( $settings['site_key'] ) && empty( $settings['secret_key'] ) ) { + return esc_html__( 'CAPTCHA', 'wpforms-lite' ); + } + + if ( $settings['provider'] === 'hcaptcha' ) { + return esc_html__( 'hCaptcha', 'wpforms-lite' ); + } + + if ( $settings['provider'] === 'turnstile' ) { + return esc_html__( 'Cloudflare Turnstile', 'wpforms-lite' ); + } + + $recaptcha_names = [ + 'v2' => esc_html__( 'Google Checkbox v2 reCAPTCHA', 'wpforms-lite' ), + 'invisible' => esc_html__( 'Google Invisible v2 reCAPTCHA', 'wpforms-lite' ), + 'v3' => esc_html__( 'Google v3 reCAPTCHA', 'wpforms-lite' ), + ]; + + return isset( $recaptcha_names[ $settings['recaptcha_type'] ] ) ? $recaptcha_names[ $settings['recaptcha_type'] ] : ''; + } + + /** + * Get CAPTCHA callback result mockup. + * + * @since 1.6.6 + * + * @param array $settings The CAPTCHA settings. + * + * @return array + */ + private function get_captcha_result_mockup( $settings ) { + + $captcha_name = $this->get_captcha_name( $settings ); + + if ( empty( $captcha_name ) ) { + wp_send_json_error( esc_html__( 'Something wrong. Please, try again later.', 'wpforms-lite' ) ); + } + + return [ + 'current' => false, + 'cases' => [ + 'not_configured' => [ + 'title' => esc_html__( 'Heads up!', 'wpforms-lite' ), + 'content' => sprintf( + wp_kses( /* translators: %1$s - CAPTCHA settings page URL, %2$s - WPForms.com doc URL. */ + __( 'Please complete the setup in your WPForms Settings, and check out our guide to learn about available CAPTCHA solutions.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => true, + 'rel' => true, + 'target' => true, + ], + ] + ), + esc_url( admin_url( 'admin.php?page=wpforms-settings&view=captcha' ) ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/setup-captcha-wpforms/', 'builder-modal', 'Captcha Documentation' ) ) + ), + ], + 'configured_not_enabled' => [ + 'title' => false, + /* translators: %s - CAPTCHA name. */ + 'content' => sprintf( esc_html__( '%s has been enabled for this form. Don\'t forget to save your form!', 'wpforms-lite' ), $captcha_name ), + ], + 'configured_enabled' => [ + 'title' => false, + /* translators: %s - CAPTCHA name. */ + 'content' => sprintf( esc_html__( 'Are you sure you want to disable %s for this form?', 'wpforms-lite' ), $captcha_name ), + 'cancel' => true, + ], + ], + 'provider' => $settings['provider'], + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Fields.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Fields.php new file mode 100755 index 00000000..08c1a638 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Fields.php @@ -0,0 +1,75 @@ +fields = wpforms()->obj( 'education_fields' ); + } + + /** + * Print the form preview notice. + * + * @since 1.9.4 + * + * @param array $texts Notice texts. + */ + protected function print_form_preview_notice( $texts ): void { + + printf( + '
              +
              +

              %2$s

              +

              %3$s

              +
              +
              +
              +
              ', + esc_attr( $texts['class'] ), + esc_html( $texts['title'] ), + $texts['content'], // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_html( $texts['dismiss_section'] ), + esc_attr__( 'Dismiss this notice', 'wpforms-lite' ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Geolocation.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Geolocation.php new file mode 100755 index 00000000..ceb46cac --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Geolocation.php @@ -0,0 +1,154 @@ +addons->get_addon( 'geolocation' ); + + if ( + empty( $addon ) || + empty( $addon['action'] ) || + empty( $addon['status'] ) || ( + $addon['status'] === 'active' && + $addon['action'] !== 'upgrade' + ) + ) { + return; + } + + $row_args = $this->get_address_autocomplete_row_attributes( $addon ); + $row_args['content'] = $instance->field_element( + 'toggle', + $field, + $this->get_address_autocomplete_field_attributes( $addon ), + false + ); + + $instance->field_element( 'row', $field, $row_args ); + } + + /** + * Get attributes for address autocomplete row. + * + * @since 1.6.6 + * + * @param array $addon Current addon information. + * + * @return array + */ + private function get_address_autocomplete_row_attributes( array $addon ): array { + + $data = $this->prepare_field_action_data( $addon ); + $default = [ + 'slug' => 'enable_address_autocomplete', + ]; + + if ( ! empty( $data ) ) { + return wp_parse_args( $data, $default ); + } + + return wp_parse_args( + [ + 'data' => [ + 'action' => 'upgrade', + 'name' => esc_html__( 'Address Autocomplete', 'wpforms-lite' ), + 'utm-content' => 'Address Autocomplete', + 'licence' => 'pro', + 'message' => esc_html__( 'We\'re sorry, Address Autocomplete is part of the Geolocation Addon and not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features.', 'wpforms-lite' ), + ], + 'class' => 'education-modal', + ], + $default + ); + } + + /** + * Get attributes for address autocomplete field. + * + * @since 1.6.6 + * + * @param array $addon Current addon information. + * + * @return array + */ + private function get_address_autocomplete_field_attributes( array $addon ): array { + + $default = [ + 'slug' => 'enable_address_autocomplete', + 'value' => '0', + 'desc' => esc_html__( 'Enable Address Autocomplete', 'wpforms-lite' ), + ]; + + if ( $addon['plugin_allow'] ) { + return $default; + } + + return wp_parse_args( + [ + 'desc' => sprintf( + '%1$s%2$s', + esc_html__( 'Enable Address Autocomplete', 'wpforms-lite' ), + Helpers::get_badge( 'Pro', 'sm', 'inline', 'slate' ) + ), + 'attrs' => [ + 'disabled' => 'disabled', + ], + ], + $default + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/PDF.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/PDF.php new file mode 100755 index 00000000..89274903 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/PDF.php @@ -0,0 +1,246 @@ +addon_data = $this->get_addon_data(); + + if ( ! $this->should_show_popup() ) { + return; + } + + $this->hooks(); + } + + /** + * Should show popup. + * + * @since 1.9.7.3 + * + * @return bool + */ + private function should_show_popup(): bool { + + if ( ! wpforms_is_admin_page( 'builder' ) && ! wpforms_is_admin_ajax() ) { + return false; + } + + if ( ! current_user_can( wpforms_get_capability_manage_options() ) ) { + return false; + } + + $challenge = wpforms()->obj( 'challenge' ); + + if ( ! $challenge || $challenge->challenge_active() ) { + return false; + } + + return $this->is_popup_visible(); + } + + /** + * Is popup visible. + * + * @since 1.9.7.3 + * + * @return bool + */ + private function is_popup_visible(): bool { + + $action = $this->addon_data['action'] ?? 'install'; + + if ( + empty( $this->addon_data ) || + ( $action === 'install' && empty( $this->addon_data['url'] ) ) // The install action requires a valid URL. + ) { + return false; + } + + $meta = get_user_meta( get_current_user_id(), 'wpforms_dismissed', true ); + + return empty( $meta['edu-builder-pdf'] ); + } + + /** + * Hooks. + * + * @since 1.9.7.3 + */ + private function hooks(): void { + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + add_filter( 'wpforms_builder_output_before_toolbar', [ $this, 'popup_html' ] ); + } + + /** + * Enqueue scripts. + * + * @since 1.9.7.3 + */ + public function enqueue_scripts(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-pdf-popup', + WPFORMS_PLUGIN_URL . "assets/js/admin/education/pdf$min.js", + [], + WPFORMS_VERSION, + true + ); + } + + /** + * Popup HTML. + * + * @since 1.9.7.3 + * + * @param string|mixed $html HTML. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + public function popup_html( $html ): string { + + $html = (string) $html; + + $popup = sprintf( + '', + esc_url( WPFORMS_PLUGIN_URL . 'assets/images/pdf-education/pdf.svg' ), + __( 'NEW FEATURE', 'wpforms-lite' ), + __( 'PDF Addon', 'wpforms-lite' ), + __( 'Easily turn form entry data into beautifully designed PDFs and attach them to notifications.', 'wpforms-lite' ), + $this->get_button_html() + ); + + return $popup . $html; + } + + /** + * Get button HTML. + * + * @since 1.9.7.3 + * + * @return string + * @noinspection HtmlUnknownAttribute + */ + private function get_button_html(): string { + + $addon = $this->addon_data; + $action = $addon['action'] ?? 'switch'; + + [ $button_label, $button_utm, $button_class, $button_attr ] = $this->get_button_data( $action, $addon ); + + return sprintf( + '', + esc_attr( $button_class ), + esc_attr( $action ), + esc_html( $button_label ), + $button_attr, + esc_attr( $addon['license_level'] ?? 'pro' ), + esc_attr( $button_utm ) + ); + } + + /** + * Get addon data. + * + * @since 1.9.7.3 + * + * @return array + */ + private function get_addon_data(): array { + + /** + * Filter the slug for the PDF educational popup. + * + * @since 1.9.7.3 + * + * @param string $slug The slug for the PDF educational popup. + */ + $slug = apply_filters( 'wpforms_admin_education_builder_pdf_get_addon_data_slug', $this->slug ); + $addons = Helpers::get_edu_addons(); + + return $addons[ $slug ] ?? []; + } + + /** + * Get button data. + * + * @since 1.9.7.3 + * + * @param string $action Action type (switch, upgrade, etc.). + * @param array $addon Addon data. + * + * @return array + */ + protected function get_button_data( string $action, array $addon ): array { + + $button_label = $action === 'upgrade' + ? esc_html__( 'Upgrade to Pro', 'wpforms-lite' ) + : esc_html__( 'Try it Out', 'wpforms-lite' ); + $button_utm = 'PDF Addon Pop-up'; + $button_class = 'education-action-button'; + $button_attr = ''; + + if ( $action === 'switch' ) { + $button_class = 'education-modal education-switch-button'; + $button_attr = 'data-target="wpforms-pdf"'; + } elseif ( $action !== 'upgrade' ) { + $button_class = 'education-modal'; + $button_attr = sprintf( + 'data-nonce="%1$s" data-path="%2$s" data-url="%3$s" data-message="" data-name="%4$s"', + esc_attr( wp_create_nonce( 'wpforms-admin' ) ), + $addon['path'] ?? '', + $addon['url'] ?? '', + esc_html__( 'WPForms PDF Addon', 'wpforms-lite' ) + ); + } + + return [ $button_label, $button_utm, $button_class, $button_attr ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Panel.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Panel.php new file mode 100755 index 00000000..ee808432 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Panel.php @@ -0,0 +1,69 @@ +get_name() ); + } + + /** + * Get addons for the current panel. + * + * @since 1.6.6 + */ + protected function get_addons() { + + return $this->addons->get_by_path( 'form_builder.category', $this->get_name() ); + } + + /** + * Template name for rendering single addon item. + * + * @since 1.6.6 + * + * @return string + */ + protected function get_single_addon_template() { + + return 'education/builder/' . $this->get_name() . '-item'; + } + + /** + * Display addons. + * + * @since 1.6.6 + */ + public function display_addons() { + + $this->single_addon_template = $this->get_single_addon_template(); + + parent::display_addons(); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Payments.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Payments.php new file mode 100755 index 00000000..047461c7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Payments.php @@ -0,0 +1,70 @@ +addons->get_by_path( 'form_builder.category', $this->get_name() ); + } + + /** + * Template name for rendering single addon item. + * + * @since 1.6.6 + * + * @return string + */ + protected function get_single_addon_template() { + + return 'education/builder/providers-item'; + } + + /** + * Ensure that we do not display activated addon items if those addons are not allowed according to the current license. + * + * @since 1.6.6 + */ + public function filter_addons() { + + $this->filter_not_allowed_addons( 'wpforms_payments_panel_sidebar' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Providers.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Providers.php new file mode 100755 index 00000000..bf8dec53 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Providers.php @@ -0,0 +1,71 @@ +filter_not_allowed_addons( 'wpforms_providers_panel_sidebar' ); + } + + /** + * Get addons for the Marketing panel. + * + * @since 1.7.7.2 + */ + protected function get_addons() { + + $addons = parent::get_addons(); + + /** + * Google Sheets uses Providers API. All providers are automatically + * added to the Marketing tab in the builder. We don't need the addon + * on the Marketing tab because the addon is already added to + * the builder's Settings tab. + */ + foreach ( $addons as $key => $addon ) { + if ( isset( $addon['slug'] ) && $addon['slug'] === 'wpforms-google-sheets' ) { + unset( $addons[ $key ] ); + break; + } + } + + return $addons; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Settings.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Settings.php new file mode 100755 index 00000000..b1982db5 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Builder/Settings.php @@ -0,0 +1,69 @@ +get_name() !== $panel ) { + return; + } + + $this->display_addons(); + } + + /** + * Ensure that we do not display activated addon items if those addons are not allowed according to the current license. + * + * @since 1.6.6 + * + * @param array $sections Settings sections. + * + * @return array + */ + public function filter_addons( $sections ) { + + $this->filter_not_allowed_addons( 'wpforms_builder_settings_sections' ); + + return $sections; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Core.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Core.php new file mode 100755 index 00000000..9bd5003a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Core.php @@ -0,0 +1,143 @@ +allow_load() ) { + return; + } + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.6.6 + */ + protected function hooks() { + + if ( wp_doing_ajax() ) { + add_action( 'wp_ajax_wpforms_education_dismiss', [ $this, 'ajax_dismiss' ] ); + + return; + } + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); + } + + /** + * Load enqueues. + * + * @since 1.6.6 + */ + public function enqueues() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-admin-education-core', + WPFORMS_PLUGIN_URL . "assets/js/admin/education/core{$min}.js", + [ 'jquery', 'jquery-confirm' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-admin-education-core', + 'wpforms_education', + $this->get_js_strings() + ); + } + + /** + * Ajax handler for the education dismisses buttons. + * + * @since 1.6.6 + */ + public function ajax_dismiss() { + + // Run a security check. + check_ajax_referer( 'wpforms-education', 'nonce' ); + + // Section is the identifier of the education feature. + // For example, in Builder/DidYouKnow feature used 'builder-did-you-know-notifications' + // and 'builder-did-you-know-confirmations'. + $section = ! empty( $_POST['section'] ) ? sanitize_key( $_POST['section'] ) : ''; + + if ( empty( $section ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Please specify a section.', 'wpforms-lite' ) ] + ); + } + + // Check for permissions. + if ( ! $this->current_user_can() ) { + wp_send_json_error( + [ 'error' => esc_html__( 'You do not have permission to perform this action.', 'wpforms-lite' ) ] + ); + } + + $user_id = get_current_user_id(); + $dismissed = get_user_meta( $user_id, 'wpforms_dismissed', true ); + + if ( empty( $dismissed ) ) { + $dismissed = []; + } + + $dismissed[ 'edu-' . $section ] = time(); + + update_user_meta( $user_id, 'wpforms_dismissed', $dismissed ); + wp_send_json_success(); + } + + /** + * Whether the current user can perform an action. + * + * @since 1.8.0 + * + * @return bool + */ + private function current_user_can(): bool { + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $page = ! empty( $_POST['page'] ) ? sanitize_key( $_POST['page'] ) : ''; + + // key is the same as $current_screen->id and the JS global 'pagenow', value - capability name(s). + $caps = [ + 'toplevel_page_wpforms-overview' => [ 'view_forms' ], + 'wpforms_page_wpforms-builder' => [ 'edit_forms' ], + 'wpforms_page_wpforms-entries' => [ 'view_entries' ], + ]; + + return isset( $caps[ $page ] ) ? wpforms_current_user_can( $caps[ $page ] ) : wpforms_current_user_can(); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/EducationInterface.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/EducationInterface.php new file mode 100755 index 00000000..d54665d7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/EducationInterface.php @@ -0,0 +1,27 @@ +fields ) ) { + return $this->fields; + } + + $this->fields = [ + [ + 'icon' => 'fa-phone', + 'name' => esc_html__( 'Phone', 'wpforms-lite' ), + 'name_en' => 'Phone', + 'type' => 'phone', + 'group' => 'fancy', + 'order' => '50', + ], + [ + 'icon' => 'fa-map-marker', + 'name' => esc_html__( 'Address', 'wpforms-lite' ), + 'name_en' => 'Address', + 'type' => 'address', + 'group' => 'fancy', + 'order' => '70', + ], + [ + 'icon' => 'fa-calendar-o', + 'name' => esc_html__( 'Date / Time', 'wpforms-lite' ), + 'name_en' => 'Date / Time', + 'type' => 'date-time', + 'group' => 'fancy', + 'order' => '80', + ], + [ + 'icon' => 'fa-link', + 'name' => esc_html__( 'Website / URL', 'wpforms-lite' ), + 'name_en' => 'Website / URL', + 'type' => 'url', + 'group' => 'fancy', + 'order' => '90', + ], + [ + 'icon' => 'fa-upload', + 'name' => esc_html__( 'File Upload', 'wpforms-lite' ), + 'name_en' => 'File Upload', + 'type' => 'file-upload', + 'group' => 'fancy', + 'order' => '100', + ], + [ + 'icon' => 'fa-camera', + 'name' => esc_html__( 'Camera', 'wpforms-lite' ), + 'name_en' => 'Camera', + 'type' => 'camera', + 'group' => 'fancy', + 'order' => '105', + ], + [ + 'icon' => 'fa-lock', + 'name' => esc_html__( 'Password', 'wpforms-lite' ), + 'name_en' => 'Password', + 'type' => 'password', + 'group' => 'fancy', + 'order' => '95', + ], + [ + 'icon' => 'fa-columns', + 'name' => esc_html__( 'Layout', 'wpforms-lite' ), + 'name_en' => 'Layout', + 'type' => 'layout', + 'group' => 'fancy', + 'order' => '140', + ], + [ + 'icon' => 'fa-list', + 'name' => esc_html__( 'Repeater', 'wpforms-lite' ), + 'name_en' => 'Repeater', + 'type' => 'repeater', + 'group' => 'fancy', + 'order' => '150', + ], + [ + 'icon' => 'fa-files-o', + 'name' => esc_html__( 'Page Break', 'wpforms-lite' ), + 'name_en' => 'Page Break', + 'type' => 'pagebreak', + 'group' => 'fancy', + 'order' => '160', + ], + [ + 'icon' => 'fa-arrows-h', + 'name' => esc_html__( 'Section Divider', 'wpforms-lite' ), + 'name_en' => 'Section Divider', + 'type' => 'divider', + 'group' => 'fancy', + 'order' => '170', + ], + [ + 'icon' => 'fa-pencil-square-o', + 'name' => esc_html__( 'Rich Text', 'wpforms-lite' ), + 'name_en' => 'Rich Text', + 'type' => 'richtext', + 'group' => 'fancy', + 'order' => '170', + ], + [ + 'icon' => 'fa-file-image-o', + 'name' => esc_html__( 'Content', 'wpforms-lite' ), + 'name_en' => 'Content', + 'type' => 'content', + 'group' => 'fancy', + 'order' => '180', + ], + [ + 'icon' => 'fa-code', + 'name' => esc_html__( 'HTML', 'wpforms-lite' ), + 'name_en' => 'HTML', + 'type' => 'html', + 'group' => 'fancy', + 'order' => '185', + ], + [ + 'icon' => 'fa-file-text-o', + 'name' => esc_html__( 'Entry Preview', 'wpforms-lite' ), + 'name_en' => 'Entry Preview', + 'type' => 'entry-preview', + 'group' => 'fancy', + 'order' => '190', + ], + [ + 'icon' => 'fa-star', + 'name' => esc_html__( 'Rating', 'wpforms-lite' ), + 'name_en' => 'Rating', + 'type' => 'rating', + 'group' => 'fancy', + 'order' => '310', + ], + [ + 'icon' => 'fa-eye-slash', + 'name' => esc_html__( 'Hidden Field', 'wpforms-lite' ), + 'name_en' => 'Hidden Field', + 'type' => 'hidden', + 'group' => 'fancy', + 'order' => '98', + ], + [ + 'icon' => 'fa-question-circle', + 'name' => esc_html__( 'Custom Captcha', 'wpforms-lite' ), + 'keywords' => esc_html__( 'spam, math, maths, question', 'wpforms-lite' ), + 'name_en' => 'Custom Captcha', + 'type' => 'captcha', + 'group' => 'fancy', + 'addon' => 'wpforms-captcha', + 'order' => '300', + ], + [ + 'icon' => 'fa-pencil', + 'name' => esc_html__( 'Signature', 'wpforms-lite' ), + 'keywords' => esc_html__( 'user, e-signature', 'wpforms-lite' ), + 'name_en' => 'Signature', + 'type' => 'signature', + 'group' => 'fancy', + 'addon' => 'wpforms-signatures', + 'order' => '200', + ], + [ + 'icon' => 'fa-ellipsis-h', + 'name' => esc_html__( 'Likert Scale', 'wpforms-lite' ), + 'keywords' => esc_html__( 'survey, rating scale', 'wpforms-lite' ), + 'name_en' => 'Likert Scale', + 'type' => 'likert_scale', + 'group' => 'fancy', + 'addon' => 'wpforms-surveys-polls', + 'order' => '400', + ], + [ + 'icon' => 'fa-tachometer', + 'name' => esc_html__( 'Net Promoter Score', 'wpforms-lite' ), + 'keywords' => esc_html__( 'survey, nps', 'wpforms-lite' ), + 'name_en' => 'Net Promoter Score', + 'type' => 'net_promoter_score', + 'group' => 'fancy', + 'addon' => 'wpforms-surveys-polls', + 'order' => '410', + ], + [ + 'icon' => 'fa-credit-card', + 'name' => esc_html__( 'PayPal Commerce', 'wpforms-lite' ), + 'keywords' => esc_html__( 'store, ecommerce, credit card, pay, payment, debit card', 'wpforms-lite' ), + 'name_en' => 'PayPal Commerce', + 'type' => 'paypal-commerce', + 'group' => 'payment', + 'addon' => 'wpforms-paypal-commerce', + 'order' => '89', + ], + [ + 'icon' => 'fa-credit-card', + 'name' => esc_html__( 'Authorize.Net', 'wpforms-lite' ), + 'keywords' => esc_html__( 'store, ecommerce, credit card, pay, payment, debit card', 'wpforms-lite' ), + 'name_en' => 'Authorize.Net', + 'type' => 'authorize_net', + 'group' => 'payment', + 'addon' => 'wpforms-authorize-net', + 'order' => '95', + ], + [ + 'icon' => 'fa-ticket', + 'name' => esc_html__( 'Coupon', 'wpforms-lite' ), + 'keywords' => esc_html__( 'discount, sale', 'wpforms-lite' ), + 'name_en' => 'Coupon', + 'type' => 'payment-coupon', + 'group' => 'payment', + 'addon' => 'wpforms-coupons', + 'order' => '100', + ], + ]; + + $captcha = $this->get_captcha(); + + if ( ! empty( $captcha ) ) { + $this->fields[] = $captcha; + } + + return $this->fields; + } + + /** + * Get Captcha field data. + * + * @since 1.6.6 + * + * @return array Captcha field data. + */ + private function get_captcha(): array { + + $captcha_settings = wpforms_get_captcha_settings(); + + if ( empty( $captcha_settings['provider'] ) ) { + return []; + } + + $captcha = [ + 'hcaptcha' => [ + 'name' => 'hCaptcha', + 'icon' => 'fa-question-circle-o', + ], + 'recaptcha' => [ + 'name' => 'reCAPTCHA', + 'icon' => 'fa-google', + ], + 'turnstile' => [ + 'name' => 'Turnstile', + 'icon' => 'fa-question-circle-o', + ], + ]; + + if ( ! empty( $captcha_settings['site_key'] ) || ! empty( $captcha_settings['secret_key'] ) ) { + $captcha_name = $captcha[ $captcha_settings['provider'] ]['name']; + $captcha_icon = $captcha[ $captcha_settings['provider'] ]['icon']; + } else { + $captcha_name = 'CAPTCHA'; + $captcha_icon = 'fa-question-circle-o'; + } + + return [ + 'icon' => $captcha_icon, + 'name' => $captcha_name, + 'name_en' => $captcha_name, + 'keywords' => esc_html__( 'captcha, spam, antispam', 'wpforms-lite' ), + 'type' => 'captcha_' . $captcha_settings['provider'], + 'group' => 'standard', + 'order' => 180, + 'class' => 'not-draggable', + ]; + } + + /** + * Get filtered fields data. + * + * Usage: + * get_filtered( [ 'group' => 'payment' ] ) - fields from the 'payment' group. + * get_filtered( [ 'addon' => 'surveys-polls' ] ) - fields of the addon 'surveys-polls'. + * get_filtered( [ 'type' => 'payment-total' ] ) - field 'payment-total'. + * + * @since 1.6.6 + * + * @param array $args Arguments array. + * + * @return array Fields data filtered according to given arguments. + */ + private function get_filtered( array $args = [] ): array { + + $default_args = [ + 'group' => '', + 'addon' => '', + 'type' => '', + ]; + + $args = array_filter( wp_parse_args( $args, $default_args ) ); + + $fields = $this->get_all(); + $filtered_fields = []; + + foreach ( $args as $prop => $prop_val ) { + foreach ( $fields as $field ) { + if ( ! empty( $field[ $prop ] ) && $field[ $prop ] === $prop_val ) { + $filtered_fields[] = $field; + } + } + } + + return $filtered_fields; + } + + /** + * Get fields by group. + * + * @since 1.6.6 + * + * @param string $group Fields group (standard, fancy or payment). + * + * @return array. + */ + public function get_by_group( string $group ): array { + + return $this->get_filtered( [ 'group' => $group ] ); + } + + /** + * Get fields by addon. + * + * @since 1.6.6 + * + * @param string $addon Addon slug. + * + * @return array. + */ + public function get_by_addon( string $addon ): array { + + return $this->get_filtered( [ 'addon' => $addon ] ); + } + + /** + * Get field by type. + * + * @since 1.6.6 + * + * @param string $type Field type. + * + * @return array Single field data. Empty array if field is not available. + */ + public function get_field( string $type ): array { + + $fields = $this->get_filtered( [ 'type' => $type ] ); + + return ! empty( $fields[0] ) ? $fields[0] : []; + } + + /** + * Set key value of each field (conditionally). + * + * @since 1.6.6 + * + * @param array $fields Fields data. + * @param string $key Key. + * @param string $value Value. + * @param string $condition Condition. + * + * @return array Updated field data. + */ + public function set_values( array $fields, string $key, string $value, string $condition ): array { + + if ( empty( $fields ) || empty( $key ) ) { + return $fields; + } + + foreach ( $fields as $f => $field ) { + + switch ( $condition ) { + case 'empty': + $fields[ $f ][ $key ] = empty( $field[ $key ] ) ? $value : $field[ $key ]; + break; + + default: + $fields[ $f ][ $key ] = $value; + } + } + + return $fields; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Helpers.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Helpers.php new file mode 100755 index 00000000..3ac91531 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Helpers.php @@ -0,0 +1,172 @@ +%5$s%6$s', + esc_attr( $size ), + esc_attr( $position ), + esc_attr( $color ), + esc_attr( $shape ), + wp_kses( + $icon, + [ + 'i' => [ + 'class' => [], + 'aria-hidden' => [], + ], + ] + ), + esc_html( $text ) + ); + } + + /** + * Print badge HTML. + * + * @since 1.8.5 + * @since 1.8.6 Added `$icon` parameter. + * + * @param string $text Badge text. + * @param string $size Badge size. + * @param string $position Badge position. + * @param string $color Badge color. + * @param string $shape Badge shape. + * @param string $icon Badge icon name in Font Awesome "format", e.g. `fa-check`, defaults to empty string. + */ + public static function print_badge( + string $text, + string $size = 'sm', + string $position = 'inline', + string $color = 'titanium', + string $shape = 'rounded', + string $icon = '' + ) { + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo self::get_badge( $text, $size, $position, $color, $shape, $icon ); + } + + /** + * Get addon badge HTML. + * + * @since 1.8.9 + * + * @param array $addon Addon data. + * + * @return string + */ + public static function get_addon_badge( array $addon ): string { + + // List of possible badges. + $badges = [ + 'recommended' => [ + 'text' => esc_html__( 'Recommended', 'wpforms-lite' ), + 'color' => 'green', + 'icon' => 'fa-star', + ], + 'new' => [ + 'text' => esc_html__( 'New', 'wpforms-lite' ), + 'color' => 'blue', + ], + 'featured' => [ + 'text' => esc_html__( 'Featured', 'wpforms-lite' ), + 'color' => 'orange', + ], + ]; + + $badge = []; + + // Get first badge that exists. + foreach ( $badges as $key => $value ) { + if ( ! empty( $addon[ $key ] ) ) { + $badge = $value; + + break; + } + } + + if ( empty( $badge ) ) { + return ''; + } + + return self::get_badge( $badge['text'], 'sm', 'inline', $badge['color'], 'rounded', $badge['icon'] ?? '' ); + } + + /** + * Get inline icon HTML. + * + * @since 1.8.6 + * + * @param string $name Font Awesome icon name, e.g. `fa-check`. + * + * @return string HTML markup for the icon element. + */ + public static function get_inline_icon( string $name ): string { + + return sprintf( '', esc_attr( $name ) ); + } + + /** + * Get available education addons. + * + * @since 1.9.4 + * + * @return array + */ + public static function get_edu_addons(): array { + + static $addons = null; + + if ( $addons !== null ) { + return $addons; + } + + $addons_obj = wpforms()->obj( 'addons' ); + + if ( ! $addons_obj ) { + $addons = []; + + return $addons; + } + + $addons = $addons_obj->get_available(); + + return $addons; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Payment.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Payment.php new file mode 100755 index 00000000..e2d9a833 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Payment.php @@ -0,0 +1,157 @@ +get_license_type(), [ 'lite', 'basic', 'plus' ], true ) ) { + return false; + } + + // Bail early if it has been less than 90 days since activation or the installation wasn't upgraded. + if ( + ! get_option( MigrationsBase::PREVIOUS_CORE_VERSION_OPTION_NAME ) || + wpforms_get_activated_timestamp() > ( time() - 90 * DAY_IN_SECONDS ) + ) { + return false; + } + + // Bail early if a Stripe account is connected. + if ( Stripe\Helpers::has_stripe_keys() ) { + return false; + } + + // Bail early if the user doesn't have the capability to manage options. + if ( ! wpforms_current_user_can() ) { + return false; + } + + // Bail early if there are no published forms. + $forms_obj = wpforms()->obj( 'form' ); + + return $forms_obj && $forms_obj->forms_exist(); + } + + /** + * Enqueue assets for the pointer. + * + * @since 1.8.8 + */ + public function enqueue_assets() { + + // Enqueue the pointer static assets. + parent::enqueue_assets(); + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-education-pointers-payment', + WPFORMS_PLUGIN_URL . "assets/js/admin/education/pointers/payment{$min}.js", + [ 'wp-pointer' ], + WPFORMS_VERSION, + true + ); + + $admin_l10n = [ + 'pointer' => sanitize_key( $this->pointer_id ), + 'nonce' => sanitize_text_field( $this->get_nonce_token() ), + ]; + + wp_localize_script( + 'wpforms-education-pointers-payment', + 'wpforms_education_pointers_payment', + $admin_l10n + ); + } + + /** + * Set arguments for the Payments feature pointer. + * + * @since 1.8.8 + * + * @noinspection HtmlUnknownTarget + */ + protected function set_args() { + + $this->args['title'] = __( 'Payment and Donation Forms are here!', 'wpforms-lite' ); + $this->args['message'] = sprintf( /* translators: %1$s - Payments page URL. */ + __( + 'Now available for you: create forms that accept credit cards, Apple Pay, and Google Pay payments. Visit our new Payments area to get started.', + 'wpforms-lite' + ), + esc_url( PaymentsPage::get_url() ) + ); + } + + /** + * Retrieve the current installation license type in the lowercase. + * If no license type is found, defaults to 'lite'. + * + * @since 1.8.8 + * + * @return string + */ + private function get_license_type(): string { + + $type = wpforms_get_license_type(); + + // Set the default to 'lite' if no license type is detected. + if ( empty( $type ) ) { + $type = 'lite'; + } + + return $type; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Pointer.php b/wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Pointer.php new file mode 100755 index 00000000..b6d3ccc6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Admin/Education/Pointers/Pointer.php @@ -0,0 +1,445 @@ +allow_display() || ! $this->allow_load() ) { + return; + } + + // Set initial arguments. + $this->set_initial_args(); + + // Register hooks. + $this->hooks(); + } + + /** + * Check if the pointer is already dismissed or interacted with. + * + * @since 1.8.8 + * + * @return bool + */ + private function allow_display(): bool { + + // If the pointer ID is empty, return. + // Check if announcements are allowed to be displayed. + if ( empty( $this->pointer_id ) || wpforms_setting( 'hide-announcements' ) ) { + return false; + } + + // Get pointers. + $pointers = (array) get_option( self::OPTION_NAME, [] ); + + // Check if the pointer ID exists in the engagement list. + if ( isset( $pointers['engagement'] ) && in_array( $this->pointer_id, (array) $pointers['engagement'], true ) ) { + return false; + } + + // Check if the pointer ID exists in the dismissed list. + if ( isset( $pointers['dismiss'] ) && in_array( $this->pointer_id, (array) $pointers['dismiss'], true ) ) { + return false; + } + + return true; + } + + /** + * Register hooks for the pointer. + * + * @since 1.8.8 + */ + private function hooks(): void { + + // Enqueue assets. + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + + // Print the pointer script. + add_action( 'admin_print_footer_scripts', [ $this, 'print_script' ] ); + + // Add Ajax callback for the engagement. + add_action( 'wp_ajax_wpforms_education_pointers_engagement', [ $this, 'engagement_callback' ] ); + + // Add Ajax callback for dismissing the pointer. + add_action( 'wp_ajax_wpforms_education_pointers_dismiss', [ $this, 'dismiss_callback' ] ); + } + + /** + * Enqueue assets for the pointer. + * + * @since 1.8.8 + */ + public function enqueue_assets() { + + // Enqueue the pointer CSS. + wp_enqueue_style( 'wp-pointer' ); + + // Enqueue the pointer script. + wp_enqueue_script( 'wp-pointer' ); + } + + /** + * Print the pointer script. + * + * @since 1.8.8 + */ + public function print_script(): void { + + // Encode the $args array into JSON format. + $encoded_args = $this->get_prepared_args(); + + if ( empty( $encoded_args ) ) { + return; + } + + // Sanitize pointer ID and selector. + $pointer_id = sanitize_text_field( $this->pointer_id ); + $selector = sanitize_text_field( $this->get_selector() ); + + // Get the admin-ajax URL. + $ajaxurl = esc_url_raw( admin_url( 'admin-ajax.php' ) ); + + // Create nonce for the pointer. + $nonce = sanitize_text_field( $this->get_nonce_token() ); + + // Menu flyout selector. + $menu_flyout = "{$this->top_level_menu}:not(.wp-menu-open)"; + + // Inline CSS style id. + $inline_css_id = "wpforms-{$pointer_id}-inline-css"; + + // The type of echo being used in this PHP code is a HEREDOC syntax. + // HEREDOC allows you to create strings that span multiple lines without + // needing to concatenate them with dots (.) as you would with double quotes. + + // phpcs:disable + echo << + ( function( $ ) { + let options = $encoded_args, setup; + + if ( ! options ) { + return; + } + + options = $.extend( options, { + show: function() { + if ( ! $( '#$inline_css_id' ).length && $( '$menu_flyout' ).length ) { + $( '\n"; + + // Inject media queries, CssToInlineStyles strips them. + $this->styled_email = \str_replace( '', $queries, $this->styled_email ); + } + + /** + * Get an email with inline styles. + * + * @since 1.5.4 + * + * @return string + */ + public function get() { + + if ( empty( $this->styled_email ) ) { + $this->process_markup(); + } + + return $this->styled_email; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Emails/Summaries.php b/wp-content/plugins/wpforms-lite/src/Emails/Summaries.php new file mode 100755 index 00000000..9725e296 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Emails/Summaries.php @@ -0,0 +1,577 @@ +hooks(); + + $summaries_disabled = $this->is_disabled(); + + if ( $summaries_disabled && wp_next_scheduled( 'wpforms_email_summaries_cron' ) ) { + wp_clear_scheduled_hook( 'wpforms_email_summaries_cron' ); + } + + if ( ! $summaries_disabled && ! wp_next_scheduled( 'wpforms_email_summaries_cron' ) ) { + // Since v1.9.1 we use a single event and manually reoccur it + // because a recurring event cannot guarantee + // its firing at the same time during WP_CLI execution. + wp_schedule_single_event( $this->get_next_launch_time(), 'wpforms_email_summaries_cron' ); + } + } + + /** + * Get the instance of a class and store it in itself. + * + * @since 1.5.4 + */ + public static function get_instance() { + + static $instance; + + if ( ! $instance ) { + $instance = new self(); + } + + return $instance; + } + + /** + * Email Summaries hooks. + * + * @since 1.5.4 + */ + public function hooks() { + + add_filter( 'wpforms_settings_defaults', [ $this, 'disable_summaries_setting' ] ); + add_action( 'wpforms_settings_updated', [ $this, 'deregister_fetch_info_blocks_task' ] ); + + // Leave early if Email Summaries are disabled in settings. + if ( $this->is_disabled() ) { + return; + } + + add_action( 'init', [ $this, 'preview' ] ); + add_action( 'wpforms_email_summaries_cron', [ $this, 'cron' ] ); + add_filter( 'wpforms_tasks_get_tasks', [ $this, 'register_fetch_info_blocks_task' ] ); + } + + /** + * Check if Email Summaries are disabled in settings. + * + * @since 1.5.4 + * + * @return bool + */ + protected function is_disabled(): bool { + + /** + * Allows to modify whether Email Summaries are disabled in settings. + * + * @since 1.5.4 + * + * @param bool $is_disabled True if Email Summaries are disabled in settings. False by default. + */ + return (bool) apply_filters( 'wpforms_emails_summaries_is_disabled', (bool) wpforms_setting( 'email-summaries-disable', false ) ); + } + + /** + * Add "Disable Email Summaries" to WPForms settings. + * + * @since 1.5.4 + * + * @param array $settings WPForms settings. + * + * @return mixed + */ + public function disable_summaries_setting( $settings ) { + + /** This filter is documented in wpforms/src/Emails/Summaries.php */ + if ( (bool) apply_filters( 'wpforms_emails_summaries_is_disabled', false ) ) { + return $settings; + } + + $url = wp_nonce_url( + add_query_arg( + [ + 'wpforms_email_template' => 'summary', + 'wpforms_email_preview' => '1', + ], + admin_url() + ), + Preview::PREVIEW_NONCE_NAME + ); + + $desc = esc_html__( 'Disable Email Summaries weekly delivery.', 'wpforms-lite' ); + + if ( ! $this->is_disabled() ) { + $desc .= ' ' . esc_html__( 'View Email Summary Example', 'wpforms-lite' ) . '.'; + } + + // Get the uninstall data setting. + $uninstall_data = $settings['misc']['uninstall-data']; + + // Remove the uninstall data setting. + unset( $settings['misc']['uninstall-data'] ); + + // Add the email summaries setting. + $settings['misc']['email-summaries-disable'] = [ + 'id' => 'email-summaries-disable', + 'name' => esc_html__( 'Disable Email Summaries', 'wpforms-lite' ), + 'desc' => $desc, + 'type' => 'toggle', + 'status' => true, + ]; + + // Add the uninstall data setting to the end. + $settings['misc']['uninstall-data'] = $uninstall_data; + + return $settings; + } + + /** + * Preview Email Summary. + * + * @since 1.5.4 + */ + public function preview() { + + // Leave early if the current request is not a preview for the summaries email template. + if ( ! $this->is_preview() ) { + return; + } + + // Get form entries. + $entries = $this->get_entries(); + + $args = [ + 'body' => [ + 'overview' => $this->get_calculation_overview( $entries ), + 'entries' => $this->format_trends_for_display( $entries ), + 'has_trends' => $this->entries_has_trends( $entries ), + 'notification_block' => ( new NotificationBlocks() )->get_block(), + 'info_block' => ( new InfoBlocks() )->get_next(), + 'icons' => $this->get_icons_url(), + ], + ]; + + $template = ( new Templates\Summary() )->set_args( $args ); + + /** + * Filters the summaries email template. + * + * @since 1.5.4 + * + * @param Templates\Summary $template Default summaries email template. + */ + $template = apply_filters( 'wpforms_emails_summaries_template', $template ); + + $content = $template->get(); + + if ( Helpers::is_plain_text_template() ) { + $content = wpautop( $content ); + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $content; + + exit; + } + + /** + * Get next cron occurrence date. + * + * @since 1.5.4 + * @deprecated 1.9.1 + * + * @return int + */ + protected function get_first_cron_date_gmt(): int { + + _deprecated_function( __METHOD__, '1.9.1 of the WPForms plugin', __CLASS__ . '::get_next_launch_time()' ); + + return $this->get_next_launch_time(); + } + + /** + * Get next Monday 2p.m with WordPress offset. + * + * @since 1.9.1 + * + * @return int + */ + protected function get_next_launch_time(): int { + + $datetime = date_create( 'now', wp_timezone() ); + $now_plus_week = time() + constant( 'WEEK_IN_SECONDS' ); + + if ( ! $datetime ) { + return $now_plus_week; + } + + $hours = 14; + + // If today is Monday and the current time is less than 2 p.m., + // we can launch the cron for today. + if ( + (int) $datetime->format( 'N' ) !== 1 || + (int) $datetime->format( 'H' ) >= $hours + ) { + try { + $datetime->modify( 'next monday' ); + } catch ( Exception $e ) { + return $now_plus_week; + } + } + + $datetime->setTime( $hours, 0 ); + + $timestamp = $datetime->getTimestamp(); + + return $timestamp > 0 ? $timestamp : $now_plus_week; + } + + /** + * Add custom Email Summaries cron schedule. + * + * @since 1.5.4 + * @deprecated 1.9.1 + * + * @param array $schedules WP cron schedules. + * + * @return array + */ + public function add_weekly_cron_schedule( $schedules ) { + + _deprecated_function( __METHOD__, '1.9.1 of the WPForms plugin' ); + + $schedules['wpforms_email_summaries_weekly'] = [ + 'interval' => $this->get_next_launch_time() - time(), + 'display' => esc_html__( 'Weekly WPForms Email Summaries', 'wpforms-lite' ), + ]; + + return $schedules; + } + + /** + * Email Summaries cron callback. + * + * @since 1.5.4 + */ + public function cron() { + + $entries = $this->get_entries(); + + // Email won't be sent if there are no form entries. + if ( empty( $entries ) ) { + return; + } + + $notification = new NotificationBlocks(); + $notification_block = $notification->get_block(); + + $info_blocks = new InfoBlocks(); + + $next_block = $info_blocks->get_next(); + + $args = [ + 'body' => [ + 'overview' => $this->get_calculation_overview( $entries ), + 'entries' => $this->format_trends_for_display( $entries ), + 'has_trends' => $this->entries_has_trends( $entries ), + 'notification_block' => $notification_block, + 'info_block' => $next_block, + 'icons' => $this->get_icons_url(), + ], + ]; + + $template = ( new Templates\Summary() )->set_args( $args ); + + /** This filter is documented in preview() method above. */ + $template = apply_filters( 'wpforms_emails_summaries_template', $template ); + + $content = $template->get(); + + if ( ! $content ) { + return; + } + + $parsed_home_url = wp_parse_url( home_url() ); + $site_domain = $parsed_home_url['host']; + + if ( is_multisite() && isset( $parsed_home_url['path'] ) ) { + $site_domain .= $parsed_home_url['path']; + } + + $subject = sprintf( + /* translators: %s - site domain. */ + esc_html__( 'Your Weekly WPForms Summary for %s', 'wpforms-lite' ), + $site_domain + ); + + /** + * Filters the summaries email subject. + * + * @since 1.5.4 + * + * @param string $subject Default summaries email subject. + */ + $subject = apply_filters( 'wpforms_emails_summaries_cron_subject', $subject ); + + /** + * Filters the summaries recipient email address. + * + * @since 1.5.4 + * + * @param string $option Default summaries recipient email address. + */ + $to_email = apply_filters( 'wpforms_emails_summaries_cron_to_email', get_option( 'admin_email' ) ); + + $sent = ( new Mailer() ) + ->template( $template ) + ->subject( $subject ) + ->to_email( $to_email ) + ->send(); + + if ( $sent === true ) { + $info_blocks->register_sent( $next_block ); + + // Cache the notification block shown to avoid showing it again in the future. + $notification->maybe_remember_shown_block( $notification_block ); + } + } + + /** + * Get form entries. + * + * @since 1.5.4 + * + * @return array + */ + protected function get_entries(): array { + + // The return value is intentionally left empty, as each email summary + // depending on the plugin edition Lite/Pro will have different implementation. + return []; + } + + /** + * Get calculation overview. + * + * @since 1.8.8 + * + * @param array $entries Form entries. + * + * @return array + */ + private function get_calculation_overview( $entries ): array { + + // Check if the entries array is empty. + if ( empty( $entries ) ) { + return []; + } + + // Get the sum of 'count' index in all entries. + $sum_current = array_sum( array_column( $entries, 'count' ) ); + + // Choose a specific 'form_id' to check if 'count_previous_week' index exists. + $sample_form_id = key( $entries ); + + // Check if 'count_previous_week' index doesn't exist and return early. + if ( ! isset( $entries[ $sample_form_id ]['count_previous_week'] ) ) { + return []; + } + + // Get the sum of 'count_previous_week' index in all entries. + $sum_previous_week = array_sum( array_column( $entries, 'count_previous_week' ) ); + + // Check if the sum of counts from the previous week is 0. + // If so, return the sum of counts from the current week and trends as "+100%". + if ( $sum_previous_week === 0 ) { + return [ + 'total' => $sum_current, + 'trends' => $this->format_trends_for_display( $sum_current === 0 ? 0 : 100 ), + ]; + } + + // Calculate trends based on the sum of counts from the current week and the previous week. + $trends = round( ( $sum_current - $sum_previous_week ) / $sum_previous_week * 100 ); + + // Return an array with the total and trends. + return [ + 'total' => $sum_current, + 'trends' => $this->format_trends_for_display( $trends ), + ]; + } + + /** + * Register Action Scheduler task to fetch and cache Info Blocks. + * + * @since 1.6.4 + * + * @param \WPForms\Tasks\Task[] $tasks List of task classes. + * + * @return array + */ + public static function register_fetch_info_blocks_task( $tasks ): array { + + $tasks[] = FetchInfoBlocksTask::class; + + return $tasks; + } + + /** + * Deregister Action Scheduler task to fetch and cache Info Blocks. + * + * @since 1.6.4 + */ + public function deregister_fetch_info_blocks_task() { + + if ( ! $this->is_disabled() ) { + return; + } + + // Deregister the task. + ( new FetchInfoBlocksTask() )->cancel(); + + // Delete last run time record. + delete_option( FetchInfoBlocksTask::LAST_RUN ); + + // Remove the cache file if it exists. + $file_name = ( new InfoBlocks() )->get_cache_file_path(); + + if ( file_exists( $file_name ) ) { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.unlink_unlink + @unlink( $file_name ); + } + } + + /** + * Check if the current request is a preview for the summaries email template. + * + * @since 1.8.8 + * + * @return bool + */ + private function is_preview(): bool { + + // Leave if the current user can't access. + if ( ! wpforms_current_user_can() ) { + return false; + } + + // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + + // Leave early if nonce verification failed. + if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), Preview::PREVIEW_NONCE_NAME ) ) { + return false; + } + + // Leave early if preview is not requested. + if ( ! isset( $_GET['wpforms_email_preview'], $_GET['wpforms_email_template'] ) ) { + return false; + } + + // Leave early if preview is not requested for the summaries template. + if ( $_GET['wpforms_email_template'] !== 'summary' ) { + return false; + } + + // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + + return true; + } + + /** + * Format entries trends for display. + * + * This function takes an array of entries and formats the 'trends' value for display. + * + * @since 1.8.8 + * + * @param array|int $input Input data to format. + * + * @return array|string + */ + private function format_trends_for_display( $input ) { + + // If input is a numeric value, format and return it. + if ( is_numeric( $input ) ) { + return sprintf( '%s%s%%', $input >= 0 ? '+' : '', $input ); + } + + // Loop through entries and format 'trends' values. + foreach ( $input as &$form ) { + // Leave early if 'trends' index doesn't exist. + if ( ! isset( $form['trends'] ) ) { + continue; + } + + // Add percent sign to trends and + sign if value greater than zero. + $form['trends'] = sprintf( '%s%s%%', $form['trends'] >= 0 ? '+' : '', $form['trends'] ); + } + + return $input; + } + + /** + * Check if trends can be displayed for the given entries. + * + * @since 1.8.8 + * + * @param array $entries The entries data. + * + * @return bool + */ + private function entries_has_trends( array $entries ): bool { + + // Return false if entries array is empty. + if ( empty( $entries ) ) { + return false; + } + + // Check if at least one array item has the 'trends' key. + foreach ( $entries as $entry ) { + if ( isset( $entry['trends'] ) ) { + return true; + } + } + + return false; + } + + /** + * Get icons URL. + * Primarily used in the HTML version of the email template. + * + * @since 1.8.8 + * + * @return array + */ + private function get_icons_url(): array { + + $base_url = WPFORMS_PLUGIN_URL . 'assets/images/email/'; + + return [ + 'overview' => $base_url . 'icon-overview.png', + 'upward' => $base_url . 'icon-upward.png', + 'downward' => $base_url . 'icon-downward.png', + 'notification_block' => $base_url . 'notification-block-icon.png', + 'info_block' => $base_url . 'info-block-icon.png', + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Emails/Tasks/FetchInfoBlocksTask.php b/wp-content/plugins/wpforms-lite/src/Emails/Tasks/FetchInfoBlocksTask.php new file mode 100755 index 00000000..97a3e83a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Emails/Tasks/FetchInfoBlocksTask.php @@ -0,0 +1,113 @@ +init(); + } + + /** + * Initialize the task with all the proper checks. + * + * @since 1.6.4 + */ + public function init() { + + $this->hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + return; + } + + $this->recurring( $this->generate_start_date(), WEEK_IN_SECONDS )->register(); + } + + /** + * Add hooks. + * + * @since 1.7.3 + */ + private function hooks() { + + // Register the action handler. + add_action( self::ACTION, [ $this, 'process' ] ); + } + + /** + * Randomly pick a timestamp which is not more than 1 week in the future + * starting before Email Summaries dispatch happens. + * + * @since 1.6.4 + * + * @return int + */ + private function generate_start_date() { + + $tracking = []; + + $tracking['days'] = wp_rand( 0, 6 ) * DAY_IN_SECONDS; + $tracking['hours'] = wp_rand( 0, 23 ) * HOUR_IN_SECONDS; + $tracking['minutes'] = wp_rand( 0, 59 ) * MINUTE_IN_SECONDS; + $tracking['seconds'] = wp_rand( 0, 59 ); + + return strtotime( 'previous monday 1pm' ) + array_sum( $tracking ); + } + + /** + * Process the task. + * + * @since 1.6.4 + */ + public function process() { + + $last_run = get_option( self::LAST_RUN ); + + // Make sure we do not run it more than once a day. + if ( + $last_run !== false && + ( time() - $last_run ) < DAY_IN_SECONDS + ) { + return; + } + + ( new InfoBlocks() )->cache_all(); + + // Update the last run option to the current timestamp. + update_option( self::LAST_RUN, time() ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Emails/Templates/Classic.php b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Classic.php new file mode 100755 index 00000000..60991fb8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Classic.php @@ -0,0 +1,21 @@ +set_message( $message ); + + $this->plain_text = Helpers::is_plain_text_template(); + + $this->set_initial_args(); + } + + /** + * Set initial arguments to use in a template. + * + * @since 1.5.4 + */ + public function set_initial_args() { + + $header_args = [ + 'title' => \esc_html__( 'WPForms', 'wpforms-lite' ), + ]; + + if ( ! $this->plain_text ) { + $header_args['header_image'] = $this->get_header_image(); + } + + $args = [ + 'header' => $header_args, + 'body' => [ 'message' => $this->get_message() ], + 'footer' => [], + 'style' => [], + ]; + + $args = \apply_filters( 'wpforms_emails_templates_general_set_initial_args', $args, $this ); + + $this->set_args( $args ); + } + + /** + * Get the template slug. + * + * @since 1.5.4 + * + * @return string + */ + public function get_slug() { + + return static::TEMPLATE_SLUG; + } + + /** + * Get the template parent slug. + * + * @since 1.5.4 + * + * @return string + */ + public function get_parent_slug() { + + return self::TEMPLATE_SLUG; + } + + /** + * Get the message. + * + * @since 1.5.4 + * + * @return string + */ + public function get_message() { + + return \apply_filters( 'wpforms_emails_templates_general_get_message', $this->message, $this ); + } + + /** + * Get the dynamic tags. + * + * @since 1.5.4 + * + * @return array + */ + public function get_tags() { + + return \apply_filters( 'wpforms_emails_templates_general_get_tags', $this->tags, $this ); + } + + /** + * Get header/footer/body arguments + * + * @since 1.5.4 + * + * @param string $type Header/footer/body. + * + * @return array + */ + public function get_args( $type ) { + + if ( ! empty( $type ) ) { + return isset( $this->args[ $type ] ) ? apply_filters( 'wpforms_emails_templates_general_get_args_' . $type, $this->args[ $type ], $this ) : []; + } + + return apply_filters( 'wpforms_emails_templates_general_get_args', $this->args, $this ); + } + + /** + * Set email message. + * + * @since 1.5.4 + * + * @param string $message Email message. + * + * @return General + */ + public function set_message( $message ) { + + $message = \apply_filters( 'wpforms_emails_templates_general_set_message', $message, $this ); + + if ( ! \is_string( $message ) ) { + return $this; + } + + $this->message = $message; + + return $this; + } + + /** + * Set the dynamic tags. + * + * @since 1.5.4 + * + * @param array $tags Tags to set. + * + * @return General + */ + public function set_tags( $tags ) { + + $tags = \apply_filters( 'wpforms_emails_templates_general_set_tags', $tags, $this ); + + if ( ! \is_array( $tags ) ) { + return $this; + } + + $this->tags = $tags; + + return $this; + } + + /** + * Set header/footer/body/style arguments to use in a template. + * + * @since 1.5.4 + * + * @param array $args Arguments to set. + * @param bool $merge Merge the arguments with existing once or replace. + * + * @return General + */ + public function set_args( $args, $merge = true ) { + + $args = \apply_filters( 'wpforms_emails_templates_general_set_args', $args, $this ); + + if ( empty( $args ) || ! \is_array( $args ) ) { + return $this; + } + + foreach ( $args as $type => $value ) { + + if ( ! \is_array( $value ) ) { + continue; + } + + if ( ! isset( $this->args[ $type ] ) || ! \is_array( $this->args[ $type ] ) ) { + $this->args[ $type ] = []; + } + + $this->args[ $type ] = $merge ? \array_merge( $this->args[ $type ], $value ) : $value; + } + + return $this; + } + + /** + * Process and replace any dynamic tags. + * + * @since 1.5.4 + * + * @param string $content Content to make replacements in. + * + * @return string + */ + public function process_tags( $content ) { + + $tags = $this->get_tags(); + + if ( empty( $tags ) ) { + return $content; + } + + foreach ( $tags as $tag => $value ) { + $content = \str_replace( $tag, $value, $content ); + } + + return $content; + } + + /** + * Conditionally modify email template name. + * + * @since 1.5.4 + * + * @param string $name Base template name. + * + * @return string + */ + protected function get_full_template_name( $name ) { + + $name = \sanitize_file_name( $name ); + + if ( $this->plain_text ) { + $name .= '-plain'; + } + + $template = 'emails/' . $this->get_slug() . '-' . $name; + + if ( ! Templates::locate( $template . '.php' ) ) { + $template = 'emails/' . $this->get_parent_slug() . '-' . $name; + } + + return \apply_filters( 'wpforms_emails_templates_general_get_full_template_name', $template, $this ); + } + + /** + * Get header image URL from settings. + * + * @since 1.5.4 + * + * @return array + */ + protected function get_header_image() { + + /** + * Additional 'width' key with an integer value can be added to $img array to control image's width in pixels. + * This setting helps to scale an image in some versions of MS Outlook and old email clients. + * Percentage 'width' values have no effect in MS Outlook and will be sanitized as integer by an email template.. + * + * Example: + * + * $img = [ + * 'url' => \wpforms_setting( 'email-header-image' ), + * 'width' => 150, + * ]; + * + * + * To set percentage values for the modern email clients, use $this->set_args() method: + * + * $this->set_args( + * [ + * 'style' => [ + * 'header_image_max_width' => '45%', + * ], + * ] + *); + * + * Both pixel and percentage approaches work well with 'wpforms_emails_templates_general_get_header_image' filter or this class extension. + */ + $img = [ + 'url' => wpforms_setting( 'email-header-image' ), + 'size' => wpforms_setting( 'email-header-image-size', 'medium' ), + ]; + + return \apply_filters( 'wpforms_emails_templates_general_get_header_image', $img, $this ); + } + + /** + * Get content part HTML. + * + * @since 1.5.4 + * + * @param string $name Name of the content part. + * + * @return string + */ + protected function get_content_part( $name ) { + + if ( ! \is_string( $name ) ) { + return ''; + } + + $html = Templates::get_html( + $this->get_full_template_name( $name ), + $this->get_args( $name ), + true + ); + + return \apply_filters( 'wpforms_emails_templates_general_get_content_part', $html, $name, $this ); + } + + /** + * Assemble all content parts in an array. + * + * @since 1.5.4 + * + * @return array + */ + protected function get_content_parts() { + + $parts = [ + 'header' => $this->get_content_part( 'header' ), + 'body' => $this->get_content_part( 'body' ), + 'footer' => $this->get_content_part( 'footer' ), + ]; + + return \apply_filters( 'wpforms_emails_templates_general_get_content_parts', $parts, $this ); + } + + /** + * Apply inline styling and save email content. + * + * @since 1.5.4 + * + * @param string $content Content with no styling applied. + */ + protected function save_styled( $content ) { + + if ( empty( $content ) ) { + $this->content = ''; + return; + } + + if ( $this->plain_text ) { + $this->content = \wp_strip_all_tags( $content ); + return; + } + + $style_templates = [ + 'style' => $this->get_full_template_name( 'style' ), + 'queries' => $this->get_full_template_name( 'queries' ), + ]; + + $styler = new Styler( $content, $style_templates, $this->get_args( 'style' ) ); + + $this->content = \apply_filters( 'wpforms_emails_templates_general_save_styled_content', $styler->get(), $this ); + } + + /** + * Build an email including styling. + * + * @since 1.5.4 + * + * @param bool $force Rebuild the content if it was already built and saved. + */ + protected function build( $force = false ) { + + if ( $this->content && ! $force ) { + return; + } + + $content = \implode( $this->get_content_parts() ); + + if ( empty( $content ) ) { + return; + } + + $content = $this->process_tags( $content ); + + if ( ! $this->plain_text ) { + $content = \make_clickable( $content ); + } + + $content = \apply_filters( 'wpforms_emails_templates_general_build_content', $content, $this ); + + $this->save_styled( $content ); + } + + /** + * Return final email. + * + * @since 1.5.4 + * + * @param bool $force Rebuild the content if it was already built and saved. + * + * @return string + */ + public function get( $force = false ) { + + $this->build( $force ); + + return $this->content; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Emails/Templates/Notifications.php b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Notifications.php new file mode 100755 index 00000000..9ff740cc --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Notifications.php @@ -0,0 +1,112 @@ +is_preview = $is_preview; + $this->plain_text = ! $is_preview && Helpers::is_plain_text_template( $current_template ); + + // Call the parent method after to set the correct header properties. + $this->set_initial_args(); + } + + /** + * Set template message. + * + * @since 1.8.5 + * + * @param string $message Message. + */ + public function set_field( $message ) { + + // Leave if not a string. + if ( ! is_string( $message ) ) { + return; + } + + // Set the template message. + $this->set_args( + [ + 'body' => [ + 'message' => $message, + ], + ] + ); + } + + /** + * Get field template. + * + * @since 1.8.5 + * + * @return string + */ + public function get_field_template() { + + return $this->get_content_part( 'field' ); + } + + /** + * Get header image URL from settings. + * This method has been overridden to add support for filtering the returned image. + * + * @since 1.8.6 + * + * @return array + */ + protected function get_header_image() { + + // Retrieve header image URL and size from WPForms settings. + $img = [ + 'url_light' => wpforms_setting( 'email-header-image' ), + 'size_light' => wpforms_setting( 'email-header-image-size', 'medium' ), + 'url_dark' => wpforms_setting( 'email-header-image-dark' ), + 'size_dark' => wpforms_setting( 'email-header-image-size-dark', 'medium' ), + ]; + + /** + * Filter the email header image. + * + * @since 1.8.6 + * + * @param array $img Email header image. + * @param Notifications $this Current instance of the class. + */ + return (array) apply_filters( 'wpforms_emails_templates_notifications_get_header_image', $img, $this ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Emails/Templates/Plain.php b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Plain.php new file mode 100755 index 00000000..e758adda --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Plain.php @@ -0,0 +1,69 @@ +plain_text = true; + + // Call the parent method after to set the correct header properties. + $this->set_initial_args(); + } + + /** + * Maybe prepare the content for the preview. + * + * @since 1.8.5 + * + * @param string $content Content with no styling applied. + */ + protected function save_styled( $content ) { + + // Leave early if we are not in preview mode. + if ( ! $this->is_preview ) { + // Call the parent method to handle the proper styling. + parent::save_styled( $content ); + + return; + } + + // Leave if content is empty. + if ( empty( $content ) ) { + $this->content = ''; + + return; + } + + // Stop here as we don't need to apply any styling for the preview. + // The only exception here is to keep the break tags to maintain the readability. + $this->content = wp_kses( $content, [ 'br' => [] ] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Emails/Templates/Summary.php b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Summary.php new file mode 100755 index 00000000..bea2dcb4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Emails/Templates/Summary.php @@ -0,0 +1,117 @@ +set_args( $this->maybe_revert_background_color() ); + } + + /** + * Get header image URL from settings. + * + * @since 1.5.4 + * + * @return array + */ + protected function get_header_image() { + + $legacy_header_image = $this->maybe_revert_header_image(); + + // Bail early, if legacy behavior is enabled. + if ( ! empty( $legacy_header_image ) ) { + return $legacy_header_image; + } + + // Set specific WPForms logo width in pixels for MS Outlook and old email clients. + return [ + 'url_light' => WPFORMS_PLUGIN_URL . 'assets/images/logo.png', + 'url_dark' => WPFORMS_PLUGIN_URL . 'assets/images/logo-negative.png', + ]; + } + + /** + * Checks if legacy header image overrides should be applied. + * + * @since 1.8.8 + * + * @return array + */ + private function maybe_revert_header_image() { + + /** + * This filter is designed to restore the legacy behavior, reverting the WPForms logo and template background color + * to values defined in the WPForms → Settings → Email tab. + * + * @since 1.8.8 + * + * @param bool $revert_legacy_style_overrides Whether to apply legacy style overrides. + */ + if ( ! (bool) apply_filters( 'wpforms_emails_templates_summary_revert_legacy_style_overrides', false ) ) { + return []; + } + + $header_image = wpforms_setting( 'email-header-image' ); + + // Bail early, if no custom header image if set. + if ( empty( $header_image ) ) { + return []; + } + + return [ 'url_light' => esc_url( $header_image ) ]; + } + + /** + * Checks if legacy background color overrides should be applied. + * + * @since 1.8.8 + * + * @return array + */ + private function maybe_revert_background_color() { + + /** + * This filter is designed to restore the legacy behavior, reverting the WPForms logo and template background color + * to values defined in the WPForms → Settings → Email tab. + * + * @since 1.8.8 + * + * @param bool $revert_legacy_style_overrides Whether to apply legacy style overrides. + */ + if ( ! (bool) apply_filters( 'wpforms_emails_templates_summary_revert_legacy_style_overrides', false ) ) { + return [ 'style' => [ 'email_background_color' => '' ] ]; + } + + return [ + 'style' => [ + 'email_background_color' => wpforms_setting( 'email-background-color', '#e9eaec' ), + ], + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/ErrorHandler.php b/wp-content/plugins/wpforms-lite/src/ErrorHandler.php new file mode 100755 index 00000000..cb8bea27 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/ErrorHandler.php @@ -0,0 +1,418 @@ +dirs = $dirs; + $this->levels = $levels; + } + + /** + * Init class. + * + * @since 1.8.5 + * + * @return void + * @noinspection PhpUndefinedConstantInspection + */ + public function init() { + + if ( defined( 'WPFORMS_DISABLE_ERROR_HANDLER' ) && WPFORMS_DISABLE_ERROR_HANDLER ) { + return; + } + + $this->dirs = [ + // WPForms. + WPFORMS_PLUGIN_DIR . 'vendor/', + WPFORMS_PLUGIN_DIR . 'vendor_prefixed/', + // Addons. + WP_PLUGIN_DIR . '/wpforms-activecampaign/vendor/', + WP_PLUGIN_DIR . '/wpforms-authorize-net/vendor/', + WP_PLUGIN_DIR . '/wpforms-aweber/deprecated/', + WP_PLUGIN_DIR . '/wpforms-aweber/vendor/', + WP_PLUGIN_DIR . '/wpforms-calculations/vendor/', + WP_PLUGIN_DIR . '/wpforms-campaign-monitor/vendor/', + WP_PLUGIN_DIR . '/wpforms-captcha/vendor/', + WP_PLUGIN_DIR . '/wpforms-conversational-forms/vendor/', + WP_PLUGIN_DIR . '/wpforms-convertkit/vendor/', + WP_PLUGIN_DIR . '/wpforms-convertkit/vendor_prefixed/', + WP_PLUGIN_DIR . '/wpforms-coupons/vendor/', + WP_PLUGIN_DIR . '/wpforms-drip/vendor/', + WP_PLUGIN_DIR . '/wpforms-e2e-helpers/vendor/', + WP_PLUGIN_DIR . '/wpforms-entry-automation/vendor/', + WP_PLUGIN_DIR . '/wpforms-form-abandonment/vendor/', + WP_PLUGIN_DIR . '/wpforms-form-locker/vendor/', + WP_PLUGIN_DIR . '/wpforms-form-pages/vendor/', + WP_PLUGIN_DIR . '/wpforms-geolocation/vendor/', + WP_PLUGIN_DIR . '/wpforms-getresponse/vendor/', + WP_PLUGIN_DIR . '/wpforms-google-sheets/vendor/', + WP_PLUGIN_DIR . '/wpforms-hubspot/vendor/', + WP_PLUGIN_DIR . '/wpforms-lead-forms/vendor/', + WP_PLUGIN_DIR . '/wpforms-mailchimp/vendor/', + WP_PLUGIN_DIR . '/wpforms-mailerlite/vendor/', + WP_PLUGIN_DIR . '/wpforms-offline-forms/vendor/', + WP_PLUGIN_DIR . '/wpforms-paypal-commerce/vendor/', + WP_PLUGIN_DIR . '/wpforms-paypal-standard/vendor/', + WP_PLUGIN_DIR . '/wpforms-post-submissions/vendor/', + WP_PLUGIN_DIR . '/wpforms-salesforce/vendor/', + WP_PLUGIN_DIR . '/wpforms-salesforce/vendor_prefixed/', + WP_PLUGIN_DIR . '/wpforms-save-resume/vendor/', + WP_PLUGIN_DIR . '/wpforms-sendinblue/vendor/', + WP_PLUGIN_DIR . '/wpforms-signatures/vendor/', + WP_PLUGIN_DIR . '/wpforms-square/vendor/', // Backward compatibility. + WP_PLUGIN_DIR . '/wpforms-stripe/vendor/', + WP_PLUGIN_DIR . '/wpforms-surveys-polls/vendor/', + WP_PLUGIN_DIR . '/wpforms-user-journey/vendor/', + WP_PLUGIN_DIR . '/wpforms-user-registration/vendor/', + WP_PLUGIN_DIR . '/wpforms-webhooks/vendor/', + WP_PLUGIN_DIR . '/wpforms-zapier/vendor/', + ]; + + /** + * Allow modifying the list of dirs to suppress messages from. + * + * @since 1.8.6 + * + * @param array $dirs The list of dirs to suppress messages from. + */ + $this->dirs = (array) apply_filters( 'wpforms_error_handler_dirs', $this->dirs ); + + $this->normalize_dirs(); + + /** + * Allow modifying the levels of messages to suppress. + * + * @since 1.8.6 + * + * @param int $levels Error levels of messages to suppress. + */ + $this->levels = (int) apply_filters( + 'wpforms_error_handler_levels', + E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED + ); + + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.1 + * + * @return void + */ + protected function hooks() { + + if ( $this->dirs && $this->levels ) { + // Set error handler. + $this->set_error_handler(); + + // Some plugins destroy an error handler chain. Set the error handler again upon loading them. + add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ], 1000 ); + } + + // Suppress the _load_textdomain_just_in_time() notices related the WPForms for WP 6.7+. + if ( version_compare( $GLOBALS['wp_version'], '6.7', '>=' ) ) { + add_action( 'doing_it_wrong_run', [ $this,'action_doing_it_wrong_run' ], 0, 3 ); + add_action( 'doing_it_wrong_run', [ $this,'action_doing_it_wrong_run' ], 20, 3 ); + add_filter( 'doing_it_wrong_trigger_error', [ $this, 'filter_doing_it_wrong_trigger_error' ], 10, 4 ); + } + } + + /** + * Set error handler and save original. + * + * @since 1.9.1 + */ + public function set_error_handler() { + + // To chain error handlers, we must not specify the second argument and catch all errors in our handler. + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_set_error_handler + $this->previous_error_handler = set_error_handler( [ $this, 'error_handler' ] ); + } + + /** + * The 'plugins_loaded' hook. + * + * @since 0.32 + * + * @return void + */ + public function plugins_loaded() { + + // Constants of plugins that destroy an error handler chain. + $constants = [ + 'QM_VERSION', // Query Monitor. + 'AUTOMATOR_PLUGIN_VERSION', // Uncanny Automator. + ]; + + $found = false; + + foreach ( $constants as $constant ) { + if ( defined( $constant ) ) { + $found = true; + + break; + } + } + + if ( ! $found ) { + return; + } + + // Set this error handler after loading a plugin to chain its error handler. + ( new self( $this->dirs, $this->levels ) )->set_error_handler(); + } + + /** + * Error handler. + * + * @since 1.8.5 + * + * @param int $level Error level. + * @param string $message Error message. + * @param string $file File produced an error. + * @param int $line Line number. + * + * @return bool + * @noinspection PhpTernaryExpressionCanBeReplacedWithConditionInspection + */ + public function error_handler( int $level, string $message, string $file, int $line ): bool { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + if ( $this->handling ) { + $this->handling = false; + + // Prevent infinite recursion and fallback to standard error handler. + return false; + } + + $this->handling = true; + + if ( ( $level & $this->levels ) === 0 ) { + // Not served error level, use fallback error handler. + // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection + return $this->fallback_error_handler( func_get_args() ); + } + + // Process error. + $normalized_file = str_replace( DIRECTORY_SEPARATOR, '/', $file ); + + foreach ( $this->dirs as $dir ) { + if ( strpos( $normalized_file, $dir ) !== false ) { + $this->handling = false; + + // Suppress deprecated errors from this directory. + return true; + } + } + + // Not served directory, use fallback error handler. + // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection + return $this->fallback_error_handler( func_get_args() ); + } + + /** + * Action for _doing_it_wrong() calls. + * + * @since 1.9.2.2 + * + * @param string $function_name The function that was called. + * @param string $message A message explaining what has been done incorrectly. + * @param string $version The version of WordPress where the message was added. + * + * @return void + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function action_doing_it_wrong_run( $function_name, $message, $version ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed, WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + global $wp_filter; + + $function_name = (string) $function_name; + $message = (string) $message; + + if ( ! class_exists( 'QM_Collectors' ) || ! $this->is_just_in_time_for_wpforms_domain( $function_name, $message ) ) { + return; + } + + $qm_collector_doing_it_wrong = QM_Collectors::get( 'doing_it_wrong' ); + $current_priority = $wp_filter['doing_it_wrong_run']->current_priority(); + + if ( $qm_collector_doing_it_wrong === null || $current_priority === false ) { + return; + } + + switch ( $current_priority ) { + case 0: + remove_action( 'doing_it_wrong_run', [ $qm_collector_doing_it_wrong, 'action_doing_it_wrong_run' ] ); + break; + + case 20: + add_action( 'doing_it_wrong_run', [ $qm_collector_doing_it_wrong, 'action_doing_it_wrong_run' ], 10, 3 ); + break; + + default: + break; + } + } + + /** + * Filter for _doing_it_wrong() calls. + * + * @since 1.9.2.2 + * + * @param bool|mixed $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true. + * @param string $function_name The function that was called. + * @param string $message A message explaining what has been done incorrectly. + * @param string $version The version of WordPress where the message was added. + * + * @return bool + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function filter_doing_it_wrong_trigger_error( $trigger, $function_name, $message, $version ): bool { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $trigger = (bool) $trigger; + $function_name = (string) $function_name; + $message = (string) $message; + + return $this->is_just_in_time_for_wpforms_domain( $function_name, $message ) ? false : $trigger; + } + + /** + * Filter for gettext. + * + * @since 1.9.2.2 + * @deprecated 1.9.3 + * + * @param string|mixed $translation Translated text. + * @param string|mixed $text Text to translate. + * @param string|mixed $domain Text domain. Unique identifier for retrieving translated strings. + * + * @return string|mixed + * @noinspection PhpUnusedParameterInspection + */ + public function filter_gettext( $translation, $text, $domain ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + _deprecated_function( __METHOD__, '1.9.3 of the WPForms plugin' ); + + return $translation; + } + + /** + * Fallback error handler. + * + * @since 1.9.2 + * + * @param array $args Arguments. + * + * @return bool + * @noinspection PhpTernaryExpressionCanBeReplacedWithConditionInspection + */ + private function fallback_error_handler( array $args ): bool { + + $result = $this->previous_error_handler === null ? + // Use standard error handler. + false : + (bool) call_user_func_array( $this->previous_error_handler, $args ); + + $this->handling = false; + + return $result; + } + + /** + * Normalize dirs. + * + * @since 1.9.2 + * + * @return void + */ + private function normalize_dirs() { + + $this->dirs = array_filter( + array_map( + static function ( $dir ) { + + return str_replace( DIRECTORY_SEPARATOR, '/', trim( $dir ) ); + }, + $this->dirs + ) + ); + } + + /** + * Whether it is the just_in_time_error for WPForms-related domains. + * + * @since 1.9.2.2 + * + * @param string $function_name Function name. + * @param string $message Message. + * + * @return bool + */ + protected function is_just_in_time_for_wpforms_domain( string $function_name, string $message ): bool { + + return $function_name === '_load_textdomain_just_in_time' && strpos( $message, 'wpforms' ) !== false; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Akismet.php b/wp-content/plugins/wpforms-lite/src/Forms/Akismet.php new file mode 100755 index 00000000..eeb67733 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Akismet.php @@ -0,0 +1,323 @@ +get_field_type_allowlist(); + $entry_data = []; + $entry_content = []; + + foreach ( $fields as $field_id => $field ) { + $field_type = $field['type']; + + if ( ! in_array( $field_type, $field_type_allowlist, true ) ) { + continue; + } + + $field_content = $this->get_field_content( $field, $entry, $field_id ); + + if ( ! isset( $entry_data[ $field_type ] ) && in_array( $field_type, [ 'name', 'email', 'url' ], true ) ) { + $entry_data[ $field_type ] = $field_content; + + continue; + } + + $entry_content[] = $field_content; + } + + $entry_data['content'] = implode( ' ', $entry_content ); + + return $entry_data; + } + + /** + * Get field content. + * + * @since 1.8.5 + * @since 1.8.9.3 Changed $field_id type from string to int|string. + * + * @param array $field Field data. + * @param array $entry Entry data. + * @param int|string $field_id Field ID. + * + * @return string + */ + private function get_field_content( array $field, array $entry, $field_id ): string { + + if ( ! isset( $entry['fields'][ $field_id ] ) ) { + return ''; + } + + if ( ! is_array( $entry['fields'][ $field_id ] ) ) { + return (string) $entry['fields'][ $field_id ]; + } + + if ( ! empty( $field['type'] ) && $field['type'] === 'email' && ! empty( $entry['fields'][ $field_id ]['primary'] ) ) { + return (string) $entry['fields'][ $field_id ]['primary']; + } + + return implode( ' ', $entry['fields'][ $field_id ] ); + } + + /** + * Is the entry marked as spam by Akismet? + * + * @since 1.7.6 + * + * @param array $form_data Form data for the current form. + * @param array $entry Entry data for the current entry. + * + * @return bool + */ + private function entry_is_spam( array $form_data, array $entry ): bool { + + $request = $this->get_request_args( $form_data, $entry ); + + // Tell Akismet to not use the submission for training if we're on the Preview page and the user is + // an administrator. Checking for both the preview page and the administrator role prevents + // abuse by simply adding a GET parameter. This check happens in the ajax request, + // where `\WPForms\Forms\Preview::is_preview_page()` does not work, so we + // need to check for the GET parameter directly. + if ( + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + isset( $_REQUEST['page_url'] ) && strpos( wp_unslash( $_REQUEST['page_url'] ), 'wpforms_form_preview' ) !== false && + current_user_can( 'manage_options' ) + ) { + $request['is_test'] = true; + } + + $response = $this->http_post( $request, 'comment-check' ); + + return ! empty( $response ) && isset( $response[1] ) && 'true' === trim( $response[1] ); + } + + /** + * Mark the entry as not spam in Akismet. + * + * @since 1.8.8 + * + * @param array $form_data Form data for the current form. + * @param array $entry Entry data for the current entry. + * + * @return bool + */ + public function set_entry_not_spam( array $form_data, array $entry ) { + + if ( ! self::is_configured() ) { + return false; + } + + $request = $this->get_request_args( $form_data, $entry ); + + $response = $this->http_post( $request, 'submit-ham' ); + + // Yes, Akismet returns "Thanks for making the web a better place." as the response. + return ! empty( $response ) && isset( $response[1] ) && 'Thanks for making the web a better place.' === trim( $response[1] ); + } + + /** + * Mark the entry as spam in Akismet. + * + * @since 1.8.9 + * + * @param array $form_data Form data for the current form. + * @param array $entry Entry data for the current entry. + * + * @return bool + */ + public function submit_missed_spam( array $form_data, array $entry ) { + + if ( ! self::is_configured() ) { + return false; + } + + $request = $this->get_request_args( $form_data, $entry ); + + $response = $this->http_post( $request, 'submit-spam' ); + + // Yes, Akismet returns "Thanks for making the web a better place." as the response. + return ! empty( $response ) && isset( $response[1] ) && 'Thanks for making the web a better place.' === trim( $response[1] ); + } + + /** + * Get the request arguments to be sent to Akismet. + * + * @since 1.8.8 + * + * @param array $form_data Form data for the current form. + * @param array $entry Entry data for the current entry. + * + * @return array $request_args Request arguments to be sent to Akismet. + */ + private function get_request_args( $form_data, $entry ) { + + $entry_data = $this->get_entry_data( $form_data['fields'], $entry ); + + $entry_id = $entry['entry_id'] ?? null; + + // We can't use certain real-time functions when the entry is marked as not spam. + // In this case, we need to use the smart tag value. + if ( ! empty( $entry_id ) ) { + $page_url = wpforms_process_smart_tags( '{page_url}', $form_data, [], $entry_id, 'akismet-request-args' ); + $url_referer = wpforms_process_smart_tags( '{url_referer}', $form_data, [], $entry_id, 'akismet-request-args' ); + $user_id = wpforms_process_smart_tags( '{user_id}', $form_data, [], $entry_id, 'akismet-request-args' ); + $user_ip = wpforms_process_smart_tags( '{user_ip}', $form_data, [], $entry_id, 'akismet-request-args' ); + $user_agent = ''; + } else { + $page_url = wpforms_current_url(); + $url_referer = wp_get_referer(); + $user_id = get_current_user_id(); + $user_ip = wpforms_get_ip(); + $user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + } + + return [ + 'blog' => get_option( 'home' ), + 'blog_lang' => get_locale(), + 'blog_charset' => get_bloginfo( 'charset' ), + 'permalink' => $page_url, + 'user_ip' => wpforms_is_collecting_ip_allowed( $form_data ) ? $user_ip : '', + 'user_id' => $user_id, + 'user_role' => AkismetPlugin::get_user_roles( $user_id ), + 'user_agent' => $user_agent, + 'referrer' => $url_referer ? $url_referer : '', + 'comment_type' => 'contact-form', + 'comment_author' => $entry_data['name'] ?? '', + 'comment_author_email' => $entry_data['email'] ?? '', + 'comment_author_url' => $entry_data['url'] ?? '', + 'comment_content' => $entry_data['content'] ?? '', + 'honeypot_field_name' => 'wpforms[hp]', + ]; + } + + /** + * Send a POST request to the Akismet API. + * + * @since 1.8.8 + * + * @param array $request Request arguments to be sent to Akismet. + * @param string $path API path. + * + * @return array + */ + private function http_post( $request, $path ) { + + // build_query() does not urlencode the values, but API explicitly requires it. + $request = array_map( 'urlencode', $request ); + + return AkismetPlugin::http_post( build_query( $request ), $path ); + } + + /** + * Validate entry. + * + * @since 1.7.6 + * + * @param array $form_data Form data for the current form. + * @param array $entry Entry data for the current entry. + * + * @return string|bool + */ + public function validate( array $form_data, array $entry ) { + + // If Akismet is turned on in form settings, is activated, is configured and the entry is spam. + if ( + ! empty( $form_data['settings']['akismet'] ) && + self::is_configured() && + $this->entry_is_spam( $form_data, $entry ) + ) { + // This string is being logged not printed, so it does not need to be translatable. + return esc_html__( 'Anti-spam verification failed, please try again later.', 'wpforms-lite' ); + } + + return false; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/AntiSpam.php b/wp-content/plugins/wpforms-lite/src/Forms/AntiSpam.php new file mode 100755 index 00000000..402e61f6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/AntiSpam.php @@ -0,0 +1,385 @@ + field_id]). + * + * @since 1.9.0.3 + * + * @var array + */ + private $forms_data = []; + + /** + * Initialise the actions for the modern Anti-Spam. + * + * @since 1.9.0 + */ + public function init() { + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.0 + */ + private function hooks() { + + // Frontend hooks. + add_filter( 'wpforms_frontend_strings', [ $this, 'add_frontend_strings' ] ); + add_filter( 'wpforms_frontend_fields_base_level', [ $this, 'get_random_field' ], 20 ); + add_action( 'wpforms_display_field_before', [ $this, 'maybe_insert_honeypot_field' ], 1, 2 ); + add_action( 'wpforms_display_fields_after', [ $this, 'maybe_insert_honeypot_init_js' ] ); + + // Builder hooks. + add_filter( 'wpforms_builder_panel_settings_init_form_data', [ $this, 'init_builder_settings_form_data' ] ); + add_filter( 'wpforms_admin_builder_templates_apply_to_new_form_modify_data', [ $this, 'update_template_form_data' ] ); + add_filter( 'wpforms_admin_builder_templates_apply_to_existing_form_modify_data', [ $this, 'update_template_form_data' ] ); + add_filter( 'wpforms_templates_class_base_template_modify_data', [ $this, 'update_template_form_data' ] ); + add_filter( 'wpforms_templates_class_base_template_replace_modify_data', [ $this, 'update_template_form_data' ] ); + add_filter( 'wpforms_form_handler_convert_form_data', [ $this, 'update_template_form_data' ] ); + } + + /** + * Store a random field id to insert a honeypot field later. + * + * @since 1.9.0 + * + * @param array|mixed $fields_data Form fields data. + * + * @return array|mixed Form fields data. + */ + public function get_random_field( $fields_data ) { + + if ( ! is_array( $fields_data ) ) { + return $fields_data; + } + + $random_field_id = array_rand( $fields_data ); + + if ( ! empty( $random_field_id ) ) { + $this->insert_before_field_id = $random_field_id; + } + + return $fields_data; + } + + /** + * Insert honeypot field before a random field. + * + * @since 1.9.0 + * + * @param array $field Field. + * @param array $form_data Form data. + */ + public function maybe_insert_honeypot_field( array $field, array $form_data ) { + + if ( + $this->insert_before_field_id !== (int) $field['id'] || + ! $this->is_honeypot_enabled( $form_data ) + ) { + return; + } + + $honeypot_field_id = $this->get_honeypot_field_id( $form_data ); + $form_id = (int) $form_data['id']; + $label = $this->get_honeypot_label( $form_data ); + $id_attr = sprintf( 'wpforms-%1$s-field_%2$s', $form_id, $honeypot_field_id ); + $is_amp = wpforms_is_amp(); + $this->forms_data[ $form_id ] = $honeypot_field_id; + + if ( $is_amp ) { + echo ''; + } + + ?> +
              + + +
              + '; + } + } + + /** + * Insert the inline styles. + * + * @since 1.9.0 + * + * @param array $form_data Form data. + * + * @noinspection PhpUnusedParameterInspection + */ + public function maybe_insert_honeypot_init_js( array $form_data ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + if ( + ! $this->forms_data || + wpforms_is_amp() + ) { + return; + } + + $ids = []; + + foreach ( $this->forms_data as $form_id => $honeypot_field_id ) { + $ids[] = sprintf( + '#wpforms-%1$d-field_%2$d-container', + $form_id, + $honeypot_field_id + ); + } + + if ( ! $ids ) { + return; + } + + $styles = sprintf( + '%1$s { position: absolute !important; overflow: hidden !important; display: inline !important; height: 1px !important; width: 1px !important; z-index: -1000 !important; padding: 0 !important; } %1$s input { visibility: hidden; } #wpforms-conversational-form-page %1$s label { counter-increment: none; }', + esc_attr( implode( ',', $ids ) ) + ); + + // There must be no empty lines inside the script. Otherwise, wpautop adds

              tags which break script execution. + printf( + "", + esc_js( $styles ) + ); + } + + /** + * Get honeypot field label. + * + * @since 1.9.0 + * + * @param array $form_data Form data. + */ + private function get_honeypot_label( array $form_data ): string { + + $labels = []; + + foreach ( $form_data['fields'] ?? [] as $field ) { + if ( ! empty( $field['label'] ) ) { + $labels[] = $field['label']; + } + } + + $words = explode( ' ', implode( ' ', $labels ) ); + $count_words = count( $words ); + $label_keys = (array) array_rand( $words, min( $count_words, 3 ) ); + + shuffle( $label_keys ); + + $label_words = array_map( + static function ( $key ) use ( $words ) { + + return $words[ $key ]; + }, + $label_keys + ); + + return implode( ' ', $label_words ); + } + + /** + * Add strings to the frontend. + * + * @since 1.9.0 + * + * @param array|mixed $strings Frontend strings. + * + * @return array Frontend strings. + */ + public function add_frontend_strings( $strings ): array { + + $strings = (array) $strings; + + // Store the honeypot field ID for validation and adding inline styles. + $strings['hn_data'] = $this->forms_data; + + return $strings; + } + + /** + * Validate whether the modern Anti-Spam is enabled. + * + * @since 1.9.0 + * + * @param array $form_data Form data. + * @param array $fields Fields. + * @param array $entry Form submission raw data ($_POST). + * + * @return bool True if the entry is valid, false otherwise. + * @noinspection PhpUnusedParameterInspection + */ + public function validate( array $form_data, array $fields, array &$entry ): bool { + + // Bail out if the modern Anti-Spam is not enabled. + if ( ! $this->is_honeypot_enabled( $form_data ) ) { + return true; + } + + $honeypot_fields = array_diff_key( $entry['fields'], $form_data['fields'] ); + $is_valid = true; + + // Compatibility with the WPML plugin (WPFML addon). + // In case the form contains an Entry Preview field, they add an extra field with ID 0 to the entry. + if ( + isset( $entry['fields'][0] ) && + defined( 'WPML_WP_FORMS_VERSION' ) && + wpforms_has_field_type( 'entry-preview', $form_data ) + ) { + unset( $honeypot_fields[0] ); + } + + foreach ( $honeypot_fields as $key => $honeypot_field ) { + // Remove the honeypot field from the entry. + unset( $entry['fields'][ $key ] ); + + // If the honeypot field is not empty, the entry is invalid. + if ( ! empty( $honeypot_field ) ) { + $is_valid = false; + } + } + + return $is_valid; + } + + /** + * Check if the modern Anti-Spam is enabled. + * + * @since 1.9.0 + * + * @param array $form_data Form data. + * + * @return bool True if the modern Anti-Spam is enabled, false otherwise. + */ + private function is_honeypot_enabled( array $form_data ): bool { + + static $is_enabled; + + if ( isset( $is_enabled ) ) { + return $is_enabled; + } + + /** + * Filters whether the modern Anti-Spam is enabled. + * + * @since 1.9.0 + * + * @param bool $is_enabled True if the modern Anti-Spam is enabled, false otherwise. + */ + $is_enabled = (bool) apply_filters( 'wpforms_forms_anti_spam_v3_is_honeypot_enabled', ! empty( $form_data['settings']['antispam_v3'] ) ); + + return $is_enabled; + } + + /** + * Get the honeypot field ID. + * + * @since 1.9.0 + * + * @param array $form_data Form data. + * + * @return int Honeypot field ID. + */ + private function get_honeypot_field_id( array $form_data ): int { + + $max_key = max( array_keys( $form_data['fields'] ) ); + + // Find the first available field ID. + for ( $i = 1; $i <= $max_key; $i++ ) { + if ( ! isset( $form_data['fields'][ $i ] ) ) { + return $i; + } + } + + // If no available field ID found, use the max ID + 1. + return $max_key + 1; + } + + /** + * Update the form data on the builder settings panel. + * + * @since 1.9.0 + * + * @param array|bool $form_data Form data. + * + * @return array|bool + */ + public function init_builder_settings_form_data( $form_data ) { + + if ( ! $form_data ) { + return $form_data; + } + + // Update default time limit duration for the existing form. + if ( empty( $form_data['settings']['anti_spam']['time_limit']['enable'] ) ) { + $form_data['settings']['anti_spam']['time_limit']['duration'] = '2'; + } + + return $form_data; + } + + /** + * Update the template form data. Set the modern Anti-Spam setting. + * + * @since 1.9.0 + * + * @param array|mixed $form_data Form data. + * + * @return array + */ + public function update_template_form_data( $form_data ): array { + + $form_data = (array) $form_data; + + // Unset the old Anti-Spam setting. + unset( $form_data['settings']['antispam'] ); + + // Enable the modern Anti-Spam setting. + $form_data['settings']['antispam_v3'] = $form_data['settings']['antispam_v3'] ?? '1'; + $form_data['settings']['anti_spam'] = $form_data['settings']['anti_spam'] ?? []; + + // Enable the time limit setting. + $form_data['settings']['anti_spam']['time_limit'] = [ + 'enable' => '1', + 'duration' => '2', + ]; + + return $form_data; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Coupon/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Coupon/Field.php new file mode 100755 index 00000000..2e73d667 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Coupon/Field.php @@ -0,0 +1,298 @@ +name = esc_html__( 'Coupon', 'wpforms-lite' ); + $this->keywords = esc_html__( 'discount, sale', 'wpforms-lite' ); + $this->type = 'payment-coupon'; + $this->icon = 'fa-ticket'; + $this->order = 100; + $this->group = 'payment'; + $this->addon_slug = 'coupons'; + + $this->is_addon_active = function_exists( 'wpforms_' . $this->addon_slug ); + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Define field hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + + add_filter( 'wpforms_field_new_display_duplicate_button', [ $this, 'field_display_duplicate_button' ], 20, 2 ); + add_filter( 'wpforms_field_preview_display_duplicate_button', [ $this, 'field_display_duplicate_button' ], 20, 2 ); + } + + /** + * Disallow field preview "Duplicate" button. + * + * @since 1.9.4 + * + * @param bool|mixed $display Display switch. + * @param array $field Field settings. + * + * @return bool + */ + public function field_display_duplicate_button( $display, array $field ) { + + return $field['type'] === $this->type ? false : $display; + } + + /** + * Define additional field options. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + public function field_options( $field ) { + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + $this->field_option( 'label', $field ); + + $this->field_option( 'description', $field ); + + $coupons = []; + $form_coupons = []; + + if ( $this->is_addon_active ) { + $coupons = wpforms_coupons()->get( 'repository' )->get_coupons( + [ + 'limit' => -1, + 'fields' => 'id=>name', + ] + ); + $form_coupons = wpforms_coupons()->get( 'repository' )->get_form_coupons( $this->get_form_id() ); + } + + $warning = sprintf( + '

              %2$s

              ', + empty( $form_coupons ) && empty( $this->is_disabled_field ) ? '' : ' wpforms-hidden', + esc_html__( 'You haven\'t selected any coupons that can be used with this form. Please choose at least one coupon.', 'wpforms-lite' ) + ); + + $coupons_field_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'allowed_coupons', + 'value' => esc_html__( 'Allowed Coupons', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Choose coupons that can be used in the field.', 'wpforms-lite' ), + ], + false + ); + $coupons_field = $this->get_allowed_coupons_field( $coupons, $form_coupons, $field ); + $allowed_forms_json = sprintf( + '', + $field['id'], + wp_json_encode( $form_coupons ) + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'allowed_coupons', + 'content' => $coupons_field_label . $coupons_field . $allowed_forms_json . $warning, + ] + ); + $this->field_option( 'required', $field ); + + $this->field_option( 'basic-options', $field, [ 'markup' => 'close' ] ); + + $this->field_option( 'advanced-options', $field, [ 'markup' => 'open' ] ); + + $this->field_option( 'button_text', $field ); + + $button_text_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'button_text', + 'value' => esc_html__( 'Button Text', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Change button text.', 'wpforms-lite' ), + ], + false + ); + $button_text_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'button_text', + 'value' => isset( $field['button_text'] ) && ! wpforms_is_empty_string( $field['button_text'] ) + ? $field['button_text'] + : esc_html__( 'Apply', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'button_text', + 'content' => $button_text_label . $button_text_field, + ] + ); + $this->field_option( 'css', $field ); + $this->field_option( 'label_hide', $field ); + $this->field_option( 'advanced-options', $field, [ 'markup' => 'close' ] ); + } + + /** + * Get allowed coupons' field. + * + * @since 1.9.4 + * + * @param array $coupons Coupons. + * @param array $form_coupons Form coupons. + * @param array $field Field data. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ + private function get_allowed_coupons_field( array $coupons, array $form_coupons, array $field ): string { + + $output = sprintf( ''; + + return $output; + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + $allowed_coupons = []; + + if ( $this->is_addon_active ) { + $allowed_coupons = wpforms_coupons()->get( 'repository' )->get_form_coupons( $this->get_form_id() ); + } + + printf( + '
              + + + +
              ', + esc_html( $this->get_button_text( $field ) ), + empty( $allowed_coupons ) && empty( $this->is_disabled_field ) ? '' : ' wpforms-hidden' + ); + + // Description. + $this->field_preview_option( 'description', $field ); + + // Hide remaining elements. + $this->field_preview_option( 'hide-remaining', $field ); + } + + /** + * Get form ID. In AJAX requests the $form_id property doesn't exist. + * + * @since 1.9.4 + * + * @return bool|int + */ + protected function get_form_id() { + + if ( $this->form_id ) { + return $this->form_id; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $this->form_id = isset( $_POST['id'] ) ? absint( $_POST['id'] ) : false; + + return $this->form_id; + } + + /** + * Get the apply button text. + * + * @since 1.9.4 + * + * @param array $field Field data. + * + * @return string + */ + protected function get_button_text( array $field ): string { + + return isset( $field['button_text'] ) && ! wpforms_is_empty_string( $field['button_text'] ) + ? $field['button_text'] + : __( 'Apply', 'wpforms-lite' ); + } + + /** + * Field display on the frontend. + * + * @since 1.9.4 + * + * @param array $field Field data. + * @param array $deprecated Field attributes. + * @param array $form_data Form data. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/LikertScale/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/LikertScale/Field.php new file mode 100755 index 00000000..143c78ba --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/LikertScale/Field.php @@ -0,0 +1,372 @@ +name = esc_html__( 'Likert Scale', 'wpforms-lite' ); + $this->keywords = esc_html__( 'survey, rating scale', 'wpforms-lite' ); + $this->type = 'likert_scale'; + $this->icon = 'fa-ellipsis-h'; + $this->order = 400; + $this->group = 'fancy'; + $this->addon_slug = 'surveys-polls'; + + $this->default_settings = [ + 'size' => 'large', + 'style' => 'modern', + 'survey' => '1', + 'rows' => [ + 1 => esc_html__( 'Item #1', 'wpforms-lite' ), + 2 => esc_html__( 'Item #2', 'wpforms-lite' ), + 3 => esc_html__( 'Item #3', 'wpforms-lite' ), + ], + 'columns' => [ + 1 => esc_html__( 'Strongly Disagree', 'wpforms-lite' ), + 2 => esc_html__( 'Disagree', 'wpforms-lite' ), + 3 => esc_html__( 'Neutral', 'wpforms-lite' ), + 4 => esc_html__( 'Agree', 'wpforms-lite' ), + 5 => esc_html__( 'Strongly Agree', 'wpforms-lite' ), + ], + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.4 + */ + protected function hooks() {} + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + + /** + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Rows. + $values = ! empty( $field['rows'] ) ? $field['rows'] : $this->default_settings['rows']; + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'rows', + 'value' => esc_html__( 'Rows', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Add rows to the likert scale.', 'wpforms-lite' ), + ], + false + ); + $fld = sprintf( + '
                ', + max( array_keys( $values ) ) + 1, + ! empty( $field['single_row'] ) ? 'wpforms-hidden' : '', + $field['id'], + $this->type, + 'rows' + ); + + foreach ( $values as $key => $value ) { + $fld .= sprintf( '
              • ', $key ); + $fld .= ''; + $fld .= sprintf( '', esc_attr( $field['id'] ), $key, esc_attr( $value ) ); + $fld .= ''; + $fld .= ''; + $fld .= '
              • '; + } + $fld .= '
              '; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'rows', + 'content' => $lbl . $fld, + ] + ); + + // Single rows. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'single_row', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'single_row', + 'value' => isset( $field['single_row'] ) ? '1' : '0', + 'desc' => esc_html__( 'Make this a single-row rating scale', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to make this a single-row rating scale and remove the row choices.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + // Multiple row responses. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'multiple_responses', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'multiple_responses', + 'value' => isset( $field['multiple_responses'] ) ? '1' : '0', + 'desc' => esc_html__( 'Allow multiple responses per row', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to allow multiple responses per row (uses checkboxes).', 'wpforms-lite' ), + ], + false + ), + ] + ); + + // Columns. + $values = ! empty( $field['columns'] ) ? $field['columns'] : $this->default_settings['columns']; + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'columns', + 'value' => esc_html__( 'Columns', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Add columns to the likert scale.', 'wpforms-lite' ), + ], + false + ); + $fld = sprintf( '
                ', max( array_keys( $values ) ) + 1, $field['id'], $this->type, 'columns' ); + + foreach ( $values as $key => $value ) { + $fld .= sprintf( '
              • ', $key ); + $fld .= ''; + $fld .= sprintf( '', $field['id'], $key, esc_attr( $value ) ); + $fld .= ''; + $fld .= ''; + $fld .= '
              • '; + } + $fld .= '
              '; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'columns', + 'content' => $lbl . $fld, + ] + ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Style (theme). + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'style', + 'value' => esc_html__( 'Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the style for the likert scale.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'style', + 'value' => ! empty( $field['style'] ) ? esc_attr( $field['style'] ) : 'modern', + 'options' => [ + 'modern' => esc_html__( 'Modern', 'wpforms-lite' ), + 'classic' => esc_html__( 'Classic', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'style', + 'content' => $lbl . $fld, + ] + ); + + // Size. + $this->field_option( 'size', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Define data. + $rows = ! empty( $field['rows'] ) ? $field['rows'] : $this->default_settings['rows']; + $columns = ! empty( $field['columns'] ) ? $field['columns'] : $this->default_settings['columns']; + $input_type = ! empty( $field['multiple_responses'] ) ? 'checkbox' : 'radio'; + $style = ! empty( $field['style'] ) ? sanitize_html_class( $field['style'] ) : 'modern'; + $single = ! empty( $field['single_row'] ); + $width = $single ? round( 100 / count( $columns ), 4 ) : round( 80 / count( $columns ), 4 ); + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + ?> + +
              diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-base.php b/wp-content/plugins/wpforms-lite/includes/fields/class-base.php new file mode 100755 index 00000000..b7dfc487 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-base.php @@ -0,0 +1,4406 @@ + 0, + 'type' => '', + 'label' => '', + 'description' => '', + 'size' => 'medium', + 'default_value' => '', + 'css' => '', + 'read_only' => 0, + ]; + + /** + * Full name of the field type, e.g. "Paragraph Text". + * + * @since 1.0.0 + * + * @var string + */ + public $name; + + /** + * Type of the field, eg "textarea". + * + * @since 1.0.0 + * + * @var string + */ + public $type; + + /** + * Font Awesome Icon used for the editor button, e.g. "fa-list". + * + * @since 1.0.0 + * + * @var mixed + */ + public $icon = false; + + /** + * Field keywords for search, e.g. "checkbox, file, icon, upload". + * + * @since 1.8.3 + * + * @var string + */ + public $keywords = ''; + + /** + * Priority order the field button should show inside the "Add Fields" tab. + * + * @since 1.0.0 + * + * @var int + */ + public $order = 1; + + /** + * Field group the field belongs to. + * + * @since 1.0.0 + * + * @var string + */ + public $group = 'standard'; + + /** + * Placeholder to hold default value(s) for some field types. + * + * @since 1.0.0 + * + * @var mixed + */ + public $defaults; + + /** + * Default field settings. + * + * @since 1.9.4 + * + * @var mixed + */ + public $default_settings; + + /** + * Current form ID in the admin builder. + * + * @since 1.1.1 + * + * @var int|bool + */ + public $form_id; + + /** + * Current field ID. + * + * @since 1.5.6 + * + * @var int + */ + public $field_id; + + /** + * Current form data. + * + * @since 1.1.1 + * + * @var array + */ + public $form_data; + + /** + * Current field data. + * + * @since 1.5.6 + * + * @var array + */ + public $field_data; + + /** + * Instance of the Frontend class. + * + * @since 1.8.1 + * + * @var FrontendBase + */ + protected $frontend_obj; + + /** + * Primary class constructor. + * + * @since 1.0.0 + * + * @param bool $init Pass false to allow shortcutting the whole initialization, if needed. + */ + public function __construct( $init = true ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( ! $init ) { + return; + } + + // phpcs:disable WordPress.Security.NonceVerification + $this->form_id = false; + + if ( isset( $_GET['form_id'] ) ) { + $this->form_id = absint( $_GET['form_id'] ); + } elseif ( isset( $_POST['id'] ) ) { + $this->form_id = absint( $_POST['id'] ); + } + // phpcs:enable WordPress.Security.NonceVerification + + // Bootstrap. + $this->init(); + $this->read_only_init(); + + // Init field default settings. + $this->field_default_settings(); + + // Initialize a field's Frontend class. + $this->frontend_obj = $this->get_object( 'Frontend' ); + + // Common field hooks. + $this->common_hooks(); + } + + /** + * Common field hooks. + * + * @since 1.9.4 + */ + protected function common_hooks(): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Solution to get an object of the field class. + add_filter( + "wpforms_fields_get_field_object_{$this->type}", + function () { + return $this; + } + ); + + // Field data. + add_filter( 'wpforms_field_new_default', [ $this, 'field_new_default' ] ); + + // Field data. + add_filter( 'wpforms_field_data', [ $this, 'field_data' ], 10, 2 ); + + // Add fields tab. + add_filter( 'wpforms_builder_fields_buttons', [ $this, 'field_button' ], 15 ); + + // Add field keywords to the template fields. + add_filter( 'wpforms_setup_template_fields', [ $this, 'enhance_template_fields_with_keywords' ] ); + + // Field options tab. + add_action( "wpforms_builder_fields_options_{$this->type}", [ $this, 'field_options' ] ); + + // Preview fields. + add_action( "wpforms_builder_fields_previews_{$this->type}", [ $this, 'field_preview' ] ); + + // AJAX Add new field. + add_action( "wp_ajax_wpforms_new_field_{$this->type}", [ $this, 'field_new' ] ); + + // Display field input elements on the front-end. + add_action( "wpforms_display_field_{$this->type}", [ $this, 'field_display_proxy' ], 10, 3 ); + + // Display field on the back-end. + add_filter( "wpforms_pro_admin_entries_edit_is_field_displayable_{$this->type}", '__return_true', 9 ); + + // Validation on submitting. + add_action( "wpforms_process_validate_{$this->type}", [ $this, 'validate' ], 10, 3 ); + + // Format. + add_action( "wpforms_process_format_{$this->type}", [ $this, 'format' ], 10, 3 ); + + // Prefill. + add_filter( 'wpforms_field_properties', [ $this, 'field_prefill_value_property' ], 10, 3 ); + + // Change the choice's value while saving entries. + add_filter( 'wpforms_process_before_form_data', [ $this, 'field_fill_empty_choices' ] ); + + // Change the field name for ajax error. + add_filter( 'wpforms_process_ajax_error_field_name', [ $this, 'ajax_error_field_name' ], 10, 4 ); + + // Add HTML line breaks before all newlines in Entry Preview. + add_filter( "wpforms_pro_fields_entry_preview_get_field_value_{$this->type}_field_after", 'nl2br', 100 ); + + // Add allowed HTML tags for the field label. + add_filter( 'wpforms_builder_strings', [ $this, 'add_allowed_label_html_tags' ] ); + + // Exclude empty dynamic choices from Entry Preview. + add_filter( 'wpforms_pro_fields_entry_preview_print_entry_preview_exclude_field', [ $this, 'exclude_empty_dynamic_choices' ], 10, 3 ); + + // Add classes to the builder field preview. + add_filter( 'wpforms_field_preview_class', [ $this, 'preview_field_class' ], 10, 2 ); + } + + /** + * All systems go. Used by subclasses. Required. + * + * @since 1.0.0 + * @since 1.5.0 Converted to abstract method, as it's required for all fields. + */ + abstract public function init(); + + /** + * Prefill the field value with either fallback or dynamic data. + * This needs to be public (although internal) to be used in WordPress hooks. + * + * @since 1.5.0 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * @param array $form_data Prepared form data/settings. + * + * @return array Modified field properties. + */ + public function field_prefill_value_property( $properties, $field, $form_data ) { + + // Process only for the current field. + if ( $this->type !== $field['type'] ) { + return $properties; + } + + // Set the form data, so we can reuse it later, even on the front-end. + $this->form_data = $form_data; + + // Dynamic data. + if ( ! empty( $this->form_data['settings']['dynamic_population'] ) ) { + $properties = $this->field_prefill_value_property_dynamic( $properties, $field ); + } + + // Fallback data rewrites the dynamic because user-submitted data is more important. + return $this->field_prefill_value_property_fallback( $properties, $field ); + } + + /** + * As we are processing user submitted data - ignore all admin-defined defaults. + * Preprocess choice-related fields only. + * + * @since 1.5.0 + * + * @param array $field Field data and settings. + * @param array $properties Properties we are modifying. + */ + public function field_prefill_remove_choices_defaults( $field, &$properties ): void { + + // Skip this step on the admin page. + if ( is_admin() && ! wpforms_is_admin_page( 'entries', 'edit' ) ) { + return; + } + + if ( + ! empty( $field['dynamic_choices'] ) || + ! empty( $field['choices'] ) + ) { + array_walk_recursive( + $properties['inputs'], + static function ( &$value, $key ) { + + if ( $key === 'default' ) { + $value = false; + } + if ( $value === 'wpforms-selected' ) { + $value = ''; + } + } + ); + } + } + + /** + * Whether the current field can be populated dynamically. + * + * @since 1.5.0 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_dynamic_population_allowed( $properties, $field ) { + + $allowed = true; + + // Allow the population on the front-end only. + if ( is_admin() ) { + $allowed = false; + } + + // For dynamic population we require $_GET. + if ( empty( $_GET ) ) { // phpcs:ignore + $allowed = false; + } + + /** + * Filters whether the current field can be populated dynamically. + * + * @since 1.5.0 + * + * @param bool $allowed Whether the current field can be populated dynamically. + * @param array $properties Field properties. + * @param array $field Field data. + */ + return (bool) apply_filters( 'wpforms_field_is_dynamic_population_allowed', $allowed, $properties, $field ); + } + + /** + * Prefill the field value with a dynamic value that we get from $_GET. + * The pattern is: wpf4_12_primary, where: + * 4 - form_id, + * 12 - field_id, + * first - input key. + * As 'primary' is our default input key, "wpf4_12_primary" and "wpf4_12" are the same. + * + * @since 1.5.0 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function field_prefill_value_property_dynamic( $properties, $field ) { + + if ( ! $this->is_dynamic_population_allowed( $properties, $field ) ) { + return $properties; + } + + // Iterate over each GET key, parse, and scrap data from there. + foreach ( $_GET as $key => $raw_value ) { // phpcs:ignore + preg_match( '/wpf(\d+)_(\d+)(.*)/i', $key, $matches ); + + if ( empty( $matches ) || ! is_array( $matches ) ) { + continue; + } + + // Required. + $form_id = absint( $matches[1] ); + $field_id = absint( $matches[2] ); + $input = 'primary'; + + // Optional. + if ( ! empty( $matches[3] ) ) { + $input = sanitize_key( trim( $matches[3], '_' ) ); + } + + // Both form and field IDs should be the same as the current form / field. + if ( + (int) $this->form_data['id'] !== $form_id || + (int) $field['id'] !== $field_id + ) { + // Go to the next GET param. + continue; + } + + if ( ! empty( $raw_value ) ) { + $this->field_prefill_remove_choices_defaults( $field, $properties ); + + if ( + is_string( $raw_value ) && + in_array( + $field['type'], + wpforms_get_multi_fields(), + true + ) + ) { + $raw_value = explode( '|', rawurldecode( $raw_value ) ); + } + } + + /* + * Some fields (like checkboxes) support multiple selection. + * We do not support nested values, so omit them. + * Example: ?wpf771_19_wpforms[fields][19][address1]=test + * In this case: + * $input = wpforms + * $raw_value = [fields=>[]] + * $single_value = [19=>[]] + * There is no reliable way to clean those things out. + * So we will ignore the value altogether if it's an array. + * We support only single value numeric arrays, like these: + * ?wpf771_19[]=test1&wpf771_19[]=test2 + * ?wpf771_19_value[]=test1&wpf771_19_value[]=test2 + * ?wpf771_41_r3_c2[]=1&wpf771_41_r1_c4[]=1 + * We support also pipe-separated values like this: + * ?wpf771_19=test1|test2 + */ + if ( is_array( $raw_value ) ) { + foreach ( $raw_value as $single_value ) { + $properties = $this->get_field_populated_single_property_value( $single_value, $input, $properties, $field ); + } + } else { + $properties = $this->get_field_populated_single_property_value( $raw_value, $input, $properties, $field ); + } + } + + return $properties; + } + + /** + * Public version of get_field_populated_single_property_value() to use by external classes. + * + * @since 1.6.0.1 + * + * @param string $raw_value Value from a GET param, always a string. + * @param string $input Represent a subfield inside the field. Maybe empty. + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + public function get_field_populated_single_property_value_public( $raw_value, $input, $properties, $field ) { + + return $this->get_field_populated_single_property_value( $raw_value, $input, $properties, $field ); + } + + /** + * Get the value used to prefill via dynamic or fallback population. + * Based on field data and current properties. + * + * @since 1.5.0 + * + * @param string $raw_value Value from a GET param, always a string. + * @param string $input Represent a subfield inside the field. Maybe empty. + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function get_field_populated_single_property_value( $raw_value, $input, $properties, $field ) { + + if ( ! is_string( $raw_value ) ) { + return $properties; + } + + $get_value = stripslashes( sanitize_text_field( $raw_value ) ); + + // For fields that have dynamic choices, we need to add extra logic. + if ( ! empty( $field['dynamic_choices'] ) ) { + $properties = $this->get_field_populated_single_property_value_dynamic_choices( $get_value, $properties ); + } elseif ( ! empty( $field['choices'] ) && is_array( $field['choices'] ) ) { + $properties = $this->get_field_populated_single_property_value_normal_choices( $get_value, $properties, $field ); + + } elseif ( + /** + * For other types of fields, we need to check that + * the key is registered for the defined field in an input array. + */ + ! empty( $input ) && + isset( $properties['inputs'][ $input ] ) + ) { + $properties['inputs'][ $input ]['attr']['value'] = $get_value; + } + + return $properties; + } + + /** + * Get the value used to prefill via dynamic or fallback population. + * Based on field data and current properties. + * Dynamic choices section. + * + * @since 1.6.0 + * + * @param string $get_value Value from a GET param, always a string, sanitized, stripped slashes. + * @param array $properties Field properties. + * + * @return array Modified field properties. + */ + protected function get_field_populated_single_property_value_dynamic_choices( $get_value, $properties ) { + + $default_key = null; + + foreach ( $properties['inputs'] as $input_key => $input_arr ) { + // Dynamic choices support only integers in its values. + if ( absint( $get_value ) === $input_arr['attr']['value'] ) { + $default_key = $input_key; + // Stop iterating over choices. + break; + } + } + + // Redefine default choice only if dynamic value has changed anything. + if ( $default_key !== null ) { + foreach ( $properties['inputs'] as $input_key => $choice_arr ) { + if ( $input_key === $default_key ) { + $properties['inputs'][ $input_key ]['default'] = true; + $properties['inputs'][ $input_key ]['container']['class'][] = 'wpforms-selected'; + // Stop iterating over choices. + break; + } + } + } + + return $properties; + } + + /** + * Fill choices without labels. + * + * @since 1.6.2 + * + * @param array $form_data Form data. + * + * @return array + */ + public function field_fill_empty_choices( $form_data ) { + + if ( empty( $form_data['fields'] ) ) { + return $form_data; + } + + // Set value for choices with the image only. Conditional logic doesn't work without value. + foreach ( $form_data['fields'] as $field_key => $field ) { + // Payment fields have their labels set up upfront. + if ( empty( $field['choices'] ) || ! in_array( $field['type'], [ 'radio', 'checkbox' ], true ) ) { + continue; + } + + foreach ( $field['choices'] as $choice_id => $choice ) { + if ( ( isset( $choice['value'] ) && '' !== trim( $choice['value'] ) ) || empty( $choice['image'] ) ) { + continue; + } + + $form_data['fields'][ $field_key ]['choices'][ $choice_id ]['value'] = sprintf( /* translators: %d - choice number. */ + esc_html__( 'Choice %d', 'wpforms-lite' ), + (int) $choice_id + ); + } + } + + return $form_data; + } + + /** + * Get the value used to prefill via dynamic or fallback population. + * Based on field data and current properties. + * Normal choices section. + * + * @since 1.6.0 + * + * @param string $get_value Value from a GET param, always a string, sanitized. + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function get_field_populated_single_property_value_normal_choices( $get_value, $properties, $field ) { + + $default_key = null; + + // For fields that have normal choices, we need to add extra logic. + foreach ( $field['choices'] as $choice_key => $choice_arr ) { + $choice_value_key = isset( $field['show_values'] ) ? 'value' : 'label'; + + if ( + ( + isset( $choice_arr[ $choice_value_key ] ) && + strtoupper( sanitize_text_field( $choice_arr[ $choice_value_key ] ) ) === strtoupper( $get_value ) + ) || + ( + empty( $choice_arr[ $choice_value_key ] ) && + $get_value === sprintf( /* translators: %d - choice number. */ + esc_html__( 'Choice %d', 'wpforms-lite' ), + (int) $choice_key + ) + ) + ) { + $default_key = $choice_key; + // Stop iterating over choices. + break; + } + } + + // Redefine the default choice only if population value has changed anything. + if ( $default_key === null ) { + return $properties; + } + + foreach ( $field['choices'] as $choice_key => $choice_arr ) { + if ( $choice_key === $default_key ) { + $properties['inputs'][ $choice_key ]['default'] = true; + $properties['inputs'][ $choice_key ]['container']['class'][] = 'wpforms-selected'; + + $properties = $this->add_quantity_to_populated_field_properties( $properties, $field ); + + break; + } + } + + return $properties; + } + + /** + * Handle the dropdown items field with quantities. + * + * @since 1.9.0 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array + */ + private function add_quantity_to_populated_field_properties( array $properties, array $field ): array { + + if ( + empty( $this->form_data['id'] ) || + empty( $field['id'] ) || + empty( $field['type'] ) || + empty( $field['enable_quantity'] ) || + $field['type'] !== 'payment-select' + ) { + return $properties; + } + + $quantity_key = 'wpq' . $this->form_data['id'] . '_' . $field['id']; + + // phpcs:disable WordPress.Security.NonceVerification + if ( empty( $_GET[ $quantity_key ] ) ) { + return $properties; + } + + $quantity = absint( $_GET[ $quantity_key ] ); + // phpcs:enable WordPress.Security.NonceVerification + + if ( $quantity > ( $field['max_quantity'] ?? 10 ) || $quantity < ( $field['min_quantity'] ?? 0 ) ) { + return $properties; + } + + $properties['quantity'] = $quantity; + + return $properties; + } + + /** + * Whether the current field can be populated dynamically. + * + * @since 1.5.0 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_fallback_population_allowed( $properties, $field ) { + + $allowed = true; + + // Allow the population on the front-end only. + if ( is_admin() ) { + $allowed = false; + } + + /* + * Commented out to allow partial failing for complex multi-inputs fields. + * Example: name field with first/last format and being required, filled out only first. + * On submitting, we will preserve those sub-inputs that are not empty and display an error for an empty. + */ + + // Do not populate if there are errors for that field. + + // Require form id being the same for submitted and currently rendered form. + if ( + ! empty( $_POST['wpforms']['id'] ) && // phpcs:ignore + (int) $_POST['wpforms']['id'] !== (int) $this->form_data['id'] // phpcs:ignore + ) { + $allowed = false; + } + + // Require $_POST of the submitted field. + if ( empty( $_POST['wpforms']['fields'] ) ) { // phpcs:ignore + $allowed = false; + } + + // Require field (processed and rendered) being the same. + if ( ! isset( $_POST['wpforms']['fields'][ $field['id'] ] ) ) { // phpcs:ignore + $allowed = false; + } + + /** + * Filters whether the current field can be populated using a fallback. + * + * @since 1.5.0 + * + * @param bool $allowed Whether the current field can be populated using a fallback. + * @param array $properties Field properties. + * @param array $field Field data. + */ + return (bool) apply_filters( 'wpforms_field_is_fallback_population_allowed', $allowed, $properties, $field ); + } + + /** + * Prefill the field value with a fallback value from form submission (in case of JS validation failed), that we get from $_POST. + * + * @since 1.5.0 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function field_prefill_value_property_fallback( $properties, $field ) { + + if ( ! $this->is_fallback_population_allowed( $properties, $field ) ) { + return $properties; + } + + if ( empty( $_POST['wpforms']['fields'] ) || ! is_array( $_POST['wpforms']['fields'] ) ) { // phpcs:ignore + return $properties; + } + + // We got user submitted raw data (not processed, will be done later). + $raw_value = $_POST['wpforms']['fields'][ $field['id'] ]; // phpcs:ignore + $input = 'primary'; + + if ( ! empty( $raw_value ) ) { + $this->field_prefill_remove_choices_defaults( $field, $properties ); + } + + /* + * For this particular field, this value may be either an array or a string. + * In array - this is a complex field, like address. + * The key in an array will be a sub-input (address1, state), and its appropriate value. + */ + if ( is_array( $raw_value ) ) { + foreach ( $raw_value as $input => $single_value ) { + $properties = $this->get_field_populated_single_property_value( $single_value, sanitize_key( $input ), $properties, $field ); + } + } else { + $properties = $this->get_field_populated_single_property_value( $raw_value, sanitize_key( $input ), $properties, $field ); + } + + return $properties; + } + + /** + * Init and return field default settings. + * + * @since 1.9.4 + * + * @return array + */ + public function field_default_settings(): array { + + // Merge common defaults with the current field defaults. + $this->default_settings = wp_parse_args( (array) ( $this->default_settings ?? [] ), self::COMMON_DEFAULT_SETTINGS ); + + return $this->default_settings; + } + + /** + * Get field data for the field. + * + * @since 1.8.2 + * + * @param array $field Current field. + * + * @return array + */ + public function field_new_default( $field ): array { + + if ( ! isset( $field['type'] ) || $field['type'] !== $this->type ) { + return $field; + } + + return wp_parse_args( $field, $this->field_default_settings() ); + } + + /** + * Get field data for the field. + * + * @since 1.8.2 + * + * @param array $field Current field. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_data( $field, $form_data ) { + + if ( ! isset( $field['type'] ) || $field['type'] !== $this->type ) { + return $field; + } + + // Remove field on frontend if it has no dynamic choices. + if ( $this->is_dynamic_choices_empty( $field, $form_data ) ) { + return []; + } + + return wp_parse_args( $field, $this->default_settings ); + } + + /** + * Create the button for the 'Add Fields' tab, inside the form editor. + * + * @since 1.0.0 + * + * @param array $fields List of form fields with their data. + * + * @return array + */ + public function field_button( $fields ) { + + // If the field is a Pro field and the plugin is not a Pro, don't show the field. + if ( ! empty( $this->is_disabled_field ) ) { + return $fields; + } + + // Add field information to a fields' array. + $fields[ $this->group ]['fields'][] = [ + 'order' => $this->order, + 'name' => $this->name, + 'type' => $this->type, + 'icon' => $this->icon, + 'keywords' => $this->keywords, + ]; + + // Wipe hands clean. + return $fields; + } + + /** + * Enhances template fields by adding keywords. + * + * @since 1.8.6 + * + * @param array $template_fields List of template fields. + * + * @return array + */ + public function enhance_template_fields_with_keywords( array $template_fields ): array { + + foreach ( $template_fields as $key => $field ) { + if ( $field === $this->type ) { + $template_fields[ $key ] = $this->name; + + $this->add_keywords( $template_fields ); + } + } + + return array_unique( $template_fields ); + } + + /** + * Adds keywords to the provided fields. + * + * @since 1.8.6 + * + * @param array $fields List of fields to which keywords will be added. + * + * @return void + */ + private function add_keywords( array &$fields ): void { + + if ( $this->keywords ) { + $keywords_list = explode( ',', $this->keywords ); + + foreach ( $keywords_list as $keyword ) { + $fields[] = trim( $keyword ); + } + } + } + + /** + * Create the field options panel. Used by subclasses. + * + * @since 1.0.0 + * @since 1.5.0 Converted to abstract method, as it's required for all fields. + * + * @param array $field Field data and settings. + */ + abstract public function field_options( $field ); + + /** + * Create the field preview. Used by subclasses. + * + * @since 1.0.0 + * @since 1.5.0 Converted to abstract method, as it's required for all fields. + * + * @param array $field Field data and settings. + */ + abstract public function field_preview( $field ); + + /** + * Helper function to create field option elements. + * + * Field option elements are pieces that help create a field option. + * They are used to quickly build field options. + * + * @since 1.0.0 + * + * @param string $option Field option to render. + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $do_echo Print or return the value. Print by default. + * + * @return string|null echo or return string + * @noinspection HtmlUnknownAttribute + * @noinspection HtmlWrongAttributeValue + */ + public function field_element( $option, $field, $args = [], $do_echo = true ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded + + $id = (int) $field['id']; + $class = ! empty( $args['class'] ) ? wpforms_sanitize_classes( (array) $args['class'], true ) : ''; + $slug = ! empty( $args['slug'] ) ? sanitize_title( $args['slug'] ) : ''; + $attrs = ''; + $output = ''; + + // Check for Smart Tags. + if ( ! empty( $args['smarttags'] ) ) { + $type = ! empty( $args['smarttags']['type'] ) ? esc_attr( $args['smarttags']['type'] ) : 'fields'; + $fields = ! empty( $args['smarttags']['fields'] ) ? esc_attr( $args['smarttags']['fields'] ) : ''; + $is_repeater_allowed = ! empty( $args['smarttags']['allow-repeated-fields'] ) ? esc_attr( $args['smarttags']['allow-repeated-fields'] ) : ''; + $allowed_smarttags = ! empty( $args['smarttags']['allowed'] ) ? esc_attr( $args['smarttags']['allowed'] ) : ''; + $location = ! empty( $args['location'] ) ? esc_attr( $args['location'] ) : ''; + + $args['data'] = [ + 'location' => $location, + 'type' => $type, + 'fields' => $fields, + 'allowed-smarttags' => $allowed_smarttags, + 'allow-repeated-fields' => $is_repeater_allowed, + ]; + } + + if ( ! empty( $args['data'] ) ) { + foreach ( $args['data'] as $arg_key => $val ) { + if ( is_array( $val ) ) { + $val = wp_json_encode( $val ); + } + $attrs .= ' data-' . $arg_key . '=\'' . $val . '\''; + } + } + + if ( ! empty( $args['attrs'] ) ) { + foreach ( $args['attrs'] as $arg_key => $val ) { + if ( is_array( $val ) ) { + $val = wp_json_encode( $val ); + } + $attrs .= $arg_key . '=\'' . $val . '\''; + } + } + + switch ( $option ) { + // Row. + case 'row': + $output = sprintf( + '
              %s
              ', + $slug, + $class, + $id, + $slug, + $id, + $attrs, + $args['content'] + ); + break; + + // Label. + case 'label': + $class = ! empty( $class ) ? ' class="' . $class . '"' : ''; + $output = sprintf( ''; + break; + + // Text input. + case 'text': + $type = ! empty( $args['type'] ) ? esc_attr( $args['type'] ) : 'text'; + $placeholder = ! empty( $args['placeholder'] ) ? esc_attr( $args['placeholder'] ) : ''; + $before = ! empty( $args['before'] ) ? '' . esc_html( $args['before'] ) . '' : ''; + $after = ! empty( $args['after'] ) ? '' . esc_html( $args['after'] ) . '' : ''; + + if ( ! empty( $before ) ) { + $class .= ' has-before'; + } + + if ( ! empty( $after ) ) { + $class .= ' has-after'; + } + + $output = sprintf( '%s%s', $before, $type, $class, $id, $slug, $id, $slug, esc_attr( $args['value'] ), $placeholder, $attrs, $after ); + break; + + // Textarea. + case 'textarea': + $rows = ! empty( $args['rows'] ) ? (int) $args['rows'] : '3'; + $before = ! empty( $args['before'] ) ? '' . esc_html( $args['before'] ) . '' : ''; + $after = ! empty( $args['after'] ) ? '' . esc_html( $args['after'] ) . '' : ''; + + $output = sprintf( '%s%s', $before, $class, $id, $slug, $id, $slug, $rows, $attrs, $args['value'], $after ); + break; + + // Checkbox. + case 'checkbox': + $checked = checked( '1', $args['value'], false ); + $output = sprintf( '', $class, $id, $slug, $id, $slug, $checked, $attrs ); + $output .= empty( $args['nodesc'] ) ? sprintf( '' : ''; + break; + + // Toggle. + case 'toggle': + $output = $this->field_element_toggle( $args, $class, $id, $slug, $attrs ); + break; + + // Select. + case 'select': + $output = $this->field_element_select( $args, $class, $id, $slug, $attrs ); + break; + + case 'select-multiple': + $options = $args['options']; + $selected = (array) ( $args['value'] ?? [] ); + $choicesjs = $args['choicesjs'] ?? 'choicesjs-select'; // Initialize the class for Choices.js by default. + + $output = sprintf( ''; + $output .= sprintf( '', $id, $slug, esc_attr( empty( $selected ) ? '' : wp_json_encode( $selected ) ) ); + $output .= ! empty( $args['desc'] ) ? sprintf( '%s', $args['desc'] ) : ''; + break; + + // Color. + case 'color': + $args['class'][] = 'wpforms-color-picker'; + + $output = $this->field_element( 'text', $field, $args, $do_echo ); + break; + + // Button. + case 'button': + $class .= ' wpforms-btn'; + $output = sprintf( + '', + $class, + $id, + $slug, + $attrs, + $args['value'] + ); + break; + } + + if ( ! $do_echo ) { + return $output; + } + + // @todo Ideally, we should late-escape here. All data above seems to be escaped or trusted, but we should consider refactoring this method. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $output; + + return null; + } + + /** + * Create field option toggle element. + * + * @since 1.6.8 + * + * @param array $args Arguments. + * @param string $class_name Class name. + * @param int $id Field ID. + * @param string $slug Field slug. + * @param string $attrs Attributes. + * + * @return string + */ + private function field_element_toggle( array $args, string $class_name, int $id, string $slug, string $attrs ): string { + + $input_id = sprintf( + 'wpforms-field-option-%d-%s', + esc_attr( $id ), + esc_attr( $slug ) + ); + + $field_name = sprintf( + 'fields[%d][%s]', + esc_attr( $id ), + esc_attr( $slug ) + ); + + $label = ! empty( $args['desc'] ) ? $args['desc'] : ''; + $value = ! empty( $args['value'] ) ? $args['value'] : ''; + + // Compatibility with the `checkbox` element. + $args['label-hide'] = ! empty( $args['nodesc'] ) ? $args['nodesc'] : false; + $args['input-class'] = $class_name; + + return wpforms_panel_field_toggle_control( $args, $input_id, $field_name, $label, $value, $attrs ); + } + + /** + * Create field option select element. + * + * @since 1.9.8 + * + * @param array $args Arguments. + * @param string $class_name Class name. + * @param int $id Field ID. + * @param string $slug Field slug. + * @param string $attrs Attributes. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ + protected function field_element_select( array $args, string $class_name, int $id, string $slug, string $attrs ): string { + + $options = $args['options']; + $value = $args['value'] ?? ''; + $output = sprintf( + ''; + + return $output; + } + + /** + * Helper function to create common field options that are used frequently. + * + * @since 1.0.0 + * + * @param string $option Field option to render. + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $do_echo Print or return the value. Print by default. + * + * @return string|null echo or return string + * @noinspection HtmlUnknownAttribute + * @noinspection HtmlUnknownTarget + * @noinspection HtmlWrongAttributeValue + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection + * @noinspection HtmlRequiredAltAttribute + */ + public function field_option( $option, $field, $args = [], $do_echo = true ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded, Generic.Metrics.NestingLevel.MaxExceeded + + $output = ''; + $markup = ''; + + switch ( $option ) { + /** + * Basic Fields. + * + * Basic Options markup. + */ + case 'basic-options': + $markup = ! empty( $args['markup'] ) ? $args['markup'] : 'open'; + + if ( $markup === 'open' ) { + $class = ! empty( $args['class'] ) ? esc_html( $args['class'] ) : ''; + $after_name = ! empty( $args['after_title'] ) ? $args['after_title'] : ''; + + $output = sprintf( + '
              %3$s (ID #%1$d)
              %5$s +
              + %2$s +
              + ', + wpforms_validate_field_id( $field['id'] ), + esc_html__( 'General', 'wpforms-lite' ), + esc_html( $this->name ), + esc_attr( $class ), + $after_name + ); + + } else { + $output = '
              '; + } + break; + + /* + * Field Label. + */ + case 'label': + $value = ! empty( $field['label'] ) ? esc_html( $field['label'] ) : ''; + $tooltip = ! empty( $args['tooltip'] ) ? $args['tooltip'] : esc_html__( 'Enter text for the form field label. Field labels are recommended and can be hidden in the Advanced Settings.', 'wpforms-lite' ); + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'label', + 'value' => esc_html__( 'Label', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'label', + 'value' => $value, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'label', + 'content' => $output, + ], + false + ); + break; + + /* + * Field Description. + */ + case 'description': + $value = ! empty( $field['description'] ) ? esc_html( $field['description'] ) : ''; + $tooltip = esc_html__( 'Enter text for the form field description.', 'wpforms-lite' ); + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'description', + 'value' => esc_html__( 'Description', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'textarea', + $field, + [ + 'slug' => 'description', + 'value' => $value, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'description', + 'content' => $output, + ], + false + ); + break; + + /* + * Field Required toggle. + */ + case 'required': + $default = ! empty( $args['default'] ) ? $args['default'] : '0'; + $value = isset( $field['required'] ) ? esc_attr( $field['required'] ) : esc_attr( $default ); + $tooltip = esc_html__( 'Check this option to mark the field required. A form will not submit unless all required fields are provided.', 'wpforms-lite' ); + + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'required', + 'value' => $value, + 'desc' => esc_html__( 'Required', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'required', + 'content' => $output, + ], + false + ); + break; + + /* + * Field Meta (field type and ID). + */ + case 'meta': + _deprecated_argument( __CLASS__ . '::' . __METHOD__ . '( [ \'slug\' => \'meta\' ] )', '1.7.1 of the WPForms plugin' ); + + $output = sprintf( '', esc_html__( 'Type', 'wpforms-lite' ) ); + + $output .= sprintf( + '

              %s (ID #%s)

              ', + esc_attr( $this->name ), + wpforms_validate_field_id( $field['id'] ) + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'meta', + 'content' => $output, + ], + false + ); + break; + + /* + * Code Block. + */ + case 'code': + $value = ! empty( $field['code'] ) ? esc_textarea( $field['code'] ) : ''; + $tooltip = esc_html__( 'Enter code for the form field.', 'wpforms-lite' ); + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'code', + 'value' => esc_html__( 'Code', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'textarea', + $field, + [ + 'slug' => 'code', + 'value' => $value, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'code', + 'content' => $output, + ], + false + ); + break; + + /* + * Choices. + */ + case 'choices': + $values = ! empty( $field['choices'] ) ? $field['choices'] : $this->defaults; + $label = ! empty( $args['label'] ) ? esc_html( $args['label'] ) : esc_html__( 'Choices', 'wpforms-lite' ); + $class = []; + $field_type = $this->type; + $inline_style = ''; + + if ( ! empty( $field['multiple'] ) ) { + $field_type = 'checkbox'; + } + + if ( ! AIHelpers::is_disabled() ) { + $class[] = 'wpforms-ai-choices'; + } + + if ( ! empty( $field['show_values'] ) ) { + $class[] = 'show-values'; + } + + if ( ! empty( $field['dynamic_choices'] ) ) { + $class[] = 'wpforms-hidden'; + } + + if ( ! empty( $field['choices_images'] ) ) { + $class[] = 'show-images'; + } + + if ( ! empty( $field['choices_icons'] ) ) { + $class[] = 'show-icons'; + $icon_color = isset( $field['choices_icons_color'] ) ? wpforms_sanitize_hex_color( $field['choices_icons_color'] ) : ''; + $icon_color = empty( $icon_color ) ? IconChoices::get_default_color() : $icon_color; + $inline_style = "--wpforms-icon-choices-color: {$icon_color};"; + } + + $after_tooltip_classes = [ + 'toggle-bulk-add-display', + 'toggle-unfoldable-cont', + empty( $field['dynamic_choices'] ) ? '' : 'wpforms-hidden', + ]; + + // Field label. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'choices', + 'value' => $label, + 'tooltip' => esc_html__( 'Add choices for the form field.', 'wpforms-lite' ), + 'tooltip_class' => empty( $field['dynamic_choices'] ) ? '' : 'wpforms-hidden', + 'after_tooltip' => sprintf( + '' . esc_html__( 'Bulk Add', 'wpforms-lite' ) . '', + wpforms_sanitize_classes( $after_tooltip_classes, true ) + ), + ], + false + ); + + // Field contents. + $fld = sprintf( + '
                ', + max( array_keys( $values ) ) + 1, + wpforms_sanitize_classes( $class, true ), + wpforms_validate_field_id( $field['id'] ), + esc_attr( $this->type ), + esc_attr( $inline_style ) + ); + + foreach ( $values as $key => $value ) { + $default = ! empty( $value['default'] ) ? $value['default'] : ''; + $base = sprintf( 'fields[%s][choices][%d]', wpforms_validate_field_id( $field['id'] ), absint( $key ) ); + $label = $value['label'] ?? ''; + $image = ! empty( $value['image'] ) ? $value['image'] : ''; + $hide_image_btn = false; + $icon = isset( $value['icon'] ) && ! wpforms_is_empty_string( $value['icon'] ) ? $value['icon'] : IconChoices::DEFAULT_ICON; + $icon_style = ! empty( $value['icon_style'] ) ? $value['icon_style'] : IconChoices::DEFAULT_ICON_STYLE; + $is_other_option = ! empty( $value['other'] ); + + $not_draggable = $is_other_option ? 'not-draggable wpforms-choice-other-option' : ''; + + $fld .= '
              • '; + + $add_class = $is_other_option ? 'add wpforms-disabled' : 'add'; + $remove_class = $is_other_option ? 'remove wpforms-disabled' : 'remove'; + $move_class = $is_other_option ? 'move wpforms-disabled' : 'move'; + + $fld .= sprintf( + '', + $field_type === 'checkbox' ? 'checkbox' : 'radio', + esc_attr( $base ), + checked( '1', $default, false ) + ); + + $fld .= sprintf( '', esc_attr( $move_class ) ); + + /** + * Fires before the field choice label. + * + * @since 1.9.8.6 + * + * @param string $output Output string. + * @param int $key Choice key. + * @param array $value Choice value. + * @param array $field Field settings. + * @param array $args Field options. + */ + $fld .= (string) apply_filters( 'wpforms_field_option_choice_before_label', '', $key, $value, $field, $args ); + + $fld .= sprintf( + '', + esc_attr( $base ), + esc_attr( $label ) + ); + + /** + * Fires after the field choice label. + * + * @since 1.9.8.6 + * + * @param string $output Output string. + * @param int $key Choice key. + * @param array $value Choice value. + * @param array $field Field settings. + * @param array $args Field options. + */ + $fld .= (string) apply_filters( 'wpforms_field_option_choice_after_label', '', $key, $value, $field, $args ); + + $fld .= sprintf( '', esc_attr( $add_class ), esc_attr( $remove_class ) ); + $fld .= sprintf( + '', + esc_attr( $base ), + esc_attr( $value['value'] ?? '' ) + ); + $fld .= '
                '; + $fld .= '
                '; + + if ( ! empty( $image ) ) { + $fld .= sprintf( + '', + esc_url_raw( $image ), + esc_attr__( 'Remove Image', 'wpforms-lite' ) + ); + + $hide_image_btn = true; + } + + $fld .= '
                '; + $fld .= sprintf( + '', + $hide_image_btn ? ' style="display:none;"' : '', + esc_html__( 'Upload Image', 'wpforms-lite' ) + ); + $fld .= sprintf( + '', + esc_attr( $base ), + esc_url_raw( $image ) + ); + $fld .= '
                '; + + $fld .= sprintf( + '
                + + %2$s + + + +
                ', + esc_attr( $icon_style ), + esc_attr( $icon ), + esc_attr( $base ) + ); + + if ( $is_other_option ) { + $fld .= sprintf( '', esc_attr( $base ) ); + } + + $fld .= '
              • '; + } + $fld .= '
              '; + + // Field note: dynamic status. + $source = ''; + $type = ''; + $dynamic = ! empty( $field['dynamic_choices'] ) ? esc_html( $field['dynamic_choices'] ) : ''; + + if ( $dynamic === 'post_type' && ! empty( $field[ 'dynamic_' . $dynamic ] ) ) { + $type = esc_html__( 'post type', 'wpforms-lite' ); + $pt = get_post_type_object( $field[ 'dynamic_' . $dynamic ] ); + + if ( $pt !== null ) { + $source = $pt->labels->name; + } + } elseif ( $dynamic === 'taxonomy' && ! empty( $field[ 'dynamic_' . $dynamic ] ) ) { + $type = esc_html__( 'taxonomy', 'wpforms-lite' ); + $tax = get_taxonomy( $field[ 'dynamic_' . $dynamic ] ); + + if ( $tax !== false ) { + $source = $tax->labels->name; + } + } + + $note = sprintf( + '
              ', + ! empty( $dynamic ) && ! empty( $field[ 'dynamic_' . $dynamic ] ) ? '' : 'wpforms-hidden' + ); + + $note .= '

              ' . esc_html__( 'Dynamic Choices Active', 'wpforms-lite' ) . '

              '; + + $note .= sprintf( + /* translators: %1$s - source name, %2$s - type name. */ + '

              ' . esc_html__( 'Choices are dynamically populated from the %1$s %2$s. Go to the Advanced tab to change this.', 'wpforms-lite' ) . '

              ', + '' . esc_html( $source ) . '', + '' . esc_html( $type ) . '' + ); + $note .= '
              '; + + // Final field output. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices', + 'content' => $lbl . $fld . $note, + ], + false + ); + break; + + /* + * Choices for payments. + */ + case 'choices_payments': + $values = ! empty( $field['choices'] ) ? $field['choices'] : $this->defaults; + $class = []; + $input_type = in_array( $field['type'], [ 'payment-multiple', 'payment-select' ], true ) ? 'radio' : 'checkbox'; + $inline_style = ''; + + if ( ! empty( $field['choices_images'] ) ) { + $class[] = 'show-images'; + } + + if ( ! empty( $field['choices_icons'] ) ) { + $class[] = 'show-icons'; + $icon_color = isset( $field['choices_icons_color'] ) ? wpforms_sanitize_hex_color( $field['choices_icons_color'] ) : ''; + $icon_color = empty( $icon_color ) ? IconChoices::get_default_color() : $icon_color; + $inline_style = "--wpforms-icon-choices-color: {$icon_color};"; + } + + // Field label. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'choices', + 'value' => esc_html__( 'Items', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Add choices for the form field.', 'wpforms-lite' ), + ], + false + ); + + // Field contents. + $fld = sprintf( + '
                ', + max( array_keys( $values ) ) + 1, + wpforms_sanitize_classes( $class, true ), + wpforms_validate_field_id( $field['id'] ), + esc_attr( $this->type ), + esc_attr( $inline_style ) + ); + + foreach ( $values as $key => $value ) { + $default = ! empty( $value['default'] ) ? $value['default'] : ''; + $base = sprintf( 'fields[%s][choices][%d]', wpforms_validate_field_id( $field['id'] ), absint( $key ) ); + $image = ! empty( $value['image'] ) ? $value['image'] : ''; + $hide_image_btn = false; + $icon = isset( $value['icon'] ) && ! wpforms_is_empty_string( $value['icon'] ) ? $value['icon'] : IconChoices::DEFAULT_ICON; + $icon_style = ! empty( $value['icon_style'] ) ? $value['icon_style'] : IconChoices::DEFAULT_ICON_STYLE; + + $fld .= '
              • '; + $fld .= sprintf( + '', + esc_attr( $input_type ), + esc_attr( $base ), + checked( '1', $default, false ) + ); + $fld .= ''; + $fld .= sprintf( + '', + esc_attr( $base ), + esc_attr( $value['label'] ) + ); + + $fld .= sprintf( + '', + esc_attr( $base ), + esc_attr( wpforms_format_amount( wpforms_sanitize_amount( $value['value'] ) ) ), + wpforms_format_amount( 0 ) + ); + $fld .= ''; + $fld .= '
                '; + $fld .= '
                '; + + if ( ! empty( $image ) ) { + $fld .= sprintf( + '', + esc_url_raw( $image ), + esc_attr__( 'Remove Image', 'wpforms-lite' ) + ); + + $hide_image_btn = true; + } + + $fld .= '
                '; + $fld .= sprintf( + '', + $hide_image_btn ? ' style="display:none;"' : '', + esc_html__( 'Upload Image', 'wpforms-lite' ) + ); + $fld .= sprintf( + '', + $base, + esc_url_raw( $image ) + ); + $fld .= '
                '; + + $fld .= sprintf( + '
                + + %2$s + + + +
                ', + esc_attr( $icon_style ), + esc_attr( $icon ), + esc_attr( $base ) + ); + + $fld .= '
              • '; + } + $fld .= '
              '; + + // Final field output. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices', + 'content' => $lbl . $fld, + ], + false + ); + break; + + /* + * Add Other Choice. + */ + case 'choices_other': + // Field contents. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'choices_other', + 'value' => $this->has_other_choice( $field ) ? '1' : '0', + 'desc' => esc_html__( 'Add Other Choice', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Add an Other choice so users can input their own value.', 'wpforms-lite' ), + ], + false + ); + + // Final field output. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_other', + 'class' => $this->is_dynamic_choices( $field ) ? 'wpforms-hidden' : '', + 'content' => $fld, + ], + false + ); + break; + + /* + * Other Placeholder (for "Other" choice input field). + */ + case 'other_placeholder': + $label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'other_placeholder', + 'value' => esc_html__( 'Placeholder Text', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter placeholder text for the Other input.', 'wpforms-lite' ), + ], + false + ); + + $input = $this->field_element( + 'text', + $field, + [ + 'slug' => 'other_placeholder', + 'value' => isset( $field['other_placeholder'] ) ? esc_attr( $field['other_placeholder'] ) : '', + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'other_placeholder', + 'content' => $label . $input, + 'class' => ( $this->is_dynamic_choices( $field ) || ! $this->has_other_choice( $field ) ) ? 'wpforms-hidden' : '', + ], + false + ); + break; + + /* + * Other Field Size (for "Other" choice input field). + */ + case 'other_size': + $tooltip = esc_html__( 'Select the size of the Other input.', 'wpforms-lite' ); + $value = ! empty( $field['other_size'] ) ? esc_attr( $field['other_size'] ) : 'medium'; + $options = [ + 'small' => esc_html__( 'Small', 'wpforms-lite' ), + 'medium' => esc_html__( 'Medium', 'wpforms-lite' ), + 'large' => esc_html__( 'Large', 'wpforms-lite' ), + ]; + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'other_size', + 'value' => esc_html__( 'Field Size', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => 'other_size', + 'value' => $value, + 'options' => $options, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'other_size', + 'content' => $output, + 'class' => ( $this->is_dynamic_choices( $field ) || ! $this->has_other_choice( $field ) ) ? 'wpforms-hidden' : '', + ], + false + ); + break; + + /* + * Choices Images. + */ + case 'choices_images': + // Field note: Image tips. + $note = sprintf( + '
              ', + ! empty( $field['choices_images'] ) ? '' : 'wpforms-hidden' + ); + $note .= wp_kses( + __( '

              Images are not cropped or resized.

              For best results, they should be the same size and 250x250 pixels or smaller.

              ', 'wpforms-lite' ), + [ + 'h4' => [], + 'p' => [], + ] + ); + $note .= '
              '; + + // Field contents. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'choices_images', + 'value' => isset( $field['choices_images'] ) ? '1' : '0', + 'desc' => esc_html__( 'Use Image Choices', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enable this option to use images with choices', 'wpforms-lite' ), + ], + false + ); + + // Final field output. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_images', + 'class' => ! empty( $field['dynamic_choices'] ) ? 'wpforms-hidden' : '', + 'content' => $note . $fld, + ], + false + ); + break; + + /* + * Hide Images Choices. + */ + case 'choices_images_hide': + $output = $this->choices_images_hide_option( $field ); + break; + + /* + * Choices Images Style. + */ + case 'choices_images_style': + // Field label. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'choices_images_style', + 'value' => esc_html__( 'Image Choice Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the style for the image choices.', 'wpforms-lite' ), + ], + false + ); + + // Field contents. + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'choices_images_style', + 'value' => ! empty( $field['choices_images_style'] ) ? esc_attr( $field['choices_images_style'] ) : 'modern', + 'options' => [ + 'modern' => esc_html__( 'Modern', 'wpforms-lite' ), + 'classic' => esc_html__( 'Classic', 'wpforms-lite' ), + 'none' => esc_html__( 'None', 'wpforms-lite' ), + ], + ], + false + ); + + // Final field output. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_images_style', + 'content' => $lbl . $fld, + 'class' => ! empty( $field['choices_images'] ) ? '' : 'wpforms-hidden', + ], + false + ); + break; + + /* + * Choices Icons. + */ + case 'choices_icons': + // Field contents. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'choices_icons', + 'value' => isset( $field['choices_icons'] ) ? '1' : '0', + 'desc' => esc_html__( 'Use Icon Choices', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enable this option to use icons with the choices.', 'wpforms-lite' ), + ], + false + ); + + // Final field output. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_icons', + 'class' => ! empty( $field['dynamic_choices'] ) ? 'wpforms-hidden' : '', + 'content' => $fld, + ], + false + ); + break; + + case 'choices_icons_color': + // Color picker. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'choices_icons_color', + 'value' => esc_html__( 'Icon Color', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select an accent color for the icon choices.', 'wpforms-lite' ), + ], + false + ); + + $icon_color = isset( $field['choices_icons_color'] ) ? wpforms_sanitize_hex_color( $field['choices_icons_color'] ) : ''; + $icon_color = empty( $icon_color ) ? IconChoices::get_default_color() : $icon_color; + + $fld = $this->field_element( + 'color', + $field, + [ + 'slug' => 'choices_icons_color', + 'value' => $icon_color, + 'data' => [ + 'fallback-color' => $icon_color, + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_icons_color', + 'content' => $lbl . $fld, + 'class' => ! empty( $field['choices_icons'] ) ? [ 'color-picker-row' ] : [ 'color-picker-row', 'wpforms-hidden' ], + ] + ); + break; + + case 'choices_icons_size': + // Field abel. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'choices_icons_size', + 'value' => esc_html__( 'Icon Size', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select icon size.', 'wpforms-lite' ), + ], + false + ); + + $icon_choices_obj = wpforms()->obj( 'icon_choices' ); + $raw_icon_sizes = $icon_choices_obj ? $icon_choices_obj->get_icon_sizes() : []; + + $icon_sizes = array_map( + static function ( $data ) { + + return $data['label'] ?? ''; + }, + $raw_icon_sizes + ); + + // Field contents. + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'choices_icons_size', + 'value' => ! empty( $field['choices_icons_size'] ) ? esc_attr( $field['choices_icons_size'] ) : 'large', + 'options' => $icon_sizes, + ], + false + ); + + // Final field output. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_icons_size', + 'content' => $lbl . $fld, + 'class' => ! empty( $field['choices_icons'] ) ? '' : 'wpforms-hidden', + ] + ); + break; + + case 'choices_icons_style': + // Field label. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'choices_icons_style', + 'value' => esc_html__( 'Icon Choice Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the style for the icon choices.', 'wpforms-lite' ), + ], + false + ); + + // Field contents. + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'choices_icons_style', + 'value' => ! empty( $field['choices_icons_style'] ) ? esc_attr( $field['choices_icons_style'] ) : 'default', + 'options' => [ + 'default' => esc_html__( 'Default', 'wpforms-lite' ), + 'modern' => esc_html__( 'Modern', 'wpforms-lite' ), + 'classic' => esc_html__( 'Classic', 'wpforms-lite' ), + 'none' => esc_html__( 'None', 'wpforms-lite' ), + ], + ], + false + ); + + // Final field output. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_icons_style', + 'content' => $lbl . $fld, + 'class' => ! empty( $field['choices_icons'] ) ? '' : 'wpforms-hidden', + ] + ); + break; + + /** + * Advanced Fields. + */ + + /* + * Default value. + */ + case 'default_value': + $value = ! empty( $field['default_value'] ) || ( isset( $field['default_value'] ) && '0' === (string) $field['default_value'] ) ? esc_attr( $field['default_value'] ) : ''; + $tooltip = esc_html__( 'Enter text for the default form field value.', 'wpforms-lite' ); + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'default_value', + 'value' => esc_html__( 'Default Value', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'default_value', + 'value' => $value, + 'class' => 'wpforms-smart-tags-enabled', + 'smarttags' => [ + 'type' => 'other', + ], + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'default_value', + 'content' => $output, + ], + false + ); + break; + + /* + * Size. + */ + case 'size': + $value = ! empty( $field['size'] ) ? esc_attr( $field['size'] ) : 'medium'; + $class = ! empty( $args['class'] ) ? esc_html( $args['class'] ) : ''; + $tooltip = esc_html__( 'Select the default form field size.', 'wpforms-lite' ); + $options = [ + 'small' => esc_html__( 'Small', 'wpforms-lite' ), + 'medium' => esc_html__( 'Medium', 'wpforms-lite' ), + 'large' => esc_html__( 'Large', 'wpforms-lite' ), + ]; + + if ( ! empty( $args['exclude'] ) ) { + $options = array_diff_key( $options, array_flip( $args['exclude'] ) ); + } + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'size', + 'value' => esc_html__( 'Field Size', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => 'size', + 'value' => $value, + 'options' => $options, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'size', + 'content' => $output, + 'class' => $class, + ], + false + ); + break; + + /* + * Advanced Options markup. + */ + case 'advanced-options': + $markup = ! empty( $args['markup'] ) ? $args['markup'] : 'open'; + + if ( $markup === 'open' ) { + $override = apply_filters( 'wpforms_advanced_options_override', false ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.Comments.SinceTagHooks.MissingSinceTag + $override = ! empty( $override ) ? 'style="display:' . $override . ';"' : ''; + $class = ! empty( $args['class'] ) ? esc_html( $args['class'] ) : ''; + + $output = sprintf( + '
              + %3$s +
              ', + wpforms_validate_field_id( $field['id'] ), + $override, + esc_html__( 'Advanced', 'wpforms-lite' ), + esc_attr( $class ) + ); + + } else { + $output = '
              '; + } + break; + + /* + * Placeholder. + */ + case 'placeholder': + $class = ! empty( $args['class'] ) ? esc_html( $args['class'] ) : ''; + $value = ! empty( $field['placeholder'] ) ? esc_attr( $field['placeholder'] ) : ''; + $tooltip = esc_html__( 'Enter text for the form field placeholder.', 'wpforms-lite' ); + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'placeholder', + 'value' => esc_html__( 'Placeholder Text', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'placeholder', + 'value' => $value, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'placeholder', + 'content' => $output, + 'class' => $class, + ], + false + ); + break; + + /* + * CSS classes. + */ + case 'css': + $toggle = ''; + $value = ! empty( $field['css'] ) ? esc_attr( $field['css'] ) : ''; + $tooltip = esc_html__( 'Enter CSS class names for the form field container. Class names should be separated with spaces.', 'wpforms-lite' ); + + if ( $field['type'] !== 'pagebreak' ) { + $toggle = '' . esc_html__( 'Show Layouts', 'wpforms-lite' ) . ''; + } + + // Build output. + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'css', + 'value' => esc_html__( 'CSS Classes', 'wpforms-lite' ), + 'tooltip' => $tooltip, + 'after_tooltip' => $toggle, + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'css', + 'value' => $value, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'css', + 'content' => $output, + ], + false + ); + break; + + /* + * Hide Label. + */ + case 'label_hide': + $value = $field['label_hide'] ?? '0'; + $tooltip = esc_html__( 'Check this option to hide the form field label.', 'wpforms-lite' ); + + // Build output. + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'label_hide', + 'value' => $value, + 'desc' => esc_html__( 'Hide Label', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'label_hide', + 'content' => $output, + 'class' => ! empty( $args['class'] ) ? wpforms_sanitize_classes( $args['class'] ) : '', + ], + false + ); + break; + + /* + * Hide sublabels. + */ + case 'sublabel_hide': + $value = $field['sublabel_hide'] ?? '0'; + $tooltip = esc_html__( 'Check this option to hide the form field sublabel.', 'wpforms-lite' ); + + // Build output. + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'sublabel_hide', + 'value' => $value, + 'desc' => esc_html__( 'Hide Sublabels', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'sublabel_hide', + 'content' => $output, + 'class' => ! empty( $args['class'] ) ? wpforms_sanitize_classes( $args['class'] ) : '', + ], + false + ); + break; + + /* + * Input Columns. + */ + case 'input_columns': + $value = ! empty( $field['input_columns'] ) ? esc_attr( $field['input_columns'] ) : ''; + $tooltip = esc_html__( 'Select the layout for displaying field choices.', 'wpforms-lite' ); + $options = [ + '' => esc_html__( 'One Column', 'wpforms-lite' ), + '2' => esc_html__( 'Two Columns', 'wpforms-lite' ), + '3' => esc_html__( 'Three Columns', 'wpforms-lite' ), + 'inline' => esc_html__( 'Inline', 'wpforms-lite' ), + ]; + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'input_columns', + 'value' => esc_html__( 'Choice Layout', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => 'input_columns', + 'value' => $value, + 'options' => $options, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'input_columns', + 'content' => $output, + ], + false + ); + break; + + /* + * Dynamic Choices. + */ + case 'dynamic_choices': + $value = $this->is_dynamic_choices( $field ) ? esc_attr( $field['dynamic_choices'] ) : ''; + $tooltip = esc_html__( 'Select auto-populate method to use.', 'wpforms-lite' ); + $options = [ + '' => esc_html__( 'Off', 'wpforms-lite' ), + 'post_type' => esc_html__( 'Post Type', 'wpforms-lite' ), + 'taxonomy' => esc_html__( 'Taxonomy', 'wpforms-lite' ), + ]; + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'dynamic_choices', + 'value' => esc_html__( 'Dynamic Choices', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => 'dynamic_choices', + 'value' => $value, + 'options' => $options, + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'dynamic_choices', + 'class' => ! empty( $field['choices_images'] ) || ! empty( $field['choices_icons'] ) || $this->has_other_choice( $field ) ? 'wpforms-hidden' : '', + 'content' => $output, + ], + false + ); + break; + + /* + * Dynamic Choices Source. + */ + case 'dynamic_choices_source': + $type = ! empty( $field['dynamic_choices'] ) ? esc_attr( $field['dynamic_choices'] ) : ''; + + if ( ! empty( $type ) ) { + $type_name = ''; + $items = []; + + if ( $type === 'post_type' ) { + + $type_name = esc_html__( 'Post Type', 'wpforms-lite' ); + $items = get_post_types( + [ + 'public' => true, + ], + 'objects' + ); + + unset( $items['attachment'] ); + } elseif ( $type === 'taxonomy' ) { + $type_name = esc_html__( 'Taxonomy', 'wpforms-lite' ); + $items = get_taxonomies( + [ + 'public' => true, + 'publicly_queryable' => true, + ], + 'objects' + ); + + unset( $items['post_format'] ); + } + + /* translators: %s - dynamic source type name. */ + $tooltip = sprintf( esc_html__( 'Select %s to use for auto-populating field choices.', 'wpforms-lite' ), esc_html( $type_name ) ); + + /* translators: %s - dynamic source type name. */ + $label = sprintf( esc_html__( 'Dynamic %s Source', 'wpforms-lite' ), esc_html( $type_name ) ); + $options = []; + $source = ! empty( $field[ 'dynamic_' . $type ] ) ? esc_attr( $field[ 'dynamic_' . $type ] ) : ''; + + uasort( + $items, + static function ( $prev_item, $item ) { + + return strcmp( $prev_item->name, $item->name ); + } + ); + + foreach ( $items as $key => $item ) { + $options[ $key ] = esc_html( $item->labels->name ); + } + + // Field option label. + $option_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'dynamic_' . $type, + 'value' => $label, + 'tooltip' => $tooltip, + ], + false + ); + + // The field option selects input. + $option_input = $this->field_element( + 'select', + $field, + [ + 'slug' => 'dynamic_' . $type, + 'options' => $options, + 'value' => $source, + ], + false + ); + + // Field option row (markup) including label and input. + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'dynamic_' . $type, + 'content' => $option_label . $option_input, + ], + false + ); + } // End if. + break; + + /* + * Quantity. + */ + case 'quantity': + $is_allowed = RequirementsAlerts::is_product_quantities_allowed(); + $enable_quantity = $this->is_payment_quantities_enabled( $field ); + $min_quantity = isset( $field['min_quantity'] ) ? (int) $field['min_quantity'] : 0; + $max_quantity = isset( $field['max_quantity'] ) ? (int) $field['max_quantity'] : 10; + $toggle_tooltip = esc_html__( 'Enable quantity for this product to allow customers to purchase more than one.', 'wpforms-lite' ); + $range_tooltip = esc_html__( 'Set the minimum and maximum quantity for this product.', 'wpforms-lite' ); + $hidden_class = ! empty( $args['hidden'] ) ? 'wpforms-hidden' : ''; + + $toggle_data = [ + 'slug' => 'enable_quantity', + 'value' => $enable_quantity, + 'desc' => esc_html__( 'Enable Quantity', 'wpforms-lite' ), + 'tooltip' => $toggle_tooltip, + ]; + + if ( ! $is_allowed ) { + $toggle_data['attrs'] = [ 'disabled' => 'disabled' ]; + $toggle_data['control-class'] = 'wpforms-toggle-control-disabled'; + } + + $toggle = $this->field_element( + 'toggle', + $field, + $toggle_data, + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'enable_quantity', + 'content' => $toggle, + 'class' => $hidden_class, + ], + false + ); + + $min_has_error = $min_quantity > $max_quantity ? 'wpforms-error' : ''; + + $content = $this->field_element( + 'label', + $field, + [ + 'slug' => 'quantity', + 'value' => esc_html__( 'Range', 'wpforms-lite' ), + 'tooltip' => $range_tooltip, + ], + false + ); + $content .= '
              '; + $content .= '
              '; + $content .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'min_quantity', + 'type' => 'number', + 'value' => $min_quantity, + 'after' => esc_html__( 'Minimum', 'wpforms-lite' ), + 'class' => [ 'wpforms-field-options-column', 'min-quantity-input', $min_has_error ], + 'attrs' => + [ + 'min' => 0, + 'step' => 1, + ], + ], + false + ); + $content .= '
              '; + $content .= '
              '; + $content .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'max_quantity', + 'type' => 'number', + 'value' => $max_quantity, + 'after' => esc_html__( 'Maximum', 'wpforms-lite' ), + 'class' => [ 'wpforms-field-options-column', 'max-quantity-input' ], + 'attrs' => + [ + 'min' => 1, + 'step' => 1, + ], + ], + false + ); + $content .= '
              '; + $content .= '
              '; + + $range_hidden_class = $enable_quantity && empty( $args['hidden'] ) ? '' : 'wpforms-hidden'; + + $output .= $this->field_element( + 'row', + $field, + [ + 'slug' => 'quantity', + 'content' => $content, + 'class' => [ $range_hidden_class, 'wpforms-field-quantity-option' ], + ], + false + ); + + if ( ! $is_allowed ) { + $output .= $this->field_element( + 'row', + $field, + [ + 'slug' => 'quantities_alert', + 'content' => RequirementsAlerts::get_product_quantities_alert(), + 'class' => $hidden_class, + ], + false + ); + } + break; + + /* + * Choice Limit. + */ + case 'choice_limit': + $output = $this->choice_limit_option( $field ); + break; + + default: + /** + * Filters the field preview option output. + * + * @since 1.9.1 + * + * @param string $output Field option output. + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param object $this WPForms_Field object. + */ + $output = (string) apply_filters( "wpforms_field_option_{$option}", $output, $field, $args, $this ); + break; + } + + if ( ! $do_echo ) { + return $output; + } + + if ( ! in_array( $option, [ 'basic-options', 'advanced-options' ], true ) ) { + /** + * Fires before the field option output. + * + * @since 1.9.8.6 + * + * @param array $field Field data and settings. + * @param object $this WPForms_Field object. + */ + do_action( "wpforms_field_options_before_{$option}", $field, $this ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $output; + /** + * Fires after the field option output. + * + * @since 1.9.8.6 + * + * @param array $field Field data and settings. + * @param object $this WPForms_Field object. + */ + do_action( "wpforms_field_options_after_{$option}", $field, $this ); + + return null; + } + + if ( $markup === 'open' ) { + do_action( "wpforms_field_options_before_{$option}", $field, $this ); + } + + if ( $markup === 'close' ) { + do_action( "wpforms_field_options_bottom_{$option}", $field, $this ); + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $output; + + if ( $markup === 'open' ) { + do_action( "wpforms_field_options_top_{$option}", $field, $this ); + } + + if ( $markup === 'close' ) { + do_action( "wpforms_field_options_after_{$option}", $field, $this ); + } + + return null; + } + + /** + * Get choice images hide option field element. + * + * @since 1.9.8.3 + * + * @param array $field Field data and settings. + * + * @return string + */ + private function choices_images_hide_option( array $field ): string { + + // Field contents. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'choices_images_hide', + 'value' => isset( $field['choices_images_hide'] ) ? '1' : '0', + 'desc' => wpforms()->is_pro() ? esc_html__( 'Hide Images in Entries', 'wpforms-lite' ) : esc_html__( 'Hide Images in Notifications', 'wpforms-lite' ), + 'tooltip' => wpforms()->is_pro() ? esc_html__( 'Enable this option to hide the images in entries and notifications.', 'wpforms-lite' ) : esc_html__( 'Enable this option to hide the images in notifications.', 'wpforms-lite' ), + ], + false + ); + + // Final field output. + return $this->field_element( + 'row', + $field, + [ + 'slug' => 'choices_images_hide', + 'class' => ! empty( $field['choices_images'] ) ? '' : 'wpforms-hidden', + 'content' => $fld, + ], + false + ); + } + + /** + * Get choice limit option field element. + * + * @since 1.9.7 + * + * @param array $field Field data and settings. + * + * @return string + */ + private function choice_limit_option( array $field ): string { + + return $this->field_element( + 'row', + $field, + [ + 'slug' => 'choice_limit', + 'content' => + $this->field_element( + 'label', + $field, + [ + 'slug' => 'choice_limit', + 'value' => esc_html__( 'Choice Limit', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Limit the number of checkboxes a user can select. Leave empty for unlimited.', 'wpforms-lite' ), + ], + false + ) . $this->field_element( + 'text', + $field, + [ + 'slug' => 'choice_limit', + 'value' => isset( $field['choice_limit'] ) && (int) $field['choice_limit'] > 0 ? (int) $field['choice_limit'] : '', + 'type' => 'number', + ], + false + ), + ], + false + ); + } + + /** + * Helper function to create common field options that are used frequently + * in the field preview. + * + * @since 1.0.0 + * @since 1.5.0 Added support for -based fields. + if ( $type === 'select' ) { + if ( empty( $values ) ) { + $list_class[] = 'wpforms-hidden'; + } + + $multiple = ! empty( $field['multiple'] ) ? ' multiple' : ''; + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + + $output = sprintf( + ''; + } else { + // Normal checkbox/radio-based fields. + $output = sprintf( + '
                ', + wpforms_sanitize_classes( $list_class, true ), + esc_attr( $inline_style ) + ); + + foreach ( $values as $key => $value ) { + + $default = $value['default'] ?? ''; + $selected = checked( '1', $default, false ); + $input_class = []; + $item_class = []; + + if ( ! empty( $value['default'] ) ) { + $item_class[] = 'wpforms-selected'; + } + + // Mark Other choice in preview and prepare standalone input HTML. + if ( $with_other ) { + $item_class[] = 'wpforms-other-choice'; + } + + if ( $with_images ) { + $item_class[] = 'wpforms-image-choices-item'; + } + + if ( $with_icons ) { + $item_class[] = 'wpforms-icon-choices-item'; + } + + $output .= sprintf( + '
              • ', + wpforms_sanitize_classes( $item_class, true ) + ); + + $label = $this->get_choices_label( $value['label'] ?? '', $key + 1, $field ); + $label .= ! empty( $field['show_price_after_labels'] ) && isset( $value['value'] ) ? $this->get_price_after_label( $value['value'] ) : ''; + + if ( $with_images ) { + + if ( in_array( $field['choices_images_style'], [ 'modern', 'classic' ], true ) ) { + $input_class[] = 'wpforms-screen-reader-element'; + } + + $output .= ''; + + } elseif ( $with_icons ) { + + $icon = isset( $value['icon'] ) && ! wpforms_is_empty_string( $value['icon'] ) ? $value['icon'] : IconChoices::DEFAULT_ICON; + $icon_style = ! empty( $value['icon_style'] ) ? $value['icon_style'] : IconChoices::DEFAULT_ICON_STYLE; + + if ( in_array( $field['choices_icons_style'], [ 'default', 'modern', 'classic' ], true ) ) { + $input_class[] = 'wpforms-screen-reader-element'; + } + + $output .= ''; + + } else { + $output .= sprintf( + ' %s', + $type, + $selected, + wp_kses( $label, $allowed_tags ) + ); + } + + $output .= '
              • '; + } + + $output .= '
              '; + + // Multiple choice: Other option. + if ( $type === 'radio' ) { + + $placeholder = ! empty( $field['other_placeholder'] ) ? $field['other_placeholder'] : ''; + $default_value = ( ! empty( $field['show_values'] ) && isset( $value['value'] ) && $value['value'] !== '' ) ? $value['value'] : ''; + // Show input by default if the Other choice is set as default. + $hidden_class = ! empty( $default ) && ! empty( $value['other'] ) ? '' : 'wpforms-hidden'; + + $other_input_html = sprintf( + '', + esc_attr( $hidden_class ), + esc_attr( $placeholder ), + esc_attr( $default_value ) + ); + + $output .= $other_input_html; + } + + /* + * Contains more than 20/250 items, include a note about a limited subset of results displayed. + */ + if ( $total > $slice_size ) { + $output .= '
              '; + $output .= sprintf( + wp_kses( /* translators: %s - total number of choices. */ + __( 'Showing the first %1$s choices.
              All %2$s choices will be displayed when viewing the form.', 'wpforms-lite' ), + [ + 'br' => [], + ] + ), + $slice_size, + $total + ); + $output .= '
              '; + } + } + break; + + case 'quantity': + $first_item = ! empty( $field['min_quantity'] ) ? $field['min_quantity'] : 0; + $class .= $this->is_payment_quantities_enabled( $field ) ? '' : ' wpforms-hidden'; + + $output = sprintf( + ''; + break; + } + + if ( ! $do_echo ) { + return $output; + } + + echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + + return null; + } + + /** + * Create a new field in the admin AJAX editor. + * + * @since 1.0.0 + */ + public function field_new(): void { + + // Run a security check. + if ( ! check_ajax_referer( 'wpforms-builder', 'nonce', false ) ) { + wp_send_json_error( esc_html__( 'Your session expired. Please reload the builder.', 'wpforms-lite' ) ); + } + + // Check for permissions. + if ( ! wpforms_current_user_can( 'edit_forms' ) ) { + wp_send_json_error( esc_html__( 'You are not allowed to perform this action.', 'wpforms-lite' ) ); + } + + // Check for form ID. + if ( empty( $_POST['id'] ) ) { + wp_send_json_error( esc_html__( 'No form ID found', 'wpforms-lite' ) ); + } + + // Check for a field type to add. + if ( empty( $_POST['type'] ) ) { + wp_send_json_error( esc_html__( 'No field type found', 'wpforms-lite' ) ); + } + + // Grab field data. + $field_args = ! empty( $_POST['defaults'] ) && is_array( $_POST['defaults'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['defaults'] ) ) : []; + $field_type = sanitize_key( $_POST['type'] ); + $form_obj = wpforms()->obj( 'form' ); + $field_id = $form_obj ? $form_obj->next_field_id( absint( $_POST['id'] ) ) : false; + $field = [ + 'id' => $field_id, + 'type' => $field_type, + 'label' => $this->name, + 'description' => '', + ]; + $field = wp_parse_args( $field_args, $field ); + + /** + * Allow the default field settings to be filtered. + * + * @since 1.0.8 + * + * @param array $field Default field settings. + */ + $field = (array) apply_filters( 'wpforms_field_new_default', $field ); + + /** + * Filter whether the field should be required by default. + * + * @since 1.0.8 + * + * @param string $field_required Required attribute value. + * @param array $field Field settings. + */ + $field_required = (string) apply_filters( 'wpforms_field_new_required', '', $field ); + + /** + * Filter the new field CSS class. + * + * @since 1.0.8 + * + * @param string $class Required attribute value. + * @param array $field Field settings. + */ + $field_class = (string) apply_filters( 'wpforms_field_new_class', '', $field ); + + $field_helper_hide = ! empty( $_COOKIE['wpforms_field_helper_hide'] ); + + // Field types that default to the required. + if ( ! empty( $field_required ) ) { + $field_required = 'required'; + $field['required'] = '1'; + } + + // Build Preview. + ob_start(); + /** + * Fires after the field preview output in the Form Builder. + * + * @since 1.0.0 + * + * @param array $field Field data. + */ + do_action( "wpforms_builder_fields_previews_{$field_type}", $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $prev = ob_get_clean(); + $preview = sprintf( + '
              ', + esc_attr( $field_type ), + esc_attr( $field_required ), + esc_attr( $field_class ), + wpforms_validate_field_id( $field['id'] ), + esc_attr( $field_type ) + ); + + /** + * Allow the duplicate button to be hidden. + * + * @since 1.5.5 + * + * @param bool $display Whether to display the duplicate button. Default is true. + * @param array $field Field. + */ + if ( apply_filters( 'wpforms_field_new_display_duplicate_button', true, $field ) ) { + $preview .= sprintf( '', esc_attr__( 'Duplicate Field', 'wpforms-lite' ) ); + } + + $preview .= sprintf( '', esc_attr__( 'Delete Field', 'wpforms-lite' ) ); + + if ( ! $field_helper_hide ) { + $preview .= sprintf( + '
              + %s + %s + + + +
              ', + esc_html__( 'Click to Edit', 'wpforms-lite' ), + esc_html__( 'Drag to Reorder', 'wpforms-lite' ), + esc_html__( 'Hide Helper', 'wpforms-lite' ) + ); + } + + $preview .= $prev; + $preview .= '
              '; + + // Build Options. + $class = apply_filters( 'wpforms_builder_field_option_class', '', $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.Comments.SinceTagHooks.MissingSinceTag + $options = sprintf( + '
              ', + sanitize_html_class( $field['type'] ), + wpforms_sanitize_classes( $class ), + wpforms_validate_field_id( $field['id'] ) + ); + + $options .= sprintf( + '', + wpforms_validate_field_id( $field['id'] ) + ); + $options .= sprintf( + '', + wpforms_validate_field_id( $field['id'] ), + esc_attr( $field['type'] ) + ); + + ob_start(); + $this->field_options( $field ); + $options .= ob_get_clean(); + $options .= '
              '; + + // Prepare to return compiled results. + wp_send_json_success( + [ + 'form_id' => absint( $_POST['id'] ), + 'field' => $field, + 'preview' => $preview, + 'options' => $options, + ] + ); + } + + /** + * Display the field input elements on the frontend + * according to the render engine setting. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $field_atts Field attributes (deprecated). + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function field_display_proxy( $field, $field_atts, $form_data ): void { + + $render_engine = wpforms_get_render_engine(); + $method = "field_display_{$render_engine}"; + + if ( ! method_exists( $this, $method ) ) { + + // Something is wrong, this should never occur. + // Let's display the classic field in this case. + $method = 'fields_display_classic'; + } + + $this->$method( $field, $form_data ); + } + + /** + * Display the field using classic rendering. + * + * @since 1.0.0 + * @since 1.5.0 Converted to abstract method, as it's required for all fields. + * + * @param array $field Field data and settings. + * @param array|null $deprecated Field attributes (deprecated). + * @param array $form_data Form data and settings. + */ + abstract public function field_display( $field, $deprecated, $form_data ); + + /** + * Display the field using classic rendering. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + */ + protected function field_display_classic( $field, $form_data ): void { + + // The classic view is the same good old `field_display`. + $this->field_display( $field, null, $form_data ); + } + + /** + * Display the field using modern rendering. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + */ + protected function field_display_modern( $field, $form_data ) { + + // Maybe call the method from the field's modern frontend class. + if ( ! empty( $this->frontend_obj ) && method_exists( $this->frontend_obj, 'field_display_modern' ) ) { + $this->frontend_obj->field_display_modern( $field, $form_data ); + + return; + } + + // By default, the modern view is the same as the classic. + // In this way, we will implement modern only for the fields, + // where it is necessary. + $this->field_display_classic( $field, $form_data ); + } + + + /** + * Display field input errors if present. + * + * @since 1.3.7 + * + * @param string $key Input key. + * @param array $field Field data and settings. + */ + public function field_display_error( $key, $field ) { + + // Need an error. + if ( empty( $field['properties']['error']['value'][ $key ] ) ) { + return; + } + + printf( + '', + esc_attr( $field['properties']['inputs'][ $key ]['id'] ?? '' ), + esc_html( $field['properties']['error']['value'][ $key ] ) + ); + } + + /** + * Display field input sublabel if present. + * + * @since 1.3.7 + * @since 1.8.9 Ability to skip for attribute. + * + * @param string $key Input key. + * @param string $position Sublabel position. + * @param array $field Field data and settings. + * + * @noinspection HtmlUnknownAttribute + */ + public function field_display_sublabel( $key, $position, $field ): void { + + // Need a sublabel value. + if ( empty( $field['properties']['inputs'][ $key ]['sublabel']['value'] ) ) { + return; + } + + $field_position = ! empty( $field['properties']['inputs'][ $key ]['sublabel']['position'] ) ? $field['properties']['inputs'][ $key ]['sublabel']['position'] : 'after'; + + // Used to prevent from displaying sublabel twice. + if ( $field_position !== $position ) { + return; + } + + $classes = [ + 'wpforms-field-sublabel', + $field_position, + ]; + + if ( ! empty( $field['properties']['inputs'][ $key ]['sublabel']['hidden'] ) ) { + $classes[] = 'wpforms-sublabel-hide'; + } + + /** + * Allow skipping the `for` attribute inside the label. + * + * @since 1.8.9 + * + * @param bool $skip Whether to skip the `for` attribute. + * @param string $key Input key. + * @param array $field Field data and settings. + */ + $skip_for = (bool) apply_filters( 'wpforms_field_display_sublabel_skip_for', false, $key, $field ); + + /** + * Allow setting custom for attribute to the label. + * + * @since 1.8.9 + * + * @param string $value Actual for attribute value. + * @param string $key Input key. + * @param array $field Field data and settings. + */ + $for = apply_filters( 'wpforms_field_display_sublabel_for', $field['properties']['inputs'][ $key ]['id'], $key, $field ); + + printf( + '', + ! $skip_for ? sprintf( 'for="%s"', esc_attr( $for ) ) : '', + wpforms_sanitize_classes( $classes, true ), + esc_html( $field['properties']['inputs'][ $key ]['sublabel']['value'] ) + ); + } + + /** + * Validate field on form submitting. + * + * @since 1.0.0 + * + * @param string|int $field_id Field ID as a numeric string. + * @param mixed $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + if ( ! empty( $this->is_disabled_field ) ) { + return; + } + + // Basic required check - If a field is marked as required, check for entry data. + if ( ! empty( $form_data['fields'][ $field_id ]['required'] ) && empty( $field_submit ) && '0' !== (string) $field_submit ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = wpforms_get_required_label(); + } + } + + /** + * Format and sanitize field. + * + * @since 1.0.0 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + if ( is_array( $field_submit ) ) { + $field_submit = array_filter( $field_submit ); + $field_submit = implode( "\r\n", $field_submit ); + } + + $name = ! empty( $form_data['fields'][ $field_id ]['label'] ) ? sanitize_text_field( $form_data['fields'][ $field_id ]['label'] ) : ''; + + // Sanitize but keep line breaks. + $value = wpforms_sanitize_textarea_field( $field_submit ); + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $name, + 'value' => $value, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } + + /** + * Format field returning value due to the context and field type: + * E.g., return images, if any, for HTML-supported values, use separate formatting for the Other option. + * + * @since 1.4.5 + * + * @param string|mixed $value Field value. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * @param string $context Value display context. + * + * @return string + */ + public function field_html_value( $value, $field, $form_data = [], $context = '' ) { + + $value = (string) $value; + + if ( wpforms_payment_has_quantity( $field, $form_data ) ) { + return wpforms_payment_format_quantity( $field ); + } + + // Only use HTML formatting for checkbox fields, with image choices enabled + // and exclude the entry table display. + // Lastly, provides a filter to disable fancy display. + if ( + ! empty( $field['value'] ) && + $field['type'] === $this->type && + $context !== 'entry-table' && + $this->filter_field_html_value_images( $context, $form_data['fields'][ $field['id'] ] ?? [] ) + ) { + return $this->get_field_html( $field, $value, $form_data ); + } + + return $value; + } + + /** + * Filter whether to use HTML formatting for a field with image choices enabled. + * + * @since 1.9.8.3 + * + * @param bool $filtering Whether to use HTML formatting. + * @param string $context Value display context. + * @param array $field Field settings. + * + * @return bool + */ + public function field_html_value_images( $filtering, string $context, array $field ): bool { + + // Bail if images are hidden and not in entry-preview context. + if ( ! empty( $field['choices_images_hide'] ) && $context !== 'entry-preview' ) { + return false; + } + + return (bool) $filtering; + } + + /** + * Return HTML for a field value. + * + * @since 1.8.4.1 + * @since 1.8.9 Add $form_data parameter. + * + * @param array $field Field settings. + * @param string $value Field value. + * @param array $form_data Form data. + * + * @return string + */ + private function get_field_html( array $field, string $value, array $form_data ): string { + + if ( ! empty( $field['image'] ) ) { + $value = $this->get_choices_value( $field, $form_data ); + + return $this->get_field_html_image( $field['image'], $value ); + } + + if ( ! empty( $field['images'] ) ) { + $items = []; + $value = $this->get_choices_value( $field, $form_data ); + $values = explode( "\n", $value ); + + foreach ( $values as $key => $choice_label ) { + if ( ! empty( $field['images'][ $key ] ) ) { + $choice_label = $this->get_field_html_image( $field['images'][ $key ], $choice_label ); + } + + $items[] = $choice_label; + } + + return implode( '', $items ); + } + + return $value; + } + + /** + * Return choice value. + * + * This is only a wrapper for the wpforms_get_choices_value() global function. + * + * @since 1.9.8.3 + * + * @param array $field Field settings. + * @param array $form_data Form data. + * + * @return string + */ + protected function get_choices_value( array $field, array $form_data ): string { + + return wpforms_get_choices_value( $field, $form_data ); + } + + /** + * Return image HTML for a field value. + * + * @since 1.8.4.1 + * + * @param string $url Image URL. + * @param string $label Field value. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + private function get_field_html_image( $url, $label ): string { + + return sprintf( + '%s', + esc_url( $url ), + $label + ); + } + + /** + * Return boolean determining if field HTML values uses images. + * + * Bail if a field type is not set. + * + * @since 1.8.2 + * + * @param string $context Context of the field. + * @param array $field Field settings. + * + * @return bool + */ + private function filter_field_html_value_images( string $context, array $field ): bool { + + /** + * Filters whether to use HTML formatting for a field with image choices enabled. + * + * @since 1.5.1 + * @since 1.9.8.3 Added $field parameter. + * + * @param bool $use_html Whether to use HTML formatting. + * @param string $context Value display context. + * @param array $field Field settings. + */ + return (bool) apply_filters( "wpforms_{$this->type}_field_html_value_images", true, $context, $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Get a field name for an ajax error message. + * + * @since 1.6.3 + * + * @param string|mixed $name Field name for error triggered. + * @param array $field Field settings. + * @param array $props List of properties. + * @param string|string[] $error Error message. + * + * @return string + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection + * @noinspection PhpMissingParamTypeInspection + */ + public function ajax_error_field_name( $name, $field, $props, $error ) { + + $name = (string) $name; + + if ( $name ) { + return $name; + } + + if ( is_array( $error ) && isset( $props['inputs'][ key( $error ) ] ) ) { + // Handle separate error messages for composed fields like name or date_time. + $input = $props['inputs'][ key( $error ) ]; + } else { + $input = $props['inputs']['primary'] ?? end( $props['inputs'] ); + } + + return (string) isset( $input['attr']['name'] ) ? $input['attr']['name'] : ''; + } + + /** + * Exclude empty dynamic choices from the entry preview. + * + * @since 1.8.2 + * + * @param bool $hide Whether to hide the field. + * @param array $field Field data. + * @param array $form_data Form data. + * + * @return bool + */ + public function exclude_empty_dynamic_choices( $hide, $field, $form_data ) { + + if ( empty( $field['dynamic'] ) ) { + return $hide; + } + + $field_id = $field['id']; + $fields = $form_data['fields']; + $form_field = $fields[ $field_id ]; + + return $this->is_dynamic_choices_empty( $form_field, $form_data ); + } + + /** + * Enqueue Choicesjs script and config. + * + * @param array $forms Forms on the current page. + * + * @since 1.6.3 + */ + protected function enqueue_choicesjs_once( $forms ): void { + + if ( wpforms()->obj( 'frontend' )->is_choicesjs_enqueued ) { + return; + } + + wp_enqueue_script( + 'wpforms-choicesjs', + WPFORMS_PLUGIN_URL . 'assets/lib/choices.min.js', + [], + '10.2.0', + $this->load_script_in_footer() + ); + + $config = [ + 'removeItemButton' => true, + 'shouldSort' => false, + // Forces the search to look for exact matches anywhere in the string. + 'fuseOptions' => [ + 'threshold' => 0.1, + 'distance' => 1000, + ], + 'loadingText' => esc_html__( 'Loading...', 'wpforms-lite' ), + 'noResultsText' => esc_html__( 'No results found', 'wpforms-lite' ), + 'noChoicesText' => esc_html__( 'No choices to choose from', 'wpforms-lite' ), + 'uniqueItemText' => esc_html__( 'Only unique values can be added', 'wpforms-lite' ), + 'customAddItemText' => esc_html__( 'Only values matching specific conditions can be added', 'wpforms-lite' ), + ]; + + /** + * Allow theme/plugin developers to modify the provided or add own Choices.js settings. + * + * @since 1.6.1 + * + * @param array $config Choices.js settings. + * @param array $forms Forms on the current page. + * @param WPForms_Field $field_obj Field object. + */ + $config = apply_filters( 'wpforms_field_select_choicesjs_config', $config, $forms, $this ); + + wp_localize_script( + 'wpforms-choicesjs', + 'wpforms_choicesjs_config', + $config + ); + + wpforms()->obj( 'frontend' )->is_choicesjs_enqueued = true; + } + + /** + * Whether a Choicesjs search area should be shown. + * + * @since 1.6.4 + * + * @param int $choices_count Choices amount. + * + * @return bool + */ + protected function is_choicesjs_search_enabled( $choices_count ) { + + // We should auto hide/remove search, if less than 8 choices. + return $choices_count >= (int) apply_filters( 'wpforms_field_choicesjs_search_enabled_items_min', 8 ); + } + + /** + * Whether a Choicesjs search area should be shown for quantity select. + * + * @since 1.8.7 + * + * @param array $field Field data. + * + * @return bool + */ + protected function is_quantity_choicesjs_search_enabled( $field ) { + + if ( ! isset( $field['max_quantity'], $field['min_quantity'] ) ) { + return false; + } + + $choices_count = (int) $field['max_quantity'] - (int) $field['min_quantity']; + + /** + * We should auto hide/remove search, if less than 20 choices. + * + * @since 1.8.7 + * + * @param int $limit Minimum limit. + */ + return $choices_count >= (int) apply_filters( 'wpforms_field_quantity_choicesjs_search_enabled_items_min', 20 ); + } + + /** + * Get an instance of the class connected to the current field + * and located in the `src/Forms/[Pro/]Fields/FieldType/Class.php` file. + * + * @since 1.8.1 + * + * @param string $class_name Class name, for example `Frontend`. + * + * @return object + */ + protected function get_object( $class_name ) { + + $property = strtolower( $class_name ) . '_obj'; + + if ( ! is_null( $this->$property ) ) { + return $this->$property; + } + + $class_dir = implode( '', array_map( 'ucfirst', explode( '-', $this->type ) ) ); + $class_name = ucfirst( $class_name ); + $class_name = 'Forms\Fields\\' . $class_dir . '\\' . $class_name; + $fqdn_class = '\WPForms\Pro\\' . $class_name; + $fqdn_class = class_exists( $fqdn_class ) && wpforms()->is_pro() ? $fqdn_class : '\WPForms\Lite\\' . $class_name; + $fqdn_class = class_exists( $fqdn_class ) ? $fqdn_class : '\WPForms\\' . $class_name; + + $this->$property = class_exists( $fqdn_class ) ? new $fqdn_class( $this ) : null; + + return $this->$property; + } + + /** + * Add allowed HTML tags for field labels. + * + * @since 1.8.2 + * + * @param array $strings Array of strings. + * + * @return array + */ + public function add_allowed_label_html_tags( $strings ) { + + // Default allowed tags. + $allowed_tags = [ + 'br', + 'strong', + 'b', + 'em', + 'i', + 'a', + ]; + + /** + * Filter the allowed HTML tags for field labels. + * + * @since 1.8.2 + * + * @param array $allowed_tags Allowed HTML tags. + */ + $strings['allowed_label_html_tags'] = (array) apply_filters( 'wpforms_field_label_allowed_html_tags', $allowed_tags ); + + return $strings; + } + + /** + * Whether a field has dynamic choices. + * + * @since 1.8.2 + * + * @param array $field Field settings. + * + * @return bool + */ + protected function is_dynamic_choices( array $field ): bool { + + return ! empty( $field['dynamic_choices'] ); + } + + /** + * Whether a field has dynamic choices and they are empty. + * + * @since 1.8.2 + * + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return bool + */ + protected function is_dynamic_choices_empty( $field, $form_data ) { + + if ( ! $this->is_dynamic_choices( $field ) ) { + return false; + } + + $form_id = absint( $form_data['id'] ); + $dynamic = wpforms_get_field_dynamic_choices( $field, $form_id, $form_data ); + + return empty( $dynamic ); + } + + /** + * Get an empty dynamic choices message. + * + * @since 1.8.2 + * + * @param array $field Field data and settings. + * + * @return string + */ + protected function get_empty_dynamic_choices_message( $field ) { + + $dynamic = ! empty( $field['dynamic_choices'] ) ? $field['dynamic_choices'] : false; + + if ( ! $dynamic ) { + return ''; + } + + if ( empty( $field[ 'dynamic_' . $dynamic ] ) ) { + return ''; + } + + $source = esc_html__( 'Dynamic choices', 'wpforms-lite' ); + $type = esc_html__( 'items', 'wpforms-lite' ); + + $source_object = null; + + if ( $dynamic === 'post_type' ) { + $type = esc_html__( 'posts', 'wpforms-lite' ); + $source_object = get_post_type_object( $field[ 'dynamic_' . $dynamic ] ); + } + + if ( $dynamic === 'taxonomy' ) { + $type = esc_html__( 'terms', 'wpforms-lite' ); + $source_object = get_taxonomy( $field[ 'dynamic_' . $dynamic ] ); + } + + if ( $source_object !== null ) { + $source = $source_object->labels->name; + } + + return sprintf( /* translators: %1$s - data source name (e.g., Categories, Posts), %2$s - data source type (e.g., post type, taxonomy). */ + esc_html__( 'This field will not be displayed in your form since there are no %2$s belonging to %1$s.', 'wpforms-lite' ), + esc_html( $source ), + esc_html( $type ) + ); + } + + /** + * Display an empty dynamic choices message. + * + * @since 1.8.2 + * + * @param array $field Field data and settings. + */ + protected function display_empty_dynamic_choices_message( $field ): void { + + printf( + '
              %s
              ', + esc_html( $this->get_empty_dynamic_choices_message( $field ) ) + ); + } + + /** + * Get checkbox, choices and select the field options label. + * + * @since 1.8.6 + * @since 1.8.9 Added the `$field` parameter. + * + * @param string $label Choice option label. + * @param int $key Choice number. + * @param array $field Field data and settings. + * + * @return string + */ + protected function get_choices_label( $label, int $key, array $field ) { + + $is_payment_field = ! empty( $field ) && ( $field['type'] === 'payment-checkbox' || $field['type'] === 'payment-multiple' ); + $label = trim( $label ); + $is_icon_image_choice = ! empty( $field['choices_icons'] ) || ! empty( $field['choices_images'] ); + + // Do not set a placeholder for an empty label in Icon and Image choices except for payment fields. + if ( ! $is_payment_field && $is_icon_image_choice && wpforms_is_empty_string( $label ) ) { + return ''; + } + + /* translators: %d - choice number. */ + $placeholder = $is_payment_field ? __( 'Item %d', 'wpforms-lite' ) : __( 'Choice %d', 'wpforms-lite' ); + + return ! wpforms_is_empty_string( $label ) ? + $label : + sprintf( + $placeholder, + $key + ); + } + + /** + * Display quantity dropdown on the front. + * + * @since 1.8.7 + * + * @param array $field Field data and settings. + * + * @noinspection HtmlUnknownAttribute + */ + protected function display_quantity_dropdown( $field ): void { + + if ( ! $this->is_payment_quantities_enabled( $field ) ) { + return; + } + + $field_id = wpforms_validate_field_id( $field['id'] ); + $form_id = absint( $this->form_data['id'] ); + $container = [ + 'id' => "wpforms-{$form_id}-field_{$field_id}-quantity", + 'class' => [ 'wpforms-payment-quantity' ], + 'attr' => [ + 'name' => "wpforms[quantities][{$field_id}]", + ], + 'data' => [], + ]; + $is_modern = ! empty( $field['style'] ) && $field['style'] === 'modern'; + + // Add a class for Choices.js initialization. + if ( $is_modern ) { + $container['class'][] = 'choicesjs-select'; + $container['data']['size-class'] = 'wpforms-payment-quantity'; + $container['data']['search-enabled'] = $this->is_quantity_choicesjs_search_enabled( $field ); + $container['data']['remove-items-enabled'] = false; + } + + // Add the required attribute. + if ( ! empty( $field['required'] ) ) { + $container['attr']['required'] = 'required'; + } + + // Preselect default if no other choices were marked as default. + printf( + ''; + } + + /** + * Add a class to the builder field preview. + * + * @since 1.8.7 + * + * @param string $css Class names. + * @param array $field Field properties. + * + * @return string + */ + public function preview_field_class( $css, $field ) { + + if ( $field['type'] !== $this->type ) { + return $css; + } + + if ( $this->is_payment_quantities_enabled( $field ) ) { + $css .= ' payment-quantity-enabled'; + } + + return $css; + } + + /** + * Determine if payment quantities enabled. + * + * @since 1.8.7 + * + * @param array $field_settings Field settings. + * + * @return bool + */ + protected function is_payment_quantities_enabled( $field_settings ) { + + if ( empty( $field_settings['enable_quantity'] ) ) { + return false; + } + + // Quantity available only for `single` format of the Single payment field. + if ( $field_settings['type'] === 'payment-single' && $field_settings['format'] !== 'single' ) { + return false; + } + + // Otherwise return true. + return true; + } + + /** + * Get field payment submitted quantity. + * + * @since 1.8.7 + * + * @param array $field Field data. + * @param array $form_data Form data and settings. + * + * @return int + */ + protected function get_submitted_field_quantity( $field, $form_data ): int { + // phpcs:disable WordPress.Security.NonceVerification.Missing + $has_submitted_quantity = isset( $_POST['wpforms']['quantities'][ $field['id'] ] ); + $submitted_quantity = $has_submitted_quantity ? (int) $_POST['wpforms']['quantities'][ $field['id'] ] : 0; + // phpcs:enable WordPress.Security.NonceVerification.Missing + + if ( ! $has_submitted_quantity && isset( $form_data['quantities'][ $field['id'] ] ) ) { + $submitted_quantity = (int) $form_data['quantities'][ $field['id'] ]; + } + + $min_quantity = (int) $field['min_quantity']; + + // Verify submitted quantity value. + if ( $submitted_quantity >= $min_quantity && $submitted_quantity <= (int) $field['max_quantity'] ) { + return $submitted_quantity; + } + + // Otherwise, return a minimum quantity. + return $min_quantity; + } + + /** + * Whether to print the script in the footer. + * + * @since 1.9.0 + * + * @return bool + */ + protected function load_script_in_footer(): bool { + + return ! wpforms_is_frontend_js_header_force_load(); + } + + /** + * Get formatted price after label. + * + * @since 1.9.2 + * + * @param float $amount Amount. + * + * @return string + */ + protected function get_price_after_label( $amount ): string { + + return sprintf( ' - %s', wpforms_format_amount( wpforms_sanitize_amount( $amount ), true ) ); + } + + /** + * Validate field choice limit. + * + * @since 1.9.7 + * + * @param int $field_id Field ID. + * @param array $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + protected function validate_field_choice_limit( int $field_id, array $field_submit, array $form_data ): void { + + $choice_limit = isset( $form_data['fields'][ $field_id ]['choice_limit'] ) ? (int) $form_data['fields'][ $field_id ]['choice_limit'] : ''; + $count_choices = count( $field_submit ); + + if ( ! $choice_limit || $count_choices <= $choice_limit ) { + return; + } + + // Generating the error. + $error = wpforms_setting( 'validation-check-limit', esc_html__( 'You have exceeded the number of allowed selections: {#}.', 'wpforms-lite' ) ); + $error = str_replace( '{#}', $choice_limit, $error ); + + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = $error; + } + + /** + * Determines if the field has the "Add Other Choice" option enabled. + * + * @since 1.9.8.3 + * + * @param array $field The field data to check for the "Add Other Choice" option. + * + * @return bool True, if the "Add Other Choice" option is enabled, false otherwise. + */ + protected function has_other_choice( array $field ): bool { + + return ! empty( $field['choices_other'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-checkbox.php b/wp-content/plugins/wpforms-lite/includes/fields/class-checkbox.php new file mode 100755 index 00000000..3cea747d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-checkbox.php @@ -0,0 +1,773 @@ +name = esc_html__( 'Checkboxes', 'wpforms-lite' ); + $this->keywords = esc_html__( 'choice', 'wpforms-lite' ); + $this->type = 'checkbox'; + $this->icon = 'fa-check-square-o'; + $this->order = 110; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'First Choice', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + 2 => [ + 'label' => esc_html__( 'Second Choice', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + 3 => [ + 'label' => esc_html__( 'Third Choice', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + // Customize HTML field values. + add_filter( 'wpforms_html_field_value', [ $this, 'field_html_value' ], 10, 4 ); + add_filter( "wpforms_{$this->type}_field_html_value_images", [ $this, 'field_html_value_images' ], 10, 3 ); + + // Define additional field properties. + add_filter( 'wpforms_field_properties_checkbox', [ $this, 'field_properties' ], 5, 3 ); + + // This field requires fieldset+legend instead of the field label. + add_filter( "wpforms_frontend_modern_is_field_requires_fieldset_{$this->type}", '__return_true', PHP_INT_MAX, 2 ); + } + + /** + * Define additional field properties. + * + * @since 1.4.5 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = wpforms_validate_field_id( $field['id'] ); + $choices = $field['choices']; + $dynamic = wpforms_get_field_dynamic_choices( $field, $form_id, $form_data ); + + if ( $dynamic !== false ) { + $choices = $dynamic; + $field['show_values'] = true; + } + + // Remove primary input, unset for attribute for label. + unset( $properties['inputs']['primary'], $properties['label']['attr']['for'] ); + + // Set input container (ul) properties. + $properties['input_container'] = [ + 'class' => [ ! empty( $field['random'] ) ? 'wpforms-randomize' : '' ], + 'data' => [], + 'attr' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}", + ]; + + $is_choice_limit_set = ! empty( $field['choice_limit'] ) && (int) $field['choice_limit'] > 0; + + if ( $is_choice_limit_set ) { + $properties['input_container']['data']['choice-limit'] = $field['choice_limit']; + } + + // Set input properties. + foreach ( $choices as $key => $choice ) { + + // Used for dynamic choices. + $depth = isset( $choice['depth'] ) ? absint( $choice['depth'] ) : 1; + $label = isset( $choice['label'] ) ? $choice['label'] : ''; + + // Choice labels should not be left blank, but if they are we + // provide a basic value. + $value = isset( $field['show_values'] ) ? $choice['value'] : $label; + + if ( '' === $value ) { + if ( 1 === count( $choices ) ) { + $value = esc_html__( 'Checked', 'wpforms-lite' ); + } else { + /* translators: %s - choice number. */ + $value = sprintf( esc_html__( 'Choice %s', 'wpforms-lite' ), $key ); + } + } + + $properties['inputs'][ $key ] = [ + 'container' => [ + 'attr' => [], + 'class' => [ "choice-{$key}", "depth-{$depth}" ], + 'data' => [], + 'id' => '', + ], + 'label' => [ + 'attr' => [ + 'for' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + ], + 'class' => [ 'wpforms-field-label-inline' ], + 'data' => [], + 'id' => '', + 'text' => $label, + ], + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][]", + 'value' => $value, + ], + 'class' => [], + 'data' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + 'icon' => isset( $choice['icon'] ) ? $choice['icon'] : '', + 'icon_style' => isset( $choice['icon_style'] ) ? $choice['icon_style'] : '', + 'image' => isset( $choice['image'] ) ? $choice['image'] : '', + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'default' => isset( $choice['default'] ), + ]; + + // Rule for validator only if needed. + if ( $is_choice_limit_set ) { + $properties['inputs'][ $key ]['data']['rule-check-limit'] = 'true'; + } + } + + // Required class for pagebreak validation. + if ( ! empty( $field['required'] ) ) { + $properties['input_container']['class'][] = 'wpforms-field-required'; + } + + // Custom properties if image choices is enabled. + if ( ! $dynamic && ! empty( $field['choices_images'] ) ) { + + $properties['input_container']['class'][] = 'wpforms-image-choices'; + $properties['input_container']['class'][] = 'wpforms-image-choices-' . sanitize_html_class( $field['choices_images_style'] ); + + foreach ( $properties['inputs'] as $key => $inputs ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-image-choices-item'; + + if ( in_array( $field['choices_images_style'], [ 'modern', 'classic' ], true ) ) { + $properties['inputs'][ $key ]['class'][] = 'wpforms-screen-reader-element'; + } + } + } elseif ( ! $dynamic && ! empty( $field['choices_icons'] ) ) { + $properties = wpforms()->obj( 'icon_choices' )->field_properties( $properties, $field ); + } + + // Custom properties for disclaimer format display. + if ( ! empty( $field['disclaimer_format'] ) ) { + + $properties['description']['class'][] = 'wpforms-disclaimer-description'; + $properties['description']['value'] = nl2br( $properties['description']['value'] ); + } + + // Add selected class for choices with defaults. + foreach ( $properties['inputs'] as $key => $inputs ) { + if ( ! empty( $inputs['default'] ) ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-selected'; + } + } + + return $properties; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Choices. + $this->field_option( 'choices', $field ); + + // AI Feature. + $this->field_option( + 'ai_modal_button', + $field, + [ + 'value' => esc_html__( 'Generate Choices', 'wpforms-lite' ), + 'type' => 'choices', + ] + ); + + // Choices Images. + $this->field_option( 'choices_images', $field ); + + // Hide Choices Images. + $this->field_option( 'choices_images_hide', $field ); + + // Choices Images Style (theme). + $this->field_option( 'choices_images_style', $field ); + + // Choices Icons. + $this->field_option( 'choices_icons', $field ); + + // Choices Icons Color. + $this->field_option( 'choices_icons_color', $field ); + + // Choices Icons Size. + $this->field_option( 'choices_icons_size', $field ); + + // Choices Icons Style. + $this->field_option( 'choices_icons_style', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Randomize order of choices. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'random', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'random', + 'value' => isset( $field['random'] ) ? '1' : '0', + 'desc' => esc_html__( 'Randomize Choices', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to randomize the order of the choices.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + // Show Values toggle option. This option will only show if already used + // or if manually enabled by a filter. + if ( ! empty( $field['show_values'] ) || wpforms_show_fields_options_setting() ) { + $this->field_element( + 'row', + $field, + [ + 'slug' => 'show_values', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'show_values', + 'value' => isset( $field['show_values'] ) ? $field['show_values'] : '0', + 'desc' => esc_html__( 'Show Values', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to manually set form field values.', 'wpforms-lite' ), + ], + false + ), + ] + ); + } + + // Display format. + $this->field_option( 'input_columns', $field ); + + // Choice Limit. + $this->field_option( 'choice_limit', $field ); + + // Dynamic choice auto-populating toggle. + $this->field_option( 'dynamic_choices', $field ); + + // Dynamic choice source. + $this->field_option( 'dynamic_choices_source', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Enable Disclaimer formatting. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'disclaimer_format', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'disclaimer_format', + 'value' => isset( $field['disclaimer_format'] ) ? '1' : '0', + 'desc' => esc_html__( 'Enable Disclaimer / Terms of Service Display', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to adjust the field styling to support Disclaimers and Terms of Service type agreements.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + // Choices. + $this->field_preview_option( 'choices', $field ); + + // Description. + $this->field_preview_option( + 'description', + $field, + [ + 'class' => ! empty( $field['disclaimer_format'] ) ? 'disclaimer nl2br' : false, + ] + ); + } + + /** + * Field display on the form front-end and admin entry edit page. + * + * @since 1.0.0 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + $using_image_choices = empty( $field['dynamic_choices'] ) && ! empty( $field['choices_images'] ); + $using_icon_choices = empty( $field['dynamic_choices'] ) && empty( $field['choices_images'] ) && ! empty( $field['choices_icons'] ); + + // Define data. + $container = $field['properties']['input_container']; + $choices = $field['properties']['inputs']; + + // Do not display the field with empty choices on the frontend. + if ( ! $choices && ! is_admin() ) { + return; + } + + // Display a warning message on Entry Edit page. + if ( ! $choices && is_admin() ) { + $this->display_empty_dynamic_choices_message( $field ); + + return; + } + + $amp_state_id = ''; + + if ( wpforms_is_amp() && ( $using_image_choices || $using_icon_choices ) ) { + $amp_state_id = str_replace( '-', '_', sanitize_key( $container['id'] ) ) . '_state'; + $state = []; + + foreach ( $choices as $key => $choice ) { + $state[ $choice['id'] ] = ! empty( $choice['default'] ); + } + printf( + '', + esc_attr( $amp_state_id ), + wp_json_encode( $state ) + ); + } + + printf( + '
                ', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) + ); + + foreach ( $choices as $key => $choice ) { + $label = $this->get_choices_label( $choice['label']['text'] ?? '', $key, $field ); + + if ( wpforms_is_amp() && ( $using_image_choices || $using_icon_choices ) ) { + $choice['container']['attr']['[class]'] = sprintf( + '%s + ( %s[%s] ? " wpforms-selected" : "")', + wp_json_encode( implode( ' ', $choice['container']['class'] ) ), + $amp_state_id, + wp_json_encode( $choice['id'] ) + ); + } + + // If the field is required, has the label hidden, and has + // disclaimer mode enabled, so the required status in choice + // label. + $required = ''; + + if ( ! empty( $field['disclaimer_format'] ) && ! empty( $choice['required'] ) && ! empty( $field['label_hide'] ) ) { + $required = wpforms_get_field_required_label(); + } + + printf( + '
              • ', + wpforms_html_attributes( $choice['container']['id'], $choice['container']['class'], $choice['container']['data'], $choice['container']['attr'] ) + ); + + // The required constraint in HTML5 form validation does not work with checkbox groups, so omit in AMP. + $required_attr = wpforms_is_amp() && count( $choices ) > 1 ? '' : $choice['required']; + + if ( $using_image_choices ) { + + // Make sure the image choices are keyboard-accessible. + $choice['label']['attr']['tabindex'] = 0; + + if ( wpforms_is_amp() ) { + $choice['label']['attr']['on'] = sprintf( + 'tap:AMP.setState({ %s: { %s: ! %s[%s] } })', + wp_json_encode( $amp_state_id ), + wp_json_encode( $choice['id'] ), + $amp_state_id, + wp_json_encode( $choice['id'] ) + ); + $choice['label']['attr']['role'] = 'button'; + } + if ( is_array( $choice['label']['class'] ) && wpforms_is_empty_string( $label ) ) { + $choice['label']['class'][] = 'wpforms-field-label-inline-empty'; + } + + // Image choices. + printf( + ''; + + } elseif ( $using_icon_choices ) { + + if ( wpforms_is_amp() ) { + $choice['label']['attr']['on'] = sprintf( + 'tap:AMP.setState({ %s: { %s: ! %s[%s] } })', + wp_json_encode( $amp_state_id ), + wp_json_encode( $choice['id'] ), + $amp_state_id, + wp_json_encode( $choice['id'] ) + ); + $choice['label']['attr']['role'] = 'button'; + } + + // Icon Choices. + wpforms()->obj( 'icon_choices' )->field_display( $field, $choice, 'checkbox' ); + + } else { + + // Normal display. + printf( + '', + wpforms_html_attributes( $choice['id'], $choice['class'], $choice['data'], $choice['attr'] ), + esc_attr( $required_attr ), + checked( '1', $choice['default'], false ) + ); + + printf( + '', + wpforms_html_attributes( $choice['label']['id'], $choice['label']['class'], $choice['label']['data'], $choice['label']['attr'] ), + wp_kses_post( $label ), + wp_kses( + $required, + [ + 'span' => [ + 'class' => true, + ], + ] + ) + ); + } + + echo '
              • '; + } + + echo '
              '; + } + + /** + * Validate field on form submit. + * + * @since 1.5.2 + * + * @param int $field_id Field ID. + * @param array $field_submit Submitted field value (raw data). + * @param array $form_data Form data. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $field_id = (int) $field_id; + $field = $form_data['fields'][ $field_id ]; + + // Skip validation if field is dynamic and choices are empty. + if ( $this->is_dynamic_choices_empty( $field, $form_data ) ) { + return; + } + + $field_submit = (array) $field_submit; + + $this->validate_field_choice_limit( $field_id, $field_submit, $form_data ); + + // Basic required check - If field is marked as required, check for entry data. + if ( + ! empty( $form_data['fields'][ $field_id ]['required'] ) && + ( + empty( $field_submit ) || + ( + count( $field_submit ) === 1 && + ( ! isset( $field_submit[0] ) || (string) $field_submit[0] === '' ) + ) + ) + ) { + $error = wpforms_get_required_label(); + } + + if ( ! empty( $error ) ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = $error; + } + } + + /** + * Format and sanitize field. + * + * @since 1.0.2 + * + * @param int $field_id Field ID. + * @param array $field_submit Submitted form data. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field_submit = (array) $field_submit; + $field = $form_data['fields'][ $field_id ]; + $dynamic = ! empty( $field['dynamic_choices'] ) ? $field['dynamic_choices'] : false; + $name = sanitize_text_field( $field['label'] ); + $value_raw = wpforms_sanitize_array_combine( $field_submit ); + + $data = [ + 'name' => $name, + 'value' => '', + 'value_raw' => $value_raw, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + + if ( 'post_type' === $dynamic && ! empty( $field['dynamic_post_type'] ) ) { + + // Dynamic population is enabled using post type. + $value_raw = implode( ',', array_map( 'absint', $field_submit ) ); + $data['value_raw'] = $value_raw; + $data['dynamic'] = 'post_type'; + $data['dynamic_items'] = $value_raw; + $data['dynamic_post_type'] = $field['dynamic_post_type']; + $posts = []; + + foreach ( $field_submit as $id ) { + $post = get_post( $id ); + + if ( ! is_wp_error( $post ) && ! empty( $post ) && $data['dynamic_post_type'] === $post->post_type ) { + $posts[] = esc_html( wpforms_get_post_title( $post ) ); + } + } + + $data['value'] = ! empty( $posts ) ? wpforms_sanitize_array_combine( $posts ) : ''; + + } + elseif ( 'taxonomy' === $dynamic && ! empty( $field['dynamic_taxonomy'] ) ) { + + // Dynamic population is enabled using taxonomy. + $value_raw = implode( ',', array_map( 'absint', $field_submit ) ); + $data['value_raw'] = $value_raw; + $data['dynamic'] = 'taxonomy'; + $data['dynamic_items'] = $value_raw; + $data['dynamic_taxonomy'] = $field['dynamic_taxonomy']; + $terms = []; + + foreach ( $field_submit as $id ) { + $term = get_term( $id, $field['dynamic_taxonomy'] ); + + if ( ! is_wp_error( $term ) && ! empty( $term ) ) { + $terms[] = esc_html( wpforms_get_term_name( $term ) ); + } + } + + $data['value'] = ! empty( $terms ) ? wpforms_sanitize_array_combine( $terms ) : ''; + + } else { + + // Normal processing, dynamic population is off. + $choice_keys = []; + + // If show_values is true, that means values posted are the raw values + // and not the labels. So we need to set label values. Also store + // the choice keys. + if ( ! empty( $field['show_values'] ) && (int) $field['show_values'] === 1 ) { + + foreach ( $field_submit as $item ) { + foreach ( $field['choices'] as $key => $choice ) { + // Check if the submitted value is the same as the choice value or if the value is empty and the key matches. + // Skip if the submitted value is empty. + if ( ( ! empty( $item ) && $item === $choice['value'] ) || ( empty( $choice['value'] ) && (int) str_replace( 'Choice ', '', $item ) === $key ) ) { + $value[] = $choice['label']; + $choice_keys[] = $key; + + break; + } + } + } + + $data['value'] = ! empty( $value ) ? wpforms_sanitize_array_combine( $value ) : ''; + + } else { + + $data['value'] = $value_raw; + + // Determine choices keys, this is needed for image choices. + foreach ( $field_submit as $item ) { + foreach ( $field['choices'] as $key => $choice ) { + /* translators: %s - choice number. */ + if ( $item === $choice['label'] || $item === sprintf( esc_html__( 'Choice %s', 'wpforms-lite' ), $key ) ) { + $choice_keys[] = $key; + + break; + } + } + } + } + + // Images choices are enabled, lookup and store image URLs. + if ( ! empty( $choice_keys ) && ! empty( $field['choices_images'] ) ) { + + $data['images'] = []; + + foreach ( $choice_keys as $key ) { + $data['images'][] = ! empty( $field['choices'][ $key ]['image'] ) ? esc_url_raw( $field['choices'][ $key ]['image'] ) : ''; + } + } + } + + // Push field details to be saved. + wpforms()->obj( 'process' )->fields[ $field_id ] = $data; + } +} + +new WPForms_Field_Checkbox(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-email.php b/wp-content/plugins/wpforms-lite/includes/fields/class-email.php new file mode 100755 index 00000000..227ca801 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-email.php @@ -0,0 +1,1397 @@ +name = esc_html__( 'Email', 'wpforms-lite' ); + $this->keywords = esc_html__( 'user', 'wpforms-lite' ); + $this->type = 'email'; + $this->icon = 'fa-envelope-o'; + $this->order = 170; + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + // Define additional field properties. + add_filter( 'wpforms_field_properties_email', [ $this, 'field_properties' ], 5, 3 ); + + // Set field to default to required. + add_filter( 'wpforms_field_new_required', [ $this, 'default_required' ], 10, 2 ); + + // Set confirmation status to option wrapper class. + add_filter( 'wpforms_builder_field_option_class', [ $this, 'field_option_class' ], 10, 2 ); + + add_action( 'wp_ajax_wpforms_restricted_email', [ $this, 'ajax_check_restricted_email' ] ); + add_action( 'wp_ajax_nopriv_wpforms_restricted_email', [ $this, 'ajax_check_restricted_email' ] ); + + add_action( 'wp_ajax_wpforms_sanitize_restricted_rules', [ $this, 'ajax_sanitize_restricted_rules' ] ); + add_action( 'wp_ajax_wpforms_sanitize_default_email', [ $this, 'ajax_sanitize_default_email' ] ); + + add_filter( 'wpforms_save_form_args', [ $this, 'save_form_args' ], 11, 3 ); + + add_filter( 'wpforms_builder_strings', [ $this, 'add_builder_strings' ], 10, 2 ); + + // This field requires fieldset+legend instead of the field label. + add_filter( "wpforms_frontend_modern_is_field_requires_fieldset_{$this->type}", [ $this, 'is_field_requires_fieldset' ], PHP_INT_MAX, 2 ); + } + + /** + * Define additional field properties. + * + * @since 1.3.7 + * + * @param array $properties List field properties. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + // Prevent "spell-jacking" of email addresses. + $properties['inputs']['primary']['attr']['spellcheck'] = 'false'; + + if ( ! empty( $field['confirmation'] ) ) { + $properties = $this->confirmation_field_properties( $properties, $field, $form_data ); + } + if ( ! empty( $field['filter_type'] ) ) { + $properties = $this->filter_type_field_properties( $properties, $field, $form_data ); + } + + return $properties; + } + + /** + * Define the confirmation field properties. + * + * @since 1.6.3 + * + * @param array $properties List field properties. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function confirmation_field_properties( $properties, $field, $form_data ) { + $form_id = absint( $form_data['id'] ); + $field_id = wpforms_validate_field_id( $field['id'] ); + + // Email confirmation setting enabled. + $props = [ + 'inputs' => [ + 'primary' => [ + 'block' => [ + 'wpforms-field-row-block', + 'wpforms-one-half', + 'wpforms-first', + ], + 'class' => [ + 'wpforms-field-email-primary', + ], + 'sublabel' => [ + 'hidden' => ! empty( $field['sublabel_hide'] ), + 'value' => esc_html__( 'Email', 'wpforms-lite' ), + ], + ], + 'secondary' => [ + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][secondary]", + 'value' => '', + 'placeholder' => ! empty( $field['confirmation_placeholder'] ) ? $field['confirmation_placeholder'] : '', + 'spellcheck' => 'false', + ], + 'block' => [ + 'wpforms-field-row-block', + 'wpforms-one-half', + ], + 'class' => [ + 'wpforms-field-email-secondary', + ], + 'data' => [ + 'rule-confirm' => '#' . $properties['inputs']['primary']['id'], + ], + 'id' => "wpforms-{$form_id}-field_{$field_id}-secondary", + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'sublabel' => [ + 'hidden' => ! empty( $field['sublabel_hide'] ), + 'value' => esc_html__( 'Confirm Email', 'wpforms-lite' ), + ], + 'value' => '', + ], + ], + ]; + + $properties = array_merge_recursive( $properties, $props ); + + // Input Primary: adjust name. + $properties['inputs']['primary']['attr']['name'] = "wpforms[fields][{$field_id}][primary]"; + + // Input Primary: remove size and error classes. + $properties['inputs']['primary']['class'] = array_diff( + $properties['inputs']['primary']['class'], + [ + 'wpforms-field-' . sanitize_html_class( $field['size'] ), + 'wpforms-error', + ] + ); + + // Input Primary: add error class if needed. + if ( ! empty( $properties['error']['value']['primary'] ) ) { + $properties['inputs']['primary']['class'][] = 'wpforms-error'; + } + + // Input Secondary: add error class if needed. + if ( ! empty( $properties['error']['value']['secondary'] ) ) { + $properties['inputs']['secondary']['class'][] = 'wpforms-error'; + } + + // Input Secondary: add required class if needed. + if ( ! empty( $field['required'] ) ) { + $properties['inputs']['secondary']['class'][] = 'wpforms-field-required'; + } + + // Remove reference to an input element to prevent duplication. + if ( empty( $field['sublabel_hide'] ) ) { + unset( $properties['label']['attr']['for'] ); + } + + return $properties; + } + + /** + * Define the filter field properties. + * + * @since 1.6.3 + * + * @param array $properties List field properties. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function filter_type_field_properties( $properties, $field, $form_data ) { + + if ( ! empty( $field['filter_type'] ) && ! empty( $field[ $field['filter_type'] ] ) ) { + $properties['inputs']['primary']['data']['rule-restricted-email'] = true; + } + + return $properties; + } + + /** + * Field should default to being required. + * + * @since 1.0.9 + * @param bool $required + * @param array $field + * @return bool + */ + public function default_required( $required, $field ) { + + if ( 'email' === $field['type'] ) { + return true; + } + return $required; + } + + /** + * Add class to field options wrapper to indicate if field confirmation is + * enabled. + * + * @since 1.3.0 + * + * @param string $class Class strings. + * @param array $field Current field. + * + * @return string + */ + public function field_option_class( $class, $field ) { + + if ( 'email' !== $field['type'] ) { + return $class; + } + + $class .= isset( $field['confirmation'] ) ? ' wpforms-confirm-enabled' : ' wpforms-confirm-disabled'; + if ( ! empty( $field['filter_type'] ) ) { + $class .= ' wpforms-filter-' . $field['filter_type']; + } + + return $class; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Confirmation toggle. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'confirmation', + 'value' => isset( $field['confirmation'] ) ? '1' : '0', + 'desc' => esc_html__( 'Enable Email Confirmation', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to ask users to provide an email address twice.', 'wpforms-lite' ), + ], + false + ); + + $args = [ + 'slug' => 'confirmation', + 'content' => $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Confirmation Placeholder. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'confirmation_placeholder', + 'value' => esc_html__( 'Confirmation Placeholder Text', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for the confirmation field placeholder.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'confirmation_placeholder', + 'value' => ! empty( $field['confirmation_placeholder'] ) ? esc_attr( $field['confirmation_placeholder'] ) : '', + ], + false + ); + + $args = [ + 'slug' => 'confirmation_placeholder', + 'content' => $lbl . $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Default value. + $this->field_option( 'default_value', $field ); + + $filter_type_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'filter_type', + 'value' => esc_html__( 'Allowlist / Denylist', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Restrict which email addresses are allowed. Be sure to separate each email address with a comma.', 'wpforms-lite' ), + ], + false + ); + + $filter_type_field = $this->field_element( + 'select', + $field, + [ + 'slug' => 'filter_type', + 'value' => ! empty( $field['filter_type'] ) ? esc_attr( $field['filter_type'] ) : '', + 'options' => [ + '' => esc_html__( 'None', 'wpforms-lite' ), + 'allowlist' => esc_html__( 'Allowlist', 'wpforms-lite' ), + 'denylist' => esc_html__( 'Denylist', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'filter_type', + 'content' => $filter_type_label . $filter_type_field, + ] + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'allowlist', + 'content' => $this->field_element( + 'textarea', + $field, + [ + 'slug' => 'allowlist', + 'value' => ! empty( $field['allowlist'] ) ? esc_attr( $this->decode_email_patterns_rules_list( $field['allowlist'] ) ) : '', + ], + false + ), + ] + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'denylist', + 'content' => $this->field_element( + 'textarea', + $field, + [ + 'slug' => 'denylist', + 'value' => ! empty( $field['denylist'] ) ? esc_attr( $this->decode_email_patterns_rules_list( $field['denylist'] ) ) : '', + ], + false + ), + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Hide sublabels. + $this->field_option( 'sublabel_hide', $field ); + + // Disable email suggestions. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'disable_suggestions', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'disable_suggestions', + 'value' => isset( $field['disable_suggestions'] ) ? '1' : '0', + 'desc' => esc_html__( 'Disable Suggestions', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Prevent email suggestions for common typos. Enable this if you find the suggestions distracting.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * @param array $field + */ + public function field_preview( $field ) { + + // Define data. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $confirm_placeholder = ! empty( $field['confirmation_placeholder'] ) ? $field['confirmation_placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + $confirm = ! empty( $field['confirmation'] ) ? 'enabled' : 'disabled'; + + // Label. + $this->field_preview_option( 'label', $field ); + ?> + +
              + +
              + + +
              + +
              + + +
              + +
              + + field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.0.0 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $primary = $field['properties']['inputs']['primary']; + $secondary = ! empty( $field['properties']['inputs']['secondary'] ) ? $field['properties']['inputs']['secondary'] : []; + + $is_confirmation_enabled = ! empty( $field['confirmation'] ); + $is_suggestions_disabled = ! empty( $field['disable_suggestions'] ); + + // Set data attributes if suggestions are disabled. + if ( $is_suggestions_disabled ) { + $primary['data']['disable-suggestions'] = true; + + if ( ! empty( $secondary ) ) { + $secondary['data']['disable-suggestions'] = true; + } + } + + // Standard email field. + if ( ! $is_confirmation_enabled ) { + + // Primary field. + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ), + esc_attr( $primary['required'] ) + ); + $this->field_display_error( 'primary', $field ); + + // Confirmation email field configuration. + } else { + + // Row wrapper. + echo '
              '; + + // Primary field. + echo '
              '; + $this->field_display_sublabel( 'primary', 'before', $field ); + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ), + esc_attr( $primary['required'] ) + ); + $this->field_display_sublabel( 'primary', 'after', $field ); + $this->field_display_error( 'primary', $field ); + echo '
              '; + + // Secondary field. + echo '
              '; + $this->field_display_sublabel( 'secondary', 'before', $field ); + printf( + '', + wpforms_html_attributes( $secondary['id'], $secondary['class'], $secondary['data'], $secondary['attr'] ), + esc_attr( $secondary['required'] ) + ); + $this->field_display_sublabel( 'secondary', 'after', $field ); + $this->field_display_error( 'secondary', $field ); + echo '
              '; + + echo '
              '; + + } + } + + /** + * Format and sanitize field. + * + * @since 1.3.0 + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + // Define data. + if ( is_array( $field_submit ) ) { + $value = ! empty( $field_submit['primary'] ) ? $field_submit['primary'] : ''; + } else { + $value = ! empty( $field_submit ) ? $field_submit : ''; + } + + if ( $value && ! wpforms_is_email( $value ) ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'The provided email is not valid.', 'wpforms-lite' ); + + return; + } + + $name = ! empty( $form_data['fields'][ $field_id ] ['label'] ) ? $form_data['fields'][ $field_id ]['label'] : ''; + + // Set final field details. + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => sanitize_text_field( $name ), + 'value' => sanitize_text_field( $this->decode_punycode( $value ) ), + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } + + /** + * Validate field on form submit. + * + * @since 1.0.0 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $form_id = (int) $form_data['id']; + + parent::validate( $field_id, $field_submit, $form_data ); + + if ( ! is_array( $field_submit ) && ! empty( $field_submit ) ) { + $field_submit = [ + 'primary' => $field_submit, + ]; + } + + if ( empty( $field_submit['primary'] ) ) { + return; + } + + $process = wpforms()->obj( 'process' ); + + if ( ! $process ) { + return; + } + + $field_submit['primary'] = $this->email_encode_punycode( $field_submit['primary'] ); + + if ( ! $field_submit['primary'] ) { + $process->errors[ $form_id ][ $field_id ] = esc_html__( 'The provided email is not valid.', 'wpforms-lite' ); + + return; + } + + // Validate email field with confirmation. + if ( isset( $form_data['fields'][ $field_id ]['confirmation'] ) && ! empty( $field_submit['secondary'] ) ) { + $field_submit['secondary'] = $this->email_encode_punycode( $field_submit['secondary'] ); + + if ( ! $field_submit['secondary'] ) { + $process->errors[ $form_id ][ $field_id ] = esc_html__( 'The provided email is not valid.', 'wpforms-lite' ); + + return; + } + + if ( $field_submit['primary'] !== $field_submit['secondary'] ) { + $process->errors[ $form_id ][ $field_id ] = esc_html__( 'The provided emails do not match.', 'wpforms-lite' ); + + return; + } + + if ( ! $this->is_restricted_email( $field_submit['primary'], $form_data['fields'][ $field_id ] ) ) { + $process->errors[ $form_id ][ $field_id ] = wpforms_setting( 'validation-email-restricted', esc_html__( 'This email address is not allowed.', 'wpforms-lite' ) ); + + return; + } + } + + // Validate regular email field, without confirmation. + if ( ! isset( $form_data['fields'][ $field_id ]['confirmation'] ) && ! $this->is_restricted_email( $field_submit['primary'], $form_data['fields'][ $field_id ] ) ) { + $process->errors[ $form_id ][ $field_id ] = wpforms_setting( 'validation-email-restricted', esc_html__( 'This email address is not allowed.', 'wpforms-lite' ) ); + } + } + + /** + * Ajax handler to detect restricted email. + * + * @since 1.6.3 + * @since 1.9.1 Added repeater field compatibility. + */ + public function ajax_check_restricted_email() { + + $form_id = filter_input( INPUT_POST, 'form_id', FILTER_SANITIZE_NUMBER_INT ); + $field_id = absint( filter_input( INPUT_POST, 'field_id', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ); + $email = filter_input( INPUT_POST, 'email', FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_NO_ENCODE_QUOTES ); + + // The valid email can contain such characters: !#$%&'*+/=?^_`{|}~-. + // After filtering the email, we need to decode the `&`, otherwise the email with `&` couldn't be properly recognized. + $email = str_replace( '&', '&', $email ); + + if ( ! $form_id || ! $field_id || ! $email ) { + wp_send_json_error(); + } + + $form_data = wpforms()->obj( 'form' )->get( + $form_id, + [ 'content_only' => true ] + ); + + if ( empty( $form_data['fields'][ $field_id ] ) ) { + wp_send_json_error(); + } + + wp_send_json_success( + $this->is_restricted_email( $email, $form_data['fields'][ $field_id ] ) + ); + } + + /** + * Sanitize restricted rules. + * + * @since 1.6.3 + */ + public function ajax_sanitize_restricted_rules() { + + $this->ajax_sanitize( self::RULES ); + } + + /** + * Sanitize default email. + * + * @since 1.7.5 + */ + public function ajax_sanitize_default_email() { + + $this->ajax_sanitize( self::EMAIL ); + } + + /** + * Sanitize email options input. + * + * @since 1.7.5 + * + * @param string $type Type of sanitization. + * + * @return void + */ + private function ajax_sanitize( $type ) { + + // Run a security check. + check_ajax_referer( 'wpforms-builder', 'nonce' ); + + $content = filter_input( INPUT_GET, 'content', FILTER_SANITIZE_FULL_SPECIAL_CHARS ); + $content = wpforms_json_decode( $content, true ); + + if ( ! $content ) { + wp_send_json_error(); + } + + $this->restricted_rules = []; + + switch ( $type ) { + case self::RULES: + $current = $content['current']; + $other = $current === 'allow' ? 'deny' : 'allow'; + $current_rules = $this->sanitize_restricted_rules( $content[ $current ] ); + $other_rules = $this->sanitize_restricted_rules( $content[ $other ] ); + $intersect_rules = array_intersect( $current_rules, $other_rules ); + $current_rules = array_diff( $current_rules, $intersect_rules ); + $content = [ + 'currentField' => $this->decode_email_patterns_rules_array( $current_rules ), + 'intersect' => str_replace( + PHP_EOL, + '
              ', + $this->decode_email_patterns_rules_array( $intersect_rules ) + ), + ]; + break; + + case self::EMAIL: + list( $local, $domain ) = $this->parse_email_pattern( $content ); + + $local = $this->sanitize_local_pattern( $local ); + $domain = $this->sanitize_domain_pattern( $domain ); + + $content = (string) wpforms_is_email( $this->get_pattern( $local, $domain ) ); + break; + + default: + break; + } + + if ( ! empty( $this->restricted_rules ) ) { + $content['restricted'] = count( $this->restricted_rules ); + } + + wp_send_json_success( $content ); + } + + /** + * Verify that an email pattern is valid. + * + * @since 1.7.5 + * + * @param string $pattern Email pattern. + * + * @return string|false + */ + private function is_email_pattern( $pattern ) { + + if ( ! $pattern ) { + // Empty pattern is not valid. + return false; + } + + list( $local, $domain ) = $this->parse_email_pattern( $pattern ); + + $local = $this->sanitize_local_pattern( $local ); + $domain = $this->sanitize_domain_pattern( $domain ); + + if ( mb_strpos( $pattern, '@' ) === false ) { + return $this->is_email_pattern_without_at( $local ); + } + + $domain_check = str_replace( '*', '', $domain ); + $domain_check = $this->maybe_adjust_domain( $domain_check ); + $pattern_check = $this->get_pattern( $local, $domain_check ); + + if ( wpforms_is_email( $pattern_check ) ) { + return $this->get_pattern( $local, $domain ); + } + + return false; + } + + /** + * Sanitize the local or domain part of the email pattern. + * + * @since 1.7.5 + * + * @param string $part Local or domain part of the email pattern. + * @param string $pattern Sanitization pattern. + * + * @return string + */ + private function sanitize_part_pattern( $part, $pattern ) { + + /** + * Smart tag placeholder. Should contain allowed chars only. + * See patterns in sanitize_local_pattern(), sanitize_domain_pattern(). + */ + $smart_tag_placeholder = '-wpforms-smart-tag-'; + + $smart_tag_pattern = '/{.+?}/'; + $smart_tags = []; + + if ( preg_match_all( $smart_tag_pattern, $part, $m ) ) { + $smart_tags = $m[0]; + + foreach ( $smart_tags as $smart_tag ) { + $part = preg_replace( + '/' . preg_quote( $smart_tag, '/' ) . '/', + $smart_tag_placeholder, + $part, + 1 + ); + } + } + + // Sanitize part by pattern. + $part = preg_replace( $pattern, '', $part ); + + foreach ( $smart_tags as $smart_tag ) { + $part = preg_replace( + '/' . preg_quote( $smart_tag_placeholder, '/' ) . '/', + $smart_tag, + $part, + 1 + ); + } + + return $part; + } + + /** + * Sanitize the local part of the email pattern. + * + * @since 1.7.5 + * + * @param string $local Local part of the email pattern. + * + * @return string + */ + private function sanitize_local_pattern( $local ) { + + /** + * This regexp is from is_email() WP core function + * with added international characters and + * asterisk [*] for patterns. + */ + return $this->sanitize_part_pattern( $local, '/[^a-zA-Z0-9\x{0080}-\x{0FFF}!#$%&\'*+\/=?^_`{|}~.-]/u' ); + } + + /** + * Sanitize the domain part of the email pattern. + * + * @since 1.7.5 + * + * @param string $domain Domain part of the email pattern. + * + * @return string + */ + private function sanitize_domain_pattern( $domain ) { + + /** + * This regexp is from is_email() WP core function + * with added international characters, + * dot [.] for the whole domain part and + * asterisk [*] for patterns. + */ + return $this->sanitize_part_pattern( $domain, '/[^a-z0-9\x{0080}-\x{FFFF}-.*]/u' ); + } + + /** + * Maybe replace empty subdomains with templates. + * + * @since 1.7.5 + * + * @param string $domain Email domain. + * + * @return string + */ + private function maybe_adjust_domain( $domain ) { + + $domain_subs = array_pad( explode( '.', $domain ), 2, '' ); + $domain_template_subs = [ 'a', 'me' ]; + + foreach ( $domain_template_subs as $index => $domain_template_sub ) { + $domain_subs[ $index ] = trim( $domain_subs[ $index ] ); + + if ( ! $domain_subs[ $index ] ) { + $domain_subs[ $index ] = $domain_template_sub; + } + } + + return implode( '.', $domain_subs ); + } + + /** + * Get pattern from local and domain parts. + * + * @since 1.7.5 + * + * @param string $local Local part. + * @param string $domain Domain part. + * + * @return string + */ + private function get_pattern( $local, $domain = '' ) { + + return implode( '@', array_filter( [ $local, $domain ] ) ); + } + + /** + * Sanitize restricted rules. + * + * @since 1.6.3 + * + * @param string $content Content. + * + * @return array + */ + private function sanitize_restricted_rules( $content ) { + + $patterns = array_filter( preg_split( '/\r\n|\r|\n|,/', $content ) ); + + foreach ( $patterns as $key => $pattern ) { + $pattern = mb_strtolower( trim( $pattern ) ); + $email_pattern = $this->is_email_pattern( $pattern ); + + if ( ! $email_pattern ) { + unset( $patterns[ $key ] ); + $this->restricted_rules[] = $pattern; + + continue; + } + + $patterns[ $key ] = $this->encode_punycode( $email_pattern ); + } + + return array_unique( $patterns ); + } + + /** + * The check is a restricted email. + * + * @since 1.6.3 + * + * @param string $email Email string. + * @param array $field Field data. + * + * @return bool + */ + private function is_restricted_email( $email, $field ) { + + if ( empty( $field['filter_type'] ) || empty( $field[ $field['filter_type'] ] ) ) { + return true; + } + + $email = mb_strtolower( trim( $email ) ); + + if ( ! wpforms_is_email( $email ) ) { + return false; + } + + // Chrome and Edge encode to punycode, but domain part only. + // Firefox sends intl email as is. + if ( $this->is_encoded_punycode( $email ) ) { + $email = $this->decode_punycode( $email ); + } + + $patterns = $this->sanitize_restricted_rules( $field[ $field['filter_type'] ] ); + $patterns = array_map( [ $this, 'decode_punycode' ], $patterns ); + $patterns = array_map( [ $this, 'sanitize_email_pattern' ], $patterns ); + + $check = $field['filter_type'] === 'allowlist'; + + foreach ( $patterns as $pattern ) { + if ( preg_match( '/' . $pattern . '/', $email ) ) { + return $check; + } + } + + return ! $check; + } + + /** + * Sanitize from email patter a REGEX pattern. + * + * @since 1.6.3 + * + * @param string $pattern Pattern line. + * + * @return string + */ + private function sanitize_email_pattern( $pattern ) { + + $chars = [ '.', '*', '/' ]; + $replace = [ '\.', '.*', '\/' ]; + + // Create regex pattern from a string. + return '^' . str_replace( $chars, $replace, $pattern ) . '$'; + } + + /** + * Sanitize allow/deny list and default value before saving. + * + * @since 1.6.8 + * + * @param array $form Form array which is usable with `wp_update_post()`. + * @param array $data Data retrieved from $_POST and processed. + * @param array $args Empty by default, may contain custom data not intended to be saved, but used for processing. + * + * @return array + */ + public function save_form_args( $form, $data, $args ) { + + // Get a filtered form content. + $form_data = json_decode( stripslashes( $form['post_content'] ), true ); + + if ( ! empty( $form_data['fields'] ) ) { + foreach ( (array) $form_data['fields'] as $key => $field ) { + if ( empty( $field['type'] ) || $field['type'] !== 'email' ) { + continue; + } + + $form_data['fields'][ $key ]['allowlist'] = ! empty( $field['allowlist'] ) ? implode( PHP_EOL, $this->sanitize_restricted_rules( $field['allowlist'] ) ) : ''; + $form_data['fields'][ $key ]['denylist'] = ! empty( $field['denylist'] ) ? implode( PHP_EOL, $this->sanitize_restricted_rules( $field['denylist'] ) ) : ''; + $form_data['fields'][ $key ]['default_value'] = isset( $field['default_value'] ) ? wpforms_is_email( $field['default_value'] ) : ''; + } + } + + $form['post_content'] = wpforms_encode( $form_data ); + + return $form; + } + + /** + * Add a custom JS i18n strings for the builder. + * + * @since 1.7.5 + * + * @param array $strings List of strings. + * @param array $form Current form. + * + * @return array + */ + public function add_builder_strings( $strings, $form ) { + + $email_strings = [ + 'allow_deny_lists_intersect' => esc_html__( + 'We’ve detected the same text in your allowlist and denylist. To prevent a conflict, we’ve removed the following text from the list you’re currently viewing:', + 'wpforms-lite' + ), + 'restricted_rules' => esc_html__( + 'At least one of the emails in your list contained an error and has been removed.', + 'wpforms-lite' + ), + 'restricted_default_email' => esc_html__( + 'The provided email is not valid.', + 'wpforms-lite' + ), + ]; + + return array_merge( $strings, $email_strings ); + } + + /** + * Get Punycode lib class. + * + * @since 1.6.9 + * + * @return WPForms\Vendor\TrueBV\Punycode + */ + private function get_punycode() { + + static $punycode; + + if ( ! $punycode ) { + $punycode = new Punycode(); + } + + return $punycode; + } + + /** + * Get email patterns parts splitted by @ and *. + * + * @since 1.6.9 + * + * @param string $email_pattern Email pattern. + * + * @return array + */ + private function get_email_pattern_parts( $email_pattern ) { + + $parts = preg_split( '/[*@.]/', $email_pattern, - 1, PREG_SPLIT_OFFSET_CAPTURE ); + + if ( empty( $parts ) ) { + return []; + } + + foreach ( $parts as $key => $part ) { + + // Replace split symbol position to the split symbol. + $part[1] = $part[1] > 0 ? $email_pattern[ $part[1] - 1 ] : ''; + + $parts[ $key ] = $part; + } + + return $parts; + } + + /** + * Glue email patterns parts. + * + * @since 1.6.9 + * + * @param array $parts Email pattern parts. + * + * @return string + */ + private function glue_email_pattern_parts( $parts ) { + + $email_pattern = ''; + + foreach ( $parts as $part ) { + $email_pattern .= $part[1] . $part[0]; + } + + return $email_pattern; + } + + /** + * Decode email patterns rules array. + * + * @since 1.7.5 + * + * @param array $rules_arr Patterns rules array. + * + * @return string + */ + private function decode_email_patterns_rules_array( $rules_arr ) { + + return implode( + PHP_EOL, + array_filter( + array_map( + function ( $rule ) { + $rule = mb_strtolower( trim( $rule ) ); + + return $this->is_email_pattern( $rule ) ? $this->decode_punycode( $rule ) : ''; + }, + $rules_arr + ) + ) + ); + } + + /** + * Decode email patterns rules list. + * + * @since 1.6.9 + * + * @param string $rules Patterns rules list. + * + * @return string + */ + private function decode_email_patterns_rules_list( $rules ) { + + return $this->decode_email_patterns_rules_array( preg_split( '/\r\n|\r|\n|,/', $rules ) ); + } + + /** + * Encode email. + * + * @since 1.7.3 + * + * @param string $email Email. + * + * @return string + */ + private function email_encode_punycode( $email ) { + + if ( ! wpforms_is_email( $email ) ) { + return ''; + } + + return $this->encode_punycode( $email ); + } + + /** + * Is email encoded. + * + * @since 1.7.5 + * + * @param string $email Email. + * + * @return bool + */ + private function is_encoded_punycode( $email ) { + + list( $local, $domain ) = $this->parse_email_pattern( $email ); + + // Check xn-- prefix in the beginning of domain part only. + return strpos( $domain, 'xn--' ) === 0; + } + + /** + * Encode email pattern. + * + * @since 1.6.9 + * + * @param string $email_pattern Email pattern. + * + * @return string + */ + private function encode_punycode( $email_pattern ) { + + try { + $encoded = $this->transform_punycode( $email_pattern, [ $this->get_punycode(), 'encode' ] ); + } catch ( Exception $e ) { + return ''; + } + + return $encoded; + } + + /** + * Decode email pattern. + * + * @since 1.6.9 + * + * @param string $email_pattern Email pattern. + * + * @return string + */ + private function decode_punycode( $email_pattern ) { + + return $this->transform_punycode( $email_pattern, [ $this->get_punycode(), 'decode' ] ); + } + + /** + * Transform email pattern. + * + * @since 1.6.9 + * + * @param string $email_pattern Email pattern. + * @param callable $callback Punycode callback. + * + * @return string + */ + private function transform_punycode( $email_pattern, callable $callback ) { + + $parts = $this->get_email_pattern_parts( $email_pattern ); + + foreach ( $parts as $key => $part ) { + if ( ! $part[0] ) { + continue; + } + + $parts[ $key ][0] = call_user_func( $callback, $part[0] ); + } + + return $this->glue_email_pattern_parts( $parts ); + } + + /** + * Parse email pattern and return local and domain parts (maybe empty). + * + * @since 1.7.5 + * + * @param string $pattern Email pattern. + * + * @return array + */ + private function parse_email_pattern( $pattern ) { + + return array_pad( explode( '@', $pattern ), 2, '' ); + } + + /** + * Verify that an email pattern without @ is valid. + * + * @since 1.7.5 + * + * @param string $pattern Local part. + * + * @return false|string + */ + private function is_email_pattern_without_at( $pattern ) { + + if ( mb_strpos( $pattern, '*' ) === false ) { + return false; + } + + /** + * If pattern does not have @ separator, we should check the pattern twice, assuming: + * case 1 - pattern is a local pattern, + * case 2 - pattern is a domain pattern. + */ + + // Check case 1. + $pattern_check = $this->get_pattern( $pattern, 'a.me' ); + + if ( wpforms_is_email( $pattern_check ) ) { + return $this->get_pattern( $pattern ); + } + + // Check case 2. + // Asterisk in the email is allowed in local part, but not in the domain part. + $pattern_check = $this->get_pattern( 'a', str_replace( '*', '', $pattern ) ); + + if ( wpforms_is_email( $pattern_check ) ) { + return $this->get_pattern( $pattern ); + } + + return false; + } + + /** + * Determine if the field requires fieldset instead of the regular field label. + * + * @since 1.8.1 + * + * @param bool $requires_fieldset True if requires fieldset. + * @param array $field Field data. + * + * @return bool + * + * @noinspection PhpUnusedParameterInspection + */ + public function is_field_requires_fieldset( $requires_fieldset, $field ) { + + return ! empty( $field['confirmation'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-gdpr-checkbox.php b/wp-content/plugins/wpforms-lite/includes/fields/class-gdpr-checkbox.php new file mode 100755 index 00000000..aa1a85fc --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-gdpr-checkbox.php @@ -0,0 +1,329 @@ +name = esc_html__( 'GDPR Agreement', 'wpforms-lite' ); + $this->type = 'gdpr-checkbox'; + $this->icon = 'fa-check-square-o'; + $this->order = 500; + $this->allow_read_only = false; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'I consent to having this website store my submitted information so they can respond to my inquiry.', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + // Set field to default to the required. + add_filter( 'wpforms_field_new_required', [ $this, 'field_default_required' ], 10, 2 ); + + // Define additional field properties. + add_filter( 'wpforms_field_properties_gdpr-checkbox', [ $this, 'field_properties' ], 5, 3 ); + } + + /** + * Field should default to being required. + * + * @since 1.4.6 + * + * @param bool $required Required status, true is required. + * @param array $field Field settings. + * + * @return bool + */ + public function field_default_required( $required, $field ) { + + if ( $this->type === $field['type'] ) { + return true; + } + + return $required; + } + + /** + * Define additional field properties. + * + * @since 1.4.6 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = absint( $field['id'] ); + $choices = ! empty( $field['choices'] ) ? $field['choices'] : []; + + // Remove primary input, unset for attribute for label. + unset( $properties['inputs']['primary'], $properties['label']['attr']['for'] ); + + // Set input container (ul) properties. + $properties['input_container'] = [ + 'class' => [], + 'data' => [], + 'attr' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}", + ]; + + // Set input properties. + foreach ( $choices as $key => $choice ) { + + $properties['inputs'][ $key ] = [ + 'container' => [ + 'attr' => [], + 'class' => [ "choice-{$key}" ], + 'data' => [], + 'id' => '', + ], + 'label' => [ + 'attr' => [ + 'for' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + ], + 'class' => [ 'wpforms-field-label-inline' ], + 'data' => [], + 'id' => '', + 'text' => $choice['label'], + ], + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][]", + 'value' => $choice['label'], + ], + 'class' => [], + 'data' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + 'image' => '', + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'default' => '', + ]; + } + + // Required class for pagebreak validation. + if ( ! empty( $field['required'] ) ) { + $properties['input_container']['class'][] = 'wpforms-field-required'; + } + + return $properties; + } + + /** + * Whether the current field can be populated dynamically. + * + * @since 1.9.4 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_dynamic_population_allowed( $properties, $field ): bool { + + return false; + } + + /** + * Field options panel inside the builder. + * + * @since 1.4.6 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + + // Field is always required. + $this->field_element( + 'text', + $field, + [ + 'type' => 'hidden', + 'slug' => 'required', + 'value' => '1', + ] + ); + + // -------------------------------------------------------------------// + // Basic field options + // -------------------------------------------------------------------// + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Choices. + $this->field_option( + 'choices', + $field, + [ + 'label' => esc_html__( 'Agreement', 'wpforms-lite' ), + ] + ); + + // Description. + $this->field_option( 'description', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + // -------------------------------------------------------------------// + // Advanced field options + // -------------------------------------------------------------------// + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.4.6 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + // Choices. + $this->field_preview_option( 'choices', $field ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.4.6 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $container = $field['properties']['input_container']; + $choices = $field['properties']['inputs']; + + printf( + '
                ', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) + ); + + foreach ( $choices as $choice ) { + $required = ''; + + if ( ! empty( $choice['required'] ) && ! empty( $field['label_hide'] ) ) { + $required = wpforms_get_field_required_label(); + } + + printf( + '
              • ', + wpforms_html_attributes( $choice['container']['id'], $choice['container']['class'], $choice['container']['data'], $choice['container']['attr'] ) + ); + // Normal display. + printf( + '', + wpforms_html_attributes( $choice['id'], $choice['class'], $choice['data'], $choice['attr'] ), + esc_attr( $choice['required'] ), + checked( '1', $choice['default'], false ) + ); + + printf( + '', + wpforms_html_attributes( $choice['label']['id'], $choice['label']['class'], $choice['label']['data'], $choice['label']['attr'] ), + wp_kses_post( $choice['label']['text'] ), + wp_kses_post( $required ) + ); + + echo '
              • '; + } + + echo '
              '; + } + + /** + * Format and sanitize field. + * + * @since 1.4.6 + * + * @param int $field_id Field ID. + * @param array $field_submit Submitted form data. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => ! empty( $form_data['fields'][ $field_id ]['label'] ) ? sanitize_text_field( $form_data['fields'][ $field_id ]['label'] ) : '', + 'value' => $form_data['fields'][ $field_id ]['choices'][1]['label'], + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } +} + +new WPForms_Field_GDPR_Checkbox(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-internal-information.php b/wp-content/plugins/wpforms-lite/includes/fields/class-internal-information.php new file mode 100755 index 00000000..72c30b10 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-internal-information.php @@ -0,0 +1,934 @@ +name = $this->is_editable() ? esc_html__( 'Internal Information', 'wpforms-lite' ) : esc_html__( 'This field is not editable', 'wpforms-lite' ); + $this->type = 'internal-information'; + $this->icon = 'fa fa-sticky-note-o'; + $this->order = 550; + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.7.6 + * + * @noinspection PhpUnnecessaryCurlyVarSyntaxInspection + */ + private function hooks() { + + add_filter( 'wpforms_entries_table_fields_disallow', [ $this, 'hide_column_in_entries_table' ], 10, 2 ); + add_filter( 'wpforms_field_preview_class', [ $this, 'add_css_class_for_field_wrapper' ], 10, 2 ); + add_filter( 'wpforms_field_new_class', [ $this, 'add_css_class_for_field_wrapper' ], 10, 2 ); + add_filter( "wpforms_pro_admin_entries_edit_is_field_displayable_{$this->type}", '__return_false' ); + add_filter( 'wpforms_builder_strings', [ $this, 'builder_strings' ], 10, 2 ); + add_filter( 'wpforms_frontend_form_data', [ $this, 'remove_internal_fields_on_front_end' ] ); + add_filter( 'wpforms_pro_fields_entry_preview_get_ignored_fields', [ $this, 'ignore_entry_preview' ] ); + add_filter( 'wpforms_process_before_form_data', [ $this, 'process_before_form_data' ], 10, 2 ); + add_filter( 'wpforms_field_preview_display_duplicate_button', [ $this, 'display_duplicate_button' ], 10, 3 ); + add_action( 'wpforms_builder_enqueues', [ $this, 'builder_enqueues' ] ); + add_action( 'wp_ajax_wpforms_builder_save_internal_information_checkbox', [ $this, 'save_internal_information_checkbox' ] ); + } + + /** + * Whether the current field can be populated dynamically. + * + * @since 1.7.6 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_dynamic_population_allowed( $properties, $field ): bool { + + return false; + } + + /** + * Whether the current field can be populated using a fallback. + * + * @since 1.7.6 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_fallback_population_allowed( $properties, $field ): bool { + + return false; + } + + /** + * Define field options to display in the left panel. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + */ + public function field_options( $field ) { + + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + $this->heading_option( $field ); + $this->field_option( 'description', $field ); + $this->expanded_description_option( $field ); + $this->cta_label_option( $field ); + $this->cta_link_option( $field ); + + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + $this->field_code( $field ); + } + + /** + * Define field preview on the right side on builder. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + */ + public function field_preview( $field ) { + + $class = wpforms_sanitize_classes( $field['class'] ?? '' ); + + printf( + '
              ', + esc_attr( $class ) + ); + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( 'fields/internal-information/icon-lightbulb' ); + + echo '
              '; + + $this->render_preview( 'heading', $field ); + $this->render_preview( 'description', $field ); + $this->render_preview( 'expanded-description', $field ); + $this->render_preview( 'addon', $field ); + + if ( $this->is_button_displayable( $field ) ) { + echo '
              '; + echo $this->render_custom_preview( 'cta-button', $field ); + echo '
              '; + } + + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + } + + /** + * Checks if the button is displayable. + * + * @since 1.7.6 + * + * @param array $field Field data. + * + * @return bool + */ + private function is_button_displayable( $field ) { + + return ! empty( $field['expanded-description'] ) || + ( ! empty( $field['cta-label'] ) && ! empty( $field['cta-link'] ) ) || + $this->is_editable(); + } + + /** + * Stub to make the field not visible in the front-end. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + * @param array $deprecated Field attributes. + * @param array $form_data Form data. + */ + public function field_display( $field, $deprecated, $form_data ) { + } + + /** + * Heading option. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + */ + private function heading_option( $field ) { + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'heading', + 'value' => esc_html__( 'Heading', 'wpforms-lite' ), + 'tooltip' => esc_attr__( 'Enter text for the form field heading.', 'wpforms-lite' ), + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'label', + 'value' => ! empty( $field['label'] ) ? esc_attr( $field['label'] ) : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'heading', + 'content' => $output, + ] + ); + } + + /** + * Expanded description option. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + */ + private function expanded_description_option( $field ) { + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'expanded-description', + 'value' => esc_html__( 'Expanded Content', 'wpforms-lite' ), + 'tooltip' => esc_attr__( 'Enter text for the form field expanded description.', 'wpforms-lite' ), + ], + false + ); + + $output .= $this->field_element( + 'textarea', + $field, + [ + 'slug' => 'expanded-description', + 'value' => ! empty( $field['expanded-description'] ) ? esc_html( $field['expanded-description'] ) : '', + ], + false + ); + + $output .= sprintf( + '

              %s

              ', + esc_html__( 'Adds an expandable content area below the description.', 'wpforms-lite' ) + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'expanded-description', + 'content' => $output, + ] + ); + } + + /** + * CTA label option. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + */ + private function cta_label_option( $field ) { + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'cta-label', + 'value' => esc_html__( 'CTA Label', 'wpforms-lite' ), + 'tooltip' => esc_attr__( 'Enter label for the form field call to action button. The label will be ignored if the field has extended description content: in that case button will be used to expand the description content.', 'wpforms-lite' ), + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'cta-label', + 'value' => ! empty( $field['cta-label'] ) ? esc_attr( $field['cta-label'] ) : esc_attr__( 'Learn More', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'cta-label', + 'content' => $output, + ] + ); + } + + /** + * CTA link option. + * + * @since 1.7.6 + * + * @param array $field Field data and settings. + */ + private function cta_link_option( $field ) { + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'cta-link', + 'value' => esc_html__( 'CTA Link', 'wpforms-lite' ), + 'tooltip' => esc_attr__( 'Enter the URL for the form field call to action button. URL will be ignored if the field has extended description content: in that case button will be used to expand the description content.', 'wpforms-lite' ), + ], + false + ); + + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'cta-link', + 'value' => ! empty( $field['cta-link'] ) ? esc_url( $field['cta-link'] ) : '', + ], + false + ); + + $output .= sprintf( + '

              %s

              ', + esc_html__( 'CTA is hidden if Expanded Content is used.', 'wpforms-lite' ) + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'cta-link', + 'content' => $output, + ] + ); + } + + /** + * Add hidden input with code identifier. + * + * @since 1.8.9 + * + * @param array $field Field data and settings. + */ + private function field_code( $field ) { + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'code', + 'content' => sprintf( + '', + $field['id'], + ! empty( $field['code'] ) ? esc_attr( $field['code'] ) : '' + ), + ] + ); + } + + /** + * Add a CSS class to hide field settings when the field is not editable. + * + * @since 1.7.6 + * + * @param string $option Field option to render. + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $do_echo Print or return the value. Print by default. + * + * @return string|null + */ + public function field_element( $option, $field, $args = [], $do_echo = true ) { + + if ( ! isset( $args['class'] ) ) { + $args['class'] = ''; + } + + if ( ! $this->is_editable() ) { + $args['class'] .= ' wpforms-hidden '; + } + + return parent::field_element( $option, $field, $args, $do_echo ); + } + + /** + * Render a custom option preview on the right side of the builder. + * + * @since 1.7.6 + * + * @param string $option Field option to render. + * @param array $field Field data and settings. + * @param array $args Field arguments. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + private function render_custom_preview( $option, $field, $args = [] ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $class = ! empty( $args['class'] ) ? wpforms_sanitize_classes( $args['class'] ) : ''; + $allowed_tags = $this->get_allowed_tags(); + + switch ( $option ) { + case 'heading': + $label = isset( $field['label'] ) && ! wpforms_is_empty_string( $field['label'] ) ? esc_html( $field['label'] ) : ''; + + if ( ! $label ) { + $class .= ' hidden '; + } + + return sprintf( + '', + esc_attr( $class ), + esc_html( $label ) + ); + + case 'description': // phpcs:ignore WPForms.Formatting.Switch.AddEmptyLineBefore + $description = ! empty( $field['description'] ) ? wp_kses( $field['description'], $allowed_tags ) : ''; + $description = wpautop( $this->replace_checkboxes( $description, $field ) ); + $description = $this->add_link_attributes( $description ); + + return sprintf( '
              %s
              ', $class, $description ); + + case 'expanded-description': // phpcs:ignore WPForms.Formatting.Switch.AddEmptyLineBefore + $description = isset( $field['expanded-description'] ) && ! wpforms_is_empty_string( $field['expanded-description'] ) ? wp_kses( $field['expanded-description'], $allowed_tags ) : ''; + $description = wpautop( $this->replace_checkboxes( $description, $field ) ); + $description = $this->add_link_attributes( $description ); + + return sprintf( '
              %s
              ', esc_attr( $class ), wp_kses( $description, $allowed_tags ) ); + + case 'cta-button': // phpcs:ignore WPForms.Formatting.Switch.AddEmptyLineBefore + $label = ! empty( $field['cta-label'] ) && empty( $field['expanded-description'] ) ? esc_attr( $field['cta-label'] ) : esc_attr__( 'Learn More', 'wpforms-lite' ); + + if ( ! empty( $field['expanded-description'] ) ) { + return sprintf( + '', + esc_attr( $class ), + esc_html( $label ), + wpforms_render( 'fields/internal-information/icon-not-expanded' ), + wpforms_render( 'fields/internal-information/icon-expanded' ) + ); + } + + if ( ! empty( $field['cta-link'] ) ) { + return sprintf( '', esc_attr( $class ), esc_url( $this->add_url_utm( $field ) ), esc_html( $label ) ); + } + + return sprintf( '', esc_attr( $class ) ); + + case 'addon': + if ( empty( $field['addon'] ) ) { + return ''; + } + + return sprintf( '', esc_attr( $field['id'] ), esc_attr( $field['addon'] ) ); + } + + return ''; + } + + /** + * Display the field button in the left panel only if the field is editable. + * + * @since 1.7.6 + * + * @param array $fields All fields to display in the left panel. + * + * @return array + */ + public function field_button( $fields ) { + + if ( $this->is_editable() ) { + return parent::field_button( $fields ); + } + + return $fields; + } + + /** + * When the form is going to be displayed on the front-end, remove internal information fields. + * + * @since 1.7.6 + * + * @param array $form_data Form data. + * + * @return array + */ + public function remove_internal_fields_on_front_end( $form_data ) { + + if ( empty( $form_data['fields'] ) ) { + return $form_data; + } + + foreach ( $form_data['fields'] as $id => $field ) { + if ( $field['type'] === $this->type ) { + unset( $form_data['fields'][ $id ] ); + } + } + + return $form_data; + } + + /** + * Add the internal information field to the list of ignored fields for entry preview. + * + * @since 1.9.1 + * + * @param array|mixed $ignored_fields Ignored fields. + * + * @return array + */ + public function ignore_entry_preview( $ignored_fields ): array { + + $ignored_fields = (array) $ignored_fields; + $ignored_fields[] = $this->type; + + return $ignored_fields; + } + + /** + * Remove field from form data before processing the form submit. + * + * @since 1.7.6 + * + * @param array $form_data Form data. + * @param array $entry Form submission raw data ($_POST). + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function process_before_form_data( $form_data, $entry ) { + + return $this->remove_internal_fields_on_front_end( $form_data ); + } + + /** + * Do not display the duplicate button. + * + * @since 1.7.6 + * + * @param bool $is_visible If true, the duplicate button will be displayed. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return bool + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function display_duplicate_button( $is_visible, $field, $form_data ) { + + if ( $this->is_internal_information_field( $field ) && ! $this->is_editable() ) { + return false; + } + + return $is_visible; + } + + /** + * Hide the column from the entry list table. + * + * @since 1.7.6 + * + * @param array|mixed $disallowed Table columns. + * + * @return array + */ + public function hide_column_in_entries_table( $disallowed ): array { + + $disallowed = (array) $disallowed; + $disallowed[] = $this->type; + + return $disallowed; + } + + /** + * Add a CSS class for the field parent div informing about mode (editable or not). + * + * @since 1.7.6 + * + * @param string $css CSS classes. + * @param array $field Field data and settings. + * + * @return string + */ + public function add_css_class_for_field_wrapper( $css, $field ) { + + if ( ! $this->is_internal_information_field( $field ) ) { + return $css; + } + + // If the Internal Information field is added by some add-ons, it will be hidden by default. + // Add styles to the addon assets to display the field. + // When the addon is disabled, the field is hidden. + if ( ! empty( $field['addon'] ) ) { + $css .= sprintf( ' wpforms-field-internal-information-%s-addon wpforms-hidden', $field['addon'] ); + } + + if ( $this->is_editable() ) { + $css .= ' internal-information-editable '; + + return $css; + } + + $css .= ' ui-sortable-disabled internal-information-not-editable internal-information-not-draggable '; + + return str_replace( 'ui-sortable-handle', '', $css ); + } + + /** + * Save the checkbox state to the post meta table. + * + * @since 1.7.6 + */ + public function save_internal_information_checkbox(): void { + + $form_id = isset( $_POST['formId'] ) ? absint( $_POST['formId'] ) : 0; + + // Run several checks: required items, security, permissions. + if ( + ! $form_id || + ! isset( $_POST['name'], $_POST['checked'] ) || + ! check_ajax_referer( 'wpforms-builder', 'nonce', false ) || + ! wpforms_current_user_can( 'edit_forms', $form_id ) + ) { + wp_send_json_error(); + } + + $checked = (int) $_POST['checked']; + $name = sanitize_text_field( wp_unslash( $_POST['name'] ) ); + $post_meta = get_post_meta( $form_id, self::CHECKBOX_META_KEY, true ); + $post_meta = ! empty( $post_meta ) ? (array) $post_meta : []; + + if ( $checked ) { + $post_meta[ $name ] = $checked; + } else { + unset( $post_meta[ $name ] ); + } + + update_post_meta( $form_id, self::CHECKBOX_META_KEY, $post_meta ); + + wp_send_json_success(); + } + + /** + * Localized strings for wpforms-internal-information-field JS script. + * + * @since 1.7.6 + * + * @param array $strings Localized strings. + * @param array $form The form element. + * + * @return array + * @noinspection PhpUnusedParameterInspection + */ + public function builder_strings( $strings, $form ) { + + $strings['iif_redirect_url_field_error'] = esc_html__( 'You should enter a valid absolute address to the CTA Link field or leave it empty.', 'wpforms-lite' ); + $strings['iif_dismiss'] = esc_html__( 'Dismiss', 'wpforms-lite' ); + $strings['iif_more'] = esc_html__( 'Learn More', 'wpforms-lite' ); + + return $strings; + } + + /** + * Enqueue wpforms-internal-information-field script. + * + * @since 1.7.6 + * + * @param string $view Current view. + * + * @noinspection PhpUnusedParameterInspection, PhpUnnecessaryCurlyVarSyntaxInspection + */ + public function builder_enqueues( $view ) { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-md5-hash', + WPFORMS_PLUGIN_URL . 'assets/lib/md5.min.js', + [ 'wpforms-builder' ], + '2.19.0', + false + ); + + wp_enqueue_script( + 'wpforms-internal-information-field', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/fields/internal-information{$min}.js", + [ 'wpforms-builder', 'wpforms-md5-hash', 'wpforms-builder-drag-fields' ], + WPFORMS_VERSION, + false + ); + } + + /** + * Checks if the user is allowed to edit the field's content. + * + * @since 1.7.6 + * + * @return bool + */ + private function is_editable() { + + /** + * Allow changing a mode. + * + * @since 1.7.6 + * + * @param bool $is_editable True if editable mode is allowed. Default: false. + */ + return (bool) apply_filters( 'wpforms_field_internal_information_is_editable', false ); + } + + /** + * Check if the field has type internal-information. + * + * @since 1.7.6 + * + * @param array $field Field data. + * + * @return bool + */ + private function is_internal_information_field( $field ) { + + return isset( $field['type'] ) && $field['type'] === $this->type; + } + + /** + * Render result of field_preview_option into custom div. + * + * If the field has no value, do not echo anything. + * + * @since 1.7.6 + * + * @param string $label Field label. + * @param array $field Field settings and data. + * @param array $args Field arguments. + */ + private function render_preview( $label, $field, $args = [] ) { + + $key = $label === 'heading' ? 'label' : $label; + + if ( empty( $field[ $key ] ) && ! $this->is_editable() ) { + return; + } + + $allowed_tags = $this->get_allowed_tags(); + + printf( + '
              %s
              ', + esc_attr( $label ), + wp_kses( $this->render_custom_preview( $label, $field, $args ), $allowed_tags ) + ); + } + + /** + * Replace `[] some text` with checkboxes. + * + * Additionally, generates the input name by hashing the line of text where the checkbox is. + * + * @since 1.7.6 + * + * @param string $description Expanded description. + * @param array $field Field data and settings. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ + private function replace_checkboxes( $description, array $field ) { + + if ( ! $this->form_id ) { + return $description; + } + + $lines = explode( PHP_EOL, $description ); + $replaced = []; + $post_meta = get_post_meta( $this->form_id, self::CHECKBOX_META_KEY, true ); + $post_meta = ! empty( $post_meta ) ? (array) $post_meta : []; + $field_id = $field['id'] ?? 0; + $needle = '[] '; + + foreach ( $lines as $line_number => $line ) { + $line = trim( $line ); + + if ( strpos( $line, $needle ) !== 0 ) { + $replaced[] = $line . PHP_EOL; + + continue; + } + + $field_name = sprintf( 'iif-%d-%s-%d', $field_id, md5( $line ), $line_number ); + $checked = (int) isset( $post_meta[ $field_name ] ); + $attributes = [ + 'name' => esc_attr( $field_name ), + 'value' => 1, + ]; + + if ( $this->is_editable() ) { + $attributes['disabled'] = 'disabled'; + $attributes['title'] = esc_html__( 'This field is disabled in the editor mode.', 'wpforms-lite' ); + } + + $html = sprintf( + '
              ', + wpforms_html_attributes( + '', + [ 'wpforms-field-internal-information-checkbox' ], + [], + $attributes + ), + ! $this->is_editable() ? checked( $checked, 1, false ) : '' + ); + + $line = substr_replace( $line, $html, 0, strlen( $needle ) ); + + $replaced[] = '
              ' . $line . '
              '; + } + + return implode( '', $replaced ); + } + + /** + * Return allowed tags specific to internal information field content. + * + * @since 1.7.6 + * + * @return array + */ + private function get_allowed_tags() { + + $allowed_tags = wpforms_builder_preview_get_allowed_tags(); + + $allowed_tags['input'] = [ + 'type' => [], + 'name' => [], + 'value' => [], + 'class' => [], + 'checked' => [], + 'disabled' => [], + 'title' => [], + ]; + + return $allowed_tags; + } + + /** + * Adds link parameters to all links in the provided content. + * + * @since 1.8.3 + * + * @param string $content The content to modify. + * + * @return string The modified content with UTM parameters added to links. + */ + private function add_link_attributes( $content ) { + + if ( empty( $content ) || ! class_exists( 'DOMDocument' ) ) { + return $content; + } + + $dom = new DOMDocument(); + $form_data = wpforms()->obj( 'form' )->get( $this->form_id, [ 'content_only' => true ] ); + $template_data = ! empty( $form_data['meta'] ) ? wpforms()->obj( 'builder_templates' )->get_template( $form_data['meta']['template'] ) : []; + $template_name = ! empty( $template_data ) ? $template_data['name'] : ''; + + $dom->loadHTML( htmlspecialchars_decode( htmlentities( $content ) ) ); + + $links = $dom->getElementsByTagName( 'a' ); + + foreach ( $links as $link ) { + $href = $link->getAttribute( 'href' ); + $text = $link->textContent; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $modified_href = wpforms_utm_link( $href, 'Form Template Information Note', $template_name, $text ); + + $link->setAttribute( 'href', $modified_href ); + $link->setAttribute( 'target', '_blank' ); + $link->setAttribute( 'rel', 'noopener noreferrer' ); + } + + // Remove the wrapper elements. + $body = $dom->getElementsByTagName( 'body' )->item( 0 ); + $inner_html = ''; + + foreach ( $body->childNodes as $node ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $inner_html .= $dom->saveHTML( $node ); + } + + return $inner_html; + } + + /** + * Add UTM parameters to the CTA button link. + * + * @since 1.7.6 + * + * @param array $field Field data. + * + * @return string + */ + private function add_url_utm( $field ) { + + if ( strpos( $field['cta-link'], 'https://wpforms.com' ) === 0 ) { + return wpforms_utm_link( $field['cta-link'], 'Template Documentation' ); + } + + return $field['cta-link']; + } +} + +new WPForms_Field_Internal_Information(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-name.php b/wp-content/plugins/wpforms-lite/includes/fields/class-name.php new file mode 100755 index 00000000..1bf0f773 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-name.php @@ -0,0 +1,681 @@ +name = esc_html__( 'Name', 'wpforms-lite' ); + $this->keywords = esc_html__( 'user, first, last', 'wpforms-lite' ); + $this->type = 'name'; + $this->icon = 'fa-user'; + $this->order = 150; + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.1 + */ + private function hooks(): void { + + // Define additional field properties. + add_filter( 'wpforms_field_properties_name', [ $this, 'field_properties' ], 5, 3 ); + + // Set field to default required. + add_filter( 'wpforms_field_new_required', [ $this, 'default_required' ], 10, 2 ); + + // This field requires fieldset+legend instead of the field label. + add_filter( "wpforms_frontend_modern_is_field_requires_fieldset_{$this->type}", [ $this, 'is_field_requires_fieldset' ], PHP_INT_MAX, 2 ); + } + + /** + * Define additional field properties. + * + * @since 1.3.7 + * + * @param array|mixed $properties Field properties. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded + + $properties = (array) $properties; + + $format = ! empty( $field['format'] ) ? esc_attr( $field['format'] ) : 'first-last'; + + // Simple format. + if ( $format === 'simple' ) { + $properties['inputs']['primary']['attr']['placeholder'] = ! empty( $field['simple_placeholder'] ) + ? $field['simple_placeholder'] : + ''; + $properties['inputs']['primary']['attr']['value'] = ! empty( $field['simple_default'] ) + ? wpforms_process_smart_tags( $field['simple_default'], $form_data, [], '', 'field-properties' ) + : ''; + + return $properties; + } + + // Expanded formats. + // Remove primary for expanded formats since we have first, middle, last. + unset( $properties['inputs']['primary'] ); + + // Remove reference to an input element to prevent duplication. + if ( empty( $field['sublabel_hide'] ) ) { + unset( $properties['label']['attr']['for'] ); + } + + $form_id = absint( $form_data['id'] ); + $field_id = wpforms_validate_field_id( $field['id'] ); + + $props = [ + 'inputs' => [ + 'first' => [ + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][first]", + 'value' => ! empty( $field['first_default'] ) + ? wpforms_process_smart_tags( $field['first_default'], $form_data, [], '', 'field-properties' ) + : '', + 'placeholder' => ! empty( $field['first_placeholder'] ) ? $field['first_placeholder'] : '', + ], + 'block' => [ + 'wpforms-field-row-block', + 'wpforms-first', + ], + 'class' => [ + 'wpforms-field-name-first', + ], + 'data' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}", + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'sublabel' => [ + 'hidden' => ! empty( $field['sublabel_hide'] ), + 'value' => esc_html__( 'First', 'wpforms-lite' ), + ], + ], + 'middle' => [ + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][middle]", + 'value' => ! empty( $field['middle_default'] ) + ? wpforms_process_smart_tags( $field['middle_default'], $form_data, [], '', 'field-properties' ) + : '', + 'placeholder' => ! empty( $field['middle_placeholder'] ) ? $field['middle_placeholder'] : '', + ], + 'block' => [ + 'wpforms-field-row-block', + 'wpforms-one-fifth', + ], + 'class' => [ + 'wpforms-field-name-middle', + ], + 'data' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}-middle", + 'required' => '', + 'sublabel' => [ + 'hidden' => ! empty( $field['sublabel_hide'] ), + 'value' => esc_html__( 'Middle', 'wpforms-lite' ), + ], + ], + 'last' => [ + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][last]", + 'value' => ! empty( $field['last_default'] ) + ? wpforms_process_smart_tags( $field['last_default'], $form_data, [], '', 'field-properties' ) + : '', + 'placeholder' => ! empty( $field['last_placeholder'] ) ? $field['last_placeholder'] : '', + ], + 'block' => [ + 'wpforms-field-row-block', + + ], + 'class' => [ + 'wpforms-field-name-last', + ], + 'data' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}-last", + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'sublabel' => [ + 'hidden' => ! empty( $field['sublabel_hide'] ), + 'value' => esc_html__( 'Last', 'wpforms-lite' ), + ], + ], + ], + ]; + + $properties = array_merge_recursive( $properties, $props ); + + $has_common_error = ! empty( $properties['error']['value'] ) && is_string( $properties['error']['value'] ); + + // Input First: add error class if needed. + if ( ! empty( $properties['error']['value']['first'] ) || $has_common_error ) { + $properties['inputs']['first']['class'][] = 'wpforms-error'; + } + + // Input First: add required class if needed. + if ( ! empty( $field['required'] ) ) { + $properties['inputs']['first']['class'][] = 'wpforms-field-required'; + } + + // Input First: add column class. + $properties['inputs']['first']['block'][] = $format === 'first-last' ? 'wpforms-one-half' : 'wpforms-two-fifths'; + + // Input Middle: add error class if needed. + if ( $has_common_error ) { + $properties['inputs']['middle']['class'][] = 'wpforms-error'; + } + + // Input Last: add error class if needed. + if ( ! empty( $properties['error']['value']['last'] ) || $has_common_error ) { + $properties['inputs']['last']['class'][] = 'wpforms-error'; + } + + // Input Last: add required class if needed. + if ( ! empty( $field['required'] ) ) { + $properties['inputs']['last']['class'][] = 'wpforms-field-required'; + } + + // Input Last: add column class. + $properties['inputs']['last']['block'][] = $format === 'first-last' ? 'wpforms-one-half' : 'wpforms-two-fifths'; + + return $properties; + } + + /** + * Name fields should default to being required. + * + * @since 1.0.8 + * + * @param bool|mixed $required Whether the field is required. + * @param array $field Field data. + * + * @return bool + */ + public function default_required( $required, $field ): bool { + + if ( $field['type'] === 'name' ) { + return true; + } + + return (bool) $required; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field information. + */ + public function field_options( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Define data. + $format = ! empty( $field['format'] ) ? esc_attr( $field['format'] ) : 'first-last'; + + /* + * Basic field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + // Label. + $this->field_option( 'label', $field ); + + // Format. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'format', + 'value' => esc_html__( 'Format', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select format to use for the name form field', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'format', + 'value' => $format, + 'options' => [ + 'simple' => esc_html__( 'Simple', 'wpforms-lite' ), + 'first-last' => esc_html__( 'First Last', 'wpforms-lite' ), + 'first-middle-last' => esc_html__( 'First Middle Last', 'wpforms-lite' ), + ], + ], + false + ); + + $args = [ + 'slug' => 'format', + 'content' => $lbl . $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + echo '
              '; + + // Simple. + $simple_placeholder = ! empty( $field['simple_placeholder'] ) ? esc_attr( $field['simple_placeholder'] ) : ''; + $simple_default = ! empty( $field['simple_default'] ) ? esc_attr( $field['simple_default'] ) : ''; + + printf( '
              ', esc_attr( $field['id'] ), esc_attr( $field['id'] ) ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'simple_placeholder', + 'value' => esc_html__( 'Name', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Name field advanced options.', 'wpforms-lite' ), + ] + ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], (int) $field['id'], esc_attr( $simple_placeholder ) ); + printf( '', (int) $field['id'], esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], (int) $field['id'], esc_attr( $simple_default ) ); + printf( '', (int) $field['id'], esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + echo '
              '; + + // First. + $first_placeholder = ! empty( $field['first_placeholder'] ) ? esc_attr( $field['first_placeholder'] ) : ''; + $first_default = ! empty( $field['first_default'] ) ? esc_attr( $field['first_default'] ) : ''; + + printf( '
              ', esc_attr( $field['id'] ), esc_attr( $field['id'] ) ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'first_placeholder', + 'value' => esc_html__( 'First Name', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'First name field advanced options.', 'wpforms-lite' ), + ] + ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], esc_attr( $first_placeholder ) ); + printf( '', (int) $field['id'], esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], esc_attr( $first_default ) ); + printf( '', (int) $field['id'], esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + echo '
              '; + + // Middle. + $middle_placeholder = ! empty( $field['middle_placeholder'] ) ? esc_attr( $field['middle_placeholder'] ) : ''; + $middle_default = ! empty( $field['middle_default'] ) ? esc_attr( $field['middle_default'] ) : ''; + + printf( '
              ', esc_attr( $field['id'] ), esc_attr( $field['id'] ) ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'middle_placeholder', + 'value' => esc_html__( 'Middle Name', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Middle name field advanced options.', 'wpforms-lite' ), + ] + ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], esc_attr( $middle_placeholder ) ); + printf( '', (int) $field['id'], esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], esc_attr( $middle_default ) ); + printf( '', (int) $field['id'], esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + echo '
              '; + + // Last. + $last_placeholder = ! empty( $field['last_placeholder'] ) ? esc_attr( $field['last_placeholder'] ) : ''; + $last_default = ! empty( $field['last_default'] ) ? esc_attr( $field['last_default'] ) : ''; + + printf( '
              ', esc_attr( $field['id'] ), esc_attr( $field['id'] ) ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'last_placeholder', + 'value' => esc_html__( 'Last Name', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Last name field advanced options.', 'wpforms-lite' ), + ] + ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], esc_attr( $last_placeholder ) ); + printf( '', (int) $field['id'], esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', (int) $field['id'], esc_attr( $last_default ) ); + printf( '', (int) $field['id'], esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + echo '
              '; + + echo '
              '; + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Hide sublabels. + $sublabel_class = isset( $field['format'] ) && ! in_array( $field['format'], [ 'first-last', 'first-middle-last' ], true ) ? 'wpforms-hidden' : ''; + + $this->field_option( 'sublabel_hide', $field, [ 'class' => $sublabel_class ] ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field information. + */ + public function field_preview( $field ) { + + // Define data. + $simple_placeholder = ! empty( $field['simple_placeholder'] ) ? $field['simple_placeholder'] : ''; + $first_placeholder = ! empty( $field['first_placeholder'] ) ? $field['first_placeholder'] : ''; + $middle_placeholder = ! empty( $field['middle_placeholder'] ) ? $field['middle_placeholder'] : ''; + $last_placeholder = ! empty( $field['last_placeholder'] ) ? $field['last_placeholder'] : ''; + $simple_default = ! empty( $field['simple_default'] ) ? $field['simple_default'] : ''; + $first_default = ! empty( $field['first_default'] ) ? $field['first_default'] : ''; + $middle_default = ! empty( $field['middle_default'] ) ? $field['middle_default'] : ''; + $last_default = ! empty( $field['last_default'] ) ? $field['last_default'] : ''; + $format = ! empty( $field['format'] ) ? $field['format'] : 'first-last'; + + // Label. + $this->field_preview_option( 'label', $field ); + ?> + +
              + +
              + +
              + +
              + + +
              + +
              + + +
              + +
              + + +
              + +
              + + field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.0.0 + * + * @param array $field Field information. + * @param array $deprecated Deprecated parameter, not used anymore. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $format = ! empty( $field['format'] ) ? esc_attr( $field['format'] ) : 'first-last'; + $primary = ! empty( $field['properties']['inputs']['primary'] ) ? $field['properties']['inputs']['primary'] : ''; + $first = ! empty( $field['properties']['inputs']['first'] ) ? $field['properties']['inputs']['first'] : ''; + $middle = ! empty( $field['properties']['inputs']['middle'] ) ? $field['properties']['inputs']['middle'] : ''; + $last = ! empty( $field['properties']['inputs']['last'] ) ? $field['properties']['inputs']['last'] : ''; + + // Simple format. + if ( $format === 'simple' ) { + + // Primary field (Simple). + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ), + esc_attr( $primary['required'] ) + ); + + // Expanded formats. + } else { + + // Row wrapper. + echo '
              '; + + // First name. + echo '
              '; + $this->field_display_sublabel( 'first', 'before', $field ); + printf( + '', + wpforms_html_attributes( $first['id'], $first['class'], $first['data'], $first['attr'] ), + esc_attr( $first['required'] ) + ); + $this->field_display_sublabel( 'first', 'after', $field ); + $this->field_display_error( 'first', $field ); + echo '
              '; + + // Middle name. + if ( $format === 'first-middle-last' ) { + echo '
              '; + $this->field_display_sublabel( 'middle', 'before', $field ); + printf( + '', + wpforms_html_attributes( $middle['id'], $middle['class'], $middle['data'], $middle['attr'] ), + esc_attr( $middle['required'] ) + ); + $this->field_display_sublabel( 'middle', 'after', $field ); + $this->field_display_error( 'middle', $field ); + echo '
              '; + } + + // Last name. + echo '
              '; + $this->field_display_sublabel( 'last', 'before', $field ); + printf( + '', + wpforms_html_attributes( $last['id'], $last['class'], $last['data'], $last['attr'] ), + esc_attr( $last['required'] ) + ); + $this->field_display_sublabel( 'last', 'after', $field ); + $this->field_display_error( 'last', $field ); + echo '
              '; + + echo '
              '; + + } + } + + /** + * Validate field on submitting a form. + * + * @since 1.0.0 + * + * @param int $field_id Field id. + * @param array|string $field_submit Submitted field value (raw data). + * @param array $form_data Form data. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + if ( empty( $form_data['fields'][ $field_id ]['required'] ) ) { + return; + } + + // Extended validation needed for the different name fields. + $form_id = $form_data['id']; + $format = $form_data['fields'][ $field_id ]['format']; + $required = wpforms_get_required_label(); + $process = wpforms()->obj( 'process' ); + + if ( $format === 'simple' && wpforms_is_empty_string( $field_submit ) ) { + $process->errors[ $form_id ][ $field_id ] = $required; + + return; + } + + if ( ! ( $format === 'first-last' || $format === 'first-middle-last' ) ) { + return; + } + + $this->validate_complicated_formats( $process, $form_id, $field_id, $field_submit, $required ); + } + + /** + * Format and sanitize field. + * + * @since 1.0.0 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + // Define data. + $name = isset( $form_data['fields'][ $field_id ]['label'] ) && ! wpforms_is_empty_string( $form_data['fields'][ $field_id ]['label'] ) ? $form_data['fields'][ $field_id ]['label'] : ''; + $first = isset( $field_submit['first'] ) && ! wpforms_is_empty_string( $field_submit['first'] ) ? $field_submit['first'] : ''; + $middle = isset( $field_submit['middle'] ) && ! wpforms_is_empty_string( $field_submit['middle'] ) ? $field_submit['middle'] : ''; + $last = isset( $field_submit['last'] ) && ! wpforms_is_empty_string( $field_submit['last'] ) ? $field_submit['last'] : ''; + + if ( is_array( $field_submit ) ) { + $value = implode( ' ', array_filter( [ $first, $middle, $last ] ) ); + } else { + $value = $field_submit; + } + + // Set final field details. + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => sanitize_text_field( $name ), + 'value' => sanitize_text_field( $value ), + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + 'first' => sanitize_text_field( $first ), + 'middle' => sanitize_text_field( $middle ), + 'last' => sanitize_text_field( $last ), + ]; + } + + /** + * Determine if the field requires fieldset+legend instead of the regular field label. + * + * @since 1.8.1 + * + * @param bool $requires_fieldset True if it requires fieldset. + * @param array $field Field data. + * + * @return bool + * + * @noinspection PhpUnusedParameterInspection + */ + public function is_field_requires_fieldset( $requires_fieldset, $field ) { + + return isset( $field['format'] ) && $field['format'] !== 'simple'; + } + + /** + * Validate complicated formats. + * + * @since 1.8.2.3 + * + * @param WPForms_Process $process Process class instance. + * @param int|string $form_id Form id. + * @param int|string $field_id Field id. + * @param array $field_submit Field submit. + * @param string $required Required message text. + */ + private function validate_complicated_formats( $process, $form_id, $field_id, $field_submit, $required ) { + + // Prevent PHP Warning: Illegal string offset ‘first’ or 'last'. + if ( isset( $process->errors[ $form_id ][ $field_id ] ) ) { + $process->errors[ $form_id ][ $field_id ] = (array) $process->errors[ $form_id ][ $field_id ]; + } + + if ( isset( $field_submit['first'] ) && wpforms_is_empty_string( $field_submit['first'] ) ) { + $process->errors[ $form_id ][ $field_id ]['first'] = $required; + } + + if ( isset( $field_submit['last'] ) && wpforms_is_empty_string( $field_submit['last'] ) ) { + $process->errors[ $form_id ][ $field_id ]['last'] = $required; + } + } +} + +new WPForms_Field_Name(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-number-slider.php b/wp-content/plugins/wpforms-lite/includes/fields/class-number-slider.php new file mode 100755 index 00000000..925e469b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-number-slider.php @@ -0,0 +1,452 @@ +name = esc_html__( 'Number Slider', 'wpforms-lite' ); + $this->type = 'number-slider'; + $this->icon = 'fa-sliders'; + $this->order = 180; + + // Customize value format for HTML emails. + add_filter( 'wpforms_html_field_value', [ $this, 'html_email_value' ], 10, 4 ); + + // Builder strings. + add_filter( 'wpforms_builder_strings', [ $this, 'add_builder_strings' ] ); + } + + /** + * Add Builder strings. + * + * @since 1.6.2.3 + * + * @param array $strings Form Builder strings. + * + * @return array Form Builder strings. + */ + public function add_builder_strings( $strings ) { + + $strings['error_number_slider_increment'] = esc_html__( 'Increment value should be greater than zero. Decimal fractions allowed.', 'wpforms-lite' ); + + return $strings; + } + + /** + * Customize format for HTML email notifications. + * + * @since 1.5.7 + * + * @param string $val Field value. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * @param string $context Value display context. + * + * @return string + */ + public function html_email_value( $val, $field, $form_data = [], $context = '' ) { + + if ( empty( $field['value_raw'] ) || $field['type'] !== $this->type ) { + return $val; + } + + $value = isset( $field['value_raw']['value'] ) ? (float) $field['value_raw']['value'] : 0; + $min = isset( $field['value_raw']['min'] ) ? (float) $field['value_raw']['min'] : self::SLIDER_MIN; + $max = isset( $field['value_raw']['max'] ) ? (float) $field['value_raw']['max'] : self::SLIDER_MAX; + + $html_value = $value; + if ( strpos( $field['value_raw']['value_display'], '{value}' ) !== false ) { + $html_value = str_replace( + '{value}', + /* translators: %1$s - Number slider selected value, %2$s - its minimum value, %3$s - its maximum value. */ + sprintf( esc_html__( '%1$s (%2$s min / %3$s max)', 'wpforms-lite' ), $value, $min, $max ), + $field['value_raw']['value_display'] + ); + } + + return $html_value; + } + + /** + * Field options panel inside the builder. + * + * @since 1.5.7 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Set default values for Min, Max, Step, Default Value Options. + $field = $this->set_default_field_args( $field ); + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle disabled. + $this->field_element( + 'text', + $field, + [ + 'slug' => 'required', + 'value' => '', + 'type' => 'hidden', + ] + ); + + // Min/Max. + $min_max_args = [ + 'class' => 'wpforms-number-slider', + 'label' => esc_html__( 'Value Range', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Define the minimum and the maximum values for the slider.', 'wpforms-lite' ), + ]; + $min_max = $this->field_number_option_min_max( $field, $min_max_args, false ); + + // Default value. + $default_value_args = [ + 'class' => 'wpforms-number-slider-default-value', + ]; + $default_value = $this->field_number_option_default_value( $field, $default_value_args, false ); + + // Increment. + $step_args = [ + 'class' => 'wpforms-number-slider-step', + 'tooltip' => esc_html__( 'Determines the increment between selectable values on the slider.', 'wpforms-lite' ), + ]; + $step = $this->field_number_option_step( $field, $step_args, false ); + + // Print of options markup: Minimum, Maximum, Increment, Default Value. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'number_min_max_step_dependent', + 'content' => $min_max . $default_value . $step, + 'class' => 'wpforms-field-number-slider-option', + ], + true + ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Value display. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'value_display', + 'value' => esc_html__( 'Value Display', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Displays the currently selected value below the slider.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'value_display', + 'class' => 'wpforms-number-slider-value-display', + 'value' => isset( $field['value_display'] ) ? $field['value_display'] : $this->get_default_display_value(), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'value_display', + 'content' => $lbl . $fld, + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Get default display value. + * + * @since 1.7.1 + * + * @return string + */ + private function get_default_display_value() { + + return sprintf( /* translators: %s - value. */ + esc_html__( 'Selected Value: %s', 'wpforms-lite' ), + '{value}' + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.5.7 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + $value_display = isset( $field['value_display'] ) ? esc_attr( $field['value_display'] ) : $this->get_default_display_value(); + $default_value = ! empty( $field['default_value'] ) ? (float) $field['default_value'] : 0; + + echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'fields/number-slider/builder-preview', + [ + 'min' => isset( $field['min'] ) && is_numeric( $field['min'] ) ? (float) $field['min'] : self::SLIDER_MIN, + 'max' => isset( $field['max'] ) && is_numeric( $field['max'] ) ? (float) $field['max'] : self::SLIDER_MAX, + 'step' => isset( $field['step'] ) && is_numeric( $field['step'] ) ? (float) $field['step'] : self::SLIDER_STEP, + 'value_display' => $value_display, + 'default_value' => $default_value, + 'value_hint' => str_replace( '{value}', '' . $default_value . '', wp_kses( $value_display, wpforms_builder_preview_get_allowed_tags() ) ), + 'field_id' => $field['id'], + ], + true + ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.5.7 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use $field['properties'] instead. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $primary = $field['properties']['inputs']['primary']; + + $value_display = isset( $field['value_display'] ) ? esc_attr( $field['value_display'] ) : esc_html__( 'Selected Value: {value}', 'wpforms-lite' ); + $hint_value = ! empty( $primary['attr']['value'] ) ? (float) $primary['attr']['value'] : 0; + + $hint = str_replace( '{value}', '' . $hint_value . '', $value_display ); + + // phpcs:ignore + echo wpforms_render( + 'fields/number-slider/frontend', + [ + 'atts' => $primary['attr'], + 'class' => $primary['class'], + 'datas' => $primary['data'], + 'id' => $primary['id'], + 'max' => isset( $field['max'] ) && is_numeric( $field['max'] ) ? (float) $field['max'] : self::SLIDER_MAX, + 'min' => isset( $field['min'] ) && is_numeric( $field['min'] ) ? (float) $field['min'] : self::SLIDER_MIN, + 'required' => $primary['required'], + 'step' => isset( $field['step'] ) && is_numeric( $field['step'] ) ? (float) $field['step'] : self::SLIDER_STEP, + 'value_display' => $value_display, + 'value_hint' => $hint, + ], + true + ); + } + + /** + * Validate field on form submit. + * + * @since 1.5.7 + * + * @param int $field_id Field ID. + * @param int|float|string $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $form_id = $form_data['id']; + + $field_submit = (float) $this->sanitize_value( $field_submit ); + + // Basic required check - if field is marked as required, check for entry data. + if ( + ! empty( $form_data['fields'][ $field_id ]['required'] ) && + empty( $field_submit ) && + (string) $field_submit !== '0' + ) { + wpforms()->obj( 'process' )->errors[ $form_id ][ $field_id ] = wpforms_get_required_label(); + } + + // Check if value is numeric. + if ( ! empty( $field_submit ) && ! is_numeric( $field_submit ) ) { + /** + * Filter the error message for the number field. + * + * @since 1.0.0 + * + * @param string $message Error message. + */ + wpforms()->obj( 'process' )->errors[ $form_id ][ $field_id ] = apply_filters( 'wpforms_valid_number_label', esc_html__( 'Please provide a valid value.', 'wpforms-lite' ) ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + } + + /** + * Format and sanitize field. + * + * @since 1.5.7 + * + * @param int $field_id Field ID. + * @param int|string|float $field_submit Submitted field value. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + // Define data. + $name = ! empty( $form_data['fields'][ $field_id ]['label'] ) ? $form_data['fields'][ $field_id ]['label'] : ''; + $value = (float) $this->sanitize_value( $field_submit ); + + $value_raw = [ + 'value' => $value, + 'min' => (float) $form_data['fields'][ $field_id ]['min'], + 'max' => (float) $form_data['fields'][ $field_id ]['max'], + 'value_display' => wp_kses_post( $form_data['fields'][ $field_id ]['value_display'] ), + ]; + + // Set final field details. + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => sanitize_text_field( $name ), + 'value' => $value, + 'value_raw' => $value_raw, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } + + /** + * Sanitize the value. + * + * @since 1.5.7 + * + * @param string $value The number field submitted value. + * + * @return float|int|string + */ + private function sanitize_value( $value ) { + + // Some browsers allow other non-digit/decimal characters to be submitted + // with the num input, which then trips the is_numeric validation below. + // To get around this we remove all chars that are not expected. + $signed_value = preg_replace( '/[^-0-9.]/', '', $value ); + + // If there's no number on the signed value we return zero. + // We have to do that because since PHP 8.0, the abs() function is allowed an argument with int|float type. + if ( ! is_numeric( $signed_value ) ) { + return 0; + } + + $abs_value = abs( $signed_value ); + $value = strpos( $signed_value, '-' ) === 0 ? '-' . $abs_value : $abs_value; + + return $value; + } + + /** + * Sets default field settings. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * + * @return array Modified array. + */ + private function set_default_field_args( $field ) { + + $field['min'] = empty( $field['min'] ) ? self::SLIDER_MIN : $field['min']; + $field['max'] = empty( $field['max'] ) ? self::SLIDER_MAX : $field['max']; + $field['step'] = empty( $field['step'] ) ? self::SLIDER_STEP : $field['step']; + $field['default_value'] = empty( $field['default_value'] ) ? self::SLIDER_MIN : $field['default_value']; + + return $field; + } +} + +new WPForms_Field_Number_Slider(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-number.php b/wp-content/plugins/wpforms-lite/includes/fields/class-number.php new file mode 100755 index 00000000..2693c298 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-number.php @@ -0,0 +1,278 @@ +name = esc_html__( 'Numbers', 'wpforms-lite' ); + $this->type = 'number'; + $this->icon = 'fa-hashtag'; + $this->order = 130; + + $this->hooks(); + $this->number_hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + private function hooks() { + + // Define additional field properties. + add_filter( 'wpforms_field_properties_number', [ $this, 'field_properties' ], 5, 3 ); + } + + /** + * Define additional field properties. + * + * @since 1.9.4 + * + * @param array|mixed $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function field_properties( $properties, $field, $form_data ): array { + + $properties = (array) $properties; + + if ( is_numeric( $field['min'] ?? null ) ) { + $properties['inputs']['primary']['attr']['min'] = (float) $field['min']; + } + + if ( is_numeric( $field['max'] ?? null ) ) { + $properties['inputs']['primary']['attr']['max'] = (float) $field['max']; + } + + $properties['inputs']['primary']['attr']['step'] = 'any'; + + return $properties; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Min/Max. + $this->field_number_option_min_max( $field, [ 'class' => 'wpforms-numbers' ] ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Define data. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + + // Label. + $this->field_preview_option( 'label', $field ); + + // Primary input. + echo ''; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.0.0 + * + * @param array $field Field data. + * @param array $deprecated Deprecated, not used. + * @param array $form_data Form data. + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $primary = $field['properties']['inputs']['primary']; + + // Primary field. + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ), + esc_attr( $primary['required'] ) + ); + } + + /** + * Validate field on form submit. + * + * @since 1.0.0 + * + * @param int $field_id Field id. + * @param string $field_submit Submitted field value (raw data). + * @param array $form_data Form data. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $form_id = $form_data['id']; + + $value = $this->sanitize_value( $field_submit ); + + // If field is marked as required, check for entry data. + if ( + ! empty( $form_data['fields'][ $field_id ]['required'] ) && + empty( $value ) && + ! is_numeric( $value ) + ) { + wpforms()->obj( 'process' )->errors[ $form_id ][ $field_id ] = wpforms_get_required_label(); + } + + // Check if value is numeric. + if ( ! empty( $value ) && ! is_numeric( $value ) ) { + /** + * Filter the error message for the number field. + * + * @since 1.0.0 + * + * @param string $message Error message. + */ + wpforms()->obj( 'process' )->errors[ $form_id ][ $field_id ] = apply_filters( 'wpforms_valid_number_label', esc_html__( 'Please enter a valid number.', 'wpforms-lite' ) ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + } + + /** + * Format and sanitize field. + * + * @since 1.3.5 + * + * @param int $field_id Field id. + * @param string $field_submit Submitted value. + * @param array $form_data Form data. + */ + public function format( $field_id, $field_submit, $form_data ) { + + // Define data. + $name = ! empty( $form_data['fields'][ $field_id ]['label'] ) ? $form_data['fields'][ $field_id ]['label'] : ''; + + // Set final field details. + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => sanitize_text_field( $name ), + 'value' => $this->sanitize_value( $field_submit ), + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } + + /** + * Sanitize the value. + * + * @since 1.5.7 + * + * @param string $value The number field submitted value. + * + * @return float|int|string + */ + private function sanitize_value( $value ) { + + if ( empty( $value ) && ! is_numeric( $value ) ) { + return ''; + } + + // Some browsers allow other non-digit/decimal characters to be submitted + // with the num input, which then trips the is_numeric validation below. + // To get around this we remove all chars that are not expected. + $signed_value = preg_replace( '/[^-0-9.]/', '', $value ); + $abs_value = str_replace( '-', '', $signed_value ); + + return $signed_value < 0 ? '-' . $abs_value : $abs_value; + } +} + +new WPForms_Field_Number(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-radio.php b/wp-content/plugins/wpforms-lite/includes/fields/class-radio.php new file mode 100755 index 00000000..dca53085 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-radio.php @@ -0,0 +1,944 @@ +name = esc_html__( 'Multiple Choice', 'wpforms-lite' ); + $this->keywords = esc_html__( 'radio', 'wpforms-lite' ); + $this->type = 'radio'; + $this->icon = 'fa-dot-circle-o'; + $this->order = 110; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'First Choice', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + 2 => [ + 'label' => esc_html__( 'Second Choice', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + 3 => [ + 'label' => esc_html__( 'Third Choice', 'wpforms-lite' ), + 'value' => '', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + // Customize HTML field values. + add_filter( 'wpforms_html_field_value', [ $this, 'field_html_value' ], 10, 4 ); + add_filter( "wpforms_{$this->type}_field_html_value_images", [ $this, 'field_html_value_images' ], 10, 3 ); + + // Define additional field properties. + add_filter( 'wpforms_field_properties_radio', [ $this, 'field_properties' ], 5, 3 ); + + // This field requires fieldset+legend instead of the field label. + add_filter( "wpforms_frontend_modern_is_field_requires_fieldset_{$this->type}", '__return_true', PHP_INT_MAX, 2 ); + + // Load assets. + add_action( 'wpforms_builder_enqueues', [ $this, 'builder_assets' ] ); + + // Modify an export data format for the Other option. + add_filter( 'wpforms_pro_admin_entries_export_ajax_get_entry_fields_data_field', [ $this, 'export_entry_field_data' ] ); + + // Allow radio fields to be included in the Keyword Filter. + add_filter( 'wpforms_pro_anti_spam_keyword_filter_get_filtered_fields', [ $this, 'add_field_to_anti_spam_keyword_filter' ] ); + + // Adjust entry field before saving to entry_fields DB table. + add_filter( 'wpforms_entry_save_fields', [ $this, 'save_field' ], 10, 3 ); + } + + /** + * Enqueue assets for the builder. + * + * @since 1.9.8.3 + */ + public function builder_assets() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-multiple-choices', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/multiple-choices{$min}.js", + [ 'jquery', 'wpforms-builder' ], + WPFORMS_VERSION, + false + ); + } + + /** + * Adjust builder preview container classes. + * + * Adds size-{small|medium|large} to the Radio field container in the Builder + * when the "Add Other Choice" option is enabled. + * + * @since 1.9.8.3 + * + * @param string $css Existing class string. + * @param array $field Field data and settings. + * + * @return string + */ + public function preview_field_class( $css, $field ): string { + + $css = parent::preview_field_class( $css, $field ); + + if ( $field['type'] !== $this->type ) { + return $css; + } + + // Apply a size class to the field container when Other Choice is enabled. + if ( $this->has_other_choice( $field ) ) { + $size = ! empty( $field['other_size'] ) ? sanitize_html_class( $field['other_size'] ) : 'medium'; + $css .= ' size-' . $size; + } + + return $css; + } + + /** + * Define additional field properties. + * + * @since 1.4.5 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + // Remove primary input, unset for attribute for label. + unset( $properties['inputs']['primary'], $properties['label']['attr']['for'] ); + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = wpforms_validate_field_id( $field['id'] ); + $choices = $field['choices']; + $dynamic = wpforms_get_field_dynamic_choices( $field, $form_id, $form_data ); + + if ( $dynamic !== false ) { + $choices = $dynamic; + $field['show_values'] = true; + } + + // Set input container (ul) properties. + $properties['input_container'] = [ + 'class' => [ ! empty( $field['random'] ) ? 'wpforms-randomize' : '' ], + 'data' => [], + 'attr' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}", + ]; + + // Set input properties. + foreach ( $choices as $key => $choice ) { + + // Used for dynamic choices. + $depth = isset( $choice['depth'] ) ? absint( $choice['depth'] ) : 1; + + $value = ! empty( $field['show_values'] ) ? $choice['value'] : $choice['label']; + /* translators: %s - choice number. */ + $value = ( $value === '' ) ? sprintf( esc_html__( 'Choice %s', 'wpforms-lite' ), $key ) : $value; + + // Check if this is the "Other" choice. + $is_other_choice = isset( $choice['other'] ) && (bool) $choice['other'] === true; + + $properties['inputs'][ $key ] = [ + 'container' => [ + 'attr' => [], + 'class' => [ "choice-{$key}", "depth-{$depth}", $is_other_choice ? 'wpforms-other-choice' : '' ], + 'data' => [], + 'id' => '', + ], + 'label' => [ + 'attr' => [ + 'for' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + ], + 'class' => [ 'wpforms-field-label-inline' ], + 'data' => [], + 'id' => '', + 'text' => $choice['label'], + ], + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}]", + 'value' => $value, + ], + 'class' => [], + 'data' => $is_other_choice ? [ 'other-choice' => 'true' ] : [], + 'id' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + 'icon' => isset( $choice['icon'] ) ? $choice['icon'] : '', + 'icon_style' => isset( $choice['icon_style'] ) ? $choice['icon_style'] : '', + 'image' => isset( $choice['image'] ) ? $choice['image'] : '', + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'default' => isset( $choice['default'] ), + ]; + } + + // Required class for pagebreak validation. + if ( ! empty( $field['required'] ) ) { + $properties['input_container']['class'][] = 'wpforms-field-required'; + } + + // Custom properties if image choices is enabled. + if ( ! $dynamic && ! empty( $field['choices_images'] ) ) { + + $properties['input_container']['class'][] = 'wpforms-image-choices'; + $properties['input_container']['class'][] = 'wpforms-image-choices-' . sanitize_html_class( $field['choices_images_style'] ); + + foreach ( $properties['inputs'] as $key => $inputs ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-image-choices-item'; + + if ( in_array( $field['choices_images_style'], [ 'modern', 'classic' ], true ) ) { + $properties['inputs'][ $key ]['class'][] = 'wpforms-screen-reader-element'; + } + } + } elseif ( ! $dynamic && ! empty( $field['choices_icons'] ) ) { + $properties = wpforms()->obj( 'icon_choices' )->field_properties( $properties, $field ); + } + + // Add selected class for choices with defaults. + foreach ( $properties['inputs'] as $key => $inputs ) { + if ( ! empty( $inputs['default'] ) ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-selected'; + } + } + + return $properties; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Choices. + $this->field_option( 'choices', $field ); + + // AI Feature. + $this->field_option( + 'ai_modal_button', + $field, + [ + 'value' => esc_html__( 'Generate Choices', 'wpforms-lite' ), + 'type' => 'choices', + ] + ); + + // Add Other Choice. + $this->field_option( 'choices_other', $field ); + + // Other Field Size for "Other" input. + $this->field_option( 'other_size', $field ); + + // Other Placeholder for "Other" input. + $this->field_option( 'other_placeholder', $field ); + + // Choices Images. + $this->field_option( 'choices_images', $field ); + + // Hide Choices Images. + $this->field_option( 'choices_images_hide', $field ); + + // Choices Images Style (theme). + $this->field_option( 'choices_images_style', $field ); + + // Choices Icons. + $this->field_option( 'choices_icons', $field ); + + // Choices Icons Color. + $this->field_option( 'choices_icons_color', $field ); + + // Choices Icons Size. + $this->field_option( 'choices_icons_size', $field ); + + // Choices Icons Style. + $this->field_option( 'choices_icons_style', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Randomize order of choices. + $this->field_element( + 'row', + $field, + [ + 'slug' => 'random', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'random', + 'value' => isset( $field['random'] ) ? '1' : '0', + 'desc' => esc_html__( 'Randomize Choices', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to randomize the order of the choices.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + // Show Values toggle option. This option will only show if already used + // or if manually enabled by a filter. + if ( ! empty( $field['show_values'] ) || wpforms_show_fields_options_setting() ) { + $this->field_element( + 'row', + $field, + [ + 'slug' => 'show_values', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'show_values', + 'value' => isset( $field['show_values'] ) ? $field['show_values'] : '0', + 'desc' => esc_html__( 'Show Values', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to manually set form field values.', 'wpforms-lite' ), + ], + false + ), + ] + ); + } + + // Display format. + $this->field_option( 'input_columns', $field ); + + // Dynamic choice auto-populating toggle. + $this->field_option( 'dynamic_choices', $field ); + + // Dynamic choice source. + $this->field_option( 'dynamic_choices_source', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + // Choices. + $this->field_preview_option( 'choices', $field ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end and admin entry edit page. + * + * @since 1.0.0 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + $using_image_choices = empty( $field['dynamic_choices'] ) && empty( $field['choices_icons'] ) && ! empty( $field['choices_images'] ); + $using_icon_choices = empty( $field['dynamic_choices'] ) && empty( $field['choices_images'] ) && ! empty( $field['choices_icons'] ); + + // Define data. + $container = $field['properties']['input_container']; + $choices = $field['properties']['inputs']; + + // Do not display the field with empty choices on the frontend. + if ( ! $choices && ! is_admin() ) { + return; + } + + // Display a warning message on Entry Edit page. + if ( ! $choices && is_admin() ) { + $this->display_empty_dynamic_choices_message( $field ); + + return; + } + + $amp_state_id = ''; + + if ( wpforms_is_amp() && ( $using_image_choices || $using_icon_choices ) ) { + $amp_state_id = str_replace( '-', '_', sanitize_key( $container['id'] ) ) . '_state'; + $state = [ + 'selected' => null, + ]; + + foreach ( $choices as $key => $choice ) { + if ( $choice['default'] ) { + $state['selected'] = $choice['attr']['value']; + + break; + } + } + printf( + '', + esc_attr( $amp_state_id ), + wp_json_encode( $state ) + ); + } + + printf( + '
                ', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) + ); + + foreach ( $choices as $key => $choice ) { + $label = $this->get_choices_label( $choice['label']['text'] ?? '', $key, $field ); + + if ( wpforms_is_amp() && ( $using_image_choices || $using_icon_choices ) ) { + $choice['container']['attr']['[class]'] = sprintf( + '%s + ( %s == %s ? " wpforms-selected" : "")', + wp_json_encode( implode( ' ', $choice['container']['class'] ) ), + $amp_state_id, + wp_json_encode( $choice['attr']['value'] ) + ); + } + + printf( + '
              • ', + wpforms_html_attributes( $choice['container']['id'], $choice['container']['class'], $choice['container']['data'], $choice['container']['attr'] ) + ); + + if ( $using_image_choices ) { + + // Make sure the image choices are keyboard-accessible. + $choice['label']['attr']['tabindex'] = 0; + + if ( wpforms_is_amp() ) { + $choice['label']['attr']['on'] = sprintf( + 'tap:AMP.setState(%s)', + wp_json_encode( [ $amp_state_id => $choice['attr']['value'] ] ) + ); + $choice['label']['attr']['role'] = 'button'; + } + + if ( is_array( $choice['label']['class'] ) && wpforms_is_empty_string( $label ) ) { + $choice['label']['class'][] = 'wpforms-field-label-inline-empty'; + } + + // Image choices. + printf( + ''; + + } elseif ( $using_icon_choices ) { + + if ( wpforms_is_amp() ) { + $choice['label']['attr']['on'] = sprintf( + 'tap:AMP.setState(%s)', + wp_json_encode( [ $amp_state_id => $choice['attr']['value'] ] ) + ); + $choice['label']['attr']['role'] = 'button'; + } + + // Icon Choices. + wpforms()->obj( 'icon_choices' )->field_display( $field, $choice, 'radio' ); + + } else { + // Normal display. + printf( + '', + wpforms_html_attributes( $choice['id'], $choice['class'], $choice['data'], $choice['attr'] ), + esc_attr( $choice['required'] ), + checked( '1', $choice['default'], false ) + ); + + printf( + '', + wpforms_html_attributes( $choice['label']['id'], $choice['label']['class'], $choice['label']['data'], $choice['label']['attr'] ), + wp_kses_post( $label ) + ); + } + + // Capture the text field for "Other" choice to render separately below the list. + if ( ! empty( $choice['data']['other-choice'] ) ) { + $default_value = ''; + $size = ! empty( $field['other_size'] ) ? sanitize_html_class( $field['other_size'] ) : 'medium'; + $size_class = 'wpforms-field-' . $size; + + // Do not hide the Other input if this choice is set as default. + $hidden_class = ! empty( $choice['default'] ) ? '' : ' wpforms-hidden'; + + if ( isset( $field['choices'][ $key ]['value'] ) && $field['choices'][ $key ]['value'] !== '' ) { + $default_value = $field['choices'][ $key ]['value']; + } + + /** + * Filters the default value of the Other choice field option. + * + * This filter allows modifying what value should be prefilled for the Other choice inputs. + * + * @since 1.9.8.3 + * + * @param string $default_value Default value for the "Other" choice input. + * @param array $field Field data and settings. + * @param string $label Field label. + */ + $default_value = apply_filters( 'wpforms_field_radio_other_choice_default_value', $default_value, $field, $label ); + + $other_atts = [ + 'name' => "wpforms[fields][{$field['id']}][other]", + 'value' => $default_value, + ]; + + if ( empty( $choice['default'] ) ) { + $other_atts['disabled'] = 'disabled'; + } + + if ( ! empty( $field['other_placeholder'] ) ) { + $other_atts['placeholder'] = $field['other_placeholder']; + } + + $other_input_html = sprintf( + '', + wpforms_html_attributes( + "wpforms-{$form_data['id']}-field_{$field['id']}_other", + [ 'wpforms-other-input', 'wpforms-field-required', $size_class, $hidden_class ], + [], + $other_atts + ) + ); + } + + echo '
              • '; + } + + echo '
              '; + // Render the captured "Other" input separately, under the list of options. + if ( ! empty( $other_input_html ) ) { + echo $other_input_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + } + + /** + * Validate field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string|array $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + + // Skip validation if field is dynamic and choices are empty. + if ( $this->is_dynamic_choices_empty( $field, $form_data ) ) { + return; + } + + parent::validate( $field_id, $field_submit, $form_data ); + } + + /** + * Format and sanitize field. + * + * @since 1.0.2 + * @since 1.9.8.3 Changed the expected $field_submit from string to mixed as in case with the Other option we can expect the array to arrive here. + * + * @param int $field_id Field ID. + * @param mixed $field_submit Submitted form data. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + $dynamic = ! empty( $field['dynamic_choices'] ) ? $field['dynamic_choices'] : false; + $name = sanitize_text_field( $field['label'] ); + $value_raw = sanitize_text_field( $field_submit ); + + $data = [ + 'name' => $name, + 'value' => '', + 'value_raw' => $value_raw, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + + if ( 'post_type' === $dynamic && ! empty( $field['dynamic_post_type'] ) ) { + + // Dynamic population is enabled using post type. + $data['dynamic'] = 'post_type'; + $data['dynamic_items'] = absint( $value_raw ); + $data['dynamic_post_type'] = $field['dynamic_post_type']; + $post = get_post( $value_raw ); + + if ( ! empty( $post ) && ! is_wp_error( $post ) && $data['dynamic_post_type'] === $post->post_type ) { + $data['value'] = esc_html( wpforms_get_post_title( $post ) ); + } + } elseif ( 'taxonomy' === $dynamic && ! empty( $field['dynamic_taxonomy'] ) ) { + + // Dynamic population is enabled using taxonomy. + $data['dynamic'] = 'taxonomy'; + $data['dynamic_items'] = absint( $value_raw ); + $data['dynamic_taxonomy'] = $field['dynamic_taxonomy']; + $term = get_term( $value_raw, $data['dynamic_taxonomy'] ); + + if ( ! empty( $term ) && ! is_wp_error( $term ) ) { + $data['value'] = esc_html( wpforms_get_term_name( $term ) ); + } + } else { + + // Normal processing, dynamic population is off. + $choice_key = ''; + + // If show_values is true, that means value posted is the raw value + // and not the label. So we need to set label value. Also store + // the choice key. + if ( ! empty( $field['show_values'] ) ) { + foreach ( $field['choices'] as $key => $choice ) { + if ( ! empty( $field_submit ) && $choice['value'] === $field_submit ) { + $data['value'] = sanitize_text_field( $choice['label'] ); + $choice_key = $key; + break; + } + } + } else { + + $data['value'] = $value_raw; + + // Determine choice key, this is needed for image choices. + foreach ( $field['choices'] as $key => $choice ) { + /* translators: %s - choice number. */ + if ( $field_submit === $choice['label'] || $value_raw === sprintf( esc_html__( 'Choice %s', 'wpforms-lite' ), $key ) ) { + $choice_key = $key; + + break; + } + } + } + + // Images choices are enabled, lookup and store image URL. + if ( ! empty( $choice_key ) && ! empty( $field['choices_images'] ) ) { + + $data['image'] = ! empty( $field['choices'][ $choice_key ]['image'] ) ? esc_url_raw( $field['choices'][ $choice_key ]['image'] ) : ''; + } + } + + // For the Other option the value_raw is the option and the value is text from the input. + if ( is_array( $field_submit ) && ! empty( $field_submit['other'] ) ) { + $data['value'] = sanitize_text_field( $field_submit['other'] ); + // Save the flag that the saved value is from the other option field. + $data['is_other'] = true; + + foreach ( $field['choices'] as $choice ) { + + if ( isset( $choice['other'] ) ) { + $data['value_raw'] = $choice['label']; + $data['image'] = ! empty( $field['choices_images'] ) && ! empty( $choice['image'] ) ? esc_url_raw( $choice['image'] ) : ''; + + break; + } + } + } + + // Push field details to be saved. + wpforms()->obj( 'process' )->fields[ $field_id ] = $data; + } + + /** + * Export entry field data. + * + * @since 1.9.8.3 + * + * @param array|mixed $field Field data. + * + * @return array + */ + public function export_entry_field_data( $field ): array { + + $field = (array) $field; + + if ( empty( $field['is_other'] ) ) { + return $field; + } + + $value = (string) ( $field['value'] ?? '' ); + $value_raw = (string) ( $field['value_raw'] ?? '' ); + + $field['value'] = $value_raw . ': ' . $value; + + return $field; + } + + /** + * Include a radio field in allowed field types for keyword search. + * + * @since 1.9.8.3 + * + * @param array|mixed $fields Array of field types. + * + * @return array + */ + public function add_field_to_anti_spam_keyword_filter( $fields ): array { + + $fields[] = $this->type; + + return $fields; + } + + /** + * Generate the HTML value for a field. + * + * It overrides the parent method because of fields with Other choices. + * + * @since 1.9.8.3 + * + * @param mixed $value The value of the field. + * @param array $field Field data and settings. + * @param array $form_data Optional. Additional form data. + * @param string $context Optional. The context in which the value is being rendered. + * + * @return string + */ + public function field_html_value( $value, $field, $form_data = [], $context = '' ) { + + if ( empty( $field['type'] ) || $field['type'] !== $this->type ) { + return $value; + } + + $other_value = $this->get_other_choice_value( $field ); + $field_value = $other_value ?? $field['value'] ?? ''; + + return parent::field_html_value( + $field_value, + $field, + $form_data, + $context + ); + } + + /** + * Return choice value, including Other label if applicable. + + * It overrides the parent method because of fields with Other choices. + * + * @since 1.9.8.3 + * + * @param array $field Field settings. + * @param array $form_data Form data. + * + * @return string + */ + protected function get_choices_value( array $field, array $form_data ): string { + + $other_value = $this->get_other_choice_value( $field ); + + return $other_value ?? parent::get_choices_value( $field, $form_data ); + } + + /** + * Retrieve the value for the "Other" choice option in a field. + * + * This method handles the retrieval of the "Other" choice value, considering + * both raw and processed values. It supports cases where the "Other" choice + * is enabled and attempts to construct a meaningful representation of the value + * based on the available inputs. + * + * @since 1.9.8.3 + * + * @param array $field Field data. + * + * @return string|null Returns the constructed "Other" choice value if available, + * or null if the "Other" choice is not enabled. + */ + private function get_other_choice_value( array $field ): ?string { + + // Bail out early if it's not an Other choice. + if ( empty( $field['is_other'] ) ) { + return null; + } + + $value = $field['value'] ?? ''; + $value_raw = $field['value_raw'] ?? ''; + + if ( wpforms_is_empty_string( $value_raw ) ) { + return (string) $value; + } + + // Return a value with a value_raw as a prefix only if both are not empty. + if ( ! wpforms_is_empty_string( $value ) ) { + return sprintf( '%1$s: %2$s', $value_raw, $value ); + } + + return (string) $value_raw; + } + + /** + * Adjust the entry field before saving. + * + * It's necessary for fields with other choices. + * + * @since 1.9.8.3 + * + * @param array $field Field data. + * @param array $form_data Form data. + * @param int $entry_id Entry ID. + * + * @return array + * @noinspection PhpUnused + */ + public function save_field( $field, $form_data, $entry_id ) { + + if ( empty( $field['type'] ) || $field['type'] !== $this->type ) { + return $field; + } + + // Save `value_raw: value` for fields with Other choices. + // It's necessary for search functionality on the Form Entries Overview table. + // Admins should be able to search for entries that have used an other value. + $other_value = $this->get_other_choice_value( $field ); + + if ( $other_value !== null ) { + $field['value'] = $other_value; + } + + return $field; + } +} + +new WPForms_Field_Radio(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-select.php b/wp-content/plugins/wpforms-lite/includes/fields/class-select.php new file mode 100755 index 00000000..0c8011e8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-select.php @@ -0,0 +1,795 @@ +name = esc_html__( 'Dropdown', 'wpforms-lite' ); + $this->keywords = esc_html__( 'choice', 'wpforms-lite' ); + $this->type = 'select'; + $this->icon = 'fa-caret-square-o-down'; + $this->order = 70; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'First Choice', 'wpforms-lite' ), + 'value' => '', + 'default' => '', + ], + 2 => [ + 'label' => esc_html__( 'Second Choice', 'wpforms-lite' ), + 'value' => '', + 'default' => '', + ], + 3 => [ + 'label' => esc_html__( 'Third Choice', 'wpforms-lite' ), + 'value' => '', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + // Define additional field properties. + add_filter( 'wpforms_field_properties_' . $this->type, [ $this, 'field_properties' ], 5, 3 ); + + // Form frontend CSS enqueues. + add_action( 'wpforms_frontend_css', [ $this, 'enqueue_frontend_css' ] ); + + // Form frontend JS enqueues. + add_action( 'wpforms_frontend_js', [ $this, 'enqueue_frontend_js' ] ); + + add_action( 'enqueue_block_editor_assets', [ $this, 'enqueue_block_editor_assets' ] ); + } + + /** + * Define additional field properties. + * + * @since 1.5.0 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + // Remove primary input. + unset( $properties['inputs']['primary'] ); + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = wpforms_validate_field_id( $field['id'] ); + $choices = $field['choices']; + $dynamic = wpforms_get_field_dynamic_choices( $field, $form_id, $form_data ); + + if ( $dynamic !== false ) { + $choices = $dynamic; + $field['show_values'] = true; + } + + // Set options container (', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) + ); + + // Optional placeholder. + if ( ! empty( $field_placeholder ) || $is_modern ) { + printf( + '', + selected( false, $has_default || $is_multiple, false ), + esc_html( $field_placeholder ) + ); + } + + // Build the select options. + foreach ( $choices as $key => $choice ) { + $label = $this->get_choices_label( $choice['label']['text'] ?? '', $key, $field ); + $value = isset( $choice['attr']['value'] ) && ! wpforms_is_empty_string( $choice['attr']['value'] ) ? $choice['attr']['value'] : $label; + $data = $choice['container']['data'] ?? []; + $data_html = ''; + + if ( ! empty( $data ) ) { + $data_html = wpforms_html_attributes( '', '', $data ); + } + + $selected = $choice['attr']['selected'] ?? false; + $selected_html = $selected ? ' selected="selected"' : ''; + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + printf( + '', + esc_attr( $value ), + selected( true, ! empty( $choice['default'] ), false ), + esc_attr( implode( ' ', $choice['container']['class'] ) ), + $data_html, + $selected_html, + wp_kses( + $label, + [ + 'span' => [ + 'class' => [], + ], + ] + ) + ); + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + } + + echo ''; + } + + /** + * Validate field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string|array $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + + // Skip validation if the field is dynamic and choices are empty. + if ( $this->is_dynamic_choices_empty( $field, $form_data ) ) { + return; + } + + parent::validate( $field_id, $field_submit, $form_data ); + } + + /** + * Format and sanitize field. + * + * @since 1.0.2 + * @since 1.6.1 Added support for multiple values. + * + * @param int $field_id Field ID. + * @param string|array $field_submit Submitted field value (selected option). + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh, Generic.Metrics.NestingLevel.MaxExceeded + + $field = $form_data['fields'][ $field_id ]; + $dynamic = ! empty( $field['dynamic_choices'] ) ? $field['dynamic_choices'] : false; + $multiple = ! empty( $field['multiple'] ); + $name = sanitize_text_field( $field['label'] ); + $value = []; + + // Convert the submitted field value to array. + if ( ! is_array( $field_submit ) ) { + $field_submit = [ $field_submit ]; + } + + $value_raw = wpforms_sanitize_array_combine( $field_submit ); + + $data = [ + 'name' => $name, + 'value' => '', + 'value_raw' => $value_raw, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + + if ( $dynamic === 'post_type' && ! empty( $field['dynamic_post_type'] ) ) { + + // Dynamic population is enabled using post type (like for a `Checkboxes` field). + $value_raw = implode( ',', array_map( 'absint', $field_submit ) ); + $data['value_raw'] = $value_raw; + $data['dynamic'] = 'post_type'; + $data['dynamic_items'] = $value_raw; + $data['dynamic_post_type'] = $field['dynamic_post_type']; + $posts = []; + + foreach ( $field_submit as $id ) { + $post = get_post( $id ); + + if ( ! empty( $post ) && ! is_wp_error( $post ) && $data['dynamic_post_type'] === $post->post_type ) { + $posts[] = esc_html( wpforms_get_post_title( $post ) ); + } + } + + $data['value'] = ! empty( $posts ) ? wpforms_sanitize_array_combine( $posts ) : ''; + + } elseif ( $dynamic === 'taxonomy' && ! empty( $field['dynamic_taxonomy'] ) ) { + + // Dynamic population is enabled using taxonomy (like for a `Checkboxes` field). + $value_raw = implode( ',', array_map( 'absint', $field_submit ) ); + $data['value_raw'] = $value_raw; + $data['dynamic'] = 'taxonomy'; + $data['dynamic_items'] = $value_raw; + $data['dynamic_taxonomy'] = $field['dynamic_taxonomy']; + $terms = []; + + foreach ( $field_submit as $id ) { + $term = get_term( $id, $field['dynamic_taxonomy'] ); + + if ( ! empty( $term ) && ! is_wp_error( $term ) ) { + $terms[] = esc_html( wpforms_get_term_name( $term ) ); + } + } + + $data['value'] = ! empty( $terms ) ? wpforms_sanitize_array_combine( $terms ) : ''; + + } else { + + // Normal processing, dynamic population is off. + + // If show_values is true, that means values posted are the raw values + // and not the labels. So we need to get the label values. + if ( ! empty( $field['show_values'] ) && (int) $field['show_values'] === 1 ) { + + foreach ( $field_submit as $item ) { + foreach ( $field['choices'] as $choice ) { + if ( $item === $choice['value'] ) { + $value[] = $choice['label']; + + break; + } + } + } + + $data['value'] = ! empty( $value ) ? wpforms_sanitize_array_combine( $value ) : ''; + + } else { + $data['value'] = $value_raw; + } + } + + // Backward compatibility: for single dropdown save a string, for multiple - array. + if ( ! $multiple && is_array( $data ) && ( 1 === count( $data ) ) ) { + $data = reset( $data ); + } + + // Push field details to be saved. + wpforms()->obj( 'process' )->fields[ $field_id ] = $data; + } + + /** + * Form frontend CSS enqueues. + * + * @since 1.6.1 + * + * @param array $forms Forms on the current page. + */ + public function enqueue_frontend_css( $forms ) { + + $has_modern_select = false; + + foreach ( $forms as $form ) { + if ( $this->is_field_style( $form, self::STYLE_MODERN ) ) { + $has_modern_select = true; + + break; + } + } + + if ( $has_modern_select || wpforms()->obj( 'frontend' )->assets_global() ) { + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-choicesjs', + WPFORMS_PLUGIN_URL . "assets/css/choices{$min}.css", + [], + self::CHOICES_VERSION + ); + } + } + + /** + * Form frontend JS enqueues. + * + * @since 1.6.1 + * + * @param array $forms Forms on the current page. + */ + public function enqueue_frontend_js( $forms ) { + + $has_modern_select = false; + + foreach ( $forms as $form ) { + if ( $this->is_field_style( $form, self::STYLE_MODERN ) ) { + $has_modern_select = true; + + break; + } + } + + if ( $has_modern_select || wpforms()->obj( 'frontend' )->assets_global() ) { + $this->enqueue_choicesjs_once( $forms ); + } + } + + /** + * Load WPForms Gutenberg block scripts. + * + * @since 1.8.1 + */ + public function enqueue_block_editor_assets() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-choicesjs', + WPFORMS_PLUGIN_URL . "assets/css/choices{$min}.css", + [], + self::CHOICES_VERSION + ); + + $this->enqueue_choicesjs_once( [] ); + } + + /** + * Whether the provided form has a dropdown field with a specified style. + * + * @since 1.6.1 + * + * @param array $form Form data. + * @param string $style Desired field style. + * + * @return bool + */ + protected function is_field_style( $form, $style ) { + + $is_field_style = false; + + if ( empty( $form['fields'] ) ) { + return false; + } + + foreach ( (array) $form['fields'] as $field ) { + if ( + ! empty( $field['type'] ) && + $field['type'] === $this->type && + ! empty( $field['style'] ) && + sanitize_key( $style ) === $field['style'] + ) { + $is_field_style = true; + + break; + } + } + + return $is_field_style; + } + + /** + * Get a field name for an ajax error message. + * + * @since 1.6.3 + * + * @param string|mixed $name Field name for error triggered. + * @param array $field Field settings. + * @param array $props List of properties. + * @param string|string[] $error Error message. + * + * @return string + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection + */ + public function ajax_error_field_name( $name, $field, $props, $error ) { + + $name = (string) $name; + + if ( ! isset( $field['type'] ) || $field['type'] !== 'select' ) { + return $name; + } + + if ( ! empty( $field['multiple'] ) ) { + $input = isset( $props['inputs'] ) ? end( $props['inputs'] ) : []; + + return isset( $input['attr']['name'] ) ? $input['attr']['name'] . '[]' : ''; + } + + return $name; + } +} + +new WPForms_Field_Select(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-text.php b/wp-content/plugins/wpforms-lite/includes/fields/class-text.php new file mode 100755 index 00000000..2b392819 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-text.php @@ -0,0 +1,558 @@ +name = esc_html__( 'Single Line Text', 'wpforms-lite' ); + $this->type = 'text'; + $this->icon = 'fa-text-width'; + $this->order = 30; + + // Define additional field properties. + add_filter( 'wpforms_field_properties_text', [ $this, 'field_properties' ], 5, 3 ); + add_action( 'wpforms_frontend_js', [ $this, 'frontend_js' ] ); + } + + /** + * Convert mask formatted for jquery.inputmask into the format used by amp-inputmask. + * + * Note that amp-inputmask does not yet support all of the options that jquery.inputmask provides. + * In particular, amp-inputmask doesn't provides: + * - Upper-alphabetical mask. + * - Upper-alphanumeric mask. + * - Advanced Input Masks with arbitrary repeating groups. + * + * @link https://amp.dev/documentation/components/amp-inputmask + * @link https://wpforms.com/docs/how-to-use-custom-input-masks/ + * + * @param string $mask Mask formatted for jquery.inputmask. + * @return array { + * Mask and placeholder. + * + * @type string $mask Mask for amp-inputmask. + * @type string $placeholder Placeholder derived from mask if one is not supplied. + * } + */ + protected function convert_mask_to_amp_inputmask( $mask ) { + $placeholder = ''; + + // Convert jquery.inputmask format into amp-inputmask format. + $amp_mask = ''; + $req_mask_mapping = [ + '9' => '0', // Numeric. + 'a' => 'L', // Alphabetical (a-z or A-Z). + 'A' => 'L', // Upper-alphabetical (A-Z). Note: AMP does not have an uppercase-alphabetical mask type, so same as previous. + '*' => 'A', // Alphanumeric (0-9, a-z, A-Z). + '&' => 'A', // Upper-alphanumeric (A-Z, 0-9). Note: AMP does not have an uppercase-alphanumeric mask type, so same as previous. + ' ' => '_', // Automatically insert spaces. + ]; + $opt_mask_mapping = [ + '9' => '9', // The user may optionally add a numeric character. + 'a' => 'l', // The user may optionally add an alphabetical character. + 'A' => 'l', // The user may optionally add an alphabetical character. + '*' => 'a', // The user may optionally add an alphanumeric character. + '&' => 'a', // The user may optionally add an alphanumeric character. + ]; + $placeholder_mapping = [ + '9' => '0', + 'a' => 'a', + 'A' => 'a', + '*' => '_', + '&' => '_', + ]; + $is_inside_optional = false; + $last_mask_token = null; + for ( $i = 0, $len = strlen( $mask ); $i < $len; $i++ ) { + if ( '[' === $mask[ $i ] ) { + $is_inside_optional = true; + $placeholder .= $mask[ $i ]; + continue; + } elseif ( ']' === $mask[ $i ] ) { + $is_inside_optional = false; + $placeholder .= $mask[ $i ]; + continue; + } elseif ( isset( $last_mask_token ) && preg_match( '/^\{(?P\d+)(?:,(?P\d+))?\}/', substr( $mask, $i ), $matches ) ) { + $amp_mask .= str_repeat( $req_mask_mapping[ $last_mask_token ], $matches['n'] ); + $placeholder .= str_repeat( $placeholder_mapping[ $last_mask_token ], $matches['n'] ); + if ( isset( $matches['m'] ) ) { + $amp_mask .= str_repeat( $opt_mask_mapping[ $last_mask_token ], $matches['m'] ); + $placeholder .= str_repeat( $placeholder_mapping[ $last_mask_token ], $matches['m'] ); + } + $i += strlen( $matches[0] ) - 1; + + $last_mask_token = null; // Reset. + continue; + } + + if ( '\\' === $mask[ $i ] ) { + $amp_mask .= '\\'; + $i++; + if ( ! isset( $mask[ $i ] ) ) { + continue; + } + $amp_mask .= $mask[ $i ]; + } else { + // Remember this token in case it is a mask. + if ( isset( $opt_mask_mapping[ $mask[ $i ] ] ) ) { + $last_mask_token = $mask[ $i ]; + } + + if ( $is_inside_optional && isset( $opt_mask_mapping[ $mask[ $i ] ] ) ) { + $amp_mask .= $opt_mask_mapping[ $mask[ $i ] ]; + } elseif ( isset( $req_mask_mapping[ $mask[ $i ] ] ) ) { + $amp_mask .= $req_mask_mapping[ $mask[ $i ] ]; + } else { + $amp_mask .= '\\' . $mask[ $i ]; + } + } + + if ( isset( $placeholder_mapping[ $mask[ $i ] ] ) ) { + $placeholder .= $placeholder_mapping[ $mask[ $i ] ]; + } else { + $placeholder .= $mask[ $i ]; + } + } + + return [ $amp_mask, $placeholder ]; + } + + /** + * Define additional field properties. + * + * @since 1.4.5 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + // Input primary: Detect custom input mask. + if ( empty( $field['input_mask'] ) ) { + return $properties; + } + + // Add class that will trigger custom mask. + $properties['inputs']['primary']['class'][] = 'wpforms-masked-input'; + + if ( wpforms_is_amp() ) { + return $this->get_amp_input_mask_properties( $properties, $field ); + } + + $properties['inputs']['primary']['data']['rule-inputmask-incomplete'] = true; + + if ( strpos( $field['input_mask'], 'alias:' ) !== false ) { + $mask = str_replace( 'alias:', '', $field['input_mask'] ); + $properties['inputs']['primary']['data']['inputmask-alias'] = $mask; + + return $properties; + } + + if ( strpos( $field['input_mask'], 'regex:' ) !== false ) { + $mask = str_replace( 'regex:', '', $field['input_mask'] ); + $properties['inputs']['primary']['data']['inputmask-regex'] = $mask; + + return $properties; + } + + if ( strpos( $field['input_mask'], 'date:' ) !== false ) { + $mask = str_replace( 'date:', '', $field['input_mask'] ); + $properties['inputs']['primary']['data']['inputmask-alias'] = 'datetime'; + $properties['inputs']['primary']['data']['inputmask-inputformat'] = $mask; + + /** + * Some datetime formats include letters, so we need to switch inputmode to text. + * For instance: + * – tt is am/pm + * – TT is AM/PM + */ + $properties['inputs']['primary']['data']['inputmask-inputmode'] = preg_match( '/[tT]/', $mask ) ? 'text' : 'numeric'; + + return $properties; + } + + $properties['inputs']['primary']['data']['inputmask-mask'] = $field['input_mask']; + + return $properties; + } + + /** + * Define additional field properties for the inputmask on AMP pages. + * + * @since 1.7.6 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * + * @return array + */ + private function get_amp_input_mask_properties( $properties, $field ) { + + list( $amp_mask, $placeholder ) = $this->convert_mask_to_amp_inputmask( $field['input_mask'] ); + + $properties['inputs']['primary']['attr']['mask'] = $amp_mask; + + if ( empty( $properties['inputs']['primary']['attr']['placeholder'] ) ) { + $properties['inputs']['primary']['attr']['placeholder'] = $placeholder; + } + + return $properties; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Limit length. + $args = [ + 'slug' => 'limit_enabled', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'limit_enabled', + 'value' => isset( $field['limit_enabled'] ), + 'desc' => esc_html__( 'Limit Length', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to limit text length by characters or words count.', 'wpforms-lite' ), + ], + false + ), + ]; + + $this->field_element( 'row', $field, $args ); + + $count = $this->field_element( + 'text', + $field, + [ + 'type' => 'number', + 'slug' => 'limit_count', + 'attrs' => [ + 'min' => 1, + 'step' => 1, + 'pattern' => '[0-9]', + ], + 'value' => ! empty( $field['limit_count'] ) ? absint( $field['limit_count'] ) : 1, + ], + false + ); + + $mode = $this->field_element( + 'select', + $field, + [ + 'slug' => 'limit_mode', + 'value' => ! empty( $field['limit_mode'] ) ? esc_attr( $field['limit_mode'] ) : 'characters', + 'options' => [ + 'characters' => esc_html__( 'Characters', 'wpforms-lite' ), + 'words' => esc_html__( 'Words', 'wpforms-lite' ), + ], + ], + false + ); + + $args = [ + 'slug' => 'limit_controls', + 'class' => ! isset( $field['limit_enabled'] ) ? 'wpforms-hide' : '', + 'content' => $count . $mode, + ]; + + $this->field_element( 'row', $field, $args ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Input Mask. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'input_mask', + 'value' => esc_html__( 'Input Mask', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter your custom input mask.', 'wpforms-lite' ), + 'after_tooltip' => '' . esc_html__( 'See Examples & Docs', 'wpforms-lite' ) . '', + ], + false + ); + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'input_mask', + 'value' => ! empty( $field['input_mask'] ) ? esc_attr( $field['input_mask'] ) : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'input_mask', + 'content' => $lbl . $fld, + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Define data. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + + // Label. + $this->field_preview_option( 'label', $field ); + + // Primary input. + echo ''; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.0.0 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $primary = $field['properties']['inputs']['primary']; + + if ( isset( $field['limit_enabled'] ) ) { + $limit_count = isset( $field['limit_count'] ) ? absint( $field['limit_count'] ) : 0; + $limit_mode = isset( $field['limit_mode'] ) ? sanitize_key( $field['limit_mode'] ) : 'characters'; + + $primary['data']['form-id'] = $form_data['id']; + $primary['data']['field-id'] = $field['id']; + + if ( 'characters' === $limit_mode ) { + $primary['class'][] = 'wpforms-limit-characters-enabled'; + $primary['attr']['maxlength'] = $limit_count; + $primary['data']['text-limit'] = $limit_count; + } else { + $primary['class'][] = 'wpforms-limit-words-enabled'; + $primary['data']['text-limit'] = $limit_count; + } + } + + // Primary field. + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ), + $primary['required'] // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Enqueue frontend limit option js. + * + * @since 1.5.6 + * + * @param array $forms Forms on the current page. + */ + public function frontend_js( $forms ) { + + // Get fields. + $fields = array_map( + function( $form ) { + return empty( $form['fields'] ) ? [] : $form['fields']; + }, + (array) $forms + ); + + // Make fields flat. + $fields = array_reduce( + $fields, + function( $accumulator, $current ) { + return array_merge( $accumulator, $current ); + }, + [] + ); + + // Leave only fields with limit. + $fields = array_filter( + $fields, + function( $field ) { + return $field['type'] === $this->type && isset( $field['limit_enabled'] ) && ! empty( $field['limit_count'] ); + } + ); + + if ( count( $fields ) ) { + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-text-limit', + WPFORMS_PLUGIN_URL . "assets/js/frontend/fields/text-limit.es5{$min}.js", + [], + WPFORMS_VERSION, + $this->load_script_in_footer() + ); + } + } + + /** + * Format and sanitize field. + * + * @since 1.5.6 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + $name = ! empty( $field['label'] ) ? sanitize_text_field( $field['label'] ) : ''; + + // Sanitize. + $value = sanitize_text_field( $field_submit ); + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $name, + 'value' => $value, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } + + /** + * Validate field on form submit. + * + * @since 1.6.2 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + parent::validate( $field_id, $field_submit, $form_data ); + + if ( empty( $form_data['fields'][ $field_id ] ) || empty( $form_data['fields'][ $field_id ]['limit_enabled'] ) ) { + return; + } + + $field = $form_data['fields'][ $field_id ]; + $limit = absint( $field['limit_count'] ); + $mode = ! empty( $field['limit_mode'] ) ? sanitize_key( $field['limit_mode'] ) : 'characters'; + $value = sanitize_text_field( $field_submit ); + + if ( 'characters' === $mode ) { + if ( mb_strlen( str_replace( "\r\n", "\n", $value ) ) > $limit ) { + /* translators: %s - limit characters number. */ + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = sprintf( _n( 'Text can\'t exceed %d character.', 'Text can\'t exceed %d characters.', $limit, 'wpforms-lite' ), $limit ); + + return; + } + } else { + if ( wpforms_count_words( $value ) > $limit ) { + /* translators: %s - limit words number. */ + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = sprintf( _n( 'Text can\'t exceed %d word.', 'Text can\'t exceed %d words.', $limit, 'wpforms-lite' ), $limit ); + + return; + } + } + } +} + +new WPForms_Field_Text(); diff --git a/wp-content/plugins/wpforms-lite/includes/fields/class-textarea.php b/wp-content/plugins/wpforms-lite/includes/fields/class-textarea.php new file mode 100755 index 00000000..ab0338fd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/fields/class-textarea.php @@ -0,0 +1,380 @@ +name = esc_html__( 'Paragraph Text', 'wpforms-lite' ); + $this->keywords = esc_html__( 'textarea', 'wpforms-lite' ); + $this->type = 'textarea'; + $this->icon = 'fa-paragraph'; + $this->order = 50; + + add_action( 'wpforms_frontend_js', [ $this, 'frontend_js' ] ); + } + + /** + * Get the value, that is used to prefill via dynamic or fallback population. + * Based on field data and current properties. + * + * @since 1.6.4 + * + * @param string $raw_value Value from a GET param, always a string. + * @param string $input Represent a subfield inside the field. May be empty. + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function get_field_populated_single_property_value( $raw_value, $input, $properties, $field ) { + + if ( ! is_string( $raw_value ) ) { + return $properties; + } + + if ( + ! empty( $input ) && + isset( $properties['inputs'][ $input ] ) + ) { + $properties['inputs'][ $input ]['attr']['value'] = wpforms_sanitize_textarea_field( wp_unslash( $raw_value ) ); + } + + return $properties; + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field data and settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Limit length. + $args = [ + 'slug' => 'limit_enabled', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'limit_enabled', + 'value' => isset( $field['limit_enabled'] ) ? '1' : '0', + 'desc' => esc_html__( 'Limit Length', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to limit text length by characters or words count.', 'wpforms-lite' ), + ], + false + ), + ]; + + $this->field_element( 'row', $field, $args ); + + $count = $this->field_element( + 'text', + $field, + [ + 'type' => 'number', + 'slug' => 'limit_count', + 'attrs' => [ + 'min' => 1, + 'step' => 1, + 'pattern' => '[0-9]', + ], + 'value' => ! empty( $field['limit_count'] ) ? $field['limit_count'] : 1, + ], + false + ); + + $mode = $this->field_element( + 'select', + $field, + [ + 'slug' => 'limit_mode', + 'value' => ! empty( $field['limit_mode'] ) ? esc_attr( $field['limit_mode'] ) : 'characters', + 'options' => [ + 'characters' => esc_html__( 'Characters', 'wpforms-lite' ), + 'words' => esc_html__( 'Words', 'wpforms-lite' ), + ], + ], + false + ); + + $args = [ + 'slug' => 'limit_controls', + 'class' => ! isset( $field['limit_enabled'] ) ? 'wpforms-hide' : '', + 'content' => $count . $mode, + ]; + + $this->field_element( 'row', $field, $args ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field data and settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + // Primary input. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + + echo ''; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.0.0 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $primary = $field['properties']['inputs']['primary']; + $value = ''; + + if ( isset( $primary['attr']['value'] ) ) { + $value = esc_textarea( html_entity_decode( $primary['attr']['value'] ) ); + + unset( $primary['attr']['value'] ); + } + + if ( isset( $field['limit_enabled'] ) ) { + $limit_count = isset( $field['limit_count'] ) ? absint( $field['limit_count'] ) : 0; + $limit_mode = isset( $field['limit_mode'] ) ? sanitize_key( $field['limit_mode'] ) : 'characters'; + + $primary['data']['form-id'] = $form_data['id']; + $primary['data']['field-id'] = $field['id']; + + if ( 'characters' === $limit_mode ) { + $primary['class'][] = 'wpforms-limit-characters-enabled'; + $primary['attr']['maxlength'] = $limit_count; + $primary['data']['text-limit'] = $limit_count; + } else { + $primary['class'][] = 'wpforms-limit-words-enabled'; + $primary['data']['text-limit'] = $limit_count; + } + } + + // Primary field. + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ), + $primary['required'], // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $value // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Enqueue frontend limit option js. + * + * @since 1.5.6 + * + * @param array $forms Forms on the current page. + */ + public function frontend_js( $forms ) { + + // Get fields. + $fields = array_map( + function( $form ) { + return empty( $form['fields'] ) ? [] : $form['fields']; + }, + (array) $forms + ); + + // Make fields flat. + $fields = array_reduce( + $fields, + function( $accumulator, $current ) { + return array_merge( $accumulator, $current ); + }, + [] + ); + + // Leave only fields with limit. + $fields = array_filter( + $fields, + function( $field ) { + return $field['type'] === $this->type && isset( $field['limit_enabled'] ); + } + ); + + if ( count( $fields ) ) { + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-text-limit', + WPFORMS_PLUGIN_URL . "assets/js/frontend/fields/text-limit.es5{$min}.js", + [], + WPFORMS_VERSION, + $this->load_script_in_footer() + ); + } + } + + /** + * Format and sanitize field. + * + * @since 1.5.6 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + if ( is_array( $field_submit ) ) { + $field_submit = implode( "\r\n", array_filter( $field_submit ) ); + } + + $name = ! empty( $field['label'] ) ? sanitize_text_field( $field['label'] ) : ''; + + // Sanitize but keep line breaks. + $value = wpforms_sanitize_textarea_field( $field_submit ); + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $name, + 'value' => $value, + 'id' => wpforms_validate_field_id( $field_id ), + 'type' => $this->type, + ]; + } + + /** + * Validate field on form submit. + * + * @since 1.6.2 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + parent::validate( $field_id, $field_submit, $form_data ); + + if ( empty( $form_data['fields'][ $field_id ] ) || empty( $form_data['fields'][ $field_id ]['limit_enabled'] ) ) { + return; + } + + if ( is_array( $field_submit ) ) { + $field_submit = implode( "\r\n", array_filter( $field_submit ) ); + } + + $field = $form_data['fields'][ $field_id ]; + $limit = absint( $field['limit_count'] ); + $mode = ! empty( $field['limit_mode'] ) ? sanitize_key( $field['limit_mode'] ) : 'characters'; + $value = wpforms_sanitize_textarea_field( $field_submit ); + + if ( 'characters' === $mode ) { + if ( mb_strlen( str_replace( "\r\n", "\n", $value ) ) > $limit ) { + /* translators: %s - limit characters number. */ + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = sprintf( _n( 'Text can\'t exceed %d character.', 'Text can\'t exceed %d characters.', $limit, 'wpforms-lite' ), $limit ); + + return; + } + } else { + if ( wpforms_count_words( $value ) > $limit ) { + /* translators: %s - limit words number. */ + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = sprintf( _n( 'Text can\'t exceed %d word.', 'Text can\'t exceed %d words.', $limit, 'wpforms-lite' ), $limit ); + + return; + } + } + } +} + +new WPForms_Field_Textarea(); diff --git a/wp-content/plugins/wpforms-lite/includes/functions-list.php b/wp-content/plugins/wpforms-lite/includes/functions-list.php new file mode 100755 index 00000000..2d499024 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions-list.php @@ -0,0 +1,7 @@ +is_pro() ? 'wpforms_versions' : 'wpforms_versions_lite'; + $upgrades = (array) get_option( $option_name, [] ); + + if ( ! isset( $upgrades[ $version ] ) ) { + return false; + } + + return (int) $upgrades[ $version ]; +} + +/** + * Get the default capability to manage everything for WPForms. + * + * @since 1.4.4 + * + * @return string + */ +function wpforms_get_capability_manage_options(): string { + + /** + * Filters the default capability to manage everything for WPForms. + * By default, it is 'manage_options'. + * + * @since 1.4.4 + * + * @param string $capability Default capability to manage everything for WPForms. + */ + return (string) apply_filters( 'wpforms_manage_cap', 'manage_options' ); +} + +/** + * Check WPForms permissions for currently logged-in user. + * Both short (e.g. 'view_own_forms') or long (e.g. 'wpforms_view_own_forms') capability names can be used. + * Only WPForms capabilities get processed. + * + * @since 1.4.4 + * + * @param array|string $caps Capability name(s). + * @param int|mixed $id ID of the specific object to check against if capability is a "meta" cap. + * "Meta" capabilities, e.g. 'edit_post', 'edit_user', etc., + * are capabilities used by map_meta_cap() to map to other "primitive" capabilities, + * e.g. 'edit_posts', 'edit_others_posts', etc. + * Accessed via func_get_args() and passed to WP_User::has_cap(), then map_meta_cap(). + * + * @return bool + */ +function wpforms_current_user_can( $caps = [], $id = 0 ): bool { + + static $results; + + $id = (int) $id; + $caps_str = is_array( $caps ) ? implode( ' ', $caps ) : (string) $caps; + $hash = md5( $caps_str . $id ); + + // Return a cached result. + if ( isset( $results[ $hash ] ) ) { + return $results[ $hash ]; + } + + $access = wpforms()->obj( 'access' ); + + if ( ! $access || ! method_exists( $access, 'current_user_can' ) ) { + return false; + } + + $user_can = $access->current_user_can( $caps, $id ); + + /** + * Filters the result of the WPForms permissions check for the currently logged-in user. + * + * @since 1.4.4 + * + * @param bool $user_can Whether the current user has the capability. + * @param array|string $caps Capability name(s). + * @param int $id ID of the specific object to check against if capability is a "meta" cap. + */ + $results[ $hash ] = apply_filters( 'wpforms_current_user_can', $user_can, $caps, $id ); + + return $results[ $hash ]; +} + +/** + * Search for posts editable by the user. + * + * @since 1.7.9 + * + * @param string $search_term Optional search term. Default ''. + * @param array $args Args { + * Optional. An array of arguments. + * + * @type string $post_type Post type to search for. + * @type string[] $post_status Post status to search for. + * @type int $count Number of results to return. Default 20. + * } + * + * @return array + * @noinspection PhpTernaryExpressionCanBeReducedToShortVersionInspection + * @noinspection ElvisOperatorCanBeUsedInspection + */ +function wpforms_search_posts( $search_term = '', $args = [] ): array { + + global $wpdb; + + $default_args = [ + 'post_type' => 'page', + 'post_status' => [ 'publish' ], + 'count' => 20, + ]; + $args = wp_parse_args( $args, $default_args ); + + // @todo: add trash access capabilities to MySQL. + // See edit_post/edit_page case in map_meta_cap(). + $args['post_status'] = array_diff( $args['post_status'], [ 'trash' ] ); + + $user = wp_get_current_user(); + $user_id = $user->ID ?? 0; + $post_type = get_post_type_object( $args['post_type'] ); + + if ( ! $user || ! $user_id || ! $post_type || $args['count'] <= 0 ) { + return []; + } + + $last_changed = wp_cache_get_last_changed( 'posts' ); + $key = __FUNCTION__ . ":$search_term:$last_changed"; + $cache_posts = wp_cache_get( $key, '', false, $found ); + + if ( $found ) { + return (array) $cache_posts; + } + + $post_title_where = $search_term ? $wpdb->prepare( + 'post_title LIKE %s AND', + '%' . $wpdb->esc_like( $search_term ) . '%' + ) : + ''; + + $post_statuses = array_intersect( array_keys( get_post_statuses() ), $args['post_status'] ); + $post_statuses = wpforms_wpdb_prepare_in( $post_statuses ); + $policy_id = (int) get_option( 'wp_page_for_privacy_policy' ); + $can_delete_published_posts = (int) $user->has_cap( $post_type->cap->delete_published_posts ); + $can_delete_posts = (int) $user->has_cap( $post_type->cap->delete_posts ); + $can_delete_others_posts = (int) $user->has_cap( $post_type->cap->delete_others_posts ); + $can_delete_private_posts = (int) $user->has_cap( $post_type->cap->delete_private_posts ); + $can_edit_policy = (int) $user->has_cap( map_meta_cap( 'manage_privacy_options', $user_id )[0] ); + + // For the case when the user is post author. + $capability_author_where = "post_author = $user_id AND + ( ( post_status IN ( 'publish', 'future' ) AND $can_delete_published_posts ) OR + ( ( post_status NOT IN ( 'publish', 'future', 'trash' ) ) AND $can_delete_posts ) + )"; + + // For the case when accessing someone other's post. + $capability_other_where = "post_author != $user_id AND + $can_delete_others_posts AND + ( ( post_status IN ( 'publish', 'future' ) AND $can_delete_published_posts ) OR + ( ( post_status IN ( 'private' ) ) AND $can_delete_private_posts ) + )"; + + // For privacy policy page. + $capability_policy_where = "ID = $policy_id AND $can_edit_policy"; + + $capability_where = '( ' . + '(' . $capability_author_where . ') OR ' . + '(' . $capability_other_where . ') OR ' . + '(' . $capability_policy_where . ')' . + ' )'; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $posts = $wpdb->get_results( + $wpdb->prepare( + "SELECT ID, post_title, post_author + FROM $wpdb->posts + WHERE $post_title_where + post_type = %s AND + post_status IN ( $post_statuses ) AND + $capability_where + ORDER BY post_title LIMIT %d", + $args['post_type'], + absint( $args['count'] ) + ) + ); + // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared + + $posts = $posts ? $posts : []; + $posts = array_map( + static function ( $post ) { + $post->post_title = wpforms_get_post_title( $post ); + + unset( $post->post_author ); + + return $post; + }, + $posts + ); + + wp_cache_set( $key, $posts ); + + return $posts; +} + +/** + * Search pages by search term and return an array containing + * `value` and `label` which is the post ID and post title respectively. + * + * @since 1.7.9 + * + * @param string $search_term The search term. + * @param array $args Optional. An array of arguments. + * + * @return array + */ +function wpforms_search_pages_for_dropdown( $search_term, $args = [] ): array { + + $search_results = wpforms_search_posts( $search_term, $args ); + $result_pages = []; + + // Prepare for ChoicesJS render. + foreach ( $search_results as $search_result ) { + $result_pages[] = [ + 'value' => absint( $search_result->ID ), + 'label' => esc_html( $search_result->post_title ), + ]; + } + + return $result_pages; +} diff --git a/wp-content/plugins/wpforms-lite/includes/functions/builder.php b/wp-content/plugins/wpforms-lite/includes/functions/builder.php new file mode 100755 index 00000000..741f9a55 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions/builder.php @@ -0,0 +1,33 @@ +%3$s%4$s', + sanitize_html_class( $is_active ? 'green' : 'silver' ), + esc_attr( $is_active ), + $is_active ? '' : '', + esc_html( $label ), + esc_attr( $title ), + esc_attr( $connection_id ) + ); + + printf( '', esc_attr( $name ), esc_attr( $connection_id ), absint( $is_active ) ); +} diff --git a/wp-content/plugins/wpforms-lite/includes/functions/checks.php b/wp-content/plugins/wpforms-lite/includes/functions/checks.php new file mode 100755 index 00000000..5f68e625 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions/checks.php @@ -0,0 +1,595 @@ + 254 ) { + return false; + } + + $email_arr = explode( '@', $email ); + + if ( count( $email_arr ) !== 2 ) { + return false; + } + + [ $local, $domain ] = $email_arr; + + /** + * RFC requires local part to be no longer than 64 octets. + * Punycode library checks for 63 octets. + * + * @link https://github.com/true/php-punycode/blob/master/src/Punycode.php#L182. + */ + if ( strlen( $local ) > 63 ) { + return false; + } + + $domain_arr = explode( '.', $domain ); + + foreach ( $domain_arr as $domain_label ) { + $domain_label = trim( $domain_label ); + + if ( ! $domain_label ) { + return false; + } + + // The RFC says: 'A DNS label may be no more than 63 octets long'. + if ( strlen( $domain_label ) > 63 ) { + return false; + } + } + + if ( ! $punycode ) { + $punycode = new Punycode(); + } + + /** + * The wp_mail() uses phpMailer, which uses is_email() as verification callback. + * For verification, phpMailer sends the email address where the domain part is punycode encoded only. + * We follow here the same principle. + */ + $email_check = $local . '@' . $punycode->encode( $domain ); + + // Other limitations are checked by the native WordPress function is_email(). + return is_email( $email_check ) ? $local . '@' . $domain : false; +} + +/** + * Check whether the string is json-encoded. + * + * @since 1.7.5 + * + * @param string $value A string. + * + * @return bool + */ +function wpforms_is_json( $value ): bool { + + return ( + is_string( $value ) && + is_array( json_decode( $value, true ) ) && + json_last_error() === JSON_ERROR_NONE + ); +} + +/** + * Check whether the current page is in AMP mode or not. + * We need to check for specific functions, as there is no special AMP header. + * + * @since 1.4.1 + * + * @param bool $check_theme_support Whether theme support should be checked. Defaults to true. + * + * @return bool + */ +function wpforms_is_amp( $check_theme_support = true ): bool { + + $is_amp = false; + + // Check for AMP by AMP Project Contributors. + if ( function_exists( 'amp_is_request' ) && amp_is_request() ) { + $is_amp = true; + } + + if ( $is_amp && $check_theme_support ) { + $is_amp = current_theme_supports( 'amp' ); + } + + /** + * Filters AMP flag. + * + * @since 1.4.1 + * + * @param bool $is_amp Current page AMP status. + * + * @return bool + */ + return (bool) apply_filters( 'wpforms_is_amp', $is_amp ); +} + +/** + * Helper function to determine if loading on WPForms related admin page. + * + * Here we determine if the current administration page is owned/created by + * WPForms. This is done in compliance with WordPress best practices for + * development, so that we only load required WPForms CSS and JS files on pages + * we create. As a result, we do not load our assets admin wide, where they might + * conflict with other plugins needlessly, also leading to a better, faster user + * experience for our users. + * + * @since 1.3.9 + * + * @param string $slug Slug identifier for a specific WPForms admin page. + * @param string $view Slug identifier for a specific WPForms admin page view ("subpage"). + * + * @return bool + */ +function wpforms_is_admin_page( $slug = '', $view = '' ): bool { + + // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + $page = ( (array) ( $_REQUEST['page'] ?? '' ) )[0]; + + // Check against basic requirements. + if ( + strpos( $page, 'wpforms' ) === false || + ! is_admin() + ) { + return false; + } + + // Check against page slug identifier. + if ( + ( ! empty( $slug ) && $_REQUEST['page'] !== 'wpforms-' . $slug ) || + ( empty( $slug ) && $_REQUEST['page'] === 'wpforms-builder' ) + ) { + return false; + } + + // Check against sublevel page view. + if ( + ! empty( $view ) && + ( empty( $_REQUEST['view'] ) || $_REQUEST['view'] !== $view ) + ) { + return false; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + + return true; +} + +/** + * Check if a string is empty. + * + * @since 1.5.0 + * + * @param string $value String to test. + * + * @return bool + */ +function wpforms_is_empty_string( $value ): bool { + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + return $value === ''; +} + +/** + * Determine if the request is a rest API call. + * + * Case #1: After WP_REST_Request initialization + * Case #2: Support "plain" permalink settings + * Case #3: It can happen that WP_Rewrite is not yet initialized, + * so do this (wp-settings.php) + * Case #4: URL Path begins with wp-json/ (your REST prefix) + * Also supports WP installations in sub folders + * + * @since 1.8.8 + * + * @return bool True if the request is a REST API call, false if not. + * @author matzeeable + */ +function wpforms_is_rest(): bool { + + if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { + return false; + } + + // Case #1. + if ( defined( 'REST_REQUEST' ) && constant( 'REST_REQUEST' ) ) { + return true; + } + + // Case #2. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $rest_route = isset( $_GET['rest_route'] ) ? + filter_input( INPUT_GET, 'rest_route', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) : + ''; + + if ( strpos( trim( $rest_route, '\\/' ), rest_get_url_prefix() ) === 0 ) { + return true; + } + + // Case #3. + global $wp_rewrite; + if ( $wp_rewrite === null ) { + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + $wp_rewrite = new WP_Rewrite(); + } + + // Case #4. + $current_url = (string) wp_parse_url( add_query_arg( [] ), PHP_URL_PATH ); + $rest_url = wp_parse_url( trailingslashit( rest_url() ), PHP_URL_PATH ); + + return strpos( $current_url, $rest_url ) === 0; +} + +/** + * Determine if the request is a WPForms related rest API call. + * + * NOTE: The function shouldn't be used before the `rest_api_init` action. + * + * @since 1.9.6.1 + * + * @return bool True if the request is a WPForms related rest API call, false if not. + */ +function wpforms_is_wpforms_rest(): bool { + + if ( ! wpforms_is_rest() ) { + return false; + } + + $rest_url = wp_parse_url( trailingslashit( rest_url() ) ); + $current_url = wp_parse_url( trailingslashit( wpforms_current_url() ) ); + $rest_url['path'] = $rest_url['path'] ?? ''; + + // phpcs:disable WordPress.Security.NonceVerification.Recommended + $is_rest_plain = $rest_url['path'] === '/index.php' && ! empty( $_GET['rest_route'] ); + $is_rest_post_name = strpos( $rest_url['path'], '/wp-json/' ) !== false; + + if ( $is_rest_plain ) { + $rest_route = sanitize_text_field( wp_unslash( $_GET['rest_route'] ) ); + + return strpos( $rest_route, '/wpforms/' ) !== false; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + if ( $is_rest_post_name ) { + return strpos( $current_url['path'] ?? '', '/wpforms/' ) !== false; + } + + return false; +} + +/** + * Determine if the request is WPForms AJAX. + * + * @since 1.8.0 + * @since 1.9.1 Added an optional parameter to check for a specific action. + * + * @param string $action Certain AJAX action to check. Optional. Default is empty. + * + * @return bool + */ +function wpforms_is_ajax( string $action = '' ): bool { + + if ( ! wp_doing_ajax() ) { + return false; + } + + // Make sure the request target is admin-ajax.php. + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && basename( sanitize_text_field( wp_normalize_path( $_SERVER['SCRIPT_FILENAME'] ) ) ) !== 'admin-ajax.php' ) { + return false; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $request_action = isset( $_REQUEST['action'] ) ? sanitize_key( $_REQUEST['action'] ) : ''; + $is_wpforms_action = strpos( $request_action, 'wpforms_' ) === 0; + + if ( empty( $action ) ) { + return $is_wpforms_action; + } + + return $is_wpforms_action && $action === $request_action; +} + +/** + * Determine if request is frontend AJAX. + * + * @since 1.5.8.2 + * @since 1.6.5 Added filterable frontend ajax actions list as a fallback to missing referer cases. + * @since 1.6.7.1 Removed a requirement for an AJAX action to be a WPForms action if referer is not missing. + * @since 1.8.0 Added clear separation between frontend and admin AJAX requests, see `wpforms_is_admin_ajax()`. + * + * @return bool + */ +function wpforms_is_frontend_ajax(): bool { + + if ( wpforms_is_ajax() && ! wpforms_is_admin_ajax() ) { + return true; + } + + // Try detecting a frontend AJAX call indirectly by comparing the current action + // with a known frontend actions list in case there's no HTTP referer. + + $ref = wp_get_raw_referer(); + + if ( $ref ) { + return false; + } + + $frontend_actions = [ + 'wpforms_submit', + 'wpforms_file_upload_speed_test', + 'wpforms_upload_chunk_init', + 'wpforms_upload_chunk', + 'wpforms_file_chunks_uploaded', + 'wpforms_remove_file', + 'wpforms_restricted_email', + 'wpforms_form_locker_unique_answer', + 'wpforms_form_abandonment', + ]; + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $action = isset( $_REQUEST['action'] ) ? sanitize_key( $_REQUEST['action'] ) : ''; + + /** + * Allow modifying the list of frontend AJAX actions. + * + * This filter may be running as early as `plugins_loaded` hook. + * Please mind the hook order when using it. + * + * @since 1.6.5 + * + * @param array $frontend_actions A list of frontend actions. + */ + $frontend_actions = (array) apply_filters( 'wpforms_is_frontend_ajax_frontend_actions', $frontend_actions ); + + return in_array( $action, $frontend_actions, true ); +} + +/** + * Determine if request is admin AJAX. + * + * @since 1.8.0 + * + * @return bool + */ +function wpforms_is_admin_ajax(): bool { + + if ( ! wpforms_is_ajax() ) { + return false; + } + + $ref = wp_get_raw_referer(); + + if ( ! $ref ) { + return false; + } + + $path = wp_parse_url( $ref, PHP_URL_PATH ); + $admin_path = wp_parse_url( admin_url(), PHP_URL_PATH ); + + // Is an admin AJAX call if HTTP referer contain an admin path. + return strpos( $path, $admin_path ) !== false; +} + +/** + * Check if Gutenberg is active. + * + * @since 1.6.2 + * + * @return bool True if Gutenberg is active. + * @noinspection PhpUndefinedFunctionInspection + */ +function wpforms_is_gutenberg_active(): bool { + + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + if ( is_plugin_active( 'classic-editor/classic-editor.php' ) ) { + return in_array( get_option( 'classic-editor-replace' ), [ 'no-replace', 'block' ], true ); + } + + if ( is_plugin_active( 'disable-gutenberg/disable-gutenberg.php' ) ) { + return ! disable_gutenberg(); + } + + return true; +} + +/** + * Check if website support Divi Builder. + * + * @since 1.9.2.3 + * + * @return bool True if Divi builder plugin or Divi or Extra theme is active. + */ +function wpforms_is_divi_active(): bool { + + if ( function_exists( 'et_divi_builder_init_plugin' ) ) { + return true; + } + + $allow_themes = [ 'Divi', 'Extra' ]; + $theme_name = get_template(); + + return in_array( $theme_name, $allow_themes, true ); +} + +/** + * Determines whether the current request is a WP CLI request. + * + * @since 1.7.6 + * + * @return bool + */ +function wpforms_doing_wp_cli(): bool { + + return defined( 'WP_CLI' ) && WP_CLI; +} + +/** + * Determines whether the Action Scheduler task is executing. + * + * @since 1.9.4 + * + * @return bool + */ +function wpforms_doing_scheduled_action(): bool { + + return class_exists( Tasks::class ) && Tasks::is_executing(); +} + +/** + * Determines whether search functionality is enabled for Choices.js elements in the admin area. + * + * @since 1.8.3 + * + * @param array $data Data to be displayed in the dropdown. + * + * @return string + */ +function wpforms_choices_js_is_search_enabled( $data ): string { + + /** + * Filter max number of items at which no search box is displayed. + * + * @since 1.8.3 + * + * @param int $count Max items count. + */ + return count( $data ) >= apply_filters( 'wpforms_choices_js_is_search_enabled_max_limit', 20 ) ? 'true' : 'false'; +} + +/** + * Check if a form is a template. + * + * @since 1.8.8 + * + * @param int|WP_Post $form Form ID or object. + * + * @return bool True if the form is a template. + */ +function wpforms_is_form_template( $form ): bool { + + $template_post_type = 'wpforms-template'; + + if ( $form instanceof WP_Post ) { + return $form->post_type === $template_post_type; + } + + return $template_post_type === get_post_type( $form ); +} + +/** + * Checks if the current screen is using the block editor. + * + * @since 1.8.8 + * + * @return bool True if the current screen is using the block editor, false otherwise. + */ +function wpforms_is_block_editor(): bool { + + $screen = get_current_screen(); + + return $screen && method_exists( $screen, 'is_block_editor' ) && $screen->is_block_editor(); +} + +/** + * Check for the editor page. + * + * @since 1.9.0 + * + * @return bool True if the page is in the editor, false otherwise. + */ +function wpforms_is_editor_page(): bool { + + // phpcs:disable WordPress.Security.NonceVerification + $rest_request = defined( 'REST_REQUEST' ) && REST_REQUEST; + $context = isset( $_REQUEST['context'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['context'] ) ) : ''; + $post_action = isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : ''; + $get_action = isset( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : ''; + + $is_gutenberg = $rest_request && $context === 'edit'; + $is_elementor = $post_action === 'elementor_ajax' || $get_action === 'elementor'; + $is_divi = wpforms_is_divi_editor(); + // phpcs:enable WordPress.Security.NonceVerification + + return $is_gutenberg || $is_elementor || $is_divi; +} + +/** + * Determines whether the current context is the Divi editor. + * + * @since 1.9.4 + * + * @return bool + */ +function wpforms_is_divi_editor(): bool { + + // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended + return ! empty( $_GET['et_fb'] ) || ( isset( $_POST['action'] ) && sanitize_key( $_POST['action'] ) === 'wpforms_divi_preview' ); +} diff --git a/wp-content/plugins/wpforms-lite/includes/functions/colors.php b/wp-content/plugins/wpforms-lite/includes/functions/colors.php new file mode 100755 index 00000000..e840f947 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions/colors.php @@ -0,0 +1,165 @@ + 155 ? $dark : $light; +} + +/** + * Convert hex color value to RGB. + * + * @since 1.7.9 + * @since 1.8.5 New param and return type were added. + * + * @param string $hex Color value in hex format. + * @param bool $as_string Whether to return the RGB value as a string or array. + * + * @return string|array Color value in RGB format. + */ +function wpforms_hex_to_rgb( $hex, $as_string = true ) { + + $hex = ltrim( $hex, '#' ); + + // Convert shorthand colors to full format, e.g. "FFF" -> "FFFFFF". + $rgb_parts = preg_replace( '~^(.)(.)(.)$~', '$1$1$2$2$3$3', $hex ); + + $rgb = []; + $rgb['R'] = hexdec( $rgb_parts[0] . $rgb_parts[1] ); + $rgb['G'] = hexdec( $rgb_parts[2] . $rgb_parts[3] ); + $rgb['B'] = hexdec( $rgb_parts[4] . $rgb_parts[5] ); + + // Return the RGB value as a string. + if ( $as_string ) { + return sprintf( + '%1$d, %2$d, %3$d', + $rgb['R'], + $rgb['G'], + $rgb['B'] + ); + } + + return $rgb; // This is an array. +} + +/** + * Get a lighter color hex value. + * + * @since 1.8.5 + * + * @param string $color Color hex value. + * @param int $factor Factor to lighten the color. + * + * @return string Lighter color hex value. + */ +function wpforms_hex_lighter( $color, $factor = 30 ) { + + $base = wpforms_hex_to_rgb( $color, false ); + + // Leave if we can't get the RGB values. + if ( empty( $base ) || count( $base ) !== 3 ) { + return ''; + } + + $hex = '#'; + + foreach ( $base as $channel ) { + $amount = 255 - $channel; + $amount = $amount / 100; + $amount = round( floatval( $amount * $factor ) ); + $new_decimal = $channel + $amount; + + $new_hex_component = dechex( $new_decimal ); + + if ( strlen( $new_hex_component ) < 2 ) { + $new_hex_component = '0' . $new_hex_component; + } + + $hex .= $new_hex_component; + } + + return $hex; +} + +/** + * Get a darker color hex value. + * + * @since 1.8.5 + * + * @param string $color Color hex value. + * @param int $factor Factor to darken the color. + * + * @return string Darker color hex value. + */ +function wpforms_hex_darker( $color, $factor = 30 ) { + + $base = wpforms_hex_to_rgb( $color, false ); + + // Leave if we can't get the RGB values. + if ( empty( $base ) || count( $base ) !== 3 ) { + return ''; + } + + $hex = '#'; + + foreach ( $base as $channel ) { + $amount = $channel / 100; + $amount = round( floatval( $amount * $factor ) ); + $new_decimal = $channel - $amount; + + $new_hex_component = dechex( $new_decimal ); + + if ( strlen( $new_hex_component ) < 2 ) { + $new_hex_component = '0' . $new_hex_component; + } + + $hex .= $new_hex_component; + } + + return $hex; +} + +/** + * Generate a contrasting color based on the given color. + * + * This function calculates a contrasting color to ensure readability based on the provided color. + * + * @since 1.8.5 + * + * @param string $color The original color value. Color hex value. + * @param int $light_factor The factor to lighten the color. + * @param int $dark_factor The factor to darken the color. + * + * @return string The contrasting color value. + */ +function wpforms_generate_contrasting_color( $color, $light_factor = 30, $dark_factor = 30 ) { + + $is_dark = wpforms_light_or_dark( $color, 'light', 'dark' ) === 'dark'; + + return $is_dark ? wpforms_hex_lighter( $color, $light_factor ) : wpforms_hex_darker( $color, $dark_factor ); +} diff --git a/wp-content/plugins/wpforms-lite/includes/functions/data-presets.php b/wp-content/plugins/wpforms-lite/includes/functions/data-presets.php new file mode 100755 index 00000000..d220b783 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions/data-presets.php @@ -0,0 +1,445 @@ + esc_html__( 'Alabama', 'wpforms-lite' ), + 'AK' => esc_html__( 'Alaska', 'wpforms-lite' ), + 'AZ' => esc_html__( 'Arizona', 'wpforms-lite' ), + 'AR' => esc_html__( 'Arkansas', 'wpforms-lite' ), + 'CA' => esc_html__( 'California', 'wpforms-lite' ), + 'CO' => esc_html__( 'Colorado', 'wpforms-lite' ), + 'CT' => esc_html__( 'Connecticut', 'wpforms-lite' ), + 'DE' => esc_html__( 'Delaware', 'wpforms-lite' ), + 'DC' => esc_html__( 'District of Columbia', 'wpforms-lite' ), + 'FL' => esc_html__( 'Florida', 'wpforms-lite' ), + 'GA' => esc_html_x( 'Georgia', 'US State', 'wpforms-lite' ), + 'HI' => esc_html__( 'Hawaii', 'wpforms-lite' ), + 'ID' => esc_html__( 'Idaho', 'wpforms-lite' ), + 'IL' => esc_html__( 'Illinois', 'wpforms-lite' ), + 'IN' => esc_html__( 'Indiana', 'wpforms-lite' ), + 'IA' => esc_html__( 'Iowa', 'wpforms-lite' ), + 'KS' => esc_html__( 'Kansas', 'wpforms-lite' ), + 'KY' => esc_html__( 'Kentucky', 'wpforms-lite' ), + 'LA' => esc_html__( 'Louisiana', 'wpforms-lite' ), + 'ME' => esc_html__( 'Maine', 'wpforms-lite' ), + 'MD' => esc_html__( 'Maryland', 'wpforms-lite' ), + 'MA' => esc_html__( 'Massachusetts', 'wpforms-lite' ), + 'MI' => esc_html__( 'Michigan', 'wpforms-lite' ), + 'MN' => esc_html__( 'Minnesota', 'wpforms-lite' ), + 'MS' => esc_html__( 'Mississippi', 'wpforms-lite' ), + 'MO' => esc_html__( 'Missouri', 'wpforms-lite' ), + 'MT' => esc_html__( 'Montana', 'wpforms-lite' ), + 'NE' => esc_html__( 'Nebraska', 'wpforms-lite' ), + 'NV' => esc_html__( 'Nevada', 'wpforms-lite' ), + 'NH' => esc_html__( 'New Hampshire', 'wpforms-lite' ), + 'NJ' => esc_html__( 'New Jersey', 'wpforms-lite' ), + 'NM' => esc_html__( 'New Mexico', 'wpforms-lite' ), + 'NY' => esc_html__( 'New York', 'wpforms-lite' ), + 'NC' => esc_html__( 'North Carolina', 'wpforms-lite' ), + 'ND' => esc_html__( 'North Dakota', 'wpforms-lite' ), + 'OH' => esc_html__( 'Ohio', 'wpforms-lite' ), + 'OK' => esc_html__( 'Oklahoma', 'wpforms-lite' ), + 'OR' => esc_html__( 'Oregon', 'wpforms-lite' ), + 'PA' => esc_html__( 'Pennsylvania', 'wpforms-lite' ), + 'RI' => esc_html__( 'Rhode Island', 'wpforms-lite' ), + 'SC' => esc_html__( 'South Carolina', 'wpforms-lite' ), + 'SD' => esc_html__( 'South Dakota', 'wpforms-lite' ), + 'TN' => esc_html__( 'Tennessee', 'wpforms-lite' ), + 'TX' => esc_html__( 'Texas', 'wpforms-lite' ), + 'UT' => esc_html__( 'Utah', 'wpforms-lite' ), + 'VT' => esc_html__( 'Vermont', 'wpforms-lite' ), + 'VA' => esc_html__( 'Virginia', 'wpforms-lite' ), + 'WA' => esc_html__( 'Washington', 'wpforms-lite' ), + 'WV' => esc_html__( 'West Virginia', 'wpforms-lite' ), + 'WI' => esc_html__( 'Wisconsin', 'wpforms-lite' ), + 'WY' => esc_html__( 'Wyoming', 'wpforms-lite' ), + ]; + + return apply_filters( 'wpforms_us_states', $states ); +} + +/** + * Countries. + * + * @since 1.0.0 + * + * @return array + */ +function wpforms_countries() { + + $countries = [ + 'AF' => esc_html__( 'Afghanistan', 'wpforms-lite' ), + 'AX' => esc_html__( 'Åland Islands', 'wpforms-lite' ), + 'AL' => esc_html__( 'Albania', 'wpforms-lite' ), + 'DZ' => esc_html__( 'Algeria', 'wpforms-lite' ), + 'AS' => esc_html__( 'American Samoa', 'wpforms-lite' ), + 'AD' => esc_html__( 'Andorra', 'wpforms-lite' ), + 'AO' => esc_html__( 'Angola', 'wpforms-lite' ), + 'AI' => esc_html__( 'Anguilla', 'wpforms-lite' ), + 'AQ' => esc_html__( 'Antarctica', 'wpforms-lite' ), + 'AG' => esc_html__( 'Antigua and Barbuda', 'wpforms-lite' ), + 'AR' => esc_html__( 'Argentina', 'wpforms-lite' ), + 'AM' => esc_html__( 'Armenia', 'wpforms-lite' ), + 'AW' => esc_html__( 'Aruba', 'wpforms-lite' ), + 'AU' => esc_html__( 'Australia', 'wpforms-lite' ), + 'AT' => esc_html__( 'Austria', 'wpforms-lite' ), + 'AZ' => esc_html__( 'Azerbaijan', 'wpforms-lite' ), + 'BS' => esc_html__( 'Bahamas', 'wpforms-lite' ), + 'BH' => esc_html__( 'Bahrain', 'wpforms-lite' ), + 'BD' => esc_html__( 'Bangladesh', 'wpforms-lite' ), + 'BB' => esc_html__( 'Barbados', 'wpforms-lite' ), + 'BY' => esc_html__( 'Belarus', 'wpforms-lite' ), + 'BE' => esc_html__( 'Belgium', 'wpforms-lite' ), + 'BZ' => esc_html__( 'Belize', 'wpforms-lite' ), + 'BJ' => esc_html__( 'Benin', 'wpforms-lite' ), + 'BM' => esc_html__( 'Bermuda', 'wpforms-lite' ), + 'BT' => esc_html__( 'Bhutan', 'wpforms-lite' ), + 'BO' => esc_html__( 'Bolivia (Plurinational State of)', 'wpforms-lite' ), + 'BQ' => esc_html__( 'Bonaire, Saint Eustatius and Saba', 'wpforms-lite' ), + 'BA' => esc_html__( 'Bosnia and Herzegovina', 'wpforms-lite' ), + 'BW' => esc_html__( 'Botswana', 'wpforms-lite' ), + 'BV' => esc_html__( 'Bouvet Island', 'wpforms-lite' ), + 'BR' => esc_html__( 'Brazil', 'wpforms-lite' ), + 'IO' => esc_html__( 'British Indian Ocean Territory', 'wpforms-lite' ), + 'BN' => esc_html__( 'Brunei Darussalam', 'wpforms-lite' ), + 'BG' => esc_html__( 'Bulgaria', 'wpforms-lite' ), + 'BF' => esc_html__( 'Burkina Faso', 'wpforms-lite' ), + 'BI' => esc_html__( 'Burundi', 'wpforms-lite' ), + 'CV' => esc_html__( 'Cabo Verde', 'wpforms-lite' ), + 'KH' => esc_html__( 'Cambodia', 'wpforms-lite' ), + 'CM' => esc_html__( 'Cameroon', 'wpforms-lite' ), + 'CA' => esc_html__( 'Canada', 'wpforms-lite' ), + 'KY' => esc_html__( 'Cayman Islands', 'wpforms-lite' ), + 'CF' => esc_html__( 'Central African Republic', 'wpforms-lite' ), + 'TD' => esc_html__( 'Chad', 'wpforms-lite' ), + 'CL' => esc_html__( 'Chile', 'wpforms-lite' ), + 'CN' => esc_html__( 'China', 'wpforms-lite' ), + 'CX' => esc_html__( 'Christmas Island', 'wpforms-lite' ), + 'CC' => esc_html__( 'Cocos (Keeling) Islands', 'wpforms-lite' ), + 'CO' => esc_html__( 'Colombia', 'wpforms-lite' ), + 'KM' => esc_html__( 'Comoros', 'wpforms-lite' ), + 'CG' => esc_html__( 'Congo', 'wpforms-lite' ), + 'CD' => esc_html__( 'Congo (Democratic Republic of the)', 'wpforms-lite' ), + 'CK' => esc_html__( 'Cook Islands', 'wpforms-lite' ), + 'CR' => esc_html__( 'Costa Rica', 'wpforms-lite' ), + 'CI' => esc_html__( 'Côte d\'Ivoire', 'wpforms-lite' ), + 'HR' => esc_html__( 'Croatia', 'wpforms-lite' ), + 'CU' => esc_html__( 'Cuba', 'wpforms-lite' ), + 'CW' => esc_html__( 'Curaçao', 'wpforms-lite' ), + 'CY' => esc_html__( 'Cyprus', 'wpforms-lite' ), + 'CZ' => esc_html__( 'Czech Republic', 'wpforms-lite' ), + 'DK' => esc_html__( 'Denmark', 'wpforms-lite' ), + 'DJ' => esc_html__( 'Djibouti', 'wpforms-lite' ), + 'DM' => esc_html__( 'Dominica', 'wpforms-lite' ), + 'DO' => esc_html__( 'Dominican Republic', 'wpforms-lite' ), + 'EC' => esc_html__( 'Ecuador', 'wpforms-lite' ), + 'EG' => esc_html__( 'Egypt', 'wpforms-lite' ), + 'SV' => esc_html__( 'El Salvador', 'wpforms-lite' ), + 'GQ' => esc_html__( 'Equatorial Guinea', 'wpforms-lite' ), + 'ER' => esc_html__( 'Eritrea', 'wpforms-lite' ), + 'EE' => esc_html__( 'Estonia', 'wpforms-lite' ), + 'ET' => esc_html__( 'Ethiopia', 'wpforms-lite' ), + 'FK' => esc_html__( 'Falkland Islands (Malvinas)', 'wpforms-lite' ), + 'FO' => esc_html__( 'Faroe Islands', 'wpforms-lite' ), + 'FJ' => esc_html__( 'Fiji', 'wpforms-lite' ), + 'FI' => esc_html__( 'Finland', 'wpforms-lite' ), + 'FR' => esc_html__( 'France', 'wpforms-lite' ), + 'GF' => esc_html__( 'French Guiana', 'wpforms-lite' ), + 'PF' => esc_html__( 'French Polynesia', 'wpforms-lite' ), + 'TF' => esc_html__( 'French Southern Territories', 'wpforms-lite' ), + 'GA' => esc_html__( 'Gabon', 'wpforms-lite' ), + 'GM' => esc_html__( 'Gambia', 'wpforms-lite' ), + 'GE' => esc_html_x( 'Georgia', 'Country', 'wpforms-lite' ), + 'DE' => esc_html__( 'Germany', 'wpforms-lite' ), + 'GH' => esc_html__( 'Ghana', 'wpforms-lite' ), + 'GI' => esc_html__( 'Gibraltar', 'wpforms-lite' ), + 'GR' => esc_html__( 'Greece', 'wpforms-lite' ), + 'GL' => esc_html__( 'Greenland', 'wpforms-lite' ), + 'GD' => esc_html__( 'Grenada', 'wpforms-lite' ), + 'GP' => esc_html__( 'Guadeloupe', 'wpforms-lite' ), + 'GU' => esc_html__( 'Guam', 'wpforms-lite' ), + 'GT' => esc_html__( 'Guatemala', 'wpforms-lite' ), + 'GG' => esc_html__( 'Guernsey', 'wpforms-lite' ), + 'GN' => esc_html__( 'Guinea', 'wpforms-lite' ), + 'GW' => esc_html__( 'Guinea-Bissau', 'wpforms-lite' ), + 'GY' => esc_html__( 'Guyana', 'wpforms-lite' ), + 'HT' => esc_html__( 'Haiti', 'wpforms-lite' ), + 'HM' => esc_html__( 'Heard Island and McDonald Islands', 'wpforms-lite' ), + 'HN' => esc_html__( 'Honduras', 'wpforms-lite' ), + 'HK' => esc_html__( 'Hong Kong', 'wpforms-lite' ), + 'HU' => esc_html__( 'Hungary', 'wpforms-lite' ), + 'IS' => esc_html__( 'Iceland', 'wpforms-lite' ), + 'IN' => esc_html__( 'India', 'wpforms-lite' ), + 'ID' => esc_html__( 'Indonesia', 'wpforms-lite' ), + 'IR' => esc_html__( 'Iran (Islamic Republic of)', 'wpforms-lite' ), + 'IQ' => esc_html__( 'Iraq', 'wpforms-lite' ), + 'IE' => esc_html__( 'Ireland (Republic of)', 'wpforms-lite' ), + 'IM' => esc_html__( 'Isle of Man', 'wpforms-lite' ), + 'IL' => esc_html__( 'Israel', 'wpforms-lite' ), + 'IT' => esc_html__( 'Italy', 'wpforms-lite' ), + 'JM' => esc_html__( 'Jamaica', 'wpforms-lite' ), + 'JP' => esc_html__( 'Japan', 'wpforms-lite' ), + 'JE' => esc_html__( 'Jersey', 'wpforms-lite' ), + 'JO' => esc_html__( 'Jordan', 'wpforms-lite' ), + 'KZ' => esc_html__( 'Kazakhstan', 'wpforms-lite' ), + 'KE' => esc_html__( 'Kenya', 'wpforms-lite' ), + 'KI' => esc_html__( 'Kiribati', 'wpforms-lite' ), + 'KP' => esc_html__( 'Korea (Democratic People\'s Republic of)', 'wpforms-lite' ), + 'KR' => esc_html__( 'Korea (Republic of)', 'wpforms-lite' ), + 'XK' => esc_html__( 'Kosovo', 'wpforms-lite' ), + 'KW' => esc_html__( 'Kuwait', 'wpforms-lite' ), + 'KG' => esc_html__( 'Kyrgyzstan', 'wpforms-lite' ), + 'LA' => esc_html__( 'Lao People\'s Democratic Republic', 'wpforms-lite' ), + 'LV' => esc_html__( 'Latvia', 'wpforms-lite' ), + 'LB' => esc_html__( 'Lebanon', 'wpforms-lite' ), + 'LS' => esc_html__( 'Lesotho', 'wpforms-lite' ), + 'LR' => esc_html__( 'Liberia', 'wpforms-lite' ), + 'LY' => esc_html__( 'Libya', 'wpforms-lite' ), + 'LI' => esc_html__( 'Liechtenstein', 'wpforms-lite' ), + 'LT' => esc_html__( 'Lithuania', 'wpforms-lite' ), + 'LU' => esc_html__( 'Luxembourg', 'wpforms-lite' ), + 'MO' => esc_html__( 'Macao', 'wpforms-lite' ), + 'MK' => esc_html__( 'North Macedonia (Republic of)', 'wpforms-lite' ), + 'MG' => esc_html__( 'Madagascar', 'wpforms-lite' ), + 'MW' => esc_html__( 'Malawi', 'wpforms-lite' ), + 'MY' => esc_html__( 'Malaysia', 'wpforms-lite' ), + 'MV' => esc_html__( 'Maldives', 'wpforms-lite' ), + 'ML' => esc_html__( 'Mali', 'wpforms-lite' ), + 'MT' => esc_html__( 'Malta', 'wpforms-lite' ), + 'MH' => esc_html__( 'Marshall Islands', 'wpforms-lite' ), + 'MQ' => esc_html__( 'Martinique', 'wpforms-lite' ), + 'MR' => esc_html__( 'Mauritania', 'wpforms-lite' ), + 'MU' => esc_html__( 'Mauritius', 'wpforms-lite' ), + 'YT' => esc_html__( 'Mayotte', 'wpforms-lite' ), + 'MX' => esc_html__( 'Mexico', 'wpforms-lite' ), + 'FM' => esc_html__( 'Micronesia (Federated States of)', 'wpforms-lite' ), + 'MD' => esc_html__( 'Moldova (Republic of)', 'wpforms-lite' ), + 'MC' => esc_html__( 'Monaco', 'wpforms-lite' ), + 'MN' => esc_html__( 'Mongolia', 'wpforms-lite' ), + 'ME' => esc_html__( 'Montenegro', 'wpforms-lite' ), + 'MS' => esc_html__( 'Montserrat', 'wpforms-lite' ), + 'MA' => esc_html__( 'Morocco', 'wpforms-lite' ), + 'MZ' => esc_html__( 'Mozambique', 'wpforms-lite' ), + 'MM' => esc_html__( 'Myanmar', 'wpforms-lite' ), + 'NA' => esc_html__( 'Namibia', 'wpforms-lite' ), + 'NR' => esc_html__( 'Nauru', 'wpforms-lite' ), + 'NP' => esc_html__( 'Nepal', 'wpforms-lite' ), + 'NL' => esc_html__( 'Netherlands', 'wpforms-lite' ), + 'NC' => esc_html__( 'New Caledonia', 'wpforms-lite' ), + 'NZ' => esc_html__( 'New Zealand', 'wpforms-lite' ), + 'NI' => esc_html__( 'Nicaragua', 'wpforms-lite' ), + 'NE' => esc_html__( 'Niger', 'wpforms-lite' ), + 'NG' => esc_html__( 'Nigeria', 'wpforms-lite' ), + 'NU' => esc_html__( 'Niue', 'wpforms-lite' ), + 'NF' => esc_html__( 'Norfolk Island', 'wpforms-lite' ), + 'MP' => esc_html__( 'Northern Mariana Islands', 'wpforms-lite' ), + 'NO' => esc_html__( 'Norway', 'wpforms-lite' ), + 'OM' => esc_html__( 'Oman', 'wpforms-lite' ), + 'PK' => esc_html__( 'Pakistan', 'wpforms-lite' ), + 'PW' => esc_html__( 'Palau', 'wpforms-lite' ), + 'PS' => esc_html__( 'Palestine (State of)', 'wpforms-lite' ), + 'PA' => esc_html__( 'Panama', 'wpforms-lite' ), + 'PG' => esc_html__( 'Papua New Guinea', 'wpforms-lite' ), + 'PY' => esc_html__( 'Paraguay', 'wpforms-lite' ), + 'PE' => esc_html__( 'Peru', 'wpforms-lite' ), + 'PH' => esc_html__( 'Philippines', 'wpforms-lite' ), + 'PN' => esc_html__( 'Pitcairn', 'wpforms-lite' ), + 'PL' => esc_html__( 'Poland', 'wpforms-lite' ), + 'PT' => esc_html__( 'Portugal', 'wpforms-lite' ), + 'PR' => esc_html__( 'Puerto Rico', 'wpforms-lite' ), + 'QA' => esc_html__( 'Qatar', 'wpforms-lite' ), + 'RE' => esc_html__( 'Réunion', 'wpforms-lite' ), + 'RO' => esc_html__( 'Romania', 'wpforms-lite' ), + 'RU' => esc_html__( 'Russian Federation', 'wpforms-lite' ), + 'RW' => esc_html__( 'Rwanda', 'wpforms-lite' ), + 'BL' => esc_html__( 'Saint Barthélemy', 'wpforms-lite' ), + 'SH' => esc_html__( 'Saint Helena, Ascension and Tristan da Cunha', 'wpforms-lite' ), + 'KN' => esc_html__( 'Saint Kitts and Nevis', 'wpforms-lite' ), + 'LC' => esc_html__( 'Saint Lucia', 'wpforms-lite' ), + 'MF' => esc_html__( 'Saint Martin (French part)', 'wpforms-lite' ), + 'PM' => esc_html__( 'Saint Pierre and Miquelon', 'wpforms-lite' ), + 'VC' => esc_html__( 'Saint Vincent and the Grenadines', 'wpforms-lite' ), + 'WS' => esc_html__( 'Samoa', 'wpforms-lite' ), + 'SM' => esc_html__( 'San Marino', 'wpforms-lite' ), + 'ST' => esc_html__( 'Sao Tome and Principe', 'wpforms-lite' ), + 'SA' => esc_html__( 'Saudi Arabia', 'wpforms-lite' ), + 'SN' => esc_html__( 'Senegal', 'wpforms-lite' ), + 'RS' => esc_html__( 'Serbia', 'wpforms-lite' ), + 'SC' => esc_html__( 'Seychelles', 'wpforms-lite' ), + 'SL' => esc_html__( 'Sierra Leone', 'wpforms-lite' ), + 'SG' => esc_html__( 'Singapore', 'wpforms-lite' ), + 'SX' => esc_html__( 'Sint Maarten (Dutch part)', 'wpforms-lite' ), + 'SK' => esc_html__( 'Slovakia', 'wpforms-lite' ), + 'SI' => esc_html__( 'Slovenia', 'wpforms-lite' ), + 'SB' => esc_html__( 'Solomon Islands', 'wpforms-lite' ), + 'SO' => esc_html__( 'Somalia', 'wpforms-lite' ), + 'ZA' => esc_html__( 'South Africa', 'wpforms-lite' ), + 'GS' => esc_html__( 'South Georgia and the South Sandwich Islands', 'wpforms-lite' ), + 'SS' => esc_html__( 'South Sudan', 'wpforms-lite' ), + 'ES' => esc_html__( 'Spain', 'wpforms-lite' ), + 'LK' => esc_html__( 'Sri Lanka', 'wpforms-lite' ), + 'SD' => esc_html__( 'Sudan', 'wpforms-lite' ), + 'SR' => esc_html__( 'Suriname', 'wpforms-lite' ), + 'SJ' => esc_html__( 'Svalbard and Jan Mayen', 'wpforms-lite' ), + 'SZ' => esc_html__( 'Eswatini (Kingdom of)', 'wpforms-lite' ), + 'SE' => esc_html__( 'Sweden', 'wpforms-lite' ), + 'CH' => esc_html__( 'Switzerland', 'wpforms-lite' ), + 'SY' => esc_html__( 'Syrian Arab Republic', 'wpforms-lite' ), + 'TW' => esc_html__( 'Taiwan, Republic of China', 'wpforms-lite' ), + 'TJ' => esc_html__( 'Tajikistan', 'wpforms-lite' ), + 'TZ' => esc_html__( 'Tanzania (United Republic of)', 'wpforms-lite' ), + 'TH' => esc_html__( 'Thailand', 'wpforms-lite' ), + 'TL' => esc_html__( 'Timor-Leste', 'wpforms-lite' ), + 'TG' => esc_html__( 'Togo', 'wpforms-lite' ), + 'TK' => esc_html__( 'Tokelau', 'wpforms-lite' ), + 'TO' => esc_html__( 'Tonga', 'wpforms-lite' ), + 'TT' => esc_html__( 'Trinidad and Tobago', 'wpforms-lite' ), + 'TN' => esc_html__( 'Tunisia', 'wpforms-lite' ), + 'TR' => esc_html__( 'Türkiye', 'wpforms-lite' ), + 'TM' => esc_html__( 'Turkmenistan', 'wpforms-lite' ), + 'TC' => esc_html__( 'Turks and Caicos Islands', 'wpforms-lite' ), + 'TV' => esc_html__( 'Tuvalu', 'wpforms-lite' ), + 'UG' => esc_html__( 'Uganda', 'wpforms-lite' ), + 'UA' => esc_html__( 'Ukraine', 'wpforms-lite' ), + 'AE' => esc_html__( 'United Arab Emirates', 'wpforms-lite' ), + 'GB' => esc_html__( 'United Kingdom of Great Britain and Northern Ireland', 'wpforms-lite' ), + 'US' => esc_html__( 'United States of America', 'wpforms-lite' ), + 'UM' => esc_html__( 'United States Minor Outlying Islands', 'wpforms-lite' ), + 'UY' => esc_html__( 'Uruguay', 'wpforms-lite' ), + 'UZ' => esc_html__( 'Uzbekistan', 'wpforms-lite' ), + 'VU' => esc_html__( 'Vanuatu', 'wpforms-lite' ), + 'VA' => esc_html__( 'Vatican City State', 'wpforms-lite' ), + 'VE' => esc_html__( 'Venezuela (Bolivarian Republic of)', 'wpforms-lite' ), + 'VN' => esc_html__( 'Vietnam', 'wpforms-lite' ), + 'VG' => esc_html__( 'Virgin Islands (British)', 'wpforms-lite' ), + 'VI' => esc_html__( 'Virgin Islands (U.S.)', 'wpforms-lite' ), + 'WF' => esc_html__( 'Wallis and Futuna', 'wpforms-lite' ), + 'EH' => esc_html__( 'Western Sahara', 'wpforms-lite' ), + 'YE' => esc_html__( 'Yemen', 'wpforms-lite' ), + 'ZM' => esc_html__( 'Zambia', 'wpforms-lite' ), + 'ZW' => esc_html__( 'Zimbabwe', 'wpforms-lite' ), + ]; + + return apply_filters( 'wpforms_countries', $countries ); +} + +/** + * Calendar Months. + * + * @since 1.3.7 + * + * @return array + */ +function wpforms_months() { + + $months = [ + 'Jan' => esc_html__( 'January', 'wpforms-lite' ), + 'Feb' => esc_html__( 'February', 'wpforms-lite' ), + 'Mar' => esc_html__( 'March', 'wpforms-lite' ), + 'Apr' => esc_html__( 'April', 'wpforms-lite' ), + 'May' => esc_html__( 'May', 'wpforms-lite' ), + 'Jun' => esc_html__( 'June', 'wpforms-lite' ), + 'Jul' => esc_html__( 'July', 'wpforms-lite' ), + 'Aug' => esc_html__( 'August', 'wpforms-lite' ), + 'Sep' => esc_html__( 'September', 'wpforms-lite' ), + 'Oct' => esc_html__( 'October', 'wpforms-lite' ), + 'Nov' => esc_html__( 'November', 'wpforms-lite' ), + 'Dec' => esc_html__( 'December', 'wpforms-lite' ), + ]; + + return apply_filters( 'wpforms_months', $months ); +} + +/** + * Calendar Days. + * + * @since 1.3.7 + * + * @return array + */ +function wpforms_days() { + + $days = [ + 'Sun' => esc_html__( 'Sunday', 'wpforms-lite' ), + 'Mon' => esc_html__( 'Monday', 'wpforms-lite' ), + 'Tue' => esc_html__( 'Tuesday', 'wpforms-lite' ), + 'Wed' => esc_html__( 'Wednesday', 'wpforms-lite' ), + 'Thu' => esc_html__( 'Thursday', 'wpforms-lite' ), + 'Fri' => esc_html__( 'Friday', 'wpforms-lite' ), + 'Sat' => esc_html__( 'Saturday', 'wpforms-lite' ), + ]; + + return apply_filters( 'wpforms_days', $days ); +} + +/** + * Return available date formats. + * + * @since 1.7.5 + * + * @return array + */ +function wpforms_date_formats() { + + /** + * Filters available date formats. + * + * @since 1.3.0 + * + * @param array $date_formats Default date formats. + * Item key is JS date character - see https://flatpickr.js.org/formatting/ + * Item value is in PHP format - see http://php.net/manual/en/function.date.php. + */ + return (array) apply_filters( + 'wpforms_datetime_date_formats', + [ + 'm/d/Y' => 'm/d/Y', + 'd/m/Y' => 'd/m/Y', + 'Y/m/d' => 'Y/m/d', + 'm.d.Y' => 'm.d.Y', + 'd.m.Y' => 'd.m.Y', + 'Y.m.d' => 'Y.m.d', + 'F j, Y' => 'F j, Y', + ] + ); +} + +/** + * Return available time formats. + * + * @since 1.7.7 + * + * @return array + */ +function wpforms_time_formats() { + + /** + * Filters available time formats. + * + * @since 1.5.9 + * + * @param array $time_formats Default time formats. + * Item key is in PHP format which it used in jquery.timepicker as well, + * see http://php.net/manual/en/function.date.php. + */ + return (array) apply_filters( + 'wpforms_datetime_time_formats', + [ + 'g:i A' => '12 H', + 'H:i' => '24 H', + ] + ); +} diff --git a/wp-content/plugins/wpforms-lite/includes/functions/date-time.php b/wp-content/plugins/wpforms-lite/includes/functions/date-time.php new file mode 100755 index 00000000..06b7a199 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions/date-time.php @@ -0,0 +1,118 @@ + + .wpforms-debug { + line-height: 0; + } + .wpforms-debug textarea { + background: #f6f7f7 !important; + margin: 20px 0 0 0; + width: 100%%; + height: 500px; + font-size: 12px; + font-family: Consolas, Menlo, Monaco, monospace; + direction: ltr; + unicode-bidi: embed; + line-height: 1.4; + padding: 10px; + border-radius: 0; + border-color: #c3c4c7; + box-sizing: border-box; + } + .postbox .wpforms-debug { + padding: 6px; + } + .postbox .wpforms-debug:not(:first-of-type) { + padding-top: 0; + } + .postbox .wpforms-debug textarea { + margin-top: 0 !important; + } + +
              + +
              ', + "\n\n" . esc_html( $data ) + ); + + /** + * Allow developers to determine whether the debug data should be displayed. + * Works only in debug mode (`WPFORMS_DEBUG` constant is `true`). + * + * @since 1.6.8 + * + * @param bool $allow_display True by default. + */ + $allow_display = apply_filters( 'wpforms_debug_data_allow_display', true ); + + if ( $do_echo && $allow_display ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $output; + } else { + return $output; + } +} + +/** + * Log helper. + * + * @since 1.0.0 + * + * @param string $title Title of a log message. + * @param mixed $message Content of a log message. + * @param array $args Expected keys: type, form_id, meta, parent, force. + */ +function wpforms_log( $title = '', $message = '', $args = [] ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Skip if logs disabled in Tools -> Logs. + if ( empty( $args['force'] ) && ! wpforms_setting( 'logs-enable' ) ) { + return; + } + + // Require log title. + if ( empty( $title ) ) { + return; + } + + /** + * Compare error levels to determine if we should log. + * Current supported levels: + * - Conditional Logic (conditional_logic) + * - Entries (entry) + * - Errors (error) + * - Payments (payment) + * - Providers (provider) + * - Security (security) + * - Spam (spam) + * - Log (log) + */ + $types = ! empty( $args['type'] ) ? (array) $args['type'] : [ 'error' ]; + + // Skip invalid logs types. + $log_types = Log::get_log_types(); + + foreach ( $types as $key => $type ) { + if ( ! isset( $log_types[ $type ] ) ) { + unset( $types[ $key ] ); + } + } + + if ( empty( $types ) ) { + return; + } + + /** + * Filter log message. + * + * @since 1.8.2 + * + * @param mixed $message Log message. + * @param string $title Log title. + * @param array $args Log arguments. + */ + $message = apply_filters( 'wpforms_log_message', $message, $title, $args ); + + // Make arrays and objects look nice. + if ( is_array( $message ) || is_object( $message ) ) { + $message = '
              ' . esc_html( print_r( $message, true ) ) . '
              '; // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r + } + + // Filter logs types from Tools -> Logs page. + $logs_types = wpforms_setting( 'logs-types' ); + + if ( $logs_types && empty( array_intersect( $logs_types, $types ) ) ) { + return; + } + + // Filter user roles from Tools -> Logs page. + $current_user = function_exists( 'wp_get_current_user' ) ? wp_get_current_user() : null; + $current_user_id = $current_user->ID ?? 0; + $current_user_roles = $current_user->roles ?? []; + $logs_user_roles = wpforms_setting( 'logs-user-roles' ); + + if ( $logs_user_roles && empty( array_intersect( $logs_user_roles, $current_user_roles ) ) ) { + return; + } + + // Filter logs users from Tools -> Logs page. + $logs_users = wpforms_setting( 'logs-users' ); + + if ( $logs_users && ! in_array( $current_user_id, $logs_users, true ) ) { + return; + } + + $log = wpforms()->obj( 'log' ); + + if ( ! $log || ! method_exists( $log, 'add' ) ) { + return; + } + + // Create log entry. + $log->add( + $title, + $message, + $types, + isset( $args['form_id'] ) ? absint( $args['form_id'] ) : 0, + isset( $args['parent'] ) ? absint( $args['parent'] ) : 0, + $current_user_id + ); +} + +/** + * Wrapper for set_time_limit to see if it is enabled. + * + * @since 1.6.4 + * + * @param int $limit Time limit. + */ +function wpforms_set_time_limit( $limit = 0 ) { + + if ( function_exists( 'set_time_limit' ) && false === strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) ) { + @set_time_limit( $limit ); // @codingStandardsIgnoreLine + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/functions/education.php b/wp-content/plugins/wpforms-lite/includes/functions/education.php new file mode 100755 index 00000000..8cc63a71 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/functions/education.php @@ -0,0 +1,96 @@ + + + +
              +

              +
              + + '; + + $output .= sprintf( '', $this->slug, $connection_id, esc_attr( $connection['connection_name'] ) ); + + $output .= ''; + + return $output; + } + + /** + * Provider account authorize fields HTML. + * + * @since 1.0.0 + * + * @return string + */ + public function output_auth() { + + return ''; + } + + /** + * Provider account select HTML. + * + * @since 1.0.0 + * + * @param string $connection_id Unique connection ID. + * @param array $connection Array of connection data. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ + public function output_accounts( $connection_id = '', $connection = [] ) { + + if ( empty( $connection_id ) || empty( $connection ) ) { + return ''; + } + + $providers = wpforms_get_providers_options(); + + if ( empty( $providers[ $this->slug ] ) ) { + return ''; + } + + $output = '
              '; + + $output .= sprintf( '

              %s

              ', esc_html__( 'Select Account', 'wpforms-lite' ) ); + $output .= sprintf( ''; + + $output .= '
              '; + + return $output; + } + + /** + * Provider account lists HTML. + * + * @since 1.0.0 + * + * @param string $connection_id Unique connection ID. + * @param array $connection Connection data. + * + * @return WP_Error|string + * @noinspection HtmlUnknownAttribute + */ + public function output_lists( $connection_id = '', $connection = [] ) { + + if ( empty( $connection_id ) || empty( $connection['account_id'] ) ) { + return ''; + } + + $lists = $this->api_lists( $connection_id, $connection['account_id'] ); + $selected = ! empty( $connection['list_id'] ) ? $connection['list_id'] : ''; + + if ( is_wp_error( $lists ) ) { + return $lists; + } + + $output = '
              '; + + $output .= sprintf( '

              %s

              ', esc_html__( 'Select List', 'wpforms-lite' ) ); + + $output .= sprintf( ''; + + $output .= '
              '; + + return $output; + } + + /** + * Provider account list groups HTML. + * + * @since 1.0.0 + * + * @param string $connection_id Unique connection ID. + * @param array $connection Connection data. + * + * @return string + * @noinspection HtmlUnknownAttribute + */ + public function output_groups( $connection_id = '', $connection = [] ) { + + if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) ) { + return ''; + } + + $groupsets = $this->api_groups( $connection_id, $connection['account_id'], $connection['list_id'] ); + + if ( is_wp_error( $groupsets ) ) { + return ''; + } + + $output = '
              '; + + $output .= sprintf( '

              %s

              ', esc_html__( 'Select Groups', 'wpforms-lite' ) ); + + $output .= sprintf( '

              %s

              ', esc_html__( 'We also noticed that you have some segments in your list. You can select specific list segments below if needed. This is optional.', 'wpforms-lite' ) ); + + $output .= '
              '; + + foreach ( $groupsets as $groupset ) { + + $output .= sprintf( '

              %s

              ', esc_html( $groupset['name'] ) ); + + foreach ( $groupset['groups'] as $group ) { + + $selected = + ! empty( $connection['groups'] ) && + ! empty( $connection['groups'][ $groupset['id'] ] ) && + in_array( $group['name'], $connection['groups'][ $groupset['id'] ], true ); + + $output .= sprintf( + '', + esc_attr( $group['id'] ), + esc_attr( $group['name'] ), + $this->slug, + $connection_id, + $groupset['id'], + $group['id'], + checked( $selected, true, false ), + esc_attr( $group['id'] ), + esc_attr( $group['name'] ) + ); + } + } + + $output .= '
              '; + + $output .= '
              '; + + return $output; + } + + /** + * Provider account list fields HTML. + * + * @since 1.0.0 + * + * @param string $connection_id Unique connection ID. + * @param array $connection Connection data. + * @param mixed $form Form id or form data. + * + * @return WP_Error|string + * @noinspection HtmlUnknownAttribute + */ + public function output_fields( $connection_id = '', $connection = [], $form = '' ) { + + if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) || empty( $form ) ) { + return ''; + } + + $provider_fields = $this->api_fields( $connection_id, $connection['account_id'], $connection['list_id'] ); + $form_fields = $this->get_form_fields( $form ); + + if ( is_wp_error( $provider_fields ) ) { + return $provider_fields; + } + + $output = '
              '; + + $output .= sprintf( '

              %s

              ', esc_html__( 'List Fields', 'wpforms-lite' ) ); + + // Table with all the fields. + $output .= ''; + + $output .= sprintf( '', esc_html__( 'List Fields', 'wpforms-lite' ), esc_html__( 'Available Form Fields', 'wpforms-lite' ) ); + + $output .= ''; + + foreach ( $provider_fields as $provider_field ) : + + $output .= ''; + + $output .= ''; + + $output .= ''; + + endforeach; + + $output .= ''; + + $output .= '
              %s%s
              '; + + $output .= esc_html( $provider_field['name'] ); + + if ( + ! empty( $provider_field['req'] ) && + (int) $provider_field['req'] === 1 + ) { + $output .= '*'; + } + + $output .= ''; + + $output .= sprintf( ''; + + $output .= '
              '; + + $output .= '
              '; + + return $output; + } + + /** + * Provider connection conditional options HTML. + * + * @since 1.0.0 + * + * @param string $connection_id Unique connection ID. + * @param array $connection Configured connection properties. + * @param string|array $form Form properties. + * + * @return string + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function output_conditionals( $connection_id = '', $connection = [], $form = '' ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + if ( empty( $connection['account_id'] ) || ! function_exists( 'wpforms_conditional_logic' ) ) { + return ''; + } + + return wpforms_conditional_logic()->builder_block( + [ + 'form' => $this->form_data, + 'type' => 'panel', + 'panel' => $this->slug, + 'parent' => 'providers', + 'subsection' => $connection_id, + ], + false + ); + } + + + /** + * Provider account list options HTML. + * + * @since 1.0.0 + * + * @param string $connection_id Connection ID. + * @param array $connection Connection data. + * + * @return string + */ + public function output_options( $connection_id = '', $connection = [] ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + return ''; + } + + /******************************************************** + * Builder methods - these methods _build_ the Builder. * + ********************************************************/ + + /** + * Fetch and store the current form data when in the builder. + * + * @since 1.2.3 + */ + public function builder_form_data() { + + // phpcs:disable WordPress.Security.NonceVerification.Recommended + if ( empty( $_GET['form_id'] ) || ! empty( $this->form_data ) ) { + return; + } + + $revisions = wpforms()->obj( 'revisions' ); + $revision = $revisions ? $revisions->get_revision() : null; + + if ( $revision ) { + // Setup form data based on the revision_id. + $this->form_data = wpforms_decode( $revision->post_content ); + + return; + } + + // Setup form data based on the ID. + $form = wpforms()->obj( 'form' ); + + if ( ! $form ) { + return; + } + + $this->form_data = $form->get( + absint( $_GET['form_id'] ), + [ 'content_only' => true ] + ); + // phpcs:enable WordPress.Security.NonceVerification.Recommended + } + + /** + * Display content inside the panel content area. + * + * @since 1.0.0 + */ + public function builder_content() { // phpcs:ignore Generic.Metrics.NestingLevel.MaxExceeded + + $form_data = $this->form_data; + $providers = wpforms_get_providers_options(); + + if ( ! empty( $form_data['providers'][ $this->slug ] ) && ! empty( $providers[ $this->slug ] ) ) { + foreach ( $form_data['providers'][ $this->slug ] as $connection_id => $connection ) { + foreach ( $providers[ $this->slug ] as $account_id => $connections ) { + if ( + ! empty( $connection['account_id'] ) && + $connection['account_id'] === $account_id + ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $this->output_connection( $connection_id, $connection, $form_data ); + } + } + } + } + } + + /** + * Get provider configured status. + * + * @since 1.6.8 + */ + private function get_configured() { + + return ! empty( $this->form_data['id'] ) && Status::init( $this->slug )->is_ready( $this->form_data['id'] ) + ? 'configured' + : ''; + } + + /** + * Display content inside the panel sidebar area. + * + * @since 1.0.0 + */ + public function builder_sidebar() { + + $configured = $this->get_configured(); + + echo ''; + + echo ''; + + echo esc_html( $this->name ); + + echo ''; + + if ( ! empty( $configured ) ) { + echo ''; + } + + echo ''; + } + + /** + * Wrap the builder content with the required markup. + * + * @since 1.0.0 + */ + public function builder_output() { + + $form_id = ! empty( $this->form_data['id'] ) ? $this->form_data['id'] : ''; + + ?> +
              + + builder_output_before(); ?> + +
              + + name ); ?> + + + +
              + slug )->is_ready( $form_id ), + $this->slug, + $this->name, + $this->icon + ); + + ?> +
              + +
              + + builder_content(); ?> + +
              + +
              + + builder_output_after(); ?> + +
              + esc_html__( 'You do not have permission', 'wpforms-lite' ), + ] + ); + } + + if ( empty( $_POST['provider'] ) || empty( $_POST['key'] ) ) { + wp_send_json_error( + [ + 'error' => esc_html__( 'Missing data', 'wpforms-lite' ), + ] + ); + } + + $providers = wpforms_get_providers_options(); + + if ( ! empty( $providers[ $_POST['provider'] ][ $_POST['key'] ] ) ) { + + unset( $providers[ $_POST['provider'] ][ $_POST['key'] ] ); + update_option( 'wpforms_providers', $providers ); + wp_send_json_success(); + + } else { + wp_send_json_error( + [ + 'error' => esc_html__( 'Connection missing', 'wpforms-lite' ), + ] + ); + } + } + + /** + * AJAX to add a provider from the settings integrations tab. + * + * @since 1.0.0 + */ + public function integrations_tab_add() { + + if ( $_POST['provider'] !== $this->slug ) { //phpcs:ignore + return; + } + + // Run a security check. + check_ajax_referer( 'wpforms-admin', 'nonce' ); + + // Check for permissions. + if ( ! wpforms_current_user_can() ) { + wp_send_json_error( + [ + 'error' => esc_html__( 'You do not have permission', 'wpforms-lite' ), + ] + ); + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + $args = $_POST['data'] ?? []; + + if ( empty( $args ) ) { + wp_send_json_error( + [ + 'error' => esc_html__( 'Missing data', 'wpforms-lite' ), + ] + ); + } + + $data = wp_parse_args( $args ); + $auth = $this->api_auth( $data ); + + if ( is_wp_error( $auth ) ) { + + wp_send_json_error( + [ + 'error' => esc_html__( 'Could not connect to the provider.', 'wpforms-lite' ), + 'error_msg' => $auth->get_error_message(), + ] + ); + + } else { + + $account = '
            • '; + $account .= '' . sanitize_text_field( $data['label'] ) . ''; + $account .= ''; + $account .= esc_html( + sprintf( /* translators: %1$s - Connection date. */ + __( 'Connected on: %1$s', 'wpforms-lite' ), + wpforms_date_format( time(), '', true ) + ) + ); + $account .= ''; + $account .= '' . esc_html__( 'Disconnect', 'wpforms-lite' ) . ''; + $account .= '
            • '; + + wp_send_json_success( + [ + 'html' => $account, + ] + ); + } + } + + /** + * Add provider to the Settings Integrations tab. + * + * @since 1.0.0 + * + * @param array $active Array of active connections. + * @param array $settings Array of all connection settings. + */ + public function integrations_tab_options( $active, $settings ) { + + $connected = ! empty( $active[ $this->slug ] ); + $accounts = ! empty( $settings[ $this->slug ] ) ? $settings[ $this->slug ] : []; + $class = $connected && $accounts ? 'connected' : ''; + $arrow = 'right'; + /* translators: %s - provider name. */ + $title_connect_to = sprintf( esc_html__( 'Connect to %s', 'wpforms-lite' ), esc_html( $this->name ) ); + + // This lets us highlight a specific service by a special link. + if ( ! empty( $_GET['wpforms-integration'] ) ) { //phpcs:ignore + if ( $this->slug === $_GET['wpforms-integration'] ) { //phpcs:ignore + $class .= ' focus-in'; + $arrow = 'down'; + } else { + $class .= ' focus-out'; + } + } + ?> + +
              + +
              + + + +
              +

              name ); ?>

              +

              + name ) + ); + ?> +

              + + + + +
              + +
              + +
              + +
              +
                + $account ) { + echo '
              • '; + echo '' . esc_html( $account['label'] ) . ''; + echo ''; + echo esc_html( + sprintf( /* translators: %1$s - Connection date. */ + __( 'Connected on: %1$s', 'wpforms-lite' ), + wpforms_date_format( (int) $account['date'], '', true ) + ) + ); + echo ''; + echo '' . esc_html__( 'Disconnect', 'wpforms-lite' ) . ''; + echo '
              • '; + } + } + ?> +
              +
              + +

              + + + +

              + +
              + + +

              + +

              + +
              + integrations_tab_new_form(); ?> +
              + + + +
              + +
              + +
              + slug . '-error', $message ); + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/providers/class-constant-contact.php b/wp-content/plugins/wpforms-lite/includes/providers/class-constant-contact.php new file mode 100755 index 00000000..7683d8cc --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/providers/class-constant-contact.php @@ -0,0 +1,969 @@ +version = '1.3.6'; + $this->name = 'Constant Contact' . $name_append; + $this->slug = 'constant-contact'; + $this->priority = 14; + $this->icon = WPFORMS_PLUGIN_URL . 'assets/images/icon-provider-constant-contact.png'; + + if ( is_admin() ) { + // Admin notice requesting connecting. + $this->connect_request(); + + add_action( 'wpforms_admin_notice_dismiss_ajax', [ $this, 'connect_dismiss' ] ); + add_filter( + "wpforms_providers_provider_settings_formbuilder_display_content_default_screen_{$this->slug}", + [ $this, 'builder_settings_default_content' ] + ); + + // Provide option to override sign up link. + $sign_up = get_option( 'wpforms_constant_contact_signup', false ); + + if ( $sign_up ) { + $this->sign_up = esc_html( $sign_up ); + } + } + } + + /** + * Process and submit entry to provider. + * + * @since 1.3.6 + * + * @param array $fields List of fields with their data and settings. + * @param array $entry Submitted entry values. + * @param array $form_data Form data and settings. + * @param int $entry_id Saved entry ID. + * + * @return void + */ + public function process_entry( $fields, $entry, $form_data, $entry_id = 0 ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded, Generic.Metrics.NestingLevel.MaxExceeded + + // Only run if this form has a connections for this provider. + if ( empty( $form_data['providers'][ $this->slug ] ) ) { + return; + } + + /* + * Fire for each connection. + */ + + foreach ( $form_data['providers'][ $this->slug ] as $connection ) : + + // Before proceeding make sure required fields are configured. + if ( empty( $connection['fields']['email'] ) ) { + continue; + } + + // Setup basic data. + $list_id = $connection['list_id']; + $account_id = $connection['account_id']; + $email_data = explode( '.', $connection['fields']['email'] ); + $email_id = $email_data[0]; + $email = $fields[ $email_id ]['value']; + + $this->api_connect( $account_id ); + + // Email is required and Access token are required. + if ( empty( $email ) || empty( $this->access_token ) ) { + continue; + } + + // Check for conditionals. + $pass = $this->process_conditionals( $fields, $entry, $form_data, $connection ); + + if ( ! $pass ) { + wpforms_log( + sprintf( 'The Constant Contact connection %s was not processed due to conditional logic.', $connection['name'] ?? '' ), + $fields, + [ + 'type' => [ 'provider', 'conditional_logic' ], + 'parent' => $entry_id, + 'form_id' => $form_data['id'], + ] + ); + continue; + } + + $this->form_id = $form_data['id'] ?? 0; + $this->entry_id = $entry_id; + $contact = $this->request( + add_query_arg( 'email', rawurlencode( $email ), 'https://api.constantcontact.com/v2/contacts' ) + ); + + if ( is_wp_error( $contact ) ) { + continue; + } + + /* + * Setup Merge Vars + */ + + $merge_vars = []; + + foreach ( $connection['fields'] as $name => $merge_var ) { + + // Don't include Email or Full name fields. + if ( $name === 'email' ) { + continue; + } + + // Check if merge var is mapped. + if ( empty( $merge_var ) ) { + continue; + } + + $merge_var = explode( '.', $merge_var ); + $id = $merge_var[0]; + $key = ! empty( $merge_var[1] ) ? $merge_var[1] : 'value'; + + // Check if mapped form field has a value. + if ( empty( $fields[ $id ][ $key ] ) ) { + continue; + } + + $value = $fields[ $id ][ $key ]; + + // Constant Contact doesn't native URL field so it has to be + // stored in a custom field. + if ( $name === 'url' ) { + + $merge_vars['custom_fields'] = [ + [ + 'name' => 'custom_field_1', + 'value' => $value, + ], + ]; + + continue; + } + + // Constant Contact stores name in two fields, so we have to + // separate it. + if ( $name === 'full_name' ) { + + $names = explode( ' ', $value ); + + if ( ! empty( $names[0] ) ) { + $merge_vars['first_name'] = $names[0]; + } + + if ( ! empty( $names[1] ) ) { + $merge_vars['last_name'] = $names[1]; + } + + continue; + } + + // Constant Contact stores address in multiple fields, so we + // have to separate it. + if ( $name === 'address' ) { + + // Only support Address fields. + if ( $fields[ $id ]['type'] !== 'address' ) { + continue; + } + + // Postal code may be in extended US format. + $postal = [ + 'code' => '', + 'subcode' => '', + ]; + + if ( ! empty( $fields[ $id ]['postal'] ) ) { + $p = explode( '-', $fields[ $id ]['postal'] ); + $postal['code'] = ! empty( $p[0] ) ? $p[0] : ''; + $postal['subcode'] = ! empty( $p[1] ) ? $p[1] : ''; + } + + $merge_vars['addresses'] = [ + [ + 'address_type' => 'BUSINESS', + 'city' => ! empty( $fields[ $id ]['city'] ) ? $fields[ $id ]['city'] : '', + 'country_code' => ! empty( $fields[ $id ]['country'] ) ? $fields[ $id ]['country'] : '', + 'line1' => ! empty( $fields[ $id ]['address1'] ) ? $fields[ $id ]['address1'] : '', + 'line2' => ! empty( $fields[ $id ]['address2'] ) ? $fields[ $id ]['address2'] : '', + 'postal_code' => $postal['code'], + 'state' => ! empty( $fields[ $id ]['state'] ) ? $fields[ $id ]['state'] : '', + 'sub_postal_code' => $postal['subcode'], + ], + ]; + + continue; + } + + $merge_vars[ $name ] = $value; + } + + /* + * Process in API + */ + + // If we have a previous contact, only update the list association. + if ( ! empty( $contact['results'] ) ) { + + $data = $contact['results'][0]; + + // Check if they are already assigned to lists. + if ( ! empty( $data['lists'] ) ) { + $has_list = false; + + foreach ( $data['lists'] as $list ) { + if ( isset( $list['id'] ) && (string) $list_id === (string) $list['id'] ) { + $has_list = true; + } + } + + if ( ! $has_list ) { + $data['lists'][ count( $data['lists'] ) ] = [ + 'id' => $list_id, + 'status' => 'ACTIVE', + ]; + } + } else { + + // Add the contact to the list. + $data['lists'][0] = [ + 'id' => $list_id, + 'status' => 'ACTIVE', + ]; + } + + // Combine merge vars into data before sending. + $data = array_merge( $data, $merge_vars ); + + // Args to use. + $args = [ + 'body' => $data, + 'method' => 'PUT', + ]; + + $this->request( 'https://api.constantcontact.com/v2/contacts/' . $data['id'] . '?action_by=ACTION_BY_VISITOR', $args ); + } else { + // Add a new contact. + $data = [ + 'email_addresses' => [ [ 'email_address' => $email ] ], + 'lists' => [ [ 'id' => $list_id ] ], + ]; + + // Combine merge vars into data before sending. + $data = array_merge( $data, $merge_vars ); + + // Args to use. + $args = [ + 'body' => $data, + 'method' => 'POST', + ]; + + $this->request( 'https://api.constantcontact.com/v2/contacts?action_by=ACTION_BY_VISITOR', $args ); + } + + endforeach; + } + + /************************************************************************ + * API methods - these methods interact directly with the provider API. * + ************************************************************************/ + + /** + * Authenticate with the API. + * + * @since 1.3.6 + * + * @param array $data Contact data. + * @param string $form_id Form ID. + * + * @return WP_Error|string Unique ID or error object + * @noinspection NonSecureUniqidUsageInspection + */ + public function api_auth( $data = [], $form_id = '' ) { + + $this->form_id = (int) $form_id; + $this->access_token = $data['authcode'] ?? ''; + $user = $this->get_account_information(); + + if ( is_wp_error( $user ) ) { + return $user; + } + + $id = uniqid(); + + wpforms_update_providers_options( + $this->slug, + [ + 'access_token' => sanitize_text_field( $data['authcode'] ), + 'label' => sanitize_text_field( $data['label'] ), + 'date' => time(), + 'email' => sanitize_text_field( $user['email'] ), + ], + $id + ); + + return $id; + } + + /** + * Get account information. + * + * @since 1.7.6 + * + * @return array|WP_Error + */ + public function get_account_information() { + + return $this->request( 'https://api.constantcontact.com/v2/account/info' ); + } + + /** + * Establish connection object to API. + * + * @since 1.3.6 + * + * @param string $account_id Account ID. + * + * @return mixed array or error object. + */ + public function api_connect( $account_id ) { + + if ( ! empty( $this->api[ $account_id ] ) ) { + return $this->api[ $account_id ]; + } + + $providers = wpforms_get_providers_options(); + + if ( ! empty( $providers[ $this->slug ][ $account_id ] ) ) { + $this->api[ $account_id ] = true; + $this->access_token = $providers[ $this->slug ][ $account_id ]['access_token']; + } else { + return $this->error( 'API error' ); + } + } + + /** + * Retrieve provider account lists. + * + * @since 1.3.6 + * + * @param string $connection_id Connection ID. + * @param string $account_id Account ID. + * + * @return array|WP_Error array or error object + */ + public function api_lists( $connection_id = '', $account_id = '' ) { + + if ( $account_id && empty( $this->access_token ) ) { + $this->api_connect( $account_id ); + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $this->form_id = ! empty( $_POST['id'] ) ? absint( $_POST['id'] ) : 0; + + return $this->request( 'https://api.constantcontact.com/v2/lists' ); + } + + /** + * Retrieve provider account list fields. + * + * @since 1.3.6 + * + * @param string $connection_id Connection ID. + * @param string $account_id Account ID. + * @param string $list_id List ID. + * + * @return array array or error object + */ + public function api_fields( $connection_id = '', $account_id = '', $list_id = '' ) { + + return [ + [ + 'name' => 'Email', + 'field_type' => 'email', + 'req' => '1', + 'tag' => 'email', + ], + [ + 'name' => 'Full Name', + 'field_type' => 'name', + 'tag' => 'full_name', + ], + [ + 'name' => 'First Name', + 'field_type' => 'first', + 'tag' => 'first_name', + ], + [ + 'name' => 'Last Name', + 'field_type' => 'last', + 'tag' => 'last_name', + ], + [ + 'name' => 'Phone', + 'field_type' => 'text', + 'tag' => 'work_phone', + ], + [ + 'name' => 'Website', + 'field_type' => 'text', + 'tag' => 'url', + ], + [ + 'name' => 'Address', + 'field_type' => 'address', + 'tag' => 'address', + ], + [ + 'name' => 'Job Title', + 'field_type' => 'text', + 'tag' => 'job_title', + ], + [ + 'name' => 'Company', + 'field_type' => 'text', + 'tag' => 'company_name', + ], + ]; + } + + + /************************************************************************* + * Output methods - these methods generally return HTML for the builder. * + *************************************************************************/ + + /** + * Provider account authorize fields HTML. + * + * @since 1.3.6 + * + * @return string + */ + public function output_auth() { + + $providers = wpforms_get_providers_options(); + $class = ! empty( $providers[ $this->slug ] ) ? 'hidden' : ''; + + ob_start(); + ?> + + + + +

              + + + +

              +

              + %s', + esc_url( admin_url( 'admin.php?page=wpforms-page&view=constant-contact' ) ), + esc_html__( 'Learn more about the power of email marketing.', 'wpforms-lite' ) + ); + ?> +

              + slug ) { + return; + } + + // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput + $data = ! empty( $_POST['data'] ) ? wp_parse_args( wp_unslash( $_POST['data'] ) ) : []; + + if ( empty( $data['authcode'] ) ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'The "Authorization Code" is required.', 'wpforms-lite' ), + ] + ); + } + + if ( empty( $data['label'] ) ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'The "Account Nickname" is required.', 'wpforms-lite' ), + ] + ); + } + + parent::integrations_tab_add(); + } + + /** + * Form fields to add a new provider account. + * + * @since 1.3.6 + * @noinspection HtmlUnknownTarget + */ + public function integrations_tab_new_form() { + + printf( + '

              ' . wp_kses( /* translators: %1$s - Documentation URL. */ + __( + 'If you need help connecting WPForms to Constant Contact, read our documentation.', + 'wpforms-lite' + ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ) . '

              ', + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-connect-constant-contact-with-wpforms/', 'Settings - Integration', 'Constant Contact Documentation' ) ) + ); + ?> + +

              + +

              + +

              + + + + + +

              + + ', + esc_attr( $this->name ), + esc_attr__( 'Authorization Code', 'wpforms-lite' ) + ); + + printf( + '', + esc_attr( $this->name ), + esc_attr__( 'Account Nickname', 'wpforms-lite' ) + ); + } + + /** + * Add provider to the Settings Integrations tab. + * + * @since 1.9.3 + * + * @param array $active Array of active connections. + * @param array $settings Array of all connection settings. + */ + public function integrations_tab_options( $active, $settings ) { + + if ( ! empty( wpforms_get_providers_options( Core::SLUG ) ) ) { + return; + } + + parent::integrations_tab_options( $active, $settings ); + } + + /************************ + * Other functionality. * + ************************/ + + /** + * Add admin notices to connect to Constant Contact. + * + * @since 1.3.6 + * @noinspection HtmlUnknownTarget + */ + public function connect_request() { + + // Only consider showing the review request to admin users. + if ( ! is_super_admin() ) { + return; + } + + // Don't display on WPForms admin content pages. + // phpcs:disable WordPress.Security.NonceVerification.Recommended + if ( ! empty( $_GET['wpforms-page'] ) ) { + return; + } + + // Don't display if user is about to connect via Settings page. + if ( ! empty( $_GET['wpforms-integration'] ) && $this->slug === $_GET['wpforms-integration'] ) { + return; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + // Only display the notice if the Constant Contact option is set and + // there are previous Constant Contact connections created. + // Please do not delete 'wpforms_constant_contact' option check from the code. + $cc_notice = get_option( 'wpforms_constant_contact', false ); + $providers = wpforms_get_providers_options(); + + if ( ! $cc_notice || ! empty( $providers[ $this->slug ] ) ) { + return; + } + + // Output the notice message. + $connect = admin_url( 'admin.php?page=wpforms-settings&view=integrations&wpforms-integration=constant-contact#!wpforms-tab-providers' ); + $learn_more = admin_url( 'admin.php?page=wpforms-page&view=constant-contact' ); + + ob_start(); + ?> +

              + WPForms plugin — use it with an active Constant Contact account.', 'wpforms-lite' ), + [ + 'strong' => [], + ] + ); + ?> +

              +

              + + + + + + + power of email marketing', 'wpforms-lite' ), + esc_url( $learn_more ) + ), + [ + 'a' => [ + 'href' => [], + ], + ] + ); + ?> +

              + + + Notice::DISMISS_GLOBAL, + 'slug' => 'constant_contact_connect', + 'autop' => false, + 'class' => 'wpforms-constant-contact-notice', + ] + ); + } + + /** + * Dismiss the Constant Contact admin notice. + * + * @since 1.3.6 + * @since 1.6.7.1 Added parameter $notice_id. + * + * @param string $notice_id Notice ID (slug). + */ + public function connect_dismiss( $notice_id = '' ) { + + if ( $notice_id !== 'global-constant_contact_connect' ) { + return; + } + + delete_option( 'wpforms_constant_contact' ); + + wp_send_json_success(); + } + + /** + * Request to the Constant Contact API. + * + * @since 1.9.0.4 + * + * @param string $url Request URL. + * @param array $args Request arguments. + * + * @return array|WP_Error + */ + private function request( string $url, array $args = [] ) { + + $args['method'] = $args['method'] ?? 'GET'; + $args['headers']['Authorization'] = 'Bearer ' . $this->access_token; + $args['headers']['Content-Type'] = 'application/json'; + + if ( isset( $args['body'] ) ) { + $args['body'] = wp_json_encode( $args['body'] ); + } + + $url = add_query_arg( 'api_key', $this->api_key, $url ); + $response = wp_remote_request( $url, $args ); + $response = is_wp_error( $response ) ? $response : (array) $response; + + return $this->process_response( $response ); + } + + /** + * Process response. + * + * @since 1.9.0.4 + * + * @param array|WP_Error $response Response. + * + * @return array|WP_Error + */ + public function process_response( $response ) { + + if ( is_wp_error( $response ) ) { + $this->log_error( $response ); + + return $response; + } + + // Body may be set here to an array or null. + $body = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( empty( $body ) || isset( $body[0]['error_key'] ) ) { + $error_message = $body[0]['error_message'] ?? ''; + $error = new WP_Error( $this->slug . '_error', $error_message ); + + $this->log_error( $error ); + + return $error; + } + + return $body; + } + + /** + * Log error message. + * + * @since 1.9.0.4 + * + * @param WP_Error $error Error. + * + * @return void + */ + public function log_error( WP_Error $error ) { + + wpforms_log( + 'Constant Contact API Error', + $error->get_error_message(), + [ + 'type' => [ 'provider', 'error' ], + 'parent' => $this->entry_id, + 'form_id' => $this->form_id, + ] + ); + } +} + +( new WPForms_Constant_Contact() )->setup(); diff --git a/wp-content/plugins/wpforms-lite/includes/templates/class-base.php b/wp-content/plugins/wpforms-lite/includes/templates/class-base.php new file mode 100755 index 00000000..686c20a6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/templates/class-base.php @@ -0,0 +1,342 @@ +init(); + + $type = $this->core ? '_core' : ''; + + add_filter( "wpforms_form_templates{$type}", [ $this, 'template_details' ], $this->priority ); + add_filter( 'wpforms_create_form_args', [ $this, 'template_data' ], 10, 2 ); + add_filter( 'wpforms_save_form_args', [ $this, 'template_replace' ], 10, 3 ); + add_filter( 'wpforms_builder_template_active', [ $this, 'template_active' ], 10, 2 ); + } + + /** + * Let's get started. + * + * @since 1.0.0 + */ + public function init() {} + + /** + * Add basic template details to the Add New Form admin screen. + * + * @since 1.0.0 + * + * @param array $templates Templates array. + * + * @return array + */ + public function template_details( $templates ) { + + $templates[] = [ + 'name' => $this->name, + 'slug' => $this->slug, + 'source' => $this->source, + 'categories' => $this->categories, + 'description' => $this->description, + 'includes' => $this->includes, + 'icon' => $this->icon, + 'url' => ! empty( $this->url ) ? $this->url : '', + 'plugin_dir' => $this->get_plugin_dir(), + 'thumbnail' => ! empty( $this->thumbnail ) ? $this->thumbnail : '', + ]; + + return $templates; + } + + /** + * Get the directory name of the plugin in which current template resides. + * + * @since 1.6.9 + * + * @return string + */ + private function get_plugin_dir(): string { + + $reflection = new ReflectionClass( $this ); + $template_file_path = wp_normalize_path( $reflection->getFileName() ); + + // Cutting out the WP_PLUGIN_DIR from the beginning of the template file path. + $template_file_path = preg_replace( '{^' . wp_slash( wp_normalize_path( WP_PLUGIN_DIR ) ) . '}', '', $template_file_path ); + + $template_file_chunks = explode( '/', $template_file_path ); + + return $template_file_chunks[1]; + } + + /** + * Add template data when form is created. + * + * @since 1.0.0 + * + * @param array $args Create form arguments. + * @param array $data Template data. + * + * @return array + */ + public function template_data( $args, $data ): array { + + if ( empty( $data['template'] ) || $data['template'] !== $this->slug ) { + return $args; + } + + // Enable Notifications by default. + $this->data['settings']['notification_enable'] = $this->data['settings']['notification_enable'] ?? '1'; + + /** + * Allow modifying form data when a template is applied to the new form. + * + * @since 1.9.0 + * + * @param array $form_data New form data. + */ + $this->data = (array) apply_filters( 'wpforms_templates_class_base_template_modify_data', $this->data ); + + $args['post_content'] = wpforms_encode( $this->data ); + + return $args; + } + + /** + * Replace template on post update if triggered. + * + * @since 1.0.0 + * + * @param array $form Form post data. + * @param array $data Form data. + * @param array $args Update form arguments. + * + * @return array + */ + public function template_replace( $form, $data, $args ): array { + + // We should proceed only if the template slug passed via $args['template'] is equal to the current template slug. + // This will work only for offline templates: Blank Form, all the Addons Templates, and all the custom templates. + // All the online (modern) templates use the hash as the identifier, + // and they are handled by `\WPForms\Admin\Builder\Templates::apply_to_existing_form()`. + if ( empty( $args['template'] ) || $args['template'] !== $this->slug ) { + return $form; + } + + $form_data = wpforms_decode( wp_unslash( $form['post_content'] ) ); + + // Something is wrong with the form data. + if ( empty( $form_data ) ) { + return $form; + } + + // Compile the new form data preserving needed data from the existing form. + $new = $this->data; + $new['id'] = $form_data['id'] ?? 0; + $new['settings'] = $form_data['settings'] ?? []; + $new['payments'] = $form_data['payments'] ?? []; + $new['meta'] = $form_data['meta'] ?? []; + + $template_id = $this->data['meta']['template'] ?? ''; + + // Preserve template ID `wpforms-user-template-{$form_id}` when overwriting it with core template. + if ( wpforms_is_form_template( $form['ID'] ) ) { + $template_id = $form_data['meta']['template'] ?? ''; + } + + $new['meta']['template'] = $template_id; + + /** + * Allow modifying form data when a template is replaced. + * + * @since 1.7.9 + * + * @param array $new Updated form data. + * @param array $form_data Current form data. + * @param array $template Template data. + */ + $new = (array) apply_filters( 'wpforms_templates_class_base_template_replace_modify_data', $new, $form_data, $this ); + + // Update the form with new data. + $form['post_content'] = wpforms_encode( $new ); + + return $form; + } + + /** + * Pass information about the active template back to the builder. + * + * @since 1.0.0 + * + * @param array $details Details. + * @param object $form Form data. + * + * @return array|void + */ + public function template_active( $details, $form ) { + + if ( empty( $form ) ) { + return; + } + + $form_data = wpforms_decode( $form->post_content ); + + if ( empty( $this->modal ) || empty( $form_data['meta']['template'] ) || $this->slug !== $form_data['meta']['template'] ) { + return $details; + } else { + $display = $this->template_modal_conditional( $form_data ); + } + + return [ + 'name' => $this->name, + 'slug' => $this->slug, + 'description' => $this->description, + 'includes' => $this->includes, + 'icon' => $this->icon, + 'modal' => $this->modal, + 'modal_display' => $display, + ]; + } + + /** + * Conditional to determine if the template informational modal screens + * should display. + * + * @since 1.0.0 + * + * @param array $form_data Form data and settings. + * + * @return bool + */ + public function template_modal_conditional( $form_data ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + return false; + } +} diff --git a/wp-content/plugins/wpforms-lite/includes/templates/class-blank.php b/wp-content/plugins/wpforms-lite/includes/templates/class-blank.php new file mode 100755 index 00000000..e4fe255a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/templates/class-blank.php @@ -0,0 +1,78 @@ +priority = 1; + $this->name = esc_html__( 'Blank Form', 'wpforms-lite' ); + $this->slug = 'blank'; + $this->source = 'wpforms-core'; + $this->categories = 'all'; + $this->description = esc_html__( 'The blank form allows you to create any type of form using our drag & drop builder.', 'wpforms-lite' ); + $this->includes = ''; + $this->icon = ''; + $this->modal = ''; + $this->core = true; + $this->data = self::get_data(); + } + + /** + * Get template data. + * + * @since 1.9.2 + * + * @return array + */ + public static function get_data(): array { + + return [ + 'field_id' => '1', + 'fields' => [], + 'settings' => [ + 'antispam_v3' => '1', + 'ajax_submit' => '1', + 'confirmation_message_scroll' => '1', + 'submit_text_processing' => esc_html__( 'Sending...', 'wpforms-lite' ), + 'store_spam_entries' => '1', + 'anti_spam' => [ + 'time_limit' => [ + 'enable' => '1', + 'duration' => '2', + ], + ], + ], + 'meta' => [ + 'template' => self::SLUG, + ], + ]; + } +} + +new WPForms_Template_Blank(); diff --git a/wp-content/plugins/wpforms-lite/includes/templates/class-simple-contact-form.php b/wp-content/plugins/wpforms-lite/includes/templates/class-simple-contact-form.php new file mode 100755 index 00000000..7ab7293c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/includes/templates/class-simple-contact-form.php @@ -0,0 +1,86 @@ +name = esc_html__( 'Simple Contact Form', 'wpforms-lite' ); + $this->priority = 1; + $this->source = 'wpforms-core'; + $this->categories = 'all'; + $this->core = true; + $this->slug = 'simple-contact-form-template'; + $this->url = 'https://wpforms.com/templates/simple-contact-form-template/'; + $this->description = esc_html__( 'Collect the names, emails, and messages from site visitors that need to talk to you.', 'wpforms-lite' ); + $this->thumbnail = esc_url( WPFORMS_PLUGIN_URL . 'assets/images/thumbnail-simple-contact-form-template.jpg' ); + $this->data = [ + 'fields' => [ + '1' => [ + 'id' => '1', + 'type' => 'name', + 'format' => 'first-last', + 'label' => esc_html__( 'Name', 'wpforms-lite' ), + 'required' => '1', + 'size' => 'medium', + ], + '2' => [ + 'id' => '2', + 'type' => 'email', + 'label' => esc_html__( 'Email', 'wpforms-lite' ), + 'required' => '1', + 'size' => 'medium', + ], + '3' => [ + 'id' => '3', + 'type' => 'textarea', + 'label' => esc_html__( 'Comment or Message', 'wpforms-lite' ), + 'size' => 'medium', + 'placeholder' => '', + 'css' => '', + ], + ], + 'field_id' => 4, + 'settings' => [ + 'form_desc' => '', + 'submit_text' => esc_html__( 'Submit', 'wpforms-lite' ), + 'submit_text_processing' => esc_html__( 'Sending...', 'wpforms-lite' ), + 'antispam_v3' => '1', + 'notification_enable' => '1', + 'notifications' => [ + '1' => [ + 'email' => '{admin_email}', + 'replyto' => '{field_id="2"}', + 'message' => '{all_fields}', + ], + ], + 'confirmations' => [ + '1' => [ + 'type' => 'message', + 'message' => esc_html__( 'Thanks for contacting us! We will be in touch with you shortly.', 'wpforms-lite' ), + 'message_scroll' => '1', + ], + ], + 'ajax_submit' => '1', + ], + 'meta' => [ + 'template' => $this->slug, + ], + ]; + } +} + +new WPForms_Template_Simple_Contact_Form(); diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/addons.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/addons.php new file mode 100755 index 00000000..15fcb3f9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/addons.php @@ -0,0 +1,98 @@ + Addons page template. + * + * @since 1.6.7 + * + * @var string $upgrade_link_base Upgrade link base. + * @var array $addons Addons data. + */ + +use WPForms\Admin\Education\Helpers; + +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +?> +
              +

              + + + + + + + +

              +
              +
              +
              + $addon['title'], + ], + $upgrade_link_base + ); + + $licenses = [ 'basic', 'plus', 'pro', 'elite', 'agency', 'ultimate' ]; + $addon_licenses = $addon['license']; + $common_licenses = array_intersect( $licenses, $addon_licenses ); + $minimum_required_license = reset( $common_licenses ); + $image_alt = sprintf( /* translators: %s - addon title. */ + __( '%s logo', 'wpforms-lite' ), + $addon['title'] + ); + + $badge = Helpers::get_addon_badge( $addon ); + + $item_classes = [ + 'wpforms-addons-list-item', + 'addon-item', + ! empty( $badge ) ? 'has-badge' : '', + ]; + ?> +
              +
              + <?php echo esc_attr( $image_alt ); ?> + +
              +
              + %3$s', + esc_url( $upgrade_link ), + esc_attr__( 'Learn more', 'wpforms-lite' ), + esc_html( $addon['title'] ) + ); + ?> + + +
              + +
              + +
              +
              +
              + + +
              + +
              +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/notice.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/notice.php new file mode 100755 index 00000000..a30b48f1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/notice.php @@ -0,0 +1,22 @@ + +
              +
              +
              +

              You’re Viewing Sample Data

              +

              Like what you see? Upgrade to Pro to get access to Entries and dozens of awesome features and addons!

              +
              +

              + Upgrade Now +

              + Hide Sample Data +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/actions.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/actions.php new file mode 100755 index 00000000..5cf26742 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/actions.php @@ -0,0 +1,24 @@ + +
              +
              + Form Fields + + + + Entry Meta + + + + + + +
              + + +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/bulk-actions.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/bulk-actions.php new file mode 100755 index 00000000..cd82d63e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/bulk-actions.php @@ -0,0 +1,38 @@ + +
              + + + +
              + + +
              + + +
              + +
              + 12 items + + + + + + + of 1 + + + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/entry-list.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/entry-list.php new file mode 100755 index 00000000..1aacf5e6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/entry-list.php @@ -0,0 +1,86 @@ + +
              +

              Entries

              +
              + $utm['entries_list_button'], + 'link_utm' => $utm['entries_list_link'], + ], + true + ); + ?> +
              +
              + + $is_lite_connect_enabled, + 'is_lite_connect_allowed' => $is_lite_connect_allowed, + 'entries_count' => $entries_count, + 'enabled_since' => $enabled_since, + 'is_enabled' => $sample_entry_enabled, + ], + true + ); + ?> +
              +
              + Select Form +

              + General Inquiry Form +
              + +
              +

              + +
              +
              + $sample_entries ], + true + ); + ?> +
              +
              + +
              +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/header.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/header.php new file mode 100755 index 00000000..5ed332c9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/header.php @@ -0,0 +1,39 @@ + + + +
              + true, + ], + true + ); + ?> +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/modal.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/modal.php new file mode 100755 index 00000000..9a27e290 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/modal.php @@ -0,0 +1,88 @@ + +
              + +
              + +
              + +
              +

              + +

              +

              + +

              +
              +
                +
              • +
              • +
              • +
              • +
              +
                +
              • +
              • +
              • +
              • +
              +
              +
              +
              + + +

              + ' . esc_html( /* translators: %d - backed up entries count. */ + _n( + '%d entry has been backed up', + '%d entries have been backed up', + $entries_count, + 'wpforms-lite' + ) + ) . '', + absint( $entries_count ) + ); + + if ( ! empty( $enabled_since ) ) { + echo ' '; + printf( + /* translators: %s - time when Lite Connect was enabled. */ + esc_html__( 'since you enabled Lite Connect on %s', 'wpforms-lite' ), + esc_html( wpforms_date_format( $enabled_since, '', true ) ) + ); + } + // phpcs:ignore Squiz.PHP.EmbeddedPhp.ContentAfterEnd + ?>.

              + + + + + + + + + + + + +

              + + + +

              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/table.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/table.php new file mode 100755 index 00000000..ac9d8dd2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/overview/table.php @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + NameEmailDate + Actions + + +
              + + + + + + + View + | + Edit + | + Spam + | + Trash +
              + + + NameEmailDateActions +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/single/entry.php b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/single/entry.php new file mode 100755 index 00000000..35a30c66 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/admin/entries/single/entry.php @@ -0,0 +1,426 @@ + +
              +

              + View Entry + + + + + + + +
              +
              + Entry 1 of 12 +
              +
              + + 1 + +
              + +
              + + +
              +
              + +

              + + $utm['entry_single_button'], + 'link_utm' => $utm['entry_single_link'], + ], + true + ); + ?> +
              +
              +
              + +
              + +
              + +
              +

              General Inquiry Form

              +
              + +
              + +
              +
              +

              Name

              +
              Michael Johnson
              +
              +
              +

              Email

              +
              michael.johnson@example.com
              +
              +
              +

              Phone

              +
              +1-206-555-6789
              +
              +
              +

              Comment or Message

              +
              I really enjoyed your insightful posts on your blog! Your writing is engaging and makes complex topics easy to understand. I'm eager to dive deeper into your passion. Keep up the fantastic work! Oh BTW, I uploaded an illustration I created that’s inspired by your writing. I hope you like it!
              +
              +
              +

              File Upload

              +
              + + illustration.jpg +
              +
              +
              +

              Signature

              +
              + +
              +
              +
              +
              + +
              + +
              +
              +

              Location

              +
              + +
              + +
                +
              • + Location + Seattle, Washington +
              • +
              • + Postal + 98125 +
              • +
              • + Country + + + US + +
              • +
              • + Lat/Long + 47.6061, -122.3328 +
              • +
              +
              +
              + +
              +
              +

              User Journey

              +
              +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              April 22, 2024
              12:23 pm + Search Results + + / (Homepage) + + + +
              12:23 pm + Homepage + + https://www.google.com/ + + + + 56 seconds
              12:24 pm + Frequently Asked Questions + + /faq/ + + + + 1 min
              12:25 pm + About Us + + /about-us/ + + + + 3 mins
              12:28 pm + Meet The Team + + /about-us/meet-the-team/ + + + + 3 mins
              12:31 pm + Testimonials + + /testimonials/ + + + + 2 mins
              12:33 pm + General Inquiry Form + + /general-inquiry-form/ + + + + 4 mins
              12:37 pm + + General Inquiry Form Submitted + + User took 7 steps over 14 mins +
              +
              +
              + +
              + +
              +

              Notes

              +
              + +
              +
              + Add Note +
              + +
              +
              + +

              My illustration of the ones that have been submitted so far. We should reach out to him and offer a t-shirt.

              +
              +
              + +

              This person went above and beyond.

              +
              +
              +
              + +
              +
              + + +
              + +
              +
              +

              Entry Details

              +
              + +
              +
              +

              + Entry ID: + 544 +

              + + + +

              + Modified: + April 22, 2024 at 12:37 PM +

              + +

              + User IP: + 192.168.1.100 +

              +
              + +
              +
              + Edit +
              +
              + Trash Entry +
              + +
              +
              +
              +
              + + +
              +
              +

              Actions

              +
              + +
              +
              +

              Print

              +

              Export (CSV)

              +

              Export (XLSX)

              +

              Resend Notifications

              +

              Star

              +

              Mark as Unread

              +

              Mark as Spam

              +

              Delete Entry

              +
              +
              +
              +
              +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/builder/context-menu.php b/wp-content/plugins/wpforms-lite/lite/templates/builder/context-menu.php new file mode 100755 index 00000000..fc578f85 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/builder/context-menu.php @@ -0,0 +1,127 @@ + + +
              +
                + + + +
              • + + + + + + + +
              • + + + +
              • + + + + + + + +
              • + +
              • + + + + + + + +
              • + + + +
              • + +
              • + + + + + + + + + +
              • + +
              • + + + + + + + +
              • + +
              • + +
              • + + + + + + + +
              • + +
              • + + + + + + + +
              • +
              +
              diff --git a/wp-content/plugins/wpforms-lite/lite/templates/education/admin/did-you-know.php b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/did-you-know.php new file mode 100755 index 00000000..7482c5b2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/lite/templates/education/admin/did-you-know.php @@ -0,0 +1,60 @@ +'; + +?> +
              +
              +
              +

              + +
              +
              + + + + +
              +
              +
              +
              +
              +

              + +
              +
              + + + + +
              +
              +
              + + + '; + } + foreach ( $columns as $column ) { + printf( + '', + esc_attr( $width ), + esc_html( sanitize_text_field( $column ) ) + ); + } + ?> + + + + '; + if ( ! $single ) { + echo ''; + } + /** + * Column is needed for foreach syntax. + * + * @noinspection PhpUnusedLocalVariableInspection + */ + foreach ( $columns as $column ) { + echo ''; + } + echo ''; + if ( $single ) { + break; + } + } + ?> + +
              %s
              ' . esc_html( sanitize_text_field( $row ) ) . ''; + echo ''; + echo ''; + echo '
              + field_preview_option( 'description', $field ); + + // Hide remaining elements. + $this->field_preview_option( 'hide-remaining', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/NetPromoterScore/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/NetPromoterScore/Field.php new file mode 100755 index 00000000..8fc2aa15 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/NetPromoterScore/Field.php @@ -0,0 +1,288 @@ +name = esc_html__( 'Net Promoter Score', 'wpforms-lite' ); + $this->keywords = esc_html__( 'survey, nps', 'wpforms-lite' ); + $this->type = 'net_promoter_score'; + $this->icon = 'fa-tachometer'; + $this->order = 410; + $this->group = 'fancy'; + $this->addon_slug = 'surveys-polls'; + + $this->default_settings = [ + 'size' => 'large', + 'survey' => '1', + 'style' => 'modern', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + + /** + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Style (theme). + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'style', + 'value' => esc_html__( 'Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the style for the net promoter score.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'style', + 'value' => ! empty( $field['style'] ) ? esc_attr( $field['style'] ) : 'modern', + 'options' => [ + 'modern' => esc_html__( 'Modern', 'wpforms-lite' ), + 'classic' => esc_html__( 'Classic', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'style', + 'content' => $lbl . $fld, + ] + ); + + // Size. + $this->field_option( 'size', $field ); + + // Start label. + $lowest_lbl_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'lowest_label', + 'value' => esc_html__( 'Lowest Score Label', 'wpforms-lite' ), + ], + false + ); + + $lowest_lbl_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'lowest_label', + 'value' => $field['lowest_label'] ?? esc_html__( 'Not at all Likely', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'lowest_label', + 'content' => $lowest_lbl_label . $lowest_lbl_field, + ] + ); + + // End label. + $highest_lbl_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'highest_label', + 'value' => esc_html__( 'Highest Score Label', 'wpforms-lite' ), + ], + false + ); + + $highest_lbl_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'highest_label', + 'value' => $field['highest_label'] ?? esc_html__( 'Extremely Likely', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'highest_label', + 'content' => $highest_lbl_label . $highest_lbl_field, + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Define data. + $style = ! empty( $field['style'] ) ? sanitize_html_class( $field['style'] ) : 'modern'; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Lowest/Highest labels. + $lowest_label = $field['lowest_label'] ?? esc_html__( 'Not at all Likely', 'wpforms-lite' ); + $highest_label = $field['highest_label'] ?? esc_html__( 'Extremely Likely', 'wpforms-lite' ); + ?> + + + + + + + + + + + + + + +
              + + +
              + + +
              + field_preview_option( 'description', $field ); + + // Hide remaining elements. + $this->field_preview_option( 'hide-remaining', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Signature/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Signature/Field.php new file mode 100755 index 00000000..7ce9c284 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Addons/Signature/Field.php @@ -0,0 +1,199 @@ +name = esc_html__( 'Signature', 'wpforms-lite' ); + $this->keywords = esc_html__( 'user, e-signature', 'wpforms-lite' ); + $this->type = 'signature'; + $this->icon = 'fa-pencil'; + $this->order = 200; + $this->group = 'fancy'; + $this->addon_slug = 'signatures'; + + $this->default_settings = [ + 'size' => 'large', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + + /** + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Ink color picker. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'ink_color', + 'value' => esc_html__( 'Ink Color', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the color for the signature ink.', 'wpforms-lite' ), + ], + false + ); + + $ink_color = isset( $field['ink_color'] ) ? wpforms_sanitize_hex_color( $field['ink_color'] ) : ''; + $ink_color = empty( $ink_color ) ? '#000000' : $ink_color; + + $fld = $this->field_element( + 'color', + $field, + [ + 'slug' => 'ink_color', + 'value' => $ink_color, + 'data' => [ + 'fallback-color' => $ink_color, + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'ink_color', + 'content' => $lbl . $fld, + 'class' => 'color-picker-row', + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Size. + $this->field_option( 'size', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Signature placeholder. + echo '
              '; + + // Description. + $this->field_preview_option( 'description', $field ); + + // Hide remaining elements. + $this->field_preview_option( 'hide-remaining', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Field.php new file mode 100755 index 00000000..6b61c669 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Field.php @@ -0,0 +1,769 @@ +name = esc_html__( 'Address', 'wpforms-lite' ); + $this->type = 'address'; + $this->icon = 'fa-map-marker'; + $this->order = 70; + $this->group = 'fancy'; + + // Allow for additional or customizing address schemes. + $default_schemes = [ + 'us' => [ + 'label' => esc_html__( 'US', 'wpforms-lite' ), + 'address1_label' => esc_html__( 'Address Line 1', 'wpforms-lite' ), + 'address2_label' => esc_html__( 'Address Line 2', 'wpforms-lite' ), + 'city_label' => esc_html__( 'City', 'wpforms-lite' ), + 'postal_label' => esc_html__( 'Zip Code', 'wpforms-lite' ), + 'state_label' => esc_html__( 'State', 'wpforms-lite' ), + 'states' => wpforms_us_states(), + ], + 'international' => [ + 'label' => esc_html__( 'International', 'wpforms-lite' ), + 'address1_label' => esc_html__( 'Address Line 1', 'wpforms-lite' ), + 'address2_label' => esc_html__( 'Address Line 2', 'wpforms-lite' ), + 'city_label' => esc_html__( 'City', 'wpforms-lite' ), + 'postal_label' => esc_html__( 'Postal Code', 'wpforms-lite' ), + 'state_label' => esc_html__( 'State / Province / Region', 'wpforms-lite' ), + 'states' => '', + 'country_label' => esc_html__( 'Country', 'wpforms-lite' ), + 'countries' => wpforms_countries(), + ], + ]; + + /** + * Allow modifying address schemes. + * + * @since 1.2.7 + * + * @param array $schemes Address schemes. + */ + $this->schemes = apply_filters( 'wpforms_address_schemes', $default_schemes ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Address Scheme - was "format" key prior to 1.2.7. + $scheme = ! empty( $field['scheme'] ) ? esc_attr( $field['scheme'] ) : 'us'; + + if ( empty( $scheme ) && ! empty( $field['format'] ) ) { + $scheme = esc_attr( $field['format'] ); + } + + $tooltip = esc_html__( 'Select scheme format for the address field.', 'wpforms-lite' ); + + $options = array_map( + static function ( $s ) { + + return $s['label']; + }, + $this->schemes + ); + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'scheme', + 'value' => esc_html__( 'Scheme', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => 'scheme', + 'value' => $scheme, + 'options' => $options, + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'scheme', + 'content' => $output, + ] + ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Size. + $this->field_option( 'size', $field ); + + // Address Line 1. + $address1_placeholder = ! empty( $field['address1_placeholder'] ) ? esc_attr( $field['address1_placeholder'] ) : ''; + $address1_default = ! empty( $field['address1_default'] ) ? esc_attr( $field['address1_default'] ) : ''; + + printf( + '
              ', + wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + $this->field_element( + 'label', + $field, + [ + 'slug' => 'address1_placeholder', + 'value' => esc_html__( 'Address Line 1', 'wpforms-lite' ), + ] + ); + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $address1_placeholder ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $address1_default ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo '
              '; + + // Address Line 2. + $address2_placeholder = ! empty( $field['address2_placeholder'] ) ? esc_attr( $field['address2_placeholder'] ) : ''; + $address2_default = ! empty( $field['address2_default'] ) ? esc_attr( $field['address2_default'] ) : ''; + $address2_hide = ! empty( $field['address2_hide'] ); + + printf( + '
              ', + wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + echo '
              '; + + $this->field_element( + 'label', + $field, + [ + 'slug' => 'address2_placeholder', + 'value' => esc_html__( 'Address Line 2', 'wpforms-lite' ), + ] + ); + + $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'address2_hide', + 'value' => $address2_hide, + 'desc' => esc_html__( 'Hide', 'wpforms-lite' ), + 'title' => esc_html__( 'Turn On if you want to hide this sub field.', 'wpforms-lite' ), + 'label-left' => true, + 'control-class' => 'wpforms-field-option-in-label-right', + 'class' => 'wpforms-subfield-hide', + ] + ); + + echo '
              '; + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $address2_placeholder ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $address2_default ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo '
              '; + + // City. + $city_placeholder = ! empty( $field['city_placeholder'] ) ? esc_attr( $field['city_placeholder'] ) : ''; + $city_default = ! empty( $field['city_default'] ) ? esc_attr( $field['city_default'] ) : ''; + + printf( + '
              ', + wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + $this->field_element( + 'label', + $field, + [ + 'slug' => 'city_placeholder', + 'value' => esc_html__( 'City', 'wpforms-lite' ), + ] + ); + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $city_placeholder ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $city_default ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo '
              '; + + // State. + $state_placeholder = ! empty( $field['state_placeholder'] ) ? $field['state_placeholder'] : ''; + + printf( + '
              ', + wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + $this->field_element( + 'label', + $field, + [ + 'slug' => 'state_placeholder', + 'value' => esc_html__( 'State / Province / Region', 'wpforms-lite' ), + ] + ); + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $state_placeholder ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + $this->subfield_default( $field, 'state', 'states' ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo '
              '; + + // ZIP/Postal. + $postal_placeholder = ! empty( $field['postal_placeholder'] ) ? esc_attr( $field['postal_placeholder'] ) : ''; + $postal_default = ! empty( $field['postal_default'] ) ? esc_attr( $field['postal_default'] ) : ''; + $postal_hide = ! empty( $field['postal_hide'] ); + $postal_visibility = ! isset( $this->schemes[ $scheme ]['postal_label'] ) ? 'wpforms-hidden' : ''; + + printf( + '
              ', + sanitize_html_class( $postal_visibility ), + wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + echo '
              '; + + $this->field_element( + 'label', + $field, + [ + 'slug' => 'postal_placeholder', + 'value' => esc_html__( 'ZIP / Postal', 'wpforms-lite' ), + ] + ); + + $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'postal_hide', + 'value' => $postal_hide, + 'desc' => esc_html__( 'Hide', 'wpforms-lite' ), + 'title' => esc_html__( 'Turn On if you want to hide this sub field.', 'wpforms-lite' ), + 'label-left' => true, + 'control-class' => 'wpforms-field-option-in-label-right', + 'class' => 'wpforms-subfield-hide', + ] + ); + + echo '
              '; + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $postal_placeholder ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $postal_default ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo '
              '; + + // Country. + $country_placeholder = ! empty( $field['country_placeholder'] ) ? $field['country_placeholder'] : ''; + $country_hide = ! empty( $field['country_hide'] ); + $country_visibility = ! isset( $this->schemes[ $scheme ]['countries'] ) ? 'wpforms-hidden' : ''; + + printf( + '
              ', + sanitize_html_class( $country_visibility ), + wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + echo '
              '; + + $this->field_element( + 'label', + $field, + [ + 'slug' => 'country_placeholder', + 'value' => esc_html__( 'Country', 'wpforms-lite' ), + ] + ); + + $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'country_hide', + 'value' => $country_hide, + 'desc' => esc_html__( 'Hide', 'wpforms-lite' ), + 'title' => esc_html__( 'Turn On if you want to hide this sub field.', 'wpforms-lite' ), + 'label-left' => true, + 'control-class' => 'wpforms-field-option-in-label-right', + 'class' => 'wpforms-subfield-hide', + ] + ); + + echo '
              '; + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + echo '
              '; + printf( '', wpforms_validate_field_id( $field['id'] ), esc_attr( $country_placeholder ) ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + $this->subfield_default( $field, 'country', 'countries' ); + printf( '', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo '
              '; + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Hide sublabel. + $this->field_option( 'sublabel_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded + + // Define data. + $address1_placeholder = ! empty( $field['address1_placeholder'] ) ? $field['address1_placeholder'] : ''; + $address1_default = ! empty( $field['address1_default'] ) ? $field['address1_default'] : ''; + $address2_placeholder = ! empty( $field['address2_placeholder'] ) ? $field['address2_placeholder'] : ''; + $address2_default = ! empty( $field['address2_default'] ) ? $field['address2_default'] : ''; + $address2_hide = ! empty( $field['address2_hide'] ) ? 'wpforms-hide' : ''; + $city_placeholder = ! empty( $field['city_placeholder'] ) ? $field['city_placeholder'] : ''; + $city_default = ! empty( $field['city_default'] ) ? $field['city_default'] : ''; + $postal_placeholder = ! empty( $field['postal_placeholder'] ) ? $field['postal_placeholder'] : ''; + $postal_default = ! empty( $field['postal_default'] ) ? $field['postal_default'] : ''; + $postal_hide = ! empty( $field['postal_hide'] ) ? 'wpforms-hide' : ''; + $country_hide = ! empty( $field['country_hide'] ) ? 'wpforms-hide' : ''; + $format = ! empty( $field['format'] ) ? $field['format'] : 'us'; + $scheme_selected = ! empty( $field['scheme'] ) ? $field['scheme'] : $format; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Field elements. + foreach ( $this->schemes as $slug => $scheme ) { + + $address1_label = $scheme['address1_label'] ?? esc_html__( 'Address Line 1', 'wpforms-lite' ); + $address2_label = $scheme['address2_label'] ?? esc_html__( 'Address Line 2', 'wpforms-lite' ); + $city_label = $scheme['city_label'] ?? esc_html__( 'City', 'wpforms-lite' ); + $state_label = $scheme['state_label'] ?? esc_html__( 'State / Province / Region', 'wpforms-lite' ); + $postal_label = $scheme['postal_label'] ?? esc_html__( 'Postal Code', 'wpforms-lite' ); + $country_label = $scheme['country_label'] ?? esc_html__( 'Country', 'wpforms-lite' ); + + $is_active_scheme = $slug === $scheme_selected; + $scheme_hide_class = ! $is_active_scheme ? 'wpforms-hide' : ''; + + $state_placeholder = ! empty( $field['state_placeholder'] ) ? $field['state_placeholder'] : ''; + $state_default = $is_active_scheme && ! empty( $field['state_default'] ) ? $field['state_default'] : ''; + $country_placeholder = ! empty( $field['country_placeholder'] ) ? $field['country_placeholder'] : ''; + $country_default = $is_active_scheme && ! empty( $field['country_default'] ) ? $field['country_default'] : ''; + + // Wrapper. + printf( + '
              ', + wpforms_sanitize_classes( $slug ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wpforms_sanitize_classes( $scheme_hide_class ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + // Row 1 - Address Line 1. + printf( + '
              + + +
              ', + esc_attr( $address1_placeholder ), + esc_attr( $address1_default ), + esc_html( $address1_label ) + ); + + // Row 2 - Address Line 2. + printf( + '
              + + +
              ', + wpforms_sanitize_classes( $address2_hide ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $address2_placeholder ), + esc_attr( $address2_default ), + esc_html( $address2_label ) + ); + + // Row 3 - City & State. + echo '
              '; + + // City. + printf( + '
              + + +
              ', + esc_attr( $city_placeholder ), + esc_attr( $city_default ), + esc_html( $city_label ) + ); + + // State / Providence / Region. + echo '
              '; + + if ( isset( $scheme['states'] ) && empty( $scheme['states'] ) ) { + + // State text input. + printf( '', esc_attr( $state_placeholder ), esc_attr( $state_default ) ); + + } elseif ( ! empty( $scheme['states'] ) && is_array( $scheme['states'] ) ) { + + $state_option = $this->dropdown_empty_value( (string) $state_label ); + + if ( ! empty( $state_placeholder ) ) { + $state_option = $state_placeholder; + } + + if ( $is_active_scheme && ! empty( $state_default ) ) { + $state_option = $scheme['states'][ $state_default ]; + } + + // State select. + printf( '', esc_html( $state_option ) ); + } + + printf( '', esc_html( $state_label ) ); + echo '
              '; + + // End row 3 - City & State. + echo '
              '; + + // Row 4 - Zip & Country. + echo '
              '; + + // ZIP / Postal. + printf( + '
              + + +
              ', + wpforms_sanitize_classes( $postal_hide ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $postal_placeholder ), + esc_attr( $postal_default ), + esc_html( $postal_label ) + ); + + // Country. + printf( '
              ', sanitize_html_class( $country_hide ) ); + + if ( isset( $scheme['countries'] ) && empty( $scheme['countries'] ) ) { + + // Country text input. + printf( '', esc_attr( $country_placeholder ), esc_attr( $country_default ) ); + + } elseif ( ! empty( $scheme['countries'] ) && is_array( $scheme['countries'] ) ) { + + $country_option = $this->dropdown_empty_value( (string) $country_label ); + + if ( ! empty( $country_placeholder ) ) { + $country_option = $country_placeholder; + } + + if ( $is_active_scheme && ! empty( $country_default ) ) { + $country_option = $scheme['countries'][ $country_default ]; + } + + // Country select. + printf( '', esc_html( $country_option ) ); + printf( '', esc_html( $country_label ) ); + } + + echo '
              '; + + // End row 4 - Zip & Country. + echo '
              '; + + // End wrapper. + echo '
              '; + } + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties instead. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } + + /** + * Output "Default" option fields for State/Country subfields. + * + * The default value should be set only for the scheme it belongs to. + * + * @since 1.9.4 + * + * @param array $field Address field data. + * @param string $subfield_slug Subfield slug, either `state` or `country`. + * @param string $subfield_key Subfield key in `$scheme` data, either `states` or `countries`. + * + * @noinspection HtmlUnknownAttribute + */ + private function subfield_default( array $field, string $subfield_slug, string $subfield_key ): void { + + // Scheme or default value may not be set yet. + $active_scheme = ! empty( $field['scheme'] ) ? $field['scheme'] : 'us'; + $default_value = ! empty( $field[ "{$subfield_slug}_default" ] ) ? $field[ "{$subfield_slug}_default" ] : ''; + + foreach ( $this->schemes as $scheme_slug => $scheme_data ) { + + $subfield_label = empty( $scheme_data[ $subfield_slug . '_label' ] ) ? ucfirst( $subfield_slug ) : $scheme_data[ $subfield_slug . '_label' ]; + $empty_value = $this->dropdown_empty_value( $subfield_label ); + $is_active_scheme = $scheme_slug === $active_scheme; + + // If a scheme contains an array of values, we display a select dropdown. Otherwise, text input. + if ( ! empty( $scheme_data[ $subfield_key ] ) && is_array( $scheme_data[ $subfield_key ] ) ) { + + $options_escaped = sprintf( '', esc_html( $empty_value ) ); + + foreach ( $scheme_data[ $subfield_key ] as $value => $label ) { + $options_escaped .= sprintf( + '', + esc_attr( $value ), + $is_active_scheme ? selected( $default_value, $value, false ) : '', + esc_html( $label ) + ); + } + + if ( $is_active_scheme ) { + printf( + '', + wpforms_validate_field_id( $field['id'] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $subfield_slug ), + esc_attr( $scheme_slug ), + $options_escaped // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + continue; + } + + printf( + '', + esc_attr( $scheme_slug ), + $options_escaped // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + continue; + } + + if ( $is_active_scheme ) { + printf( + '', + wpforms_validate_field_id( $field['id'] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $subfield_slug ), + esc_attr( $default_value ), + esc_attr( $scheme_slug ) + ); + + continue; + } + + printf( + '', + esc_attr( $scheme_slug ) + ); + } + } + + /** + * Get a select dropdown "placeholder" option which is displayed if nothing is selected. + * + * @since 1.9.4 + * + * @param string $name Select field name, can be lowercase or uppercase. + * + * @return string + */ + protected function dropdown_empty_value( string $name ): string { + + return sprintf( /* translators: %s - subfield name, e.g., state, country. */ + __( '--- Select %s ---', 'wpforms-lite' ), + $name + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Frontend.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Frontend.php new file mode 100755 index 00000000..8570e784 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Address/Frontend.php @@ -0,0 +1,73 @@ +field_obj = $field_obj; + + $this->init(); + } + + /** + * Initialize. + * + * @since 1.8.1 + */ + public function init() { + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.1 + */ + protected function hooks() { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Camera/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Camera/Field.php new file mode 100755 index 00000000..6745c4e9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Camera/Field.php @@ -0,0 +1,471 @@ +name = esc_html__( 'Camera', 'wpforms-lite' ); + $this->keywords = esc_html__( 'photo, image, capture, webcam', 'wpforms-lite' ); + $this->type = 'camera'; + $this->icon = 'fa-camera'; + $this->order = 105; + $this->group = 'fancy'; + + $this->default_settings = [ + 'style' => 'button', + ]; + + $this->init_pro_field(); + + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.9.8 + */ + private function hooks(): void { + + add_action( 'wpforms_builder_enqueues', [ $this, 'builder_enqueues' ] ); + } + + /** + * Enqueue script for the admin form builder. + * + * @since 1.9.8 + */ + public function builder_enqueues(): void { + + $min = wpforms_get_min_suffix(); + + if ( ! wpforms_is_pro() ) { + return; + } + + wp_enqueue_script( + 'wpforms-builder-file-upload-field', + WPFORMS_PLUGIN_URL . "assets/pro/js/admin/builder/fields/file-upload{$min}.js", + [ 'jquery', 'wpforms-builder' ], + WPFORMS_VERSION, + false + ); + + wp_enqueue_script( + 'wpforms-builder-camera', + WPFORMS_PLUGIN_URL . "assets/pro/js/admin/builder/camera{$min}.js", + [ 'jquery', 'wpforms-builder' ], + WPFORMS_VERSION, + false + ); + + // Localize strings for the camera field. + wp_localize_script( + 'wpforms-builder-camera', + 'wpforms_camera_builder', + [ + 'button_link_text_label' => esc_html__( 'Button Link Text', 'wpforms-lite' ), + 'link_text_label' => esc_html__( 'Link Text', 'wpforms-lite' ), + 'button_link_text_tooltip' => esc_html__( 'Enter the text for the button link.', 'wpforms-lite' ), + 'link_text_tooltip' => esc_html__( 'Enter the text for the link.', 'wpforms-lite' ), + 'error_message' => esc_html__( 'Camera field with Link style cannot have empty Link Text. Please enter text or change style to Button.', 'wpforms-lite' ), + 'error_title' => esc_html__( 'Missing Link Text', 'wpforms-lite' ), + 'error_ok' => esc_html__( 'OK', 'wpforms-lite' ), + ] + ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.8 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Camera options. + $this->add_camera_enabled_toggle( $field ); + $this->add_camera_format_options( $field ); + $this->add_camera_aspect_ratio_options( $field ); + $this->add_camera_custom_ratio_options( $field ); + $this->add_camera_time_limit_options( $field ); + + // Max file size. + $this->add_max_file_size_options( $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( 'basic-options', $field, [ 'markup' => 'close' ] ); + + // Advanced field options. + $this->field_option( 'advanced-options', $field, [ 'markup' => 'open' ] ); + + // Style (Button or Link). + $this->add_style_options( $field ); + + // Button link text. + $this->add_button_link_text_options( $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Media Library toggle. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'media_library', + 'value' => ! empty( $field['media_library'] ) ? 1 : '', + 'desc' => esc_html__( 'Store Files in WordPress Media Library', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to store the final uploaded file in the WordPress Media Library', 'wpforms-lite' ), + 'class' => 'wpforms-camera-media-library', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'media_library', + 'content' => $fld, + ] + ); + + // Access Restrictions. + $this->access_restrictions_options( $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( 'advanced-options', $field, [ 'markup' => 'close' ] ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.8 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + $style = ! empty( $field['style'] ) ? $field['style'] : self::STYLE_BUTTON; + + $field_id = absint( $field['id'] ); + $text = $field['button_link_text'] ?? esc_html__( 'Capture With Your Camera', 'wpforms-lite' ); + + // Always render both button and link, but hide/show based on the selected style. + $button_class = $style === self::STYLE_BUTTON ? 'wpforms-camera-button wpforms-btn-secondary' : 'wpforms-camera-button wpforms-btn-secondary wpforms-hidden'; + $link_class = $style === self::STYLE_LINK ? 'wpforms-camera-link' : 'wpforms-camera-link wpforms-hidden'; + + printf( + '', + esc_attr( $button_class ), + (int) $field_id, + $this->get_camera_icon_svg(), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_html( $text ) + ); + + printf( + '%s', + esc_attr( $link_class ), + (int) $field_id, + esc_html( $text ) + ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + // Implemented in Pro only. + } + + /** + * Add max file size options. + * + * @since 1.9.8 + * + * @param array $field Field data. + */ + private function add_max_file_size_options( array $field ): void { + + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'max_size', + 'value' => esc_html__( 'Max File Size', 'wpforms-lite' ), + 'tooltip' => sprintf( /* translators: %s - max upload size. */ + esc_html__( 'Enter the max size of each file, in megabytes, to allow. If left blank, the value defaults to the maximum size the server allows which is %s.', 'wpforms-lite' ), + wpforms_max_upload() + ), + ], + false + ); + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'max_size', + 'type' => 'number', + 'attrs' => [ + 'min' => 1, + 'max' => 512, + 'step' => 1, + 'pattern' => '[0-9]', + ], + 'value' => ! empty( $field['max_size'] ) ? abs( $field['max_size'] ) : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'max_size', + 'content' => $lbl . $fld, + ] + ); + } + + /** + * Add style options, Button or Link. + * + * @since 1.9.8 + * + * @param array $field Field data. + */ + private function add_style_options( array $field ): void { + + // Style (Button or Link). + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'style', + 'value' => esc_html__( 'Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Choose the style of the camera button.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'style', + 'value' => ! empty( $field['style'] ) ? $field['style'] : self::STYLE_BUTTON, + 'options' => [ + self::STYLE_BUTTON => esc_html__( 'Button', 'wpforms-lite' ), + self::STYLE_LINK => esc_html__( 'Link', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'style', + 'content' => $lbl . $fld, + 'class' => 'wpforms-camera-style', + ] + ); + } + + /** + * Add button link text options. + * + * @since 1.9.8 + * + * @param array $field Field data. + */ + private function add_button_link_text_options( array $field ): void { + + $style = ! empty( $field['style'] ) ? $field['style'] : self::STYLE_BUTTON; + + // Button link text. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'button_link_text', + 'value' => $style === self::STYLE_BUTTON ? esc_html__( 'Button Link Text', 'wpforms-lite' ) : esc_html__( 'Link Text', 'wpforms-lite' ), + 'tooltip' => $style === self::STYLE_BUTTON ? esc_html__( 'Enter the text for the button link.', 'wpforms-lite' ) : esc_html__( 'Enter the text for the link.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'button_link_text', + 'value' => $field['button_link_text'] ?? esc_html__( 'Capture With Your Camera', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'button_link_text', + 'content' => $lbl . $fld, + ] + ); + } + + /** + * Get camera icon SVG. + * + * @since 1.9.8 + * + * @return string Camera icon SVG code. + * @noinspection HtmlDeprecatedAttribute + */ + protected function get_camera_icon_svg(): string { + + return ''; + } + + /** + * Get remove selected file icon SVG. + * + * @since 1.9.8 + * + * @return string Remove icon SVG code. + * @noinspection HtmlDeprecatedAttribute + */ + protected function get_camera_remove_file_icon(): string { + + return ''; + } + + /** + * Check if the field is modern upload style. + * + * @since 1.9.8 + * + * @param array $field_data Field data. + * + * @return bool + */ + public static function is_modern_upload( $field_data ): bool { + + return isset( $field_data['style'] ) && $field_data['style'] === self::STYLE_MODERN; + } + + /** + * Format field value for display in Entries. + * + * @since 1.9.8 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field_id = absint( $field_id ); + $field_label = ! empty( $form_data['fields'][ $field_id ]['label'] ) ? sanitize_text_field( $form_data['fields'][ $field_id ]['label'] ) : ''; + $style = ! empty( $form_data['fields'][ $field_id ]['style'] ) && $form_data['fields'][ $field_id ]['style'] === self::STYLE_MODERN + ? self::STYLE_MODERN + : self::STYLE_CLASSIC; + + if ( $style === self::STYLE_CLASSIC ) { + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $field_label, + 'value' => '', + 'file' => '', + 'file_original' => '', + 'ext' => '', + 'id' => $field_id, + 'type' => $this->type, + ]; + + return; + } + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $field_label, + 'value' => '', + 'value_raw' => '', + 'id' => $field_id, + 'type' => $this->type, + 'style' => self::STYLE_MODERN, + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Content/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Content/Field.php new file mode 100755 index 00000000..c452c2cb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Content/Field.php @@ -0,0 +1,133 @@ +name = esc_html__( 'Content', 'wpforms-lite' ); + $this->keywords = esc_html__( 'image, text, table, list, heading, wysiwyg, visual', 'wpforms-lite' ); + $this->type = 'content'; + $this->icon = 'fa-file-image-o'; + $this->order = 180; + $this->group = 'fancy'; + $this->allow_read_only = false; + + $this->default_settings = [ + 'label_disable' => '1', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Register WP hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Show field options in the builder left panel. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + $this->field_option_content( $field ); + + // Set label to the disabled. + $args = [ + 'type' => 'hidden', + 'slug' => 'label_disable', + 'value' => '1', + ]; + + $this->field_element( 'text', $field, $args ); + + // Options close markup. + $this->field_option( 'basic-options', $field, [ 'markup' => 'close' ] ); + + // Options open markup. + $this->field_option( 'advanced-options', $field, [ 'markup' => 'open' ] ); + + // Size. + $this->field_option( 'size', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Options close markup. + $this->field_option( 'advanced-options', $field, [ 'markup' => 'close' ] ); + } + + /** + * Show the field preview in the builder right panel. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + if ( ! empty( $this->is_disabled_field ) ) { + // Label. + $field['label'] = empty( $field['label'] ) ? esc_html__( 'Content', 'wpforms-lite' ) : $field['label']; + + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + } + + $this->content_input_preview( $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties instead. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/CreditCard/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/CreditCard/Field.php new file mode 100755 index 00000000..1b29406e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/CreditCard/Field.php @@ -0,0 +1,265 @@ +name = esc_html__( 'Credit Card', 'wpforms-lite' ); + $this->type = 'credit-card'; + $this->icon = 'fa-credit-card'; + $this->order = 90; + $this->group = 'payment'; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.1 + */ + protected function hooks(): void { + } + + /** + * Field options panel inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Card Number. + $cardnumber_placeholder = ! empty( $field['cardnumber_placeholder'] ) ? esc_attr( $field['cardnumber_placeholder'] ) : ''; + + printf( + '
              ', + absint( $field['id'] ) + ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'cardnumber_placeholder', + 'value' => esc_html__( 'Card Number Placeholder Text', 'wpforms-lite' ), + ] + ); + + echo '
              '; + printf( + '', + absint( $field['id'] ), + esc_attr( $cardnumber_placeholder ) + ); + echo '
              '; + echo '
              '; + + // CVC/Security Code. + $cardcvc_placeholder = ! empty( $field['cardcvc_placeholder'] ) ? $field['cardcvc_placeholder'] : ''; + + printf( + '
              ', + absint( $field['id'] ) + ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'cardcvc_placeholder', + 'value' => esc_html__( 'Security Code Placeholder Text', 'wpforms-lite' ), + ] + ); + + echo '
              '; + printf( + '', + absint( $field['id'] ), + esc_attr( $cardcvc_placeholder ) + ); + echo '
              '; + echo '
              '; + + // Card Name. + $cardname_placeholder = ! empty( $field['cardname_placeholder'] ) ? $field['cardname_placeholder'] : ''; + + printf( + '
              ', + absint( $field['id'] ) + ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'cardname_placeholder', + 'value' => esc_html__( 'Name on Card Placeholder Text', 'wpforms-lite' ), + ] + ); + + echo '
              '; + printf( + '', + absint( $field['id'] ), + esc_attr( $cardname_placeholder ) + ); + echo '
              '; + echo '
              '; + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Hide sublabels. + $this->field_option( 'sublabel_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.0.0 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Define data. + $number_placeholder = ! empty( $field['cardnumber_placeholder'] ) ? esc_attr( $field['cardnumber_placeholder'] ) : ''; + $cvc_placeholder = ! empty( $field['cardcvc_placeholder'] ) ? esc_attr( $field['cardcvc_placeholder'] ) : ''; + $name_placeholder = ! empty( $field['cardname_placeholder'] ) ? esc_attr( $field['cardname_placeholder'] ) : ''; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + ?> + +
              + +
              +
              + + +
              + +
              + + +
              +
              + +
              +
              + + +
              + +
              + +
              + +
              + / +
              + +
              +
              +
              + +
              + + field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.0.0 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/CustomCaptcha/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/CustomCaptcha/Field.php new file mode 100755 index 00000000..d8e46d11 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/CustomCaptcha/Field.php @@ -0,0 +1,315 @@ +name = esc_html__( 'Custom Captcha', 'wpforms-lite' ); + $this->keywords = esc_html__( 'spam, math, maths, question', 'wpforms-lite' ); + $this->type = self::TYPE; + $this->icon = 'fa-question-circle'; + $this->order = 300; + $this->group = 'fancy'; + $this->allow_read_only = false; + $this->qs = [ + 1 => [ + 'question' => esc_html__( 'What is 7+4?', 'wpforms-lite' ), + 'answer' => esc_html__( '11', 'wpforms-lite' ), + ], + ]; + $this->math = [ + 'min' => 1, + 'max' => 15, + 'cal' => [ '+', '*' ], + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + + // Defaults. + $format = ! empty( $field['format'] ) ? esc_attr( $field['format'] ) : 'math'; + $qs = ! empty( $field['questions'] ) ? $field['questions'] : $this->qs; + $qs = array_filter( $qs ); + + // Field is always required. + $this->field_element( + 'text', + $field, + [ + 'type' => 'hidden', + 'slug' => 'required', + 'value' => '1', + ] + ); + + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Format. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'format', + 'value' => esc_html__( 'Type', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select type of captcha to use.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'format', + 'value' => $format, + 'options' => [ + 'math' => esc_html__( 'Math', 'wpforms-lite' ), + 'qa' => esc_html__( 'Question and Answer', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'format', + 'content' => $lbl . $fld, + ] + ); + + // Questions. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'questions', + 'value' => esc_html__( 'Questions and Answers', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Add questions to ask the user. Questions are randomly selected.', 'wpforms-lite' ), + ], + false + ); + $fld = sprintf( + '
                ', + max( array_keys( $qs ) ) + 1, + esc_attr( $field['id'] ), + esc_attr( $this->type ) + ); + + foreach ( $qs as $key => $value ) { + $fld .= '
              • '; + $fld .= sprintf( + '', + (int) $field['id'], + esc_attr( $key ), + esc_attr( $value['question'] ), + esc_html__( 'Question', 'wpforms-lite' ) + ); + $fld .= ''; + $fld .= sprintf( + '', + (int) $field['id'], + esc_attr( $key ), + esc_attr( $value['answer'] ), + esc_html__( 'Answer', 'wpforms-lite' ) + ); + $fld .= '
              • '; + } + $fld .= '
              '; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'questions', + 'content' => $lbl . $fld, + 'class' => $format === 'math' ? 'wpforms-hidden' : '', + ] + ); + + // Description. + $this->field_option( 'description', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Size. + $this->field_option( + 'size', + $field, + [ + 'class' => $format === 'math' ? 'wpforms-hidden' : '', + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Define data. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $format = ! empty( $field['format'] ) ? $field['format'] : 'math'; + $num1 = wp_rand( $this->math['min'], $this->math['max'] ); + $num2 = wp_rand( $this->math['min'], $this->math['max'] ); + $cal = $this->math['cal'][ wp_rand( 0, count( $this->math['cal'] ) - 1 ) ]; + $questions = ! empty( $field['questions'] ) ? $field['questions'] : $this->qs; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + $first_question = array_shift( $questions ); + ?> + +
              + + + +

              + + + +
              + + field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/DateTime/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/DateTime/Field.php new file mode 100755 index 00000000..cc0db11f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/DateTime/Field.php @@ -0,0 +1,901 @@ + 'date-time', + 'date_placeholder' => '', + 'date_format' => 'm/d/Y', + 'date_type' => 'datepicker', + 'time_placeholder' => '', + 'time_format' => 'g:i A', + 'time_interval' => '30', + 'date_limit_days_sun' => '0', + 'date_limit_days_mon' => '1', + 'date_limit_days_tue' => '1', + 'date_limit_days_wed' => '1', + 'date_limit_days_thu' => '1', + 'date_limit_days_fri' => '1', + 'date_limit_days_sat' => '0', + 'time_limit_hours_start_hour' => '09', + 'time_limit_hours_start_min' => '00', + 'time_limit_hours_start_ampm' => 'am', + 'time_limit_hours_end_hour' => '06', + 'time_limit_hours_end_min' => '00', + 'time_limit_hours_end_ampm' => 'pm', + ]; + + /** + * Alternative Date Format. + * + * @since 1.9.4 + */ + public const ALT_DATE_FORMAT = 'd/m/Y'; + + /** + * Primary class constructor. + * + * @since 1.9.4 + */ + public function init() { + + // Define field type information. + $this->name = esc_html__( 'Date / Time', 'wpforms-lite' ); + $this->type = 'date-time'; + $this->icon = 'fa-calendar-o'; + $this->order = 80; + $this->group = 'fancy'; + + $this->default_settings = self::DEFAULTS; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks(): void { + + // Set custom option wrapper classes. + add_filter( 'wpforms_builder_field_option_class', [ $this, 'field_option_class' ], 10, 2 ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * + * @noinspection PackedHashtableOptimizationInspection + * @noinspection HtmlUnknownAttribute + */ + public function field_options( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + /** + * Basic field options + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Format option. + $format = ! empty( $field['format'] ) ? esc_attr( $field['format'] ) : self::DEFAULTS['format']; + $format_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'format', + 'value' => esc_html__( 'Format', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select format for the date field.', 'wpforms-lite' ), + ], + false + ); + $format_select = $this->field_element( + 'select', + $field, + [ + 'slug' => 'format', + 'value' => $format, + 'options' => [ + 'date-time' => esc_html__( 'Date and Time', 'wpforms-lite' ), + 'date' => esc_html__( 'Date', 'wpforms-lite' ), + 'time' => esc_html__( 'Time', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'format', + 'content' => $format_label . $format_select, + ] + ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Size. + $this->field_option( 'size', $field ); + + // Custom options. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + + // Date. + $date_placeholder = ! empty( $field['date_placeholder'] ) ? $field['date_placeholder'] : ''; + $date_format = ! empty( $field['date_format'] ) ? esc_attr( $field['date_format'] ) : self::DEFAULTS['date_format']; + $date_type = ! empty( $field['date_type'] ) ? esc_attr( $field['date_type'] ) : 'datepicker'; + // Backwards compatibility with old datepicker format. + if ( $date_format === 'mm/dd/yyyy' ) { + $date_format = self::DEFAULTS['date_format']; + } elseif ( $date_format === 'dd/mm/yyyy' ) { + $date_format = self::ALT_DATE_FORMAT; + } elseif ( $date_format === 'mmmm d, yyyy' ) { + $date_format = 'F j, Y'; + } + + $date_formats = wpforms_date_formats(); + + printf( + '
              ', + esc_attr( $field['id'] ), + esc_attr( $field['id'] ) + ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'date_placeholder', + 'value' => esc_html__( 'Date', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Advanced date options.', 'wpforms-lite' ), + ] + ); + + echo '
              '; + echo '
              '; + printf( + ''; + printf( + '', + esc_attr( $field['id'] ), + esc_html__( 'Type', 'wpforms-lite' ) + ); + echo '
              '; + echo '
              '; + printf( + ''; + printf( + '', + esc_attr( $field['id'] ), + esc_html__( 'Format', 'wpforms-lite' ) + ); + echo '
              '; + echo '
              '; + echo '
              '; + printf( + '', + esc_attr( $field['id'] ), + esc_attr( $field['id'] ), + esc_attr( $date_placeholder ) + ); + printf( + '', + esc_attr( $field['id'] ), + esc_html__( 'Placeholder', 'wpforms-lite' ) + ); + echo '
              '; + + // Limit Days options. + $this->field_options_limit_days( $field ); + + echo '
              '; + + // Time. + $time_placeholder = ! empty( $field['time_placeholder'] ) ? $field['time_placeholder'] : ''; + $time_format = ! empty( $field['time_format'] ) ? esc_attr( $field['time_format'] ) : self::DEFAULTS['time_format']; + $time_formats = wpforms_time_formats(); + $time_interval = ! empty( $field['time_interval'] ) ? esc_attr( $field['time_interval'] ) : '30'; + + /** + * Filters the time intervals available for the Time field. + * + * @since 1.6.0 + * + * @param array $time_intervals Array of time intervals. + */ + $time_intervals = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_datetime_time_intervals', + [ + '15' => esc_html__( '15 minutes', 'wpforms-lite' ), + '30' => esc_html__( '30 minutes', 'wpforms-lite' ), + '60' => esc_html__( '1 hour', 'wpforms-lite' ), + ] + ); + + printf( + '
              ', + esc_attr( $field['id'] ), + esc_attr( $field['id'] ) + ); + $this->field_element( + 'label', + $field, + [ + 'slug' => 'time_placeholder', + 'value' => esc_html__( 'Time', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Advanced time options.', 'wpforms-lite' ), + ] + ); + + echo '
              '; + echo '
              '; + printf( + ''; + printf( + '', + esc_attr( $field['id'] ), + esc_html__( 'Interval', 'wpforms-lite' ) + ); + echo '
              '; + + echo '
              '; + printf( + ''; + printf( + '', + esc_attr( $field['id'] ), + esc_html__( 'Format', 'wpforms-lite' ) + ); + echo '
              '; + echo '
              '; + echo '
              '; + printf( + '', + esc_attr( $field['id'] ), + esc_attr( $field['id'] ), + esc_attr( $time_placeholder ) + ); + printf( + '', + esc_attr( $field['id'] ), + esc_html__( 'Placeholder', 'wpforms-lite' ) + ); + echo '
              '; + + // Limit Hours options. + $this->field_options_limit_hours( $field ); + + echo '
              '; + + echo '
              '; + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Hide sublabels. + $sublabel_class = isset( $field['format'] ) && $field['format'] !== self::DEFAULTS['format'] ? 'wpforms-hidden' : ''; + + $this->field_option( 'sublabel_hide', $field, [ 'class' => $sublabel_class ] ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Get regular date formats. + * + * @since 1.9.8.3 + * + * @return array + */ + private function get_regular_date_formats(): array { + + return [ + self::DEFAULTS['date_format'], + self::ALT_DATE_FORMAT, + 'Y/m/d', + 'm.d.Y', + 'd.m.Y', + 'Y.m.d', + ]; + } + + /** + * Display limit days options. + * + * @since 1.9.4 + * + * @param array $field Field setting. + */ + private function field_options_limit_days( array $field ): void { + + echo '
              '; + + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'date_limit_days', + 'value' => ! empty( $field['date_limit_days'] ) ? '1' : '0', + 'desc' => esc_html__( 'Limit Days', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to adjust which days of the week can be selected.', 'wpforms-lite' ), + 'class' => 'wpforms-panel-field-toggle', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'date_limit_days', + 'content' => $output, + 'class' => 'wpforms-clear', + ] + ); + + $week_days = [ + 'sun' => esc_html__( 'Sun', 'wpforms-lite' ), + 'mon' => esc_html__( 'Mon', 'wpforms-lite' ), + 'tue' => esc_html__( 'Tue', 'wpforms-lite' ), + 'wed' => esc_html__( 'Wed', 'wpforms-lite' ), + 'thu' => esc_html__( 'Thu', 'wpforms-lite' ), + 'fri' => esc_html__( 'Fri', 'wpforms-lite' ), + 'sat' => esc_html__( 'Sat', 'wpforms-lite' ), + ]; + + // Rearrange days array according to the Start of Week setting. + $start_of_week = get_option( 'start_of_week' ); + $start_of_week = ! empty( $start_of_week ) ? (int) $start_of_week : 0; + + if ( $start_of_week > 0 ) { + $days_after = $week_days; + $days_begin = array_splice( $days_after, 0, $start_of_week ); + $days = array_merge( $days_after, $days_begin ); + } else { + $days = $week_days; + } + + // Limit Days body. + $field = $this->field_options_limit_days_body( $days, $field ); + + // Disable Past Dates. + $this->field_options_limit_days_disable_past_dates( $field ); + + // Disable Today's Date. + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'date_disable_todays_date', + 'value' => ! empty( $field['date_disable_todays_date'] ) ? '1' : '0', + 'desc' => esc_html__( 'Disable Today\'s Date', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to prevent today\'s date from being selected.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'date_disable_todays_date', + 'content' => $output, + 'class' => ! isset( $field['date_disable_past_dates'] ) ? 'wpforms-hide' : '', + ] + ); + } + + /** + * Display limit hours options. + * + * @since 1.9.4 + * + * @param array $field Field setting. + */ + private function field_options_limit_hours( array $field ): void { + + echo '
              '; + + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'time_limit_hours', + 'value' => ! empty( $field['time_limit_hours'] ) ? '1' : '0', + 'desc' => esc_html__( 'Limit Hours', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to adjust the range of times that can be selected.', 'wpforms-lite' ), + 'class' => 'wpforms-panel-field-toggle', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'time_limit_hours', + 'content' => $output, + ] + ); + + // Determine a time format type. + // If the format contains `g` or `h`, then this is 12-hour format, otherwise 24 hours. + $time_format = empty( $field['time_format'] ) || preg_match( '/[gh]/', $field['time_format'] ) ? 12 : 24; + + // Limit Hours body. + $output = $this->field_options_limit_hours_body( $field, $time_format ); + + printf( + '
              %5$s
              ', + 'time_limit_hours_options', + 'wpforms-panel-field-toggle-body', + esc_attr( $field['id'] ), + esc_attr( 'fields[' . (int) $field['id'] . '][time_limit_hours]' ), + $output // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Generate an array of numeric options for date/time selectors. + * + * @since 1.9.4 + * + * @param integer $min Minimum value. + * @param integer $max Maximum value. + * @param integer $step Step. + * + * @return array + */ + private function get_selector_numeric_options( int $min, int $max, int $step = 1 ): array { + + $range = range( $min, $max, $step ); + $options = []; + + foreach ( $range as $i ) { + $value = str_pad( $i, 2, '0', STR_PAD_LEFT ); + $options[ $value ] = $value; + } + + return $options; + } + + /** + * Add class to field options wrapper to indicate if field confirmation is enabled. + * + * @since 1.9.4 + * + * @param string|mixed $css_class CSS class. + * @param array $field Field data. + * + * @return string + */ + public function field_option_class( $css_class, array $field ): string { + + $css_class = (string) $css_class; + + if ( $this->type === $field['type'] ) { + $date_type = ! empty( $field['date_type'] ) ? sanitize_html_class( $field['date_type'] ) : 'datepicker'; + + $css_class .= " wpforms-date-type-$date_type"; + } + + return $css_class; + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + public function field_preview( $field ) { + + $date_placeholder = ! empty( $field['date_placeholder'] ) ? $field['date_placeholder'] : ''; + $time_placeholder = ! empty( $field['time_placeholder'] ) ? $field['time_placeholder'] : ''; + $format = ! empty( $field['format'] ) ? $field['format'] : self::DEFAULTS['format']; + $date_type = ! empty( $field['date_type'] ) ? $field['date_type'] : 'datepicker'; + $date_format = ! empty( $field['date_format'] ) ? $field['date_format'] : self::DEFAULTS['date_format']; + + if ( in_array( $date_format, $this->get_month_day_formats(), true ) ) { + $date_first_select = 'MM'; + $date_second_select = 'DD'; + $date_third_select = 'YYYY'; + } elseif ( in_array( $date_format, $this->get_day_month_formats(), true ) ) { + $date_first_select = 'DD'; + $date_second_select = 'MM'; + $date_third_select = 'YYYY'; + } else { + $date_first_select = 'YYYY'; + $date_second_select = 'MM'; + $date_third_select = 'DD'; + } + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + printf( + '
              ', + sanitize_html_class( 'format-selected-' . $format ) + ); + + // Date. + printf( + '
              ', + sanitize_html_class( 'wpforms-date-type-' . $date_type ) + ); + echo '
              '; + printf( '', esc_attr( $date_placeholder ) ); + printf( '', esc_html__( 'Date', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + printf( '', esc_html( $date_first_select ) ); + printf( '', esc_html( $date_second_select ) ); + printf( '', esc_html( $date_third_select ) ); + printf( '', esc_html__( 'Date', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + + // Time. + echo '
              '; + printf( '', esc_attr( $time_placeholder ) ); + printf( '', esc_html__( 'Time', 'wpforms-lite' ) ); + echo '
              '; + echo '
              '; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Get month-day date formats. + * + * @since 1.9.8.3 + * + * @return array + */ + private function get_month_day_formats(): array { + + return [ 'mm/dd/yyyy', self::DEFAULTS['date_format'], 'm.d.Y' ]; + } + + /** + * Get day-month date formats. + * + * @since 1.9.8.3 + * + * @return array + */ + private function get_day_month_formats(): array { + + return [ 'dd/mm/yyyy', self::ALT_DATE_FORMAT, 'd.m.Y' ]; + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated array of field attributes. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } + + /** + * Field options: Limit Days body section. + * + * @since 1.9.4 + * + * @param array $days Array of days. + * @param array $field Field data and settings. + * + * @return array Modified field data array. + */ + public function field_options_limit_days_body( array $days, array $field ): array { + + // Limit Days body. + $output = ''; + + foreach ( $days as $day => $day_translation ) { + + $day_slug = 'date_limit_days_' . $day; + + // Set defaults. + if ( ! isset( $field['date_format'] ) ) { + $field[ $day_slug ] = $this->default_settings[ $day_slug ]; + } + + $output .= ''; + } + + printf( + '
              %3$s
              ', + esc_attr( $field['id'] ), + esc_attr( 'fields[' . (int) $field['id'] . '][date_limit_days]' ), + $output // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + return $field; + } + + /** + * Field options: Limit Days - Disable Past Dates section. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options_limit_days_disable_past_dates( array $field ): void { + + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'date_disable_past_dates', + 'value' => ! empty( $field['date_disable_past_dates'] ) ? '1' : '0', + 'desc' => esc_html__( 'Disable Past Dates', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to prevent any previous date from being selected.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'date_disable_past_dates', + 'content' => $output, + ] + ); + } + + /** + * Field options: Limit Hours - body section. + * + * @since 1.9.4 + * + * @param array $field Field data. + * @param int $time_format Time format. + * + * @return string + */ + private function field_options_limit_hours_body( array $field, int $time_format ): string { + + $output = ''; + + foreach ( [ 'start', 'end' ] as $option ) { + + $output .= '
              '; // Open columns container. + + $slug = 'time_limit_hours_' . $option . '_hour'; + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => $slug, + 'value' => ! empty( $field[ $slug ] ) ? $field[ $slug ] : $this->default_settings[ $slug ], + 'options' => $time_format === 12 + ? $this->get_selector_numeric_options( 1, $time_format ) + : $this->get_selector_numeric_options( 0, $time_format - 1 ), + 'class' => 'wpforms-field-options-column', + ], + false + ); + + $slug = 'time_limit_hours_' . $option . '_min'; + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => $slug, + 'value' => ! empty( $field[ $slug ] ) ? $field[ $slug ] : $this->default_settings[ $slug ], + 'options' => $this->get_selector_numeric_options( 0, 59, 5 ), + 'class' => 'wpforms-field-options-column', + ], + false + ); + + $slug = 'time_limit_hours_' . $option . '_ampm'; + $output .= $this->field_element( + 'select', + $field, + [ + 'slug' => $slug, + 'value' => ! empty( $field[ $slug ] ) ? $field[ $slug ] : $this->default_settings[ $slug ], + 'options' => [ + 'am' => 'AM', + 'pm' => 'PM', + ], + 'class' => [ + 'wpforms-field-options-column', + $time_format === 24 ? 'wpforms-hidden-strict' : '', + ], + ], + false + ); + + $slug = 'time_limit_hours_' . $option . '_hour'; + $output .= $this->field_element( + 'label', + $field, + [ + 'slug' => $slug, + 'value' => $option === 'start' ? esc_html__( 'Start Time', 'wpforms-lite' ) : esc_html__( 'End Time', 'wpforms-lite' ), + 'class' => [ + 'sub-label', + 'wpforms-field-options-column', + ], + ], + false + ); + + $output .= sprintf( + '
              ', + $time_format === 12 ? 'wpforms-hidden-strict' : '' + ); + + $output .= '
              '; // Close columns container. + } + + return $output; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Divider/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Divider/Field.php new file mode 100755 index 00000000..0a78d8af --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Divider/Field.php @@ -0,0 +1,183 @@ +name = esc_html__( 'Section Divider', 'wpforms-lite' ); + $this->keywords = esc_html__( 'line, hr', 'wpforms-lite' ); + $this->type = 'divider'; + $this->icon = 'fa-arrows-h'; + $this->order = 170; + $this->group = 'fancy'; + $this->allow_read_only = false; + + $this->default_settings = [ + 'label_disable' => '1', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Set label to the disabled. + $args = [ + 'type' => 'hidden', + 'slug' => 'label_disable', + 'value' => '1', + ]; + + $this->field_element( 'text', $field, $args ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Divider Line toggle. + $this->hide_divider_line_option( $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Hide the Divider Line option. + * + * @since 1.9.7 + * + * @param array $field Field data. + */ + private function hide_divider_line_option( array $field ): void { + + $hide_divider_line_value = $field['hide_divider_line'] ?? '0'; + $hide_divider_line = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'hide_divider_line', + 'value' => $hide_divider_line_value, + 'desc' => esc_html__( 'Hide Divider Line', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Do not show the horizontal divider line.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'hide_divider_line', + 'content' => $hide_divider_line, + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/EntryPreview/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/EntryPreview/Field.php new file mode 100755 index 00000000..19bbbeba --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/EntryPreview/Field.php @@ -0,0 +1,271 @@ +name = esc_html__( 'Entry Preview', 'wpforms-lite' ); + $this->keywords = esc_html__( 'confirm', 'wpforms-lite' ); + $this->type = 'entry-preview'; + $this->icon = 'fa-file-text-o'; + $this->order = 190; + $this->group = 'fancy'; + $this->allow_read_only = false; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + + add_filter( 'wpforms_builder_strings', [ $this, 'add_builder_strings' ], 10, 2 ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + if ( empty( $this->is_disabled_field ) ) { + $this->field_element( + 'row', + $field, + [ + 'slug' => 'description', + 'content' => sprintf( + '

              %s

              ', + esc_html__( 'Entry Preview must be displayed on its own page, without other fields. HTML fields are allowed.', 'wpforms-lite' ) + ), + ] + ); + } + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'preview-notice-enable', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'preview-notice-enable', + // When we add the field to a form, it enabled by default. + 'value' => ! empty( $field['preview-notice-enable'] ) || wp_doing_ajax(), + 'desc' => esc_html__( 'Display Preview Notice', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to show a message above the entry preview.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'preview-notice', + 'content' => + $this->field_element( + 'label', + $field, + [ + 'slug' => 'preview-notice', + 'value' => esc_html__( 'Preview Notice', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Fill in the message to show above the entry preview.', 'wpforms-lite' ), + ], + false + ) . + $this->field_element( + 'textarea', + $field, + [ + 'slug' => 'preview-notice', + 'value' => $field['preview-notice'] ?? self::get_default_notice(), + ], + false + ), + ] + ); + + $this->field_option( 'basic-options', $field, [ 'markup' => 'close' ] ); + + $this->field_option( 'advanced-options', $field, [ 'markup' => 'open' ] ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'style', + 'content' => + $this->field_element( + 'label', + $field, + [ + 'slug' => 'style', + 'value' => esc_html__( 'Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Choose the entry preview display style.', 'wpforms-lite' ), + ], + false + ) . + $this->field_element( + 'select', + $field, + [ + 'slug' => 'style', + 'value' => ! empty( $field['style'] ) ? $field['style'] : 'basic', + 'options' => self::get_styles(), + ], + false + ), + ] + ); + + $this->field_option( 'css', $field ); + + $this->field_option( 'advanced-options', $field, [ 'markup' => 'close' ] ); + } + + /** + * Create the field preview. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * + * @noinspection HtmlUnknownAttribute*/ + public function field_preview( $field ) { + + printf( + '', + esc_html__( 'Entry Preview', 'wpforms-lite' ), + $this->get_field_preview_badge() // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + $is_new_field = wp_doing_ajax(); + $notice = ! empty( $field['preview-notice-enable'] ) && isset( $field['preview-notice'] ) && ! wpforms_is_empty_string( $field['preview-notice'] ) + ? force_balance_tags( $field['preview-notice'] ) : ''; + $notice = $is_new_field || wpforms_is_empty_string( $notice ) ? self::get_default_notice() : $notice; + $is_disabled = $is_new_field || ! empty( $field['preview-notice-enable'] ); + + printf( + '
              %1$s
              ', + wp_kses_post( nl2br( $notice ) ), + ! $is_disabled ? ' style="display: none"' : '' + ); + + printf( + '
              +

              %1$s

              +
              ', + esc_html__( 'Entry preview will be displayed here and will contain all fields found on the previous page.', 'wpforms-lite' ), + $is_disabled ? ' style="display: none"' : '' + ); + } + + /** + * Display the field input elements on the frontend. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Field attributes. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } + + /** + * Add custom JS i18n strings for the builder. + * + * @since 1.9.4 + * + * @param array|mixed $strings List of strings. + * @param array $form Current form. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function add_builder_strings( $strings, $form ): array { + + $strings = (array) $strings; + + $strings['entry_preview_require_page_break'] = esc_html__( 'Page breaks are required for entry previews to work. If you\'d like to remove page breaks, you\'ll have to first remove the entry preview field.', 'wpforms-lite' ); + $strings['entry_preview_default_notice'] = self::get_default_notice(); + $strings['entry_preview_require_previous_button'] = esc_html__( 'You can\'t hide the previous button because it is required for the entry preview field on this page.', 'wpforms-lite' ); + + return $strings; + } + + /** + * Get default notice. + * + * @since 1.9.4 + * + * @return string + */ + protected static function get_default_notice(): string { + + return sprintf( + "%s\n%s", + esc_html__( 'This is a preview of your submission. It has not been submitted yet!', 'wpforms-lite' ), + esc_html__( 'Please take a moment to verify your information. You can also go back to make changes.', 'wpforms-lite' ) + ); + } + + /** + * Get a list of available styles. + * + * @since 1.9.4 + * + * @return array + */ + protected static function get_styles(): array { + + return [ + 'basic' => esc_html__( 'Basic', 'wpforms-lite' ), + 'compact' => esc_html__( 'Compact', 'wpforms-lite' ), + 'table' => esc_html__( 'Table', 'wpforms-lite' ), + 'table_compact' => esc_html__( 'Table, Compact', 'wpforms-lite' ), + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/FileUpload/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/FileUpload/Field.php new file mode 100755 index 00000000..e081a7f4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/FileUpload/Field.php @@ -0,0 +1,472 @@ +name = esc_html__( 'File Upload', 'wpforms-lite' ); + $this->type = 'file-upload'; + $this->icon = 'fa-upload'; + $this->order = 100; + $this->group = 'fancy'; + + $this->default_settings = [ + 'style' => self::STYLE_MODERN, + ]; + + $this->init_pro_field(); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * + * @noinspection HtmlUnknownTarget + */ + public function field_options( $field ) { + + $style = ! empty( $field['style'] ) ? $field['style'] : self::STYLE_MODERN; + + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Allowed extensions. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'extensions', + 'value' => esc_html__( 'Allowed File Extensions', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter the extensions you would like to allow, comma separated.', 'wpforms-lite' ), + 'after_tooltip' => sprintf( + '%2$s', + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/a-complete-guide-to-the-file-upload-field/#file-types', 'Field Options', 'File Upload Extensions Documentation' ) ), + esc_html__( 'See More Details', 'wpforms-lite' ) + ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'extensions', + 'value' => ! empty( $field['extensions'] ) ? $field['extensions'] : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'extensions', + 'content' => $lbl . $fld, + ] + ); + + // Max file size. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'max_size', + 'value' => esc_html__( 'Max File Size', 'wpforms-lite' ), + 'tooltip' => sprintf( /* translators: %s - max upload size. */ + esc_html__( 'Enter the max size of each file, in megabytes, to allow. If left blank, the value defaults to the maximum size the server allows which is %s.', 'wpforms-lite' ), + wpforms_max_upload() + ), + ], + false + ); + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'max_size', + 'type' => 'number', + 'attrs' => [ + 'min' => 1, + 'max' => 512, + 'step' => 1, + 'pattern' => '[0-9]', + ], + 'value' => ! empty( $field['max_size'] ) ? abs( $field['max_size'] ) : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'max_size', + 'content' => $lbl . $fld, + ] + ); + + // Max file number. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'max_file_number', + 'value' => esc_html__( 'Max File Uploads', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter the max number of files to allow. If left blank, the value defaults to 1.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'max_file_number', + 'type' => 'number', + 'attrs' => [ + 'min' => 1, + 'max' => self::MAX_FILE_NUM, + 'step' => 1, + 'pattern' => '[0-9]', + ], + 'value' => $this->get_max_file_number( $field ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'max_file_number', + 'content' => $lbl . $fld, + 'class' => $style === self::STYLE_CLASSIC ? 'wpforms-hidden' : '', + ] + ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( 'basic-options', $field, [ 'markup' => 'close' ] ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( 'advanced-options', $field, [ 'markup' => 'open' ] ); + + // Style. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'style', + 'value' => esc_html__( 'Style', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Modern Style supports multiple file uploads, displays a drag-and-drop upload box, and uses AJAX. Classic Style supports single file upload and displays a traditional upload button.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'style', + 'value' => $style, + 'options' => [ + self::STYLE_MODERN => esc_html__( 'Modern', 'wpforms-lite' ), + self::STYLE_CLASSIC => esc_html__( 'Classic', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'style', + 'content' => $lbl . $fld, + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Media Library toggle. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'media_library', + 'value' => ! empty( $field['media_library'] ) ? 1 : '', + 'desc' => esc_html__( 'Store Files in WordPress Media Library', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to store the final uploaded file in the WordPress Media Library', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-media-library', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'media_library', + 'content' => $fld, + ] + ); + + // Access Restrictions. + $this->access_restrictions_options( $field ); + + // Camera. + $this->camera_options( $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + $modern_classes = [ 'wpforms-file-upload-builder-modern' ]; + $classic_classes = [ 'wpforms-file-upload-builder-classic' ]; + + if ( empty( $field['style'] ) || $field['style'] !== self::STYLE_CLASSIC ) { + $classic_classes[] = 'wpforms-hide'; + } else { + $modern_classes[] = 'wpforms-hide'; + } + + $strings = $this->get_strings(); + $max_file_number = $this->get_max_file_number( $field ); + + /** + * Filter the classic camera text. + * + * @since 1.9.8 + * + * @param string $classic_camera The classic camera text. + */ + $classic_camera_text = (string) apply_filters( + 'wpforms_forms_fields_file_upload_field_classic_camera_text', + esc_html__( 'Capture With Your Camera', 'wpforms-lite' ) + ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'fields/file-upload/file-upload-backend', + [ + 'max_file_number' => $max_file_number, + 'preview_hint' => str_replace( self::TEMPLATE_MAXFILENUM, $max_file_number, $strings['preview_hint'] ), + 'modern_classes' => implode( ' ', $modern_classes ), + 'classic_classes' => implode( ' ', $classic_classes ), + 'is_camera' => ! empty( $field['camera_enabled'] ) ? 1 : '', + 'classic_camera' => $classic_camera_text, + ], + true + ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * File Uploads specific strings. + * + * @since 1.9.4 + * + * @return array Field-specific strings. + */ + public function get_strings(): array { + + return [ + 'preview_title_single' => sprintf( + /* translators: %1$s: Choose File to Upload opening tag, %2$s: Choose File to Upload closing tag. */ + esc_html__( 'Drag & Drop File or %1$sChoose File to Upload%2$s', 'wpforms-lite' ), + '', + '' + ), + 'preview_title_plural' => sprintf( + /* translators: %1$s: Choose Files to Upload opening tag, %2$s: Choose Files to Upload closing tag. */ + esc_html__( 'Drag & Drop Files or %1$sChoose Files to Upload%2$s', 'wpforms-lite' ), + '', + '' + ), + 'preview_title_single_camera' => sprintf( + /* translators: %1$s: Choose File to Upload opening tag, %2$s: Closing tag, %3$s: Capture With Camera opening tag. */ + esc_html__( 'Drag & Drop File, %1$sChoose File to Upload%2$s, or %3$sCapture With Camera%2$s', 'wpforms-lite' ), + '', + '', + '' + ), + 'preview_title_plural_camera' => sprintf( + /* translators: %1$s: Choose Files to Upload opening tag, %2$s: Closing tag, %3$s: Capture With Camera opening tag. */ + esc_html__( 'Drag & Drop Files, %1$sChoose Files to Upload%2$s, or %3$sCapture With Camera%2$s', 'wpforms-lite' ), + '', + '', + '' + ), + 'preview_hint' => sprintf( /* translators: % - max number of files as a template string (not a number), replaced by a number later. */ + esc_html__( 'You can upload up to %s files.', 'wpforms-lite' ), + self::TEMPLATE_MAXFILENUM + ), + 'password_match_error_title' => esc_html__( 'Passwords Do Not Match', 'wpforms-lite' ), + 'password_match_error_text' => esc_html__( 'Please check the password for the following fields: {fields}', 'wpforms-lite' ), + 'password_empty_error_title' => esc_html__( 'Passwords Are Empty', 'wpforms-lite' ), + 'password_empty_error_text' => esc_html__( 'Please enter a password for the following fields: {fields}', 'wpforms-lite' ), + 'notification_warning_title' => esc_html__( 'Cannot Enable Restrictions', 'wpforms-lite' ), + 'notification_warning_text' => esc_html__( 'This field is attached to Notifications. In order to enable restrictions, please first remove it from File Upload Attachments in Notifications.', 'wpforms-lite' ), + 'notification_error_title' => esc_html__( 'Cannot Enable Attachments', 'wpforms-lite' ), + 'notification_error_text' => esc_html__( 'The following fields ({fields}) cannot be attached to notifications because restrictions are enabled for them.', 'wpforms-lite' ), + 'all_user_roles_selected' => esc_html__( 'All User Roles already selected', 'wpforms-lite' ), + 'incompatible_addon_text' => esc_html__( 'File Upload Restrictions can\'t be enabled because the current version of the Post Submissions addon is incompatible.', 'wpforms-lite' ), + ]; + } + + /** + * Getting max file number. + * + * @since 1.9.4 + * + * @param array $field Field data. + * + * @return int + * @noinspection PhpMissingParamTypeInspection + */ + protected function get_max_file_number( $field ): int { + + if ( empty( $field['max_file_number'] ) ) { + return 1; + } + + $max_file_number = absint( $field['max_file_number'] ); + + if ( $max_file_number < 1 ) { + return 1; + } + + if ( $max_file_number > self::MAX_FILE_NUM ) { + return self::MAX_FILE_NUM; + } + + return $max_file_number; + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Helpers/RequirementsAlerts.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Helpers/RequirementsAlerts.php new file mode 100755 index 00000000..da79f002 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Helpers/RequirementsAlerts.php @@ -0,0 +1,255 @@ +=' ); + } + + /** + * Product Quantities feature: get an update required alert HTML. + * + * @since 1.8.7 + * + * @return string + */ + public static function get_product_quantities_alert(): string { + + $addons_require_update = self::get_addons_require_for_product_quantities(); + + // Generate update link when only one addon needs to be updated. + if ( count( $addons_require_update ) === 1 ) { + $update_url = self::get_addon_update_url( key( $addons_require_update ) ); + } else { + // Redirect to the Plugins admin page if multiple addons require an update. + $update_url = admin_url( 'plugins.php?plugin_status=upgrade' ); + } + + return self::get_update_alert( + sprintf( /* translators: %1$s - addons list. */ + __( 'The following addons require an update to support product quantities: %1$s', 'wpforms-lite' ), + implode( ', ', $addons_require_update ) + ), + $update_url + ); + } + + /** + * Order Summary feature: get an update required alert HTML. + * + * @since 1.8.7 + * + * @return string + */ + public static function get_order_summary_alert(): string { + + return self::get_update_alert( + __( 'You\'re using an older version of the Coupons addon that does not support order summary.', 'wpforms-lite' ), + self::get_addon_update_url( 'wpforms-coupons' ) + ); + } + + /** + * Repeater field: determine if addon is allowed to use inside the repeater field. + * + * @since 1.8.9 + * + * @param string $addon_slug Addon slug. + * + * @return bool + */ + public static function is_inside_repeater_allowed( string $addon_slug ): bool { + + $requirements = [ + 'wpforms-geolocation' => '2.10.0', + 'wpforms-signatures' => '1.11.0', + 'wpforms-form-abandonment' => '1.12.0', + 'wpforms-save-resume' => '1.11.0', + 'wpforms-lead-forms' => '1000', // @todo: We should adjust this value when the Lead Forms get the Repeater field support. + 'wpforms-google-sheets' => '2.1.0', + ]; + + if ( ! isset( $requirements[ $addon_slug ] ) ) { + return true; + } + + $version_constant = strtoupper( str_replace( '-', '_', $addon_slug ) ) . '_VERSION'; + + return self::is_pro() && + defined( $version_constant ) && + version_compare( constant( $version_constant ), $requirements[ $addon_slug ], '>=' ); + } + + /** + * Repeater field: get an update required alert HTML. + * + * @since 1.8.9 + * + * @param string $addon_name Addon name. + * @param string $addon_slug Addon slug. + * + * @return string + */ + public static function get_repeater_alert( string $addon_name, string $addon_slug ): string { + + return self::get_update_alert( + self::get_repeater_alert_text( $addon_name ), + self::get_addon_update_url( $addon_slug ) + ); + } + + /** + * Repeater field: get alert text. + * + * @since 1.8.9 + * + * @param string $addon_name Addon name. + * + * @return string + */ + public static function get_repeater_alert_text( string $addon_name ): string { + + return sprintf( + /* translators: %1$s - addon name. */ + __( 'You\'re using an older version of the %1$s addon that does not support the Repeater field.', 'wpforms-lite' ), + $addon_name + ); + } + + /** + * Retrieve a list of addons that require updating to support the Product Quantities feature. + * + * @since 1.8.7 + * + * @return array + */ + private static function get_addons_require_for_product_quantities(): array { + + static $addons; + + if ( ! is_null( $addons ) ) { + return $addons; + } + + $addons = []; + + // All addons require Pro and Top level licenses. + if ( ! self::is_pro() ) { + return $addons; + } + + if ( defined( 'WPFORMS_COUPONS_VERSION' ) && version_compare( WPFORMS_COUPONS_VERSION, '1.2.0', '<' ) ) { + $addons['wpforms-coupons'] = __( 'Coupons', 'wpforms-lite' ); + } + + if ( defined( 'WPFORMS_PAYPAL_COMMERCE_VERSION' ) && version_compare( WPFORMS_PAYPAL_COMMERCE_VERSION, '1.9.0', '<' ) ) { + $addons['wpforms-paypal-commerce'] = __( 'PayPal Commerce', 'wpforms-lite' ); + } + + if ( defined( 'WPFORMS_PAYPAL_STANDARD_VERSION' ) && version_compare( WPFORMS_PAYPAL_STANDARD_VERSION, '1.10.0', '<' ) ) { + $addons['wpforms-paypal-standard'] = __( 'PayPal Standard', 'wpforms-lite' ); + } + + if ( defined( 'WPFORMS_SQUARE_VERSION' ) && version_compare( WPFORMS_SQUARE_VERSION, '1.9.0', '<' ) ) { + $addons['wpforms-square'] = __( 'Square', 'wpforms-lite' ); + } + + if ( defined( 'WPFORMS_SAVE_RESUME_VERSION' ) && version_compare( WPFORMS_SAVE_RESUME_VERSION, '1.9.0', '<' ) ) { + $addons['wpforms-save-resume'] = __( 'Save and Resume', 'wpforms-lite' ); + } + + return $addons; + } + + /** + * Get an update alert HTML. + * + * @since 1.8.7 + * + * @param string $message Alert message. + * @param string $update_url Update button URL. + * + * @return string + */ + private static function get_update_alert( string $message, string $update_url ): string { + + $alert = sprintf( + '
              +

              %1$s

              +

              %2$s

              +
              +
              + %4$s +
              ', + esc_html__( 'Update Required', 'wpforms-lite' ), + esc_html( $message ), + esc_url( $update_url ), + esc_html__( 'Update Now', 'wpforms-lite' ) + ); + + return sprintf( + '
              %1$s
              ', + $alert // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Get addon update URL. + * + * @since 1.8.7 + * + * @param string $addon_slug Addon slug. + * + * @return string + */ + private static function get_addon_update_url( string $addon_slug ): string { + + $addon_path = sprintf( '%1$s/%1$s.php', $addon_slug ); + + return wp_nonce_url( + self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . $addon_path ), + 'upgrade-plugin_' . $addon_path + ); + } + + /** + * Determine if Pro or Top level license is used. + * + * @since 1.8.7 + * + * @return bool + */ + private static function is_pro(): bool { + + return in_array( wpforms_get_license_type(), [ 'pro', 'elite', 'agency', 'ultimate' ], true ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Hidden/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Hidden/Field.php new file mode 100755 index 00000000..dd092bc3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Hidden/Field.php @@ -0,0 +1,193 @@ +name = esc_html__( 'Hidden Field', 'wpforms-lite' ); + $this->type = 'hidden'; + $this->icon = 'fa-eye-slash'; + $this->order = 98; + $this->group = 'fancy'; + $this->allow_read_only = false; + + $this->default_settings = [ + 'label_hide' => '1', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks(): void { + + add_filter( 'wpforms_field_new_class', [ $this, 'preview_field_new_class' ], 10, 2 ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( + 'label', + $field, + [ + 'tooltip' => esc_html__( 'Enter text for the form field label. Never displayed on the front-end.', 'wpforms-lite' ), + ] + ); + + // Set the label to disable. + $this->field_element( + 'text', + $field, + [ + 'type' => 'hidden', + 'slug' => 'label_disable', + 'value' => '1', + ] + ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + // Advanced options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Label. + $this->field_option( + 'label_hide', + $field, + [ + 'class' => 'wpforms-disabled', + ] + ); + + // Advanced options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Get a new field CSS class. + * + * @since 1.9.4 + * + * @param string|mixed $css_class Preview new field CSS class. + * @param array $field Field data. + * + * @return string + */ + public function preview_field_new_class( $css_class, array $field ): string { + + $css_class = (string) $css_class; + + if ( empty( $field['type'] ) || $field['type'] !== $this->type ) { + return $css_class; + } + + return trim( $css_class . ' label_hide' ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + public function field_preview( $field ) { + + // Define data. + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + + // The Hidden field label is always hidden. + $field['label_hide'] = '1'; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Primary input. + echo ''; + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Not used any more field attributes. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Html/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Html/Field.php new file mode 100755 index 00000000..e051a966 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Html/Field.php @@ -0,0 +1,215 @@ +name = esc_html__( 'HTML', 'wpforms-lite' ); + $this->keywords = esc_html__( 'code', 'wpforms-lite' ); + $this->type = 'html'; + $this->icon = 'fa-code'; + $this->order = 185; + $this->group = 'fancy'; + $this->allow_read_only = false; + + $this->default_settings = [ + 'name' => '', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Extend from `parent::field_option()` to add `name` option. + * + * @since 1.9.4 + * + * @param string $option Field option to render. + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $do_echo Print or return the value. Print by default. + * + * @return string|null + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection + */ + public function field_option( $option, $field, $args = [], $do_echo = true ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.echoFound + + if ( $option !== 'name' ) { + return parent::field_option( $option, $field, $args, $do_echo ); + } + + $output = $this->field_element( + 'label', + $field, + [ + 'slug' => 'name', + 'value' => esc_html__( 'Label', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for the form field label. It will help identify your HTML blocks inside the form builder, but will not be displayed in the form.', 'wpforms-lite' ), + ], + false + ); + $output .= $this->field_element( + 'text', + $field, + [ + 'slug' => 'name', + 'value' => ! empty( $field['name'] ) ? esc_attr( $field['name'] ) : '', + ], + false + ); + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'name', + 'content' => $output, + ], + false + ); + + if ( $do_echo ) { + echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + + return null; + } + + return $output; + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Name (Label). + $this->field_option( 'name', $field ); + + // Code. + $this->field_option( 'code', $field ); + + // Set the label to disable. + $args = [ + 'type' => 'hidden', + 'slug' => 'label_disable', + 'value' => '1', + ]; + + $this->field_element( 'text', $field, $args ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + $label = ! empty( $field['name'] ) ? $field['name'] : ''; + + $label_badge = empty( $label ) ? '' : $this->get_field_preview_badge(); + $code_badge = empty( $label ) ? $this->get_field_preview_badge() : ''; + + ?> + +
              + '#72b239', + 'modern' => '#066aab', + ]; + + /** + * Pages information. + * + * @since 1.9.4 + * + * @var array|bool + */ + protected $pagebreak; + + /** + * Primary class constructor. + * + * @since 1.9.4 + */ + public function init() { + + // Define field type information. + $this->name = esc_html__( 'Page Break', 'wpforms-lite' ); + $this->keywords = esc_html__( 'progress bar, multi step, multi part', 'wpforms-lite' ); + $this->type = 'pagebreak'; + $this->icon = 'fa-files-o'; + $this->order = 160; + $this->group = 'fancy'; + $this->allow_read_only = false; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + + add_filter( 'wpforms_field_preview_class', [ $this, 'preview_field_class' ], 10, 2 ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + + $position = ! empty( $field['position'] ) ? esc_attr( $field['position'] ) : ''; + $position_class = ! empty( $field['position'] ) ? 'wpforms-pagebreak-' . $position : ''; + + $this->field_options_basic( $field, $position, $position_class ); + $this->field_options_advanced( $field, $position, $position_class ); + } + + /** + * Advanced field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + * @param string $position Position. + * @param string $position_class Position CSS class. + */ + private function field_options_basic( array $field, string $position, string $position_class ): void { + + // Hidden field indicating the position. + $this->field_element( + 'text', + $field, + [ + 'type' => 'hidden', + 'slug' => 'position', + 'value' => $position, + 'class' => 'position', + ] + ); + + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'class' => $position_class, + 'after_title' => $this->get_field_options_notice(), + ] + ); + + $this->field_options_basic_top( $field, $position ); + + // Page Title, don't display for bottom page breaks. + if ( $position !== 'bottom' ) { + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'title', + 'value' => esc_html__( 'Page Title', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for the page title.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'title', + 'value' => ! empty( $field['title'] ) ? esc_attr( $field['title'] ) : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'title', + 'content' => $lbl . $fld, + ] + ); + } + + // Next label. + if ( empty( $position ) ) { + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'next', + 'value' => esc_html__( 'Next Label', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for Next page navigation button.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'next', + 'value' => ! empty( $field['next'] ) ? esc_attr( $field['next'] ) : esc_html__( 'Next', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'next', + 'content' => $lbl . $fld, + ] + ); + } + + // Options are not available to top page breaks. + if ( $position !== 'top' ) { + + // Previous button toggle. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'prev_toggle', + // Backward compatibility for forms that were created before the toggle was added. + 'value' => ! empty( $field['prev_toggle'] ) || ! empty( $field['prev'] ), + 'desc' => esc_html__( 'Display Previous', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Toggle displaying the Previous page navigation button.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'prev_toggle', + 'content' => $fld, + ] + ); + + // Previous button label. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'prev', + 'value' => esc_html__( 'Previous Label', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for Previous page navigation button.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'prev', + 'value' => ! empty( $field['prev'] ) ? esc_attr( $field['prev'] ) : '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'prev', + 'content' => $lbl . $fld, + 'class' => empty( $field['prev_toggle'] ) ? 'wpforms-hidden' : '', + ] + ); + } + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Generate the field UI for progress text configuration within a form. + * + * @since 1.9.7 + * + * @param array $field The field data used to generate the progress text UI elements. + */ + private function field_progress_text( array $field ): void { + + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'progress_text', + 'value' => esc_html__( 'Progress Text', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for the progress indicator.', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'progress_text', + 'value' => ! empty( $field['progress_text'] ) ? esc_html( $field['progress_text'] ) : 'Step {current_page} of {last_page}', + 'after' => esc_html__( 'Enter text to show the user\'s progress. You can use {current_page} and {last_page} to indicate the current and last steps.', 'wpforms-lite' ), + ], + false + ); + + $indicator = ! empty( $field['indicator'] ) ? esc_attr( $field['indicator'] ) : 'progress'; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'progress_text', + 'content' => $lbl . $fld, + 'class' => $indicator !== 'progress' ? 'wpforms-hidden' : '', // Hide if the indicator is not set to progress. + ] + ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + * @param string $position Position. + */ + private function field_options_basic_top( array $field, string $position ): void { + + // Options specific to the top pagebreak. + if ( $position !== 'top' ) { + return; + } + + // Indicator themes. + $themes = [ + 'progress' => esc_html__( 'Progress Bar', 'wpforms-lite' ), + 'circles' => esc_html__( 'Circles', 'wpforms-lite' ), + 'connector' => esc_html__( 'Connector', 'wpforms-lite' ), + 'none' => esc_html__( 'None', 'wpforms-lite' ), + ]; + + /** + * Filter the available Pagebreak Indicator themes. + * + * @since 1.6.6 + * + * @param array $themes Available themes. + */ + $themes = apply_filters( 'wpforms_pagebreak_indicator_themes', $themes ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'indicator', + 'value' => esc_html__( 'Progress Indicator', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select theme for Page Indicator which is displayed at the top of the form.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'indicator', + 'value' => ! empty( $field['indicator'] ) ? esc_attr( $field['indicator'] ) : 'progress', + 'options' => $themes, + 'class' => 'wpforms-pagebreak-progress-indicator', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'indicator', + 'content' => $lbl . $fld, + ] + ); + + // Indicator color picker. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'indicator_color', + 'value' => esc_html__( 'Page Indicator Color', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the primary color for the Page Indicator theme.', 'wpforms-lite' ), + ], + false + ); + + $indicator_color = isset( $field['indicator_color'] ) ? wpforms_sanitize_hex_color( $field['indicator_color'] ) : self::get_default_indicator_color(); + + $fld = $this->field_element( + 'color', + $field, + [ + 'slug' => 'indicator_color', + 'value' => $indicator_color, + 'data' => [ + 'fallback-color' => $indicator_color, + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'indicator_color', + 'content' => $lbl . $fld, + 'class' => 'color-picker-row', + ] + ); + + $this->field_progress_text( $field ); + } + + /** + * Advanced field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + * @param string $position Position. + * @param string $position_class Position CSS class. + */ + private function field_options_advanced( array $field, string $position, string $position_class ): void { + + if ( $position === 'bottom' ) { + return; + } + + /** + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + 'class' => $position_class, + ] + ); + + // Navigation alignment, only available to the top. + if ( $position === 'top' ) { + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'nav_align', + 'value' => esc_html__( 'Page Navigation Alignment', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the alignment for the Next/Previous page navigation buttons', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'nav_align', + 'value' => ! empty( $field['nav_align'] ) ? esc_attr( $field['nav_align'] ) : '', + 'options' => [ + 'left' => esc_html__( 'Left', 'wpforms-lite' ), + 'right' => esc_html__( 'Right', 'wpforms-lite' ), + '' => esc_html__( 'Center', 'wpforms-lite' ), + 'split' => esc_html__( 'Split', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'nav_align', + 'content' => $lbl . $fld, + ] + ); + + // Scroll animation toggle. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'scroll_disabled', + 'value' => ! empty( $field['scroll_disabled'] ), + 'desc' => esc_html__( 'Disable Scroll Animation', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'By default, a user\'s view is pulled to the top of each form page. Set to ON to disable this animation.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'scroll_disabled', + 'content' => $fld, + ] + ); + } + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $nav_align = 'wpforms-pagebreak-buttons-left'; + $prev = ! empty( $field['prev'] ) ? $field['prev'] : esc_html__( 'Previous', 'wpforms-lite' ); + $prev_class = empty( $field['prev'] ) && empty( $field['prev_toggle'] ) ? 'wpforms-hidden' : ''; + $next = ! empty( $field['next'] ) ? $field['next'] : esc_html__( 'Next', 'wpforms-lite' ); + $next_class = empty( $next ) ? 'wpforms-hidden' : ''; + $position = ! empty( $field['position'] ) ? $field['position'] : 'normal'; + $title = ! empty( $field['title'] ) ? $field['title'] : ''; + $label = $position === 'top' ? esc_html__( 'First Page / Progress Indicator', 'wpforms-lite' ) : ''; + $label = $position === 'normal' && empty( $label ) ? esc_html__( 'Page Break', 'wpforms-lite' ) : $label; + + /** + * Fires before the page break is displayed on the preview. + * + * @since 1.7.9 + * + * @param array $form_data Form data and settings. + * @param array $field Field data. + */ + do_action( 'wpforms_field_page_break_field_preview_before', $this->form_data, $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + if ( $position !== 'top' ) { + if ( empty( $this->form_data ) ) { + $this->form_data = wpforms()->obj( 'form' )->get( $this->form_id, [ 'content_only' => true ] ); + } + + if ( empty( $this->pagebreak ) ) { + $this->pagebreak = wpforms_get_pagebreak_details( $this->form_data ); + } + + if ( ! empty( $this->pagebreak['top']['nav_align'] ) ) { + $nav_align = 'wpforms-pagebreak-buttons-' . $this->pagebreak['top']['nav_align']; + } + + echo '
              '; + printf( + '', + sanitize_html_class( $prev_class ), + esc_html( $prev ) + ); + + if ( $position !== 'bottom' ) { + printf( + '', + sanitize_html_class( $next_class ), + esc_html( $next ) + ); + + if ( $next_class !== 'wpforms-hidden' ) { + + /** This action is documented in includes/class-frontend.php. */ + do_action( 'wpforms_display_submit_after', $this->form_data, 'next' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + } + echo '
              '; + } + + // Visual divider. + echo '
              '; + if ( $position !== 'bottom' ) { + printf( + '%1$s %2$s%3$s', + esc_html( $label ), + esc_html( $title ), + $this->get_field_preview_badge() // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + echo ''; + echo '
              '; + + /** + * Fires after a page break is displayed on the preview. + * + * @since 1.7.9 + * + * @param array $form_data Form data and settings. + * @param array $field Field data. + */ + do_action( 'wpforms_field_page_break_field_preview_after', $this->form_data, $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Add a class to the builder field preview. + * + * @since 1.9.4 + * + * @param string|mixed $css CSS classes. + * @param array $field Field data and settings. + * + * @return string + */ + public function preview_field_class( $css, $field ): string { + + $css = (string) $css; + + if ( $field['type'] !== 'pagebreak' ) { + return $css; + } + + if ( ! empty( $field['position'] ) && $field['position'] === 'top' ) { + $css .= ' wpforms-field-stick wpforms-pagebreak-top'; + } elseif ( ! empty( $field['position'] ) && $field['position'] === 'bottom' ) { + $css .= ' wpforms-field-stick wpforms-pagebreak-bottom'; + } else { + $css .= ' wpforms-pagebreak-normal'; + } + + return $css; + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Field attributes. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } + + /** + * Get the default indicator color. + * + * @since 1.9.4 + * + * @return string + */ + public static function get_default_indicator_color(): string { + + $render_engine = wpforms_get_render_engine(); + + return array_key_exists( $render_engine, self::DEFAULT_INDICATOR_COLOR ) ? self::DEFAULT_INDICATOR_COLOR[ $render_engine ] : self::DEFAULT_INDICATOR_COLOR['modern']; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Password/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Password/Field.php new file mode 100755 index 00000000..a1b0ff42 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Password/Field.php @@ -0,0 +1,345 @@ +name = esc_html__( 'Password', 'wpforms-lite' ); + $this->keywords = esc_html__( 'user', 'wpforms-lite' ); + $this->type = 'password'; + $this->icon = 'fa-lock'; + $this->order = 95; + $this->group = 'fancy'; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + * + * @noinspection PackedHashtableOptimizationInspection + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Confirmation toggle. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'confirmation', + 'value' => isset( $field['confirmation'] ) ? '1' : '0', + 'desc' => esc_html__( 'Enable Password Confirmation', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to ask users to provide their password twice.', 'wpforms-lite' ), + ], + false + ); + $args = [ + 'slug' => 'confirmation', + 'content' => $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Password strength. + $meter = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'password-strength', + 'value' => isset( $field['password-strength'] ) ? '1' : '0', + 'desc' => esc_html__( 'Enable Password Strength', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to set minimum password strength.', 'wpforms-lite' ), + ], + false + ); + $args = [ + 'slug' => 'password-strength', + 'content' => $meter, + ]; + + $this->field_element( 'row', $field, $args ); + + $strength_label = $this->field_element( + 'label', + $field, + [ + 'value' => esc_html__( 'Minimum Strength', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select minimum password strength level.', 'wpforms-lite' ), + ], + false + ); + + $strength = $this->field_element( + 'select', + $field, + [ + 'slug' => 'password-strength-level', + 'options' => [ + '2' => esc_html__( 'Weak', 'wpforms-lite' ), + '3' => esc_html__( 'Medium', 'wpforms-lite' ), + '4' => esc_html__( 'Strong', 'wpforms-lite' ), + ], + 'value' => $field['password-strength-level'] ?? '3', + + ], + false + ); + $args = [ + 'slug' => 'password-strength-level', + 'class' => ! isset( $field['password-strength'] ) ? 'wpforms-hidden' : '', + 'content' => $strength_label . $strength, + ]; + + $this->field_element( 'row', $field, $args ); + + $visibility = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'password-visibility', + 'value' => isset( $field['password-visibility'] ) ? '1' : '0', + 'desc' => esc_html__( 'Enable Password Visibility', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to add a toggle for showing and hiding the password.', 'wpforms-lite' ), + ], + false + ); + $args = [ + 'slug' => 'password-visibility', + 'content' => $visibility, + ]; + + $this->field_element( 'row', $field, $args ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Confirmation Placeholder. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'confirmation_placeholder', + 'value' => esc_html__( 'Confirmation Placeholder Text', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter text for the confirmation field placeholder.', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'text', + $field, + [ + 'slug' => 'confirmation_placeholder', + 'value' => ! empty( $field['confirmation_placeholder'] ) ? esc_attr( $field['confirmation_placeholder'] ) : '', + ], + false + ); + $args = [ + 'slug' => 'confirmation_placeholder', + 'content' => $lbl . $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Hide sublabels. + $this->field_option( 'sublabel_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Current field specific data. + * + * @noinspection HtmlUnknownAttribute + */ + public function field_preview( $field ) { + + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $confirm_placeholder = ! empty( $field['confirmation_placeholder'] ) ? $field['confirmation_placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + $confirm = ! empty( $field['confirmation'] ) ? 'enabled' : 'disabled'; + $field_classes = [ + 'wpforms-confirm', + 'wpforms-confirm-' . $confirm, + ]; + + if ( ! empty( $field['password-visibility'] ) ) { + $field_classes[] = 'wpforms-field-password-visibility-enabled'; + } + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + $icons = wpforms()->is_pro() + ? ' +
              + + +
              ' + : ''; + + $field_markup = ' +
              + + %2$s +
              '; + + ?> +
              +
              + 'readonly', + 'placeholder' => $placeholder, + 'value' => $default_value, + ] + ), + $icons // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + ?> + +
              + +
              + 'readonly', + 'placeholder' => $confirm_placeholder, + ] + ), + $icons // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + ?> + +
              +
              + field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentCheckbox/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentCheckbox/Field.php new file mode 100755 index 00000000..0897518e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentCheckbox/Field.php @@ -0,0 +1,594 @@ +name = esc_html__( 'Checkbox Items', 'wpforms-lite' ); + $this->keywords = esc_html__( 'product, store, ecommerce, pay, payment', 'wpforms-lite' ); + $this->type = 'payment-checkbox'; + $this->icon = 'fa-check-square-o'; + $this->order = 50; + $this->group = 'payment'; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'First Item', 'wpforms-lite' ), + 'value' => '10', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + 2 => [ + 'label' => esc_html__( 'Second Item', 'wpforms-lite' ), + 'value' => '25', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + 3 => [ + 'label' => esc_html__( 'Third Item', 'wpforms-lite' ), + 'value' => '50', + 'image' => '', + 'icon' => '', + 'icon_style' => '', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + // Customize HTML field values. + add_filter( 'wpforms_html_field_value', [ $this, 'field_html_value' ], 10, 4 ); + add_filter( "wpforms_{$this->type}_field_html_value_images", [ $this, 'field_html_value_images' ], 10, 3 ); + + // Define additional field properties. + add_filter( "wpforms_field_properties_{$this->type}", [ $this, 'field_properties' ], 5, 3 ); + + // This field requires fieldset+legend instead of the field label. + add_filter( "wpforms_frontend_modern_is_field_requires_fieldset_{$this->type}", '__return_true', PHP_INT_MAX, 2 ); + } + + /** + * Define additional field properties. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = absint( $field['id'] ); + $choices = $field['choices']; + + // Remove primary input, unset for attribute for label. + unset( $properties['inputs']['primary'], $properties['label']['attr']['for'] ); + + // Set input container (ul) properties. + $properties['input_container'] = [ + 'class' => [], + 'data' => [], + 'attr' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}", + ]; + + $is_choice_limit_set = ! empty( $field['choice_limit'] ) && (int) $field['choice_limit'] > 0; + + if ( $is_choice_limit_set ) { + $properties['input_container']['data']['choice-limit'] = $field['choice_limit']; + } + + // Set input properties. + foreach ( $choices as $key => $choice ) { + + // Choice labels should not be left blank, but if they are, we provide a basic value. + $label = $choice['label']; + + if ( $label === '' ) { + if ( 1 === count( $choices ) ) { + $label = esc_html__( 'Checked', 'wpforms-lite' ); + } else { + /* translators: %s - item number. */ + $label = sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $key ); + } + } + + $properties['inputs'][ $key ] = [ + 'container' => [ + 'attr' => [], + 'class' => [ "choice-{$key}" ], + 'data' => [], + 'id' => '', + ], + 'label' => [ + 'attr' => [ + 'for' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + ], + 'class' => [ 'wpforms-field-label-inline' ], + 'data' => [], + 'id' => '', + 'text' => $label, + ], + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}][]", + 'value' => $key, + ], + 'class' => [ 'wpforms-payment-price' ], + 'data' => [ + 'amount' => wpforms_format_amount( wpforms_sanitize_amount( $choice['value'] ) ), + ], + 'id' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + 'icon' => $choice['icon'] ?? '', + 'icon_style' => $choice['icon_style'] ?? '', + 'image' => $choice['image'] ?? '', + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'default' => isset( $choice['default'] ), + ]; + + // Rule for validator only if needed. + if ( $is_choice_limit_set ) { + $properties['inputs'][ $key ]['data']['rule-check-limit'] = 'true'; + } + } + + // Required class for pagebreak validation. + if ( ! empty( $field['required'] ) ) { + $properties['input_container']['class'][] = 'wpforms-field-required'; + } + + // Custom properties if image choices are enabled. + if ( ! empty( $field['choices_images'] ) ) { + + $properties['input_container']['class'][] = 'wpforms-image-choices'; + $properties['input_container']['class'][] = 'wpforms-image-choices-' . sanitize_html_class( $field['choices_images_style'] ); + + foreach ( $properties['inputs'] as $key => $inputs ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-image-choices-item'; + + if ( in_array( $field['choices_images_style'], [ 'modern', 'classic' ], true ) ) { + $properties['inputs'][ $key ]['class'][] = 'wpforms-screen-reader-element'; + } + } + } elseif ( ! empty( $field['choices_icons'] ) ) { + $properties = wpforms()->obj( 'icon_choices' )->field_properties( $properties, $field ); + } + + // Add selected class for choices with defaults. + foreach ( $properties['inputs'] as $key => $inputs ) { + if ( ! empty( $inputs['default'] ) ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-selected'; + } + } + + return $properties; + } + + /** + * Get field populated single property value. + * + * @since 1.8.2 + * + * @param string $raw_value Value from a GET param, always a string. + * @param string $input Represent a subfield inside the field. May be empty. + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function get_field_populated_single_property_value( $raw_value, $input, $properties, $field ) { + /* + * When the form is submitted, we get only choice values from the Fallback. + * As payment-checkbox (checkboxes) field doesn't support 'show_values' option - + * we should transform that into label to check against using general logic in parent method. + */ + + if ( + ! is_string( $raw_value ) || + empty( $field['choices'] ) || + ! is_array( $field['choices'] ) + ) { + return $properties; + } + + // The form submits only the sum, so shortcut for Dynamic. + if ( ! is_numeric( $raw_value ) ) { + return parent::get_field_populated_single_property_value( $raw_value, $input, $properties, $field ); + } + + $get_value = wpforms_format_amount( wpforms_sanitize_amount( $raw_value ) ); + + foreach ( $field['choices'] as $choice ) { + if ( + isset( $choice['label'], $choice['value'] ) && + wpforms_format_amount( wpforms_sanitize_amount( $choice['value'] ) ) === $get_value + ) { + $trans_value = $choice['label']; + // Stop iterating over choices. + break; + } + } + + if ( empty( $trans_value ) ) { + return $properties; + } + + return parent::get_field_populated_single_property_value( $trans_value, $input, $properties, $field ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.8.2 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Choices option. + $this->field_option( 'choices_payments', $field ); + + // Show price after item labels. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'show_price_after_labels', + 'value' => isset( $field['show_price_after_labels'] ) ? '1' : '0', + 'desc' => esc_html__( 'Show Price After Item Labels', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to show price of the item after the label.', 'wpforms-lite' ), + ], + false + ); + $args = [ + 'slug' => 'show_price_after_labels', + 'content' => $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Choices Images. + $this->field_option( 'choices_images', $field ); + + // Hide Choices Images. + $this->field_option( 'choices_images_hide', $field ); + + // Choice Images Style (theme). + $this->field_option( 'choices_images_style', $field ); + + // Choices Icons. + $this->field_option( 'choices_icons', $field ); + + // Choices Icons Color. + $this->field_option( 'choices_icons_color', $field ); + + // Choices Icons Size. + $this->field_option( 'choices_icons_size', $field ); + + // Choices Icons Style. + $this->field_option( 'choices_icons_style', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Input columns. + $this->field_option( 'input_columns', $field ); + + // Choice Limit. + $this->field_option( 'choice_limit', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.8.2 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + // Choices. + $this->field_preview_option( 'choices', $field ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.8.2 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + * @noinspection HtmlUnknownTarget + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $container = $field['properties']['input_container']; + $choices = $field['properties']['inputs']; + + printf( + '
                ', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + foreach ( $choices as $key => $choice ) { + + $label = $choice['label']['text'] ?? ''; + + /* translators: %s - item number. */ + $label = $label !== '' ? $label : sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $key ); + + $label .= ! empty( $field['show_price_after_labels'] ) && isset( $choice['data']['amount'] ) ? $this->get_price_after_label( $choice['data']['amount'] ) : ''; + + printf( + '
              • ', + wpforms_html_attributes( $choice['container']['id'], $choice['container']['class'], $choice['container']['data'], $choice['container']['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + if ( empty( $field['dynamic_choices'] ) && ! empty( $field['choices_images'] ) ) { + + // Image choices. + printf( + ''; + + } elseif ( empty( $field['dynamic_choices'] ) && ! empty( $field['choices_icons'] ) ) { + // Icon Choices. + wpforms()->obj( 'icon_choices' )->field_display( $field, $choice, 'checkbox', $label ); + + } else { + + // Normal display. + printf( + '', + wpforms_html_attributes( $choice['id'], $choice['class'], $choice['data'], $choice['attr'] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $choice['required'] ), + checked( '1', $choice['default'], false ) + ); + + printf( + '', + wpforms_html_attributes( $choice['label']['id'], $choice['label']['class'], $choice['label']['data'], $choice['label']['attr'] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_kses_post( $label ) + ); + } + + echo '
              • '; + } + + echo '
              '; + } + + /** + * Validate field on submitting the form. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param array $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $field_id = (int) $field_id; + $error = ''; + + // Basic required check - If field is marked as required, check for entry data. + if ( ! empty( $form_data['fields'][ $field_id ]['required'] ) && empty( $field_submit ) ) { + $error = wpforms_get_required_label(); + } + + if ( ! empty( $field_submit ) ) { + foreach ( (array) $field_submit as $checked_choice ) { + // Validate that the option selected is real. + if ( empty( $form_data['fields'][ $field_id ]['choices'][ (int) $checked_choice ] ) ) { + $error = esc_html__( 'Invalid payment option.', 'wpforms-lite' ); + + break; + } + } + } + + $field_submit = (array) $field_submit; + + $this->validate_field_choice_limit( $field_id, $field_submit, $form_data ); + + if ( ! empty( $error ) ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = $error; + } + } + + /** + * Format and sanitize field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param array $field_submit Array of selected choice IDs. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh, Generic.Metrics.NestingLevel.MaxExceeded + + $field_submit = array_values( (array) $field_submit ); + $field = $form_data['fields'][ $field_id ]; + $name = sanitize_text_field( $field['label'] ); + $amount = 0; + $images = []; + $choice_values = []; + $choice_labels = []; + $choice_keys = []; + + if ( ! empty( $field_submit ) ) { + foreach ( $field_submit as $choice_checked ) { + foreach ( $field['choices'] as $choice_id => $choice ) { + // Exit early. + if ( (int) $choice_checked !== (int) $choice_id ) { + continue; + } + + $value = (float) wpforms_sanitize_amount( $choice['value'] ); + + // Increase the total amount. + $amount += $value; + + $value = wpforms_format_amount( $value, true ); + $choice_label = ''; + + if ( ! empty( $choice['label'] ) ) { + $choice_label = sanitize_text_field( $choice['label'] ); + $value = $choice_label . ' - ' . $value; + } + + $choice_labels[] = $choice_label; + $choice_values[] = $value; + $choice_keys[] = $choice_id; + } + } + + if ( ! empty( $choice_keys ) && ! empty( $field['choices_images'] ) ) { + foreach ( $choice_keys as $choice_key ) { + $images[] = ! empty( $field['choices'][ $choice_key ]['image'] ) ? esc_url_raw( $field['choices'][ $choice_key ]['image'] ) : ''; + } + } + } + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $name, + 'value' => implode( "\r\n", $choice_values ), + 'value_choice' => implode( "\r\n", $choice_labels ), + 'value_raw' => implode( ',', array_map( 'absint', $field_submit ) ), + 'amount' => wpforms_format_amount( $amount ), + 'amount_raw' => $amount, + 'currency' => wpforms_get_currency(), + 'images' => $images, + 'id' => absint( $field_id ), + 'type' => sanitize_key( $this->type ), + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentMultiple/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentMultiple/Field.php new file mode 100755 index 00000000..1b53c442 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentMultiple/Field.php @@ -0,0 +1,536 @@ +name = esc_html__( 'Multiple Items', 'wpforms-lite' ); + $this->keywords = esc_html__( 'product, store, ecommerce, pay, payment', 'wpforms-lite' ); + $this->type = 'payment-multiple'; + $this->icon = 'fa-list-ul'; + $this->order = 50; + $this->group = 'payment'; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'First Item', 'wpforms-lite' ), + 'value' => '10', + 'icon' => '', + 'icon_style' => '', + 'image' => '', + 'default' => '', + ], + 2 => [ + 'label' => esc_html__( 'Second Item', 'wpforms-lite' ), + 'value' => '25', + 'icon' => '', + 'icon_style' => '', + 'image' => '', + 'default' => '', + ], + 3 => [ + 'label' => esc_html__( 'Third Item', 'wpforms-lite' ), + 'value' => '50', + 'icon' => '', + 'icon_style' => '', + 'image' => '', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + // Customize HTML field values. + add_filter( 'wpforms_html_field_value', [ $this, 'field_html_value' ], 10, 4 ); + add_filter( "wpforms_{$this->type}_field_html_value_images", [ $this, 'field_html_value_images' ], 10, 3 ); + + // Define additional field properties. + add_filter( "wpforms_field_properties_{$this->type}", [ $this, 'field_properties' ], 5, 3 ); + + // This field requires fieldset+legend instead of the field label. + add_filter( "wpforms_frontend_modern_is_field_requires_fieldset_{$this->type}", '__return_true', PHP_INT_MAX, 2 ); + } + + /** + * Define additional field properties. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = absint( $field['id'] ); + $choices = $field['choices']; + + // Remove primary input, unset for attribute for label. + unset( $properties['inputs']['primary'], $properties['label']['attr']['for'] ); + + // Set input container (ul) properties. + $properties['input_container'] = [ + 'class' => [], + 'data' => [], + 'attr' => [], + 'id' => "wpforms-{$form_id}-field_{$field_id}", + ]; + + // Set input properties. + foreach ( $choices as $key => $choice ) { + + $properties['inputs'][ $key ] = [ + 'container' => [ + 'attr' => [], + 'class' => [ "choice-{$key}" ], + 'data' => [], + 'id' => '', + ], + 'label' => [ + 'attr' => [ + 'for' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + ], + 'class' => [ 'wpforms-field-label-inline' ], + 'data' => [], + 'id' => '', + 'text' => $choice['label'], + ], + 'attr' => [ + 'name' => "wpforms[fields][{$field_id}]", + 'value' => $key, + ], + 'class' => [ 'wpforms-payment-price' ], + 'data' => [ + 'amount' => wpforms_format_amount( wpforms_sanitize_amount( $choice['value'] ) ), + ], + 'id' => "wpforms-{$form_id}-field_{$field_id}_{$key}", + 'icon' => $choice['icon'] ?? '', + 'icon_style' => $choice['icon_style'] ?? '', + 'image' => $choice['image'] ?? '', + 'required' => ! empty( $field['required'] ) ? 'required' : '', + 'default' => isset( $choice['default'] ), + ]; + } + + // Required class for pagebreak validation. + if ( ! empty( $field['required'] ) ) { + $properties['input_container']['class'][] = 'wpforms-field-required'; + } + + // Custom properties if image choices are enabled. + if ( ! empty( $field['choices_images'] ) ) { + + $properties['input_container']['class'][] = 'wpforms-image-choices'; + $properties['input_container']['class'][] = 'wpforms-image-choices-' . sanitize_html_class( $field['choices_images_style'] ); + + foreach ( $properties['inputs'] as $key => $inputs ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-image-choices-item'; + + if ( in_array( $field['choices_images_style'], [ 'modern', 'classic' ], true ) ) { + $properties['inputs'][ $key ]['class'][] = 'wpforms-screen-reader-element'; + } + } + } elseif ( ! empty( $field['choices_icons'] ) ) { + $properties = wpforms()->obj( 'icon_choices' )->field_properties( $properties, $field ); + } + + // Add selected class for choices with defaults. + foreach ( $properties['inputs'] as $key => $inputs ) { + if ( ! empty( $inputs['default'] ) ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-selected'; + } + } + + return $properties; + } + + /** + * Get field populated single property value. + * + * @since 1.8.2 + * + * @param string $raw_value Value from a GET param, always a string. + * @param string $input Represent a subfield inside the field. May be empty. + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return array Modified field properties. + */ + protected function get_field_populated_single_property_value( $raw_value, $input, $properties, $field ) { + /* + * When the form is submitted, we get only values (prices) from the Fallback. + * As payment-multiple (radio) field doesn't support 'show_values' option - + * we should transform value into label to check against using general logic in parent method. + */ + + if ( + ! is_string( $raw_value ) || + empty( $field['choices'] ) || + ! is_array( $field['choices'] ) + ) { + return $properties; + } + + // The form submits only the sum, so shortcut for Dynamic. + if ( ! is_numeric( $raw_value ) ) { + return parent::get_field_populated_single_property_value( $raw_value, $input, $properties, $field ); + } + + $get_value = wpforms_format_amount( wpforms_sanitize_amount( $raw_value ) ); + + foreach ( $field['choices'] as $choice ) { + if ( + isset( $choice['label'], $choice['value'] ) && + wpforms_format_amount( wpforms_sanitize_amount( $choice['value'] ) ) === $get_value + ) { + $trans_value = $choice['label']; + // Stop iterating over choices. + break; + } + } + + if ( empty( $trans_value ) ) { + return $properties; + } + + return parent::get_field_populated_single_property_value( $trans_value, $input, $properties, $field ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.8.2 + * + * @param array $field Field settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Choices option. + $this->field_option( 'choices_payments', $field ); + + // Show price after item labels. + $fld = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'show_price_after_labels', + 'value' => isset( $field['show_price_after_labels'] ) ? '1' : '0', + 'desc' => esc_html__( 'Show Price After Item Labels', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to show price of the item after the label.', 'wpforms-lite' ), + ], + false + ); + $args = [ + 'slug' => 'show_price_after_labels', + 'content' => $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Choices Images. + $this->field_option( 'choices_images', $field ); + + // Hide Choices Images. + $this->field_option( 'choices_images_hide', $field ); + + // Choice Images Style (theme). + $this->field_option( 'choices_images_style', $field ); + + // Choices Icons. + $this->field_option( 'choices_icons', $field ); + + // Choices Icons Color. + $this->field_option( 'choices_icons_color', $field ); + + // Choices Icons Size. + $this->field_option( 'choices_icons_size', $field ); + + // Choices Icons Style. + $this->field_option( 'choices_icons_style', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Input columns. + $this->field_option( 'input_columns', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.8.2 + * + * @param array $field Field settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + // Choices. + $this->field_preview_option( 'choices', $field ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.8.2 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated array. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + * @noinspection HtmlUnknownTarget + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Define data. + $container = $field['properties']['input_container']; + $choices = $field['properties']['inputs']; + + printf( + '
                ', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + foreach ( $choices as $key => $choice ) { + + $label = $choice['label']['text'] ?? ''; + + /* translators: %s - item number. */ + $label = $label !== '' ? $label : sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $key ); + + $label .= ! empty( $field['show_price_after_labels'] ) && isset( $choice['data']['amount'] ) ? $this->get_price_after_label( $choice['data']['amount'] ) : ''; + + printf( + '
              • ', + wpforms_html_attributes( $choice['container']['id'], $choice['container']['class'], $choice['container']['data'], $choice['container']['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + if ( empty( $field['dynamic_choices'] ) && ! empty( $field['choices_images'] ) ) { + + // Image choices. + printf( + ''; + + } elseif ( empty( $field['dynamic_choices'] ) && ! empty( $field['choices_icons'] ) ) { + // Icon Choices. + wpforms()->obj( 'icon_choices' )->field_display( $field, $choice, 'radio', $label ); + + } else { + + // Normal display. + printf( + '', + wpforms_html_attributes( $choice['id'], $choice['class'], $choice['data'], $choice['attr'] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $choice['required'] ), + checked( '1', $choice['default'], false ) + ); + + printf( + '', + wpforms_html_attributes( $choice['label']['id'], $choice['label']['class'], $choice['label']['data'], $choice['label']['attr'] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_kses_post( $label ) + ); + } + + echo '
              • '; + } + + echo '
              '; + } + + /** + * Validate field on submitting the form. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + // Basic required check - If field is marked as required, check for entry data. + if ( ! empty( $form_data['fields'][ $field_id ]['required'] ) && empty( $field_submit ) ) { + + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = wpforms_get_required_label(); + } + + // Validate that the option selected is real. + if ( + is_string( $field_submit ) && + ! empty( $field_submit ) + && empty( $form_data['fields'][ $field_id ]['choices'][ $field_submit ] ) + ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = + esc_html__( 'Invalid payment option.', 'wpforms-lite' ); + } + } + + /** + * Format and sanitize field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Submitted form data. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + $name = sanitize_text_field( $field['label'] ); + $value = ''; + $amount = 0; + $choice_label = ''; + $image = ''; + + if ( ! empty( $field_submit ) && ! empty( $field['choices'][ $field_submit ] ) ) { + + $amount = wpforms_sanitize_amount( $field['choices'][ $field_submit ]['value'] ); + $value = wpforms_format_amount( $amount, true ); + + if ( ! empty( $field['choices'][ $field_submit ]['label'] ) ) { + $choice_label = sanitize_text_field( $field['choices'][ $field_submit ]['label'] ); + $value = $choice_label . ' - ' . $value; + } + + if ( ! empty( $field['choices_images'] ) ) { + $image = ! empty( $field['choices'][ $field_submit ]['image'] ) ? esc_url_raw( $field['choices'][ $field_submit ]['image'] ) : ''; + } + } + + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => $name, + 'value' => $value, + 'value_choice' => $choice_label, + 'value_raw' => sanitize_text_field( $field_submit ), + 'amount' => wpforms_format_amount( $amount ), + 'amount_raw' => $amount, + 'currency' => wpforms_get_currency(), + 'image' => $image, + 'id' => absint( $field_id ), + 'type' => sanitize_key( $this->type ), + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSelect/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSelect/Field.php new file mode 100755 index 00000000..45ab00fa --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSelect/Field.php @@ -0,0 +1,644 @@ +name = esc_html__( 'Dropdown Items', 'wpforms-lite' ); + $this->keywords = esc_html__( 'product, store, ecommerce, pay, payment', 'wpforms-lite' ); + $this->type = 'payment-select'; + $this->icon = 'fa-caret-square-o-down'; + $this->order = 70; + $this->group = 'payment'; + $this->defaults = [ + 1 => [ + 'label' => esc_html__( 'First Item', 'wpforms-lite' ), + 'value' => '10', + 'default' => '', + ], + 2 => [ + 'label' => esc_html__( 'Second Item', 'wpforms-lite' ), + 'value' => '25', + 'default' => '', + ], + 3 => [ + 'label' => esc_html__( 'Third Item', 'wpforms-lite' ), + 'value' => '50', + 'default' => '', + ], + ]; + + $this->default_settings = [ + 'choices' => $this->defaults, + ]; + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.2 + */ + private function hooks() { + + // Define additional field properties. + add_filter( "wpforms_field_properties_{$this->type}", [ $this, 'field_properties' ], 5, 3 ); + + // Form frontend CSS enqueues. + add_action( 'wpforms_frontend_css', [ $this, 'enqueue_frontend_css' ] ); + + // Form frontend JS enqueues. + add_action( 'wpforms_frontend_js', [ $this, 'enqueue_frontend_js' ] ); + + // Customize HTML field value. + add_filter( 'wpforms_html_field_value', [ $this, 'field_html_value' ], 10, 4 ); + } + + /** + * Define additional field properties. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + // Remove primary input. + unset( $properties['inputs']['primary'] ); + + // Define data. + $form_id = absint( $form_data['id'] ); + $field_id = absint( $field['id'] ); + $choices = $field['choices']; + + // Set options container (', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + + // Optional placeholder. + if ( ! empty( $field_placeholder ) || $is_modern ) { + printf( + '', + selected( false, $has_default, false ), + esc_html( $field_placeholder ) + ); + } + + // Format string for option. + if ( $is_modern ) { + // The `data-custom-properties` is a Choices.js attribute, and it stores a copy of `data-amount` attribute. + $option_format = ''; + } else { + $option_format = ''; + } + + // Build the select options. + foreach ( $choices as $key => $choice ) { + $amount = wpforms_format_amount( wpforms_sanitize_amount( $choice['attr']['value'] ) ); + $label = $choice['label']['text'] ?? ''; + + /* translators: %s - item number. */ + $label = $label !== '' ? $label : sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $key ); + + $label .= ! empty( $field['show_price_after_labels'] ) && isset( $choice['attr']['value'] ) ? ' - ' . wpforms_format_amount( wpforms_sanitize_amount( $choice['attr']['value'] ), true ) : ''; + + printf( + $option_format, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_attr( $key ), + esc_attr( $amount ), + selected( true, ! empty( $choice['default'] ), false ), + esc_html( $label ) + ); + } + + echo ''; + + $this->display_quantity_dropdown( $field ); + } + + /** + * Validate field on submitting the form. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + // Basic required check - If field is marked as required, check for entry data. + if ( ! empty( $form_data['fields'][ $field_id ]['required'] ) && empty( $field_submit ) ) { + + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = wpforms_get_required_label(); + } + + // Validate that the option selected is real. + if ( ! empty( $field_submit ) && empty( $form_data['fields'][ $field_id ]['choices'][ $field_submit ] ) ) { + + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'Invalid payment option', 'wpforms-lite' ); + } + } + + /** + * Format and sanitize field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Submitted field value (selected option). + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $choice_label = ''; + $field = $form_data['fields'][ $field_id ]; + $name = ! empty( $field['label'] ) ? sanitize_text_field( $field['label'] ) : ''; + + // Fetch the amount. + if ( ! empty( $field['choices'][ $field_submit ]['value'] ) ) { + $amount = wpforms_sanitize_amount( $field['choices'][ $field_submit ]['value'] ); + } else { + $amount = 0; + } + + $value = wpforms_format_amount( $amount, true ); + + if ( empty( $field_submit ) ) { + $value = ''; + } elseif ( ! empty( $field['choices'][ $field_submit ]['label'] ) ) { + $choice_label = sanitize_text_field( $field['choices'][ $field_submit ]['label'] ); + $value = $choice_label . ' - ' . $value; + } + + $field_data = [ + 'name' => $name, + 'value' => $value, + 'value_choice' => $choice_label, + 'value_raw' => sanitize_text_field( $field_submit ), + 'amount' => wpforms_format_amount( $amount ), + 'amount_raw' => $amount, + 'currency' => wpforms_get_currency(), + 'id' => absint( $field_id ), + 'type' => sanitize_key( $this->type ), + ]; + + if ( $this->is_payment_quantities_enabled( $field ) ) { + $field_data['quantity'] = $this->get_submitted_field_quantity( $field, $form_data ); + } + + wpforms()->obj( 'process' )->fields[ $field_id ] = $field_data; + } + + /** + * Form frontend CSS enqueues. + * + * @since 1.8.2 + * + * @param array $forms Forms on the current page. + */ + public function enqueue_frontend_css( $forms ) { + + $has_modern_select = false; + + foreach ( $forms as $form ) { + if ( $this->is_field_style( $form, self::STYLE_MODERN ) ) { + $has_modern_select = true; + + break; + } + } + + if ( $has_modern_select || wpforms()->obj( 'frontend' )->assets_global() ) { + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-choicesjs', + WPFORMS_PLUGIN_URL . "assets/css/choices{$min}.css", + [], + '10.2.0' + ); + } + } + + /** + * Form frontend JS enqueues. + * + * @since 1.8.2 + * + * @param array $forms Forms on the current page. + */ + public function enqueue_frontend_js( $forms ) { + + $has_modern_select = false; + + foreach ( $forms as $form ) { + if ( $this->is_field_style( $form, self::STYLE_MODERN ) ) { + $has_modern_select = true; + + break; + } + } + + if ( $has_modern_select || wpforms()->obj( 'frontend' )->assets_global() ) { + $this->enqueue_choicesjs_once( $forms ); + } + } + + /** + * Whether the provided form has a dropdown field with a specified style. + * + * @since 1.8.2 + * + * @param array $form Form data. + * @param string $style Desired field style. + * + * @return bool + */ + protected function is_field_style( $form, $style ) { + + $is_field_style = false; + + if ( empty( $form['fields'] ) ) { + return false; + } + + foreach ( (array) $form['fields'] as $field ) { + if ( + ! empty( $field['type'] ) && + $field['type'] === $this->type && + ! empty( $field['style'] ) && + sanitize_key( $style ) === $field['style'] + ) { + $is_field_style = true; + + break; + } + } + + return $is_field_style; + } + + /** + * Get field name for an ajax error message. + * + * @since 1.8.2 + * + * @param string|mixed $name Field name for error triggered. + * @param array $field Field settings. + * @param array $props List of properties. + * @param string|string[] $error Error message. + * + * @return string + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection + */ + public function ajax_error_field_name( $name, $field, $props, $error ) { + + $name = (string) $name; + + if ( ! isset( $field['type'] ) || $field['type'] !== $this->type ) { + return $name; + } + + return $props['input_container']['attr']['name'] ?? ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSingle/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSingle/Field.php new file mode 100755 index 00000000..5e307abf --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentSingle/Field.php @@ -0,0 +1,848 @@ +name = esc_html__( 'Single Item', 'wpforms-lite' ); + $this->keywords = esc_html__( 'product, store, ecommerce, pay, payment', 'wpforms-lite' ); + $this->type = 'payment-single'; + $this->icon = 'fa-file-o'; + $this->order = 30; + $this->group = 'payment'; + + $this->hooks(); + } + + /** + * Define additional field hooks. + * + * @since 1.8.2 + */ + private function hooks() { + + // Define additional field properties. + add_filter( "wpforms_field_properties_{$this->type}", [ $this, 'field_properties' ], 5, 3 ); + + add_action( 'wpforms_display_field_after', [ $this, 'field_minimum_price_description' ], 10, 2 ); + add_filter( 'wpforms_field_preview_class', [ $this, 'preview_field_class' ], 10, 2 ); + + // Customize HTML field value. + add_filter( 'wpforms_html_field_value', [ $this, 'field_html_value' ], 10, 4 ); + } + + /** + * Define additional field properties. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + // Basic IDs. + $form_id = absint( $form_data['id'] ); + $field_id = absint( $field['id'] ); + + // Set options container (', + esc_attr( $placeholder ), + esc_attr( $value ) + ); + + $hidden = $this->is_min_price_passed( $field ) ? 'wpforms-hidden' : ''; + + echo ''; + + echo ''; + + $this->field_preview_option( 'description', $field ); + + $hidden = ! isset( $field['min_price'] ) || empty( (float) wpforms_sanitize_amount( $field['min_price'] ) ) ? 'wpforms-hidden' : ''; + + echo '
              '; + printf( + wp_kses( /* translators: %1$s - Minimum Price value. */ + __( 'Minimum Price: %1$s', 'wpforms-lite' ), + [ + 'span' => [ + 'class' => [], + ], + ] + ), + esc_html( $min_price ) + ); + echo '
              '; + + echo '

              '; + esc_html_e( 'Note: Item type is set to hidden and will not be visible when viewing the form.', 'wpforms-lite' ); + echo '

              '; + + echo ''; + } + + /** + * Field display on the form front-end. + * + * @since 1.8.2 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + + // Shortcut for easier access. + $primary = $field['properties']['inputs']['primary']; + $field_format = ! empty( $field['format'] ) ? $field['format'] : self::FORMAT_SINGLE; + + // Placeholder attribute is only applicable to password, search, tel, text and url inputs, not hidden. + // aria-errormessage attribute is not allowed for hidden inputs. + if ( ! $this->is_user_defined( $field ) ) { + unset( $primary['attr']['placeholder'], $primary['attr']['aria-errormessage'] ); + } + + switch ( $field_format ) { + case self::FORMAT_SINGLE: + case self::FORMAT_HIDDEN: + if ( $field_format === self::FORMAT_SINGLE ) { + $price = ! empty( $field['price'] ) ? $field['price'] : 0; + $field_label = str_replace( '{price}', '' . esc_html( wpforms_format_amount( wpforms_sanitize_amount( $price ), true ) ) . '', $this->get_single_item_price_label( $field ) ); + + echo '
              '; + echo '
              '; + echo wp_kses( + $field_label, + [ + 'span' => [ + 'class' => [], + ], + ] + ); + echo '
              '; + + $this->display_quantity_dropdown( $field ); + + echo '
              '; + } + + // Primary price field. + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + + case self::FORMAT_USER: + printf( + '', + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $primary['attr'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + + default: + break; + } + } + + /** + * Validate field on form submit. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + $is_required = ! empty( $form_data['fields'][ $field_id ]['required'] ); + + // If field is required, check for data. + if ( + empty( $field_submit ) && + $is_required + ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = wpforms_get_required_label(); + + return; + } + + /** + * Whether to validate amount or not of the Payment Single item field. + * + * @since 1.8.4 + * + * @param bool $validate Whether to validate amount or not. Default true. + * @param int $field_id Field ID. + * @param string $field_submit Field data submitted by a user. + * @param array $form_data Form data and settings. + */ + $validate_amount = apply_filters( 'wpforms_forms_fields_payment_single_field_validate_amount', true, $field_id, $field_submit, $form_data ); + + // If field format is not user provided, validate the amount posted. + if ( + ! empty( $field_submit ) && + $validate_amount && + ! $this->is_user_defined( $form_data['fields'][ $field_id ] ) + ) { + + $price = wpforms_sanitize_amount( $form_data['fields'][ $field_id ]['price'] ); + $submit = wpforms_sanitize_amount( $field_submit ); + + if ( $price !== $submit ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'Amount mismatch', 'wpforms-lite' ); + } + } + + // If field format is provided by user, additionally compare the amount with a minimum price. + if ( + ! empty( $field_submit ) && + $validate_amount && + $this->is_user_defined( $form_data['fields'][ $field_id ] ) + ) { + $submit = wpforms_sanitize_amount( $field_submit ); + + if ( $submit < 0 ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'Amount can\'t be negative' , 'wpforms-lite' ); + } + + if ( empty( $form_data['fields'][ $field_id ]['min_price'] ) && ! $is_required ) { + return; + } + + $min_price = wpforms_sanitize_amount( $form_data['fields'][ $field_id ]['min_price'] ); + + if ( $submit < $min_price ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'Amount can\'t be less than the required minimum.' , 'wpforms-lite' ); + } + } + } + + /** + * Format and sanitize field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Field data submitted by a user. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + $field = $form_data['fields'][ $field_id ]; + $name = ! empty( $field['label'] ) ? sanitize_text_field( $field['label'] ) : ''; + + // Only trust the value if the field has the user defined format OR it is the entry preview. + if ( $this->is_user_defined( $field ) || wpforms_is_ajax( 'wpforms_get_entry_preview' ) ) { + $amount = wpforms_sanitize_amount( $field_submit ); + } else { + $amount = wpforms_sanitize_amount( $field['price'] ); + } + + $field_data = [ + 'name' => $name, + 'value' => wpforms_format_amount( $amount, true ), + 'amount' => wpforms_format_amount( $amount ), + 'amount_raw' => $amount, + 'currency' => wpforms_get_currency(), + 'id' => absint( $field_id ), + 'type' => sanitize_key( $this->type ), + ]; + + if ( $this->is_payment_quantities_enabled( $field ) ) { + $field_data['quantity'] = $this->get_submitted_field_quantity( $field, $form_data ); + } + + wpforms()->obj( 'process' )->fields[ $field_id ] = $field_data; + } + + /** + * Display the minimum price description for the field. + * + * @since 1.8.6 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + */ + public function field_minimum_price_description( $field, $form_data ) { + + if ( ! $this->is_user_defined( $field ) || ! isset( $field['min_price'] ) || empty( (float) wpforms_sanitize_amount( $field['min_price'] ) ) ) { + return; + } + + $description = sprintf( /* translators: %1$s - Minimum Price value. */ + __( 'Minimum Price: %1$s', 'wpforms-lite' ), + wpforms_format_amount( wpforms_sanitize_amount( $field['min_price'] ), true ) + ); + + printf( + '
              %s
              ', + esc_html( $description ) + ); + } + + /** + * Add class to the builder field preview. + * + * @since 1.8.6 + * + * @param string $css Class names. + * @param array $field Field properties. + * + * @return string + */ + public function preview_field_class( $css, $field ) { + + $css = parent::preview_field_class( $css, $field ); + + if ( $field['type'] !== $this->type ) { + return $css; + } + + if ( ! $this->is_user_defined( $field ) ) { + return $css; + } + + if ( $this->is_min_price_passed( $field ) ) { + return $css; + } + + $css .= ' min-price-warning'; + + return $css; + } + + /** + * Define if format of field is User Defined. + * + * @since 1.8.6 + * + * @param array $field Field data. + * + * @return bool + */ + private function is_user_defined( $field ) { + + return ! empty( $field['format'] ) && $field['format'] === self::FORMAT_USER; + } + + /** + * Define if format of field is Single Item. + * + * @since 1.8.7 + * + * @param array $field Field data. + * + * @return bool + */ + private function is_single_item( $field ) { + + return empty( $field['format'] ) || $field['format'] === self::FORMAT_SINGLE; + } + + /** + * Define if format of field is Hidden. + * + * @since 1.8.8 + * + * @param array $field Field data. + * + * @return bool + */ + private function is_hidden( $field ) { + + return empty( $field['format'] ) || $field['format'] === self::FORMAT_HIDDEN; + } + + /** + * Define if minimum price is equal or more than default one. + * + * @since 1.8.6 + * + * @param array $field Field data. + * + * @return bool + */ + private function is_min_price_passed( $field ) { + + return isset( $field['min_price'] ) && (float) wpforms_sanitize_amount( $field['min_price'] ) >= (float) self::MIN_PRICE_DEFAULT; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentTotal/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentTotal/Field.php new file mode 100755 index 00000000..eaf6d924 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/PaymentTotal/Field.php @@ -0,0 +1,897 @@ +name = esc_html__( 'Total', 'wpforms-lite' ); + $this->keywords = esc_html__( 'store, ecommerce, pay, payment, sum', 'wpforms-lite' ); + $this->type = 'payment-total'; + $this->icon = 'fa-money'; + $this->order = 110; + $this->group = 'payment'; + $this->allow_read_only = false; + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.8.2 + */ + private function hooks(): void { + + // Define additional field properties. + add_filter( "wpforms_field_properties_{$this->type}", [ $this, 'field_properties' ], 5, 3 ); + + // Recalculate total for a form. + add_filter( 'wpforms_process_filter', [ $this, 'calculate_total' ], 10, 3 ); + + // Add classes to the builder field preview. + add_filter( 'wpforms_field_preview_class', [ $this, 'preview_field_class' ], 10, 2 ); + + // Add a new option on the confirmation page. + add_action( 'wpforms_form_settings_confirmations_single_after', [ $this, 'add_confirmation_setting' ], 10, 2 ); + add_action( 'wpforms_lite_form_settings_confirmations_single_after', [ $this, 'add_confirmation_setting' ], 10, 2 ); + add_action( 'wpforms_frontend_confirmation_message_after', [ $this, 'order_summary_confirmation' ], 10, 4 ); + } + + /** + * Define additional field properties. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function field_properties( $properties, $field, $form_data ) { + + // Input Primary: initial total is always zero. + $properties['inputs']['primary']['attr']['value'] = '0'; + + // Input Primary: add class for targeting calculations. + $properties['inputs']['primary']['class'][] = 'wpforms-payment-total'; + + // Input Primary: add a data attribute if total is required. + if ( ! empty( $field['required'] ) ) { + $properties['inputs']['primary']['data']['rule-required-payment'] = true; + } + + // Check size. + if ( ! empty( $field['size'] ) ) { + $properties['container']['class'][] = 'wpforms-field-' . esc_attr( $field['size'] ); + } + + // Input Primary: add class for targeting summary. + if ( $this->is_summary_enabled( $field ) ) { + $properties['container']['class'][] = 'wpforms-summary-enabled'; + } + + // Unset for attribute for label. + unset( $properties['label']['attr']['for'] ); + + return $properties; + } + + /** + * Whether the current field can be populated dynamically. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_dynamic_population_allowed( $properties, $field ): bool { + + return false; + } + + /** + * Whether the current field can be populated dynamically. + * + * @since 1.8.2 + * + * @param array $properties Field properties. + * @param array $field Current field specific data. + * + * @return bool + */ + public function is_fallback_population_allowed( $properties, $field ): bool { + + return false; + } + + /** + * Do not trust the posted total since that relies on JavaScript. + * + * Instead, we re-calculate on the server side. + * + * @since 1.8.2 + * + * @param array $fields List of fields with their data. + * @param array $entry Submitted form data. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function calculate_total( $fields, $entry, $form_data ) { + + return self::calculate_total_static( $fields, $entry, $form_data ); + } + + /** + * Static version of calculate_total(). + * + * @since 1.8.4 + * + * @param array $fields List of fields with their data. + * @param array $entry Submitted form data. + * @param array $form_data Form data and settings. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public static function calculate_total_static( $fields, $entry, $form_data ) { + + if ( ! is_array( $fields ) ) { + return $fields; + } + + // At this point we have passed processing and validation, so we know + // the amounts in $fields are safe to use. + $total = wpforms_get_total_payment( $fields ); + $amount = wpforms_sanitize_amount( $total ); + + foreach ( $fields as $id => $field ) { + if ( ! empty( $field['type'] ) && $field['type'] === 'payment-total' ) { + $fields[ $id ]['value'] = wpforms_format_amount( $amount, true ); + $fields[ $id ]['amount'] = wpforms_format_amount( $amount ); + $fields[ $id ]['amount_raw'] = $amount; + } + } + + return $fields; + } + + /** + * Field options panel inside the builder. + * + * @since 1.8.2 + * + * @param array $field Field data and settings. + */ + public function field_options( $field ) { + /* + * Basic field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Enable Summary. + $this->summary_option( $field ); + + // Summary Notice. + $this->summary_option_notice( $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( + 'size', + $field, + [ + 'exclude' => [ 'small' ], // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_exclude + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.8.2 + * + * @param array $field Field data and settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( 'label', $field ); + + [ $items, $foot, $total_width ] = $this->prepare_builder_preview_data(); + + // Summary preview. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'fields/total/summary-preview', + [ + 'items' => $items, + 'foot' => $foot, + 'total_width' => $total_width, + ], + true + ); + + // Primary field. + echo '
              ' . esc_html( wpforms_format_amount( 0, true ) ) . '
              '; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.8.2 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated, not used parameter. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlWrongAttributeValue + * @noinspection HtmlUnknownAttribute + */ + public function field_display( $field, $deprecated, $form_data ) { + + $primary = $field['properties']['inputs']['primary']; + $type = ! empty( $field['required'] ) ? 'text' : 'hidden'; + $attrs = $primary['attr']; + + if ( ! empty( $field['required'] ) ) { + $attrs['style'] = 'position:absolute!important;clip:rect(0,0,0,0)!important;height:1px!important;width:1px!important;border:0!important;overflow:hidden!important;padding:0!important;margin:0!important;'; + $attrs['readonly'] = 'readonly'; + } + + // aria-errormessage attribute is not allowed for hidden inputs. + unset( $attrs['aria-errormessage'] ); + + $is_summary_enabled = $this->is_summary_enabled( $field ); + + // Prepare data for the order summary preview if summary is enabled, or we are on the editor page. + if ( $is_summary_enabled || wpforms_is_editor_page() ) { + [ $items, $foot, $total_width ] = $this->prepare_payment_fields_data( $form_data ); + } + + if ( $is_summary_enabled ) { + /** + * Allow filtering form data before displaying the order summary table. + * + * @since 1.9.3 + * + * @param array $form_data Form data. + * + * @return array + */ + $form_data = apply_filters( 'wpforms_forms_fields_payment_total_field_display_form_data', $form_data ); + + // Summary preview. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_render( + 'fields/total/summary-preview', + [ + 'items' => $items, + 'foot' => $foot, + 'total_width' => $total_width, + ], + true + ); + } + + $amount = wpforms_format_amount( 0, true ); + + // If we are on the editor page, we need to get the total amount from the last item in the foot. + if ( ! empty( $foot ) && wpforms_is_editor_page() ) { + $foot_item = end( $foot ); + $amount = $foot_item['amount'] ?? 0; + } + + // Always print total to cover a case when a field is embedded into a Layout column with 25% width. + $hidden_style = $is_summary_enabled ? 'display:none' : ''; + + // This displays the total the user sees. + printf( + '
              %2$s
              ', + esc_attr( $hidden_style ), + esc_html( $amount ) + ); + + // Hidden input for processing. + printf( + '', + esc_attr( $type ), + wpforms_html_attributes( $primary['id'], $primary['class'], $primary['data'], $attrs ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Validate field on form submitting. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Submitted field value (raw data). + * @param array $form_data Form data and settings. + */ + public function validate( $field_id, $field_submit, $form_data ) { + + // Basic required check - If a field is marked as required, check for entry data. + if ( ! empty( $form_data['fields'][ $field_id ]['required'] ) && ( empty( $field_submit ) || wpforms_sanitize_amount( $field_submit ) <= 0 ) ) { + wpforms()->obj( 'process' )->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'Payment is required.', 'wpforms-lite' ); + } + } + + /** + * Format and sanitize field. + * + * @since 1.8.2 + * + * @param int $field_id Field ID. + * @param string $field_submit Field value submitted by a user. + * @param array $form_data Form data and settings. + */ + public function format( $field_id, $field_submit, $form_data ) { + + // Define data. + $name = ! empty( $form_data['fields'][ $field_id ]['label'] ) ? $form_data['fields'][ $field_id ]['label'] : ''; + $amount = wpforms_sanitize_amount( $field_submit ); + + // Set final field details. + wpforms()->obj( 'process' )->fields[ $field_id ] = [ + 'name' => sanitize_text_field( $name ), + 'value' => wpforms_format_amount( $amount, true ), + 'amount' => wpforms_format_amount( $amount ), + 'amount_raw' => $amount, + 'id' => absint( $field_id ), + 'type' => sanitize_key( $this->type ), + ]; + } + + /** + * Summary option. + * + * @since 1.8.7 + * + * @param array $field Field data and settings. + */ + private function summary_option( array $field ): void { + + $is_allowed = RequirementsAlerts::is_order_summary_allowed(); + + $toggle_data = [ + 'slug' => 'summary', + 'value' => $this->is_summary_enabled( $field ), + 'desc' => esc_html__( 'Enable Summary', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enable order summary for this field.', 'wpforms-lite' ), + ]; + + if ( ! $is_allowed ) { + $toggle_data['attrs'] = [ 'disabled' => 'disabled' ]; + $toggle_data['control-class'] = 'wpforms-toggle-control-disabled'; + } + + $output = $this->field_element( + 'toggle', + $field, + $toggle_data, + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'summary', + 'content' => $output, + ] + ); + + if ( ! $is_allowed ) { + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'summary_alert', + 'content' => RequirementsAlerts::get_order_summary_alert(), + ] + ); + } + } + + /** + * Summary notice on the options' tab. + * + * @since 1.8.7 + * + * @param array $field Field data and settings. + */ + private function summary_option_notice( array $field ): void { + + $notice = __( 'Example data is shown in the form editor. Actual products and totals will be displayed when you preview or embed your form.', 'wpforms-lite' ); + $is_notice_hidden = ! $this->is_summary_enabled( $field ) ? 'wpforms-hidden' : ''; + + printf( + '
              +

              %2$s

              +
              ', + esc_attr( $is_notice_hidden ), + esc_html( $notice ) + ); + } + + /** + * Determine if a summary option is enabled. + * + * @since 1.8.7 + * + * @param array $field Field data and settings. + */ + private function is_summary_enabled( array $field ) { + + return ! empty( $field['summary'] ); + } + + /** + * Prepare fake fields data for builder preview. + * + * @since 1.8.7 + * + * @return array + */ + private function prepare_builder_preview_data(): array { + + $items = [ + [ + 'label' => __( 'Example Product 1', 'wpforms-lite' ), + 'quantity' => 3, + 'amount' => wpforms_format_amount( 30, true ), + 'is_hidden' => false, + ], + [ + 'label' => __( 'Example Product 2', 'wpforms-lite' ), + 'quantity' => 2, + 'amount' => wpforms_format_amount( 20, true ), + 'is_hidden' => false, + ], + [ + 'label' => __( 'Example Product 3', 'wpforms-lite' ), + 'quantity' => 1, + 'amount' => wpforms_format_amount( 10, true ), + 'is_hidden' => false, + ], + ]; + + $total = 60; + + /** + * Allow filtering items in the footer on the order summary table (builder screen). + * + * @since 1.8.7 + * + * @param array $fields Order summary footer. + * @param int $total Fields total. + */ + $foot = (array) apply_filters( 'wpforms_forms_fields_payment_total_field_builder_order_summary_preview_foot', [], $total ); + + /** + * Allow filtering builder order summary fields total. + * + * @since 1.8.7 + * + * @param string $total Fields total. + */ + $total = apply_filters( 'wpforms_forms_fields_payment_total_field_builder_order_summary_preview_total', $total ); + + $total = wpforms_format_amount( $total, true ); + + $foot[] = [ + 'label' => __( 'Total', 'wpforms-lite' ), + 'quantity' => '', + 'amount' => $total, + 'class' => 'wpforms-order-summary-preview-total', + ]; + + $total_width = strlen( html_entity_decode( $total, ENT_COMPAT, 'UTF-8' ) ) + 4; + + /** + * Allow filtering builder order summary total column width. + * + * @since 1.8.7 + * + * @param int $total_width Total column width. + */ + $total_width = (int) apply_filters( 'wpforms_forms_fields_payment_total_field_builder_order_summary_preview_total_width', $total_width ); + + return [ $items, $foot, $total_width ]; + } + + /** + * Prepare payment fields data for summary preview. + * + * @since 1.8.7 + * + * @param array $form_data Form data. + * + * @return array + */ + private function prepare_payment_fields_data( array $form_data ): array { + + $payment_fields = wpforms_payment_fields(); + $fields = []; + $foot = []; + $total = 0; + + foreach ( $form_data['fields'] as $field ) { + + if ( + ( ! isset( $field['price'] ) && empty( $field['choices'] ) ) || + ! in_array( $field['type'], $payment_fields, true ) + ) { + continue; + } + + $this->prepare_payment_field_choices( $field, $fields, $total ); + $this->prepare_payment_field_single( $field, $fields, $total ); + } + + /** + * Allow filtering items in the order summary footer. + * + * @since 1.8.7 + * + * @param array $fields Fields. + */ + $foot = (array) apply_filters( 'wpforms_forms_fields_payment_total_field_order_summary_preview_foot', $foot ); + + $total = wpforms_format_amount( $total, true ); + + $foot[] = [ + 'label' => __( 'Total', 'wpforms-lite' ), + 'quantity' => '', + 'amount' => $total, + 'class' => 'wpforms-order-summary-preview-total', + ]; + + return [ $fields, $foot, strlen( html_entity_decode( $total, ENT_COMPAT, 'UTF-8' ) ) + 3 ]; + } + + /** + * Prepare payment single data for summary preview. + * + * @since 1.8.7 + * + * @param array $field Field data. + * @param array $fields Fields data. + * @param float $total Fields total. + */ + private function prepare_payment_field_single( array $field, array &$fields, float &$total ): void { + + if ( ! empty( $field['choices'] ) ) { + return; + } + + $quantity = $this->get_payment_field_min_quantity( $field ); + $field_amount = $this->get_payment_field_single_amount( $field, $quantity ); + $classes = [ 'wpforms-order-summary-field' ]; + $format = $field['format'] ?? ''; + $is_conditionally_hidden = $this->is_conditionally_hidden( $field ); + + if ( $format === 'hidden' ) { + $classes[] = 'wpforms-hidden'; + } + + $fields[] = [ + 'label' => ! empty( $field['label_hide'] ) ? '' : $field['label'], + 'quantity' => $quantity, + 'amount' => wpforms_format_amount( $field_amount, true ), + 'is_hidden' => ! $quantity || $is_conditionally_hidden, + 'class' => $classes, + 'data' => [ + 'field' => $field['id'], + ], + ]; + + if ( ! $is_conditionally_hidden ) { + $total += $field_amount; + } + } + + /** + * Prepare payment field choices data for summary preview. + * + * @since 1.8.7 + * + * @param array $field Field data. + * @param array $fields Fields data. + * @param float $total Fields total. + */ + private function prepare_payment_field_choices( array $field, array &$fields, float &$total ): void { + + if ( empty( $field['choices'] ) ) { + return; + } + + $quantity = $this->get_payment_field_min_quantity( $field ); + $default_choice_key = $this->get_classic_dropdown_default_choice_key( $field ); + $is_conditionally_hidden = $this->is_conditionally_hidden( $field ); + + foreach ( $field['choices'] as $key => $choice ) { + + $choice_amount = ! empty( $choice['value'] ) ? wpforms_sanitize_amount( $choice['value'] ) * $quantity : 0; + $is_default = ! empty( $choice['default'] ) || ( isset( $default_choice_key ) && (int) $key === $default_choice_key ); + /* translators: %s - item number. */ + $choice_label = ! empty( $choice['label'] ) ? $choice['label'] : sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $key ); + + $fields[] = [ + 'label' => ! empty( $field['label_hide'] ) ? $choice_label : $field['label'] . ' - ' . $choice_label, + 'quantity' => $quantity, + 'amount' => wpforms_format_amount( $choice_amount, true ), + 'is_hidden' => ! $is_default || ! $quantity || $is_conditionally_hidden, + 'class' => 'wpforms-order-summary-field', + 'data' => [ + 'field' => $field['id'], + 'choice' => $key, + ], + ]; + + if ( $is_default && ! $is_conditionally_hidden ) { + $total += $choice_amount; + } + } + } + + /** + * The `array_key_first` polyfill. + * + * @since 1.9.3 + * + * @param array|mixed $arr Input array. + * + * @return int|string|null + */ + private function array_key_first( $arr ) { + + $array = (array) $arr; + + return empty( $array ) ? null : array_keys( $array )[0]; + } + + /** + * Get the classic dropdown default choice key. + * + * @since 1.8.7 + * + * @param array $field Field Settings. + * + * @return int|null + */ + private function get_classic_dropdown_default_choice_key( array $field ) { + + if ( $field['type'] !== 'payment-select' || $field['style'] !== 'classic' || ! empty( $field['placeholder'] ) ) { + return null; + } + + foreach ( $field['choices'] as $key => $choice ) { + if ( ! isset( $choice['default'] ) ) { + continue; + } + + return (int) $key; + } + + return $this->array_key_first( $field['choices'] ); + } + + /** + * Get payment field minimum quantity. + * + * @since 1.8.7 + * + * @param array $field Field data. + * + * @return int + */ + private function get_payment_field_min_quantity( array $field ): int { + + if ( ! wpforms_payment_has_quantity( $field, $this->form_data ) || ! isset( $field['min_quantity'] ) ) { + return 1; + } + + // Ensure non-negative quantity. + return max( 0, (int) $field['min_quantity'] ); + } + + /** + * Add a class to the builder field preview. + * + * @since 1.8.7 + * + * @param string $css Class names. + * @param array $field Field properties. + * + * @return string + */ + public function preview_field_class( $css, $field ) { + + if ( $field['type'] !== $this->type ) { + return $css; + } + + if ( $this->is_summary_enabled( $field ) ) { + $css .= ' wpforms-summary-enabled'; + } + + return $css; + } + + /** + * Add an order summary to the confirmation settings. + * + * @since 1.8.7 + * + * @param WPForms_Builder_Panel_Settings $settings Settings. + * @param int $field_id Field ID. + */ + public function add_confirmation_setting( $settings, int $field_id ): void { + + wpforms_panel_field( + 'toggle', + 'confirmations', + 'message_order_summary', + $settings->form_data, + esc_html__( 'Show order summary after confirmation message', 'wpforms-lite' ), + [ + 'input_id' => 'wpforms-panel-field-confirmations-message_order_summary-' . $field_id, + 'input_class' => 'wpforms-panel-field-confirmations-message_order_summary', + 'parent' => 'settings', + 'subsection' => $field_id, + ] + ); + } + + /** + * Show the order summary on the confirmation page. + * + * @since 1.8.7 + * + * @param array $confirmation Current confirmation data. + * @param array $form_data Form data and settings. + * @param array $fields Sanitized field data. + * @param int $entry_id Entry id. + */ + public function order_summary_confirmation( array $confirmation, array $form_data, array $fields, int $entry_id ): void { + + if ( empty( $confirmation['message_order_summary'] ) ) { + return; + } + + $total_exists = false; + + foreach ( $fields as $field ) { + if ( $field['type'] !== $this->type ) { + continue; + } + + $total_exists = true; + + break; + } + + // Check if the total field exists on the form. + if ( ! $total_exists ) { + return; + } + + echo '
              '; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_process_smart_tags( '{order_summary}', $form_data, $fields, $entry_id, 'payment-total-order-summary-confirmation' ); + echo '
              '; + } + + /** + * Calculates the total amount for a single payment field based on its price and quantity. + * + * @since 1.9.5 + * + * @param array $field The payment field data containing the price. + * @param int $quantity The quantity of the field specified. + * + * @return float|int The calculated total amount for the payment field. + */ + private function get_payment_field_single_amount( array $field, int $quantity ) { + + if ( empty( $field['price'] ) ) { + return 0; + } + + return wpforms_sanitize_amount( $field['price'] ) * $quantity; + } + + /** + * Determines if a field is conditionally hidden based on its settings and conditions. + * + * Note: This is a simplified implementation that assumes fields with 'show' conditional + * logic are hidden by default, without evaluating the actual conditions. This approach + * was chosen to avoid complex condition evaluation during form rendering. + * + * @since 1.9.5 + * + * @param array $field Field data, including conditional logic settings. + * + * @return bool True if the field is conditionally hidden, false otherwise. + */ + private function is_conditionally_hidden( array $field ): bool { + + return wpforms()->is_pro() && + wpforms_conditional_logic_fields()->field_is_conditional( $field ) && + ( $field['conditional_type'] ?? '' ) === 'show'; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Phone/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Phone/Field.php new file mode 100755 index 00000000..190826b9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Phone/Field.php @@ -0,0 +1,235 @@ +name = esc_html__( 'Phone', 'wpforms-lite' ); + $this->keywords = esc_html__( 'telephone, mobile, cell', 'wpforms-lite' ); + $this->type = 'phone'; + $this->icon = 'fa-phone'; + $this->order = 50; + $this->group = 'fancy'; + + $this->default_settings = [ + 'format' => 'smart', + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + + /** + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Format. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'format', + 'value' => esc_html__( 'Format', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select format for the phone form field', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'format', + 'value' => ! empty( $field['format'] ) ? esc_attr( $field['format'] ) : 'smart', + 'options' => [ + 'smart' => esc_html__( 'Smart', 'wpforms-lite' ), + 'us' => esc_html__( 'US', 'wpforms-lite' ), + 'international' => esc_html__( 'International', 'wpforms-lite' ), + ], + ], + false + ); + + $args = [ + 'slug' => 'format', + 'content' => $lbl . $fld, + ]; + + $this->field_element( 'row', $field, $args ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide Label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Define data. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + $format = ! empty( $field['format'] ) ? $field['format'] : 'smart'; + $size = ! empty( $field['size'] ) ? $field['size'] : 'medium'; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Primary input inside container for Smart format preview. + printf( + '
              + +
              +
              +
              +
              +
              ', + esc_attr( $format ), + esc_attr( $placeholder ), + esc_attr( $default_value ), + esc_attr( $size ) + ); + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Get a preview option. + * + * @since 1.9.4 + * + * @param string $option Option name. + * @param array $field Field data. + * @param array $args Additional arguments. + * @param bool $do_echo Echo or return. + */ + public function field_preview_option( $option, $field, $args = [], $do_echo = true ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.echoFound + + // Skip preview option for the editor. + if ( wpforms_is_editor_page() ) { + return; + } + + parent::field_preview_option( $option, $field, $args, $do_echo ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Rating/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Rating/Field.php new file mode 100755 index 00000000..a72e4e32 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Rating/Field.php @@ -0,0 +1,608 @@ + '#e27730', + 'modern' => '#066aab', + ]; + + /** + * Primary class constructor. + * + * @since 1.9.4 + */ + public function init() { + + // Define field type information. + $this->name = esc_html__( 'Rating', 'wpforms-lite' ); + $this->keywords = esc_html__( 'review, emoji, star', 'wpforms-lite' ); + $this->type = 'rating'; + $this->icon = 'fa-star'; + $this->order = 310; + $this->group = 'fancy'; + + $this->default_settings = [ + 'icon_color' => $this->get_default_icon_color(), + ]; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks(): void { + + add_action( 'wpforms_builder_enqueues', [ $this, 'builder_enqueues' ] ); + } + + /** + * Builder enqueues. + * + * @since 1.9.8 + */ + public function builder_enqueues(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-rating-field', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/fields/rating{$min}.js", + [ 'wpforms-builder', 'wpforms-utils' ], + WPFORMS_VERSION, + false + ); + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * + * @noinspection PackedHashtableOptimizationInspection + */ + public function field_options( $field ) { + + /** + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Scale. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'scale', + 'value' => esc_html__( 'Scale', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select rating scale', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'scale', + 'value' => ! empty( $field['scale'] ) ? esc_attr( $field['scale'] ) : '5', + 'options' => [ + '2' => '2', + '3' => '3', + '4' => '4', + '5' => '5', + '6' => '6', + '7' => '7', + '8' => '8', + '9' => '9', + '10' => '10', + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'scale', + 'content' => $lbl . $fld, + ] + ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'close', + ] + ); + + /* + * Advanced field options. + */ + + // Options open markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'open', + ] + ); + + // Icon. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'icon', + 'value' => esc_html__( 'Icon', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select icon to display', 'wpforms-lite' ), + ], + false + ); + + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'icon', + 'value' => ! empty( $field['icon'] ) ? esc_attr( $field['icon'] ) : 'star', + 'options' => [ + 'star' => esc_html__( 'Star', 'wpforms-lite' ), + 'heart' => esc_html__( 'Heart', 'wpforms-lite' ), + 'thumb' => esc_html__( 'Thumb', 'wpforms-lite' ), + 'smiley' => esc_html__( 'Smiley Face', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'icon', + 'content' => $lbl . $fld, + ] + ); + + // Icon size. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'icon_size', + 'value' => esc_html__( 'Icon Size', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the size of the rating icon', 'wpforms-lite' ), + ], + false + ); + $fld = $this->field_element( + 'select', + $field, + [ + 'slug' => 'icon_size', + 'value' => ! empty( $field['icon_size'] ) ? esc_attr( $field['icon_size'] ) : 'medium', + 'options' => [ + 'small' => esc_html__( 'Small', 'wpforms-lite' ), + 'medium' => esc_html__( 'Medium', 'wpforms-lite' ), + 'large' => esc_html__( 'Large', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'icon_size', + 'content' => $lbl . $fld, + ] + ); + + $this->score_labels( $field ); + + // Icon color picker. + $lbl = $this->field_element( + 'label', + $field, + [ + 'slug' => 'icon_color', + 'value' => esc_html__( 'Icon Color', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the color for the rating icon', 'wpforms-lite' ), + ], + false + ); + + $icon_color = isset( $field['icon_color'] ) ? wpforms_sanitize_hex_color( $field['icon_color'] ) : ''; + $icon_color = empty( $icon_color ) ? $this->get_default_icon_color() : $icon_color; + + $fld = $this->field_element( + 'color', + $field, + [ + 'slug' => 'icon_color', + 'value' => $icon_color, + 'data' => [ + 'fallback-color' => $icon_color, + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'icon_color', + 'content' => $lbl . $fld, + 'class' => 'color-picker-row', + ] + ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $this->field_option( + 'advanced-options', + $field, + [ + 'markup' => 'close', + ] + ); + } + + /** + * Score labels. + * + * @since 1.9.8 + * + * @param array $field Field settings. + */ + private function score_labels( array $field ): void { + + // Lowest score label. + $lowest_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'lowest_label', + 'value' => esc_html__( 'Lowest Score Label', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'This label indicates the lowest score on the scale.', 'wpforms-lite' ), + ], + false + ); + + $lowest_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'lowest_label', + 'value' => $field['lowest_label'] ?? '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'lowest_label', + 'content' => $lowest_label . $lowest_field, + ] + ); + + // Highest score label. + $highest_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'highest_label', + 'value' => esc_html__( 'Highest Score Label', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'This label indicates the highest score on the scale.', 'wpforms-lite' ), + ], + false + ); + + $highest_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'highest_label', + 'value' => $field['highest_label'] ?? '', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'highest_label', + 'content' => $highest_label . $highest_field, + ] + ); + + // Label position. + $label_position = $this->field_element( + 'label', + $field, + [ + 'slug' => 'label_position', + 'value' => esc_html__( 'Label Position', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the position of the label', 'wpforms-lite' ), + ], + false + ); + + $select_position = $this->field_element( + 'select', + $field, + [ + 'slug' => 'label_position', + 'value' => ! empty( $field['label_position'] ) ? esc_attr( $field['label_position'] ) : 'below', + 'options' => [ + 'above' => esc_html__( 'Above', 'wpforms-lite' ), + 'below' => esc_html__( 'Below', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'label_position', + 'content' => $label_position . $select_position, + ] + ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field settings. + */ + public function field_preview( $field ): void { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + echo '
              '; + + $this->get_field_preview_icons( $field ); + + $this->get_field_preview_labels( $field ); + + echo '
              '; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Get field preview icons. + * + * @since 1.9.8 + * + * @param array $field Field settings. + */ + private function get_field_preview_icons( array $field ): void { + + // Define data. + $scale = ! empty( $field['scale'] ) ? esc_attr( $field['scale'] ) : 5; + $icon = ! empty( $field['icon'] ) ? esc_attr( $field['icon'] ) : 'star'; + $icon_size = ! empty( $field['icon_size'] ) ? esc_attr( $field['icon_size'] ) : 'medium'; + $icon_color = ! empty( $field['icon_color'] ) ? esc_attr( $field['icon_color'] ) : $this->get_default_icon_color(); + $icon_class = $this->get_preview_icon_class( $icon ); + + // Set icon size. + $icon_size_css = $this->get_icon_size_css( $icon_size ); + + echo '
              '; + + // Primary input. + for ( $i = 1; $i <= 10; $i++ ) { + printf( + '', + esc_attr( $icon_class ), + esc_attr( $icon_size ), + esc_attr( $icon_color ), + $i <= $scale ? 'inline-block' : 'none', + esc_attr( $icon_size_css ) + ); + } + + echo '
              '; + } + + /** + * Get preview icon class based on the selected icon. + * + * @since 1.9.8 + * + * @param string $icon Selected icon. + * + * @return string Icon class. + */ + private function get_preview_icon_class( string $icon ): string { + + $icon_class = ''; + + // Set icon class. + switch ( $icon ) { + case 'star': + $icon_class = 'fa-star'; + break; + + case 'heart': + $icon_class = 'fa-heart'; + break; + + case 'thumb': + $icon_class = 'fa-thumbs-up'; + break; + + case 'smiley': + $icon_class = 'fa-smile-o'; + break; + } + + return $icon_class; + } + + /** + * Get field preview labels. + * + * @since 1.9.8 + * + * @param array $field Field settings. + */ + private function get_field_preview_labels( array $field ): void { + + // Lowest score label. + $lowest_label = ! empty( $field['lowest_label'] ) ? esc_html( $field['lowest_label'] ) : ''; + + // Highest score label. + $highest_label = ! empty( $field['highest_label'] ) ? esc_html( $field['highest_label'] ) : ''; + + $class = [ 'wpforms-rating-field-labels' ]; + + if ( ! empty( $field['label_position'] ) && $field['label_position'] === 'above' ) { + $class[] = 'wpforms-rating-field-labels-position-above'; + } + + if ( empty( $lowest_label ) && empty( $highest_label ) ) { + $class[] = 'wpforms-hidden'; + } + + echo '
              '; + + printf( + '%s', + esc_html( $lowest_label ) + ); + + printf( + '%s', + esc_html( $highest_label ) + ); + + echo '
              '; + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field settings. + * @param array $deprecated Deprecated, don't use. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } + + /** + * Get icon size CSS value in pixels. + * + * @since 1.9.4 + * + * @param string $icon_size Icon size value. + */ + protected function get_icon_size_css( $icon_size ): string { + + $render_engine = wpforms_get_render_engine(); + + $icon_sizes = [ + 'classic' => [ + 'small' => '18', + 'medium' => '28', + 'large' => '38', + ], + 'modern' => [ + 'small' => '16', + 'medium' => '24', + 'large' => '38', + ], + ]; + + $default = $render_engine === 'modern' ? '24' : '28'; + + return ! empty( $icon_sizes[ $render_engine ][ $icon_size ] ) + ? $icon_sizes[ $render_engine ][ $icon_size ] + : $default; + } + + /** + * Get default icon color. + * + * @since 1.9.4 + * + * @return string + */ + public function get_default_icon_color(): string { + + $render_engine = wpforms_get_render_engine(); + + return array_key_exists( $render_engine, self::DEFAULT_ICON_COLOR ) ? self::DEFAULT_ICON_COLOR[ $render_engine ] : self::DEFAULT_ICON_COLOR['modern']; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Richtext/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Richtext/Field.php new file mode 100755 index 00000000..6dbbd480 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Richtext/Field.php @@ -0,0 +1,204 @@ +name = esc_html__( 'Rich Text', 'wpforms-lite' ); + $this->keywords = esc_html__( 'image, text, table, list, heading, wysiwyg, visual', 'wpforms-lite' ); + $this->type = 'richtext'; + $this->icon = 'fa-pencil-square-o'; + $this->order = 170; + $this->group = 'fancy'; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + public function field_options( $field ) { + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + $this->field_option( 'label', $field ); + $this->field_option( 'description', $field ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'media_enabled', + 'content' => $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'media_enabled', + 'value' => isset( $field['media_enabled'] ) ? '1' : '0', + 'desc' => esc_html__( 'Allow Media Uploads', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to allow uploading and embedding files.', 'wpforms-lite' ), + ], + false + ), + ] + ); + + $media_library = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'media_library', + 'value' => isset( $field['media_library'] ) ? '1' : '0', + 'desc' => esc_html__( 'Store files in WordPress Media Library', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to store files in the WordPress Media Library.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'media_controls', + 'class' => ! isset( $field['media_enabled'] ) ? 'wpforms-hide' : '', + 'content' => $media_library, + ] + ); + + $this->field_option( 'required', $field ); + $this->field_option( 'basic-options', $field, [ 'markup' => 'close' ] ); + + $this->field_option( 'advanced-options', $field, [ 'markup' => 'open' ] ); + + $output_style = $this->field_element( + 'label', + $field, + [ + 'slug' => 'style', + 'value' => esc_html__( 'Field Style', 'wpforms-lite' ), + ], + false + ); + + $output_style .= $this->field_element( + 'select', + $field, + [ + 'slug' => 'style', + 'value' => ! empty( $field['style'] ) ? esc_attr( $field['style'] ) : 'full', + 'options' => [ + 'full' => esc_html__( 'Full', 'wpforms-lite' ), + 'basic' => esc_html__( 'Basic', 'wpforms-lite' ), + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'style', + 'content' => $output_style, + ] + ); + + $this->field_option( 'size', $field ); + $this->field_option( 'css', $field ); + $this->field_option( 'label_hide', $field ); + $this->field_option( 'advanced-options', $field, [ 'markup' => 'close' ] ); + } + + /** + * The field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + public function field_preview( $field ) { + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + $style = ! empty( $field['style'] ) && $field['style'] === 'basic' ? 'wpforms-field-richtext-toolbar-basic' : ''; + $media_enabled = ! empty( $field['media_enabled'] ) ? 'wpforms-field-richtext-media-enabled' : ''; + ?> + +
              +
              + + +
              +
              +
              +
              +
              + +
              + +
              +
              +
              + + field_preview_option( 'description', $field ); + } + + /** + * The field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Field attributes. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/AccessRestrictionsTrait.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/AccessRestrictionsTrait.php new file mode 100755 index 00000000..ccaa3f82 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/AccessRestrictionsTrait.php @@ -0,0 +1,613 @@ +field_element( + 'toggle', + $field, + [ + 'slug' => 'is_restricted', + 'value' => ! empty( $field['is_restricted'] ) ? 1 : '', + 'desc' => esc_html__( 'Enable File Access Restrictions', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Choose who can access the uploaded files.', 'wpforms-lite' ), + 'class' => $this->get_access_restrictions_toggle_class(), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'access_restrictions', + 'attrs' => $this->get_access_restrictions_options_attrs(), + 'content' => $access_restrictions, + ] + ); + + // User Restriction. + $this->user_restriction_options( $field ); + + // Password Protection. + $this->password_protection_options( $field ); + } + + /** + * Get access restrictions toggle class. + * + * @since 1.9.8 + * + * @return string + */ + protected function get_access_restrictions_toggle_class(): string { + + return 'wpforms-file-upload-access-restrictions'; + } + + /** + * Get access restrictions options attributes. + * + * @since 1.9.8 + * + * @return array + */ + protected function get_access_restrictions_options_attrs(): array { + + return []; + } + + /** + * Add user restrictions options to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function user_restriction_options( array $field ) { + + $user_restrictions_value = $this->get_user_restrictions_value( $field ); + + $this->add_user_restrictions_select( $field, $user_restrictions_value ); + + $hide_user_restrictions = $this->should_hide_user_restrictions( $user_restrictions_value, $field ); + + $this->add_user_roles_restrictions( $field, $hide_user_restrictions ); + $this->add_user_names_restrictions( $field, $hide_user_restrictions ); + } + + /** + * Get user restrictions value. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * + * @return string + */ + private function get_user_restrictions_value( array $field ): string { + + return ! empty( $field['user_restrictions'] ) ? $field['user_restrictions'] : 'none'; + } + + /** + * Add user restrictions select to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * @param string $user_restrictions_value User restrictions value. + */ + private function add_user_restrictions_select( array $field, string $user_restrictions_value ) { + + $label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'user_restrictions', + 'value' => esc_html__( 'User Restriction', 'wpforms-lite' ), + ], + false + ); + + $select = $this->field_element( + 'select', + $field, + [ + 'slug' => 'user_restrictions', + 'value' => $user_restrictions_value, + 'options' => [ + 'none' => esc_html__( 'None', 'wpforms-lite' ), + 'logged' => esc_html__( 'Logged-in Users', 'wpforms-lite' ), + ], + 'class' => 'wpforms-file-upload-user-restrictions', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'user_restrictions', + 'content' => $label . $select, + 'class' => $this->is_restricted( $field ) ? '' : 'wpforms-hidden', + ] + ); + } + + /** + * Check if user restrictions should be hidden. + * + * @since 1.9.8 + * + * @param string $user_restrictions_value User restrictions value. + * @param array $field Field data and settings. + * + * @return bool + */ + private function should_hide_user_restrictions( string $user_restrictions_value, array $field ): bool { + + return $user_restrictions_value === 'none' || ! $this->is_restricted( $field ); + } + + /** + * Add user roles restrictions to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * @param bool $hide_user_restrictions Should user restrictions be hidden. + */ + private function add_user_roles_restrictions( array $field, bool $hide_user_restrictions ) { + + $label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'user_roles_restrictions', + 'value' => esc_html__( 'User Roles', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the user roles that can access the uploaded files.', 'wpforms-lite' ), + ], + false + ); + + $select = $this->field_element( + 'select-multiple', + $field, + [ + 'slug' => 'user_roles_restrictions', + 'value' => $this->get_selected_roles( $field ), + 'desc' => esc_html__( 'All users with selected roles will be able to access the uploaded files.', 'wpforms-lite' ), + 'options' => $this->get_user_roles(), + 'choicesjs' => false, + 'class' => 'wpforms-file-upload-user-roles-select', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'user_roles_restrictions', + 'content' => $label . $select, + 'class' => $hide_user_restrictions ? 'wpforms-hidden' : '', + ] + ); + } + + /** + * Get selected roles. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * + * @return array + */ + private function get_selected_roles( array $field ): array { + + $selected_roles = ! empty( $field['user_roles_restrictions'] ) ? json_decode( $field['user_roles_restrictions'], true ) : []; + + array_unshift( $selected_roles, 'administrator' ); + + return array_unique( $selected_roles ); + } + + /** + * Get user roles. + * + * @since 1.9.8 + * + * @return array + */ + private function get_user_roles(): array { + + if ( empty( $this->user_roles ) ) { + $roles = get_editable_roles(); + + $this->user_roles = array_map( + static function ( $item ) { + + return $item['name']; + }, + $roles + ); + } + + return $this->user_roles; + } + + /** + * Add user names restrictions to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * @param bool $hide_user_restrictions Should user restrictions be hidden. + */ + private function add_user_names_restrictions( array $field, bool $hide_user_restrictions ) { + + $label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'user_names_restrictions', + 'value' => esc_html__( 'Users', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the users that can access the uploaded files.', 'wpforms-lite' ), + ], + false + ); + + $select = $this->field_element( + 'select-multiple', + $field, + [ + 'slug' => 'user_names_restrictions', + 'value' => array_map( 'intval', $this->get_user_ids( $field ) ), + 'options' => $this->get_user_list( $field ), + 'choicesjs' => false, + 'class' => 'wpforms-file-upload-user-names-select', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'user_names_restrictions', + 'content' => $label . $select, + 'class' => $hide_user_restrictions ? 'wpforms-hidden' : '', + ] + ); + } + + /** + * Get user ids. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * + * @return array + */ + private function get_user_ids( array $field ): array { + + return ! empty( $field['user_names_restrictions'] ) ? json_decode( $field['user_names_restrictions'], true ) : []; + } + + /** + * Get user list. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * + * @return array + */ + private function get_user_list( array $field ): array { + + $user_ids = $this->get_user_ids( $field ); + + return $this->get_selected_users( $user_ids ); + } + + /** + * Get selected users. + * + * @since 1.9.8 + * + * @param array $user_ids User IDs. + * + * @return array + */ + private function get_selected_users( array $user_ids ): array { + + $selected_users = []; + + if ( ! empty( $user_ids ) ) { + $users = get_users( + [ + 'include' => $user_ids, + 'fields' => [ 'ID', 'display_name' ], + 'orderby' => 'include', + ] + ); + + $selected_users = wp_list_pluck( $users, 'display_name', 'ID' ); + } + + return $selected_users; + } + + /** + * Add password protection options to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function password_protection_options( array $field ) { + + $this->add_password_toggle( $field ); + $this->add_password_label( $field ); + $this->add_password_fields( $field ); + } + + /** + * Add password toggle to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_password_toggle( array $field ) { + + $password = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'is_protected', + 'value' => ! empty( $field['is_protected'] ) ? 1 : '', + 'desc' => esc_html__( 'Password Protection', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to password protect the uploaded files.', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-password-restrictions', + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'password_restrictions', + 'content' => $password, + 'class' => $this->is_restricted( $field ) ? '' : 'wpforms-hidden', + ] + ); + } + + /** + * Add password label to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_password_label( array $field ) { + + $password_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'protection_password_label', + 'value' => esc_html__( 'Password', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Set a password to protect the uploaded files.', 'wpforms-lite' ), + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'protection_password_label', + 'content' => $password_label, + 'class' => $this->is_protected( $field ) ? '' : 'wpforms-hidden', + ] + ); + } + + /** + * Add password fields to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_password_fields( array $field ) { + + $password_field_row = $this->get_password_field( $field ); + $password_confirm_field_row = $this->get_password_confirm_field( $field ); + + $password_columns = $this->field_element( + 'row', + $field, + [ + 'content' => $password_field_row . $password_confirm_field_row, + 'class' => [ + 'wpforms-field-options-columns', + ], + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'protection_password_columns', + 'content' => $password_columns, + 'class' => $this->is_protected( $field ) ? '' : 'wpforms-hidden', + ] + ); + } + + /** + * Add password field to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function get_password_field( array $field ): string { + + $clean_button = $this->field_element( + 'button', + $field, + [ + 'slug' => 'password_restrictions_clean_button', + 'value' => '', + 'class' => [ + 'wpforms-file-upload-password-clean', + 'wpforms-hidden', + ], + 'data' => [ + 'field-id' => $field['id'], + ], + 'attrs' => [ + 'tabindex' => '-1', + ], + ], + false + ); + + $password_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'protection_password', + 'value' => ! empty( $field['protection_password'] ) ? $field['protection_password'] : '', + 'after' => esc_html__( 'Enter Password', 'wpforms-lite' ), + 'type' => 'password', + 'class' => 'wpforms-file-upload-password', + 'attrs' => [ + 'autocomplete' => 'new-password', + ], + ], + false + ); + + return $this->field_element( + 'row', + $field, + [ + 'slug' => 'protection_password', + 'content' => $password_field . $clean_button, + ], + false + ); + } + + /** + * Add password confirm field to the field. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function get_password_confirm_field( array $field ): string { + + $password_confirm_field = $this->field_element( + 'text', + $field, + [ + 'slug' => 'protection_password_confirm', + 'value' => ! empty( $field['protection_password_confirm'] ) ? $field['protection_password_confirm'] : '', + 'after' => esc_html__( 'Confirm Password', 'wpforms-lite' ), + 'type' => 'password', + 'class' => 'wpforms-file-upload-password-confirm', + ], + false + ); + + $password_confirm_field_error = $this->field_element( + 'row', + $field, + [ + 'slug' => 'protection_password_confirm_error', + 'content' => esc_html__( 'Passwords do not match', 'wpforms-lite' ), + 'class' => [ + 'wpforms-hidden', + 'wpforms-error', + 'wpforms-error-message', + ], + ], + false + ); + + return $this->field_element( + 'row', + $field, + [ + 'slug' => 'protection_password_confirm', + 'content' => $password_confirm_field . $password_confirm_field_error, + ], + false + ); + } + + /** + * Check if the field has access restrictions enabled. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * + * @return bool True if the field has access restrictions enabled, false otherwise. + */ + private function is_restricted( array $field ): bool { + + return ! empty( $field['is_restricted'] ); + } + + /** + * Check if the field has password protection enabled. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + * + * @return bool True if the field has password protection enabled, false otherwise. + */ + private function is_protected( array $field ): bool { + + return ! empty( $field['is_protected'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/CameraTrait.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/CameraTrait.php new file mode 100755 index 00000000..f4ec106b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/CameraTrait.php @@ -0,0 +1,384 @@ +add_camera_enabled_toggle( $field ); + $this->add_camera_format_options( $field ); + $this->add_camera_aspect_ratio_options( $field ); + $this->add_camera_custom_ratio_options( $field ); + $this->add_camera_time_limit_options( $field ); + } + + /** + * Add camera-enabled toggle. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_camera_enabled_toggle( array $field ): void { + + // Check if this is a Camera field (not FileUpload with camera options). + $is_camera_field = $this->type === 'camera'; + + $camera_enabled = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'camera_enabled', + 'value' => $this->is_camera_enabled_for_field( $field ) ? 1 : '', + 'desc' => esc_html__( 'Enable Camera', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Check this option to enable the camera field.', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-enabled-toggle', + ], + false + ); + + // Hide the toggle for the Camera field, show for FileUpload field. + $row_class = [ 'wpforms-file-upload-camera-enabled-row' ]; + + if ( $is_camera_field ) { + $row_class[] = 'wpforms-hidden'; + } + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'camera', + 'content' => $camera_enabled, + 'class' => $row_class, + ] + ); + } + + /** + * Add camera format options. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_camera_format_options( array $field ): void { + + $format_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'camera_format', + 'value' => esc_html__( 'Format', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the camera format.', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-format-label', + ], + false + ); + + $format_select = $this->field_element( + 'select', + $field, + [ + 'slug' => 'camera_format', + 'value' => ! empty( $field['camera_format'] ) ? $field['camera_format'] : 'photo', + 'options' => [ + 'photo' => esc_html__( 'Photo', 'wpforms-lite' ), + 'video' => esc_html__( 'Video', 'wpforms-lite' ), + ], + 'class' => 'wpforms-file-upload-camera-format-select', + ], + false + ); + + // Check if the camera is enabled to determine visibility. + $hidden_class = $this->is_camera_enabled_for_field( $field ) ? [] : [ 'wpforms-hidden' ]; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'camera_format', + 'content' => $format_label . $format_select, + 'class' => array_merge( [ 'wpforms-file-upload-camera-format' ], $hidden_class ), + ] + ); + } + + /** + * Add camera aspect ratio options. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_camera_aspect_ratio_options( array $field ): void { + + $aspect_ratio_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'camera_aspect_ratio', + 'value' => esc_html__( 'Aspect Ratio', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Select the camera aspect ratio.', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-aspect-ratio-label', + ], + false + ); + + // Build aspect ratio options - always include freeform. + $aspect_ratio_options = [ + 'original' => esc_html__( 'Original', 'wpforms-lite' ), + 'custom' => esc_html__( 'Custom', 'wpforms-lite' ), + 'freeform' => esc_html__( 'Freeform', 'wpforms-lite' ), + 'landscape' => [ + 'optgroup' => esc_html__( 'Landscape orientation', 'wpforms-lite' ), + '16:9' => esc_html__( '16:9', 'wpforms-lite' ), + '5:4' => esc_html__( '5:4', 'wpforms-lite' ), + '3:2' => esc_html__( '3:2', 'wpforms-lite' ), + ], + 'portrait' => [ + 'optgroup' => esc_html__( 'Portrait orientation', 'wpforms-lite' ), + '9:16' => esc_html__( '9:16', 'wpforms-lite' ), + '4:5' => esc_html__( '4:5', 'wpforms-lite' ), + '2:3' => esc_html__( '2:3', 'wpforms-lite' ), + ], + ]; + + // Add class to hide freeform if a format is not a photo. + $camera_format = ! empty( $field['camera_format'] ) ? $field['camera_format'] : 'photo'; + $aspect_ratio_class = [ 'wpforms-file-upload-camera-aspect-ratio-select' ]; + + if ( $camera_format !== 'photo' ) { + $aspect_ratio_class[] = 'wpforms-file-upload-camera-aspect-ratio-no-freeform'; + } + + $aspect_ratio_select = $this->field_element( + 'select', + $field, + [ + 'slug' => 'camera_aspect_ratio', + 'value' => ! empty( $field['camera_aspect_ratio'] ) ? $field['camera_aspect_ratio'] : 'original', + 'options' => $aspect_ratio_options, + 'class' => $aspect_ratio_class, + ], + false + ); + + // Check if the camera is enabled to determine visibility. + $hidden_class = $this->is_camera_enabled_for_field( $field ) ? [] : [ 'wpforms-hidden' ]; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'camera_aspect_ratio', + 'content' => $aspect_ratio_label . $aspect_ratio_select, + 'class' => array_merge( [ 'wpforms-file-upload-camera-aspect-ratio' ], $hidden_class ), + ] + ); + } + + /** + * Add camera custom ratio options. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_camera_custom_ratio_options( array $field ): void { + + // Check if an aspect ratio is custom to determine visibility. + $camera_aspect_ratio = ! empty( $field['camera_aspect_ratio'] ) ? $field['camera_aspect_ratio'] : 'original'; + $custom_ratio_hidden_class = ( $this->is_camera_enabled_for_field( $field ) && $camera_aspect_ratio === 'custom' ) ? [] : [ 'wpforms-hidden' ]; + + // Ratio Width field. + $ratio_width_field = '
              ' . $this->field_element( + 'text', + $field, + [ + 'slug' => 'camera_ratio_width', + 'type' => 'number', + 'value' => ! empty( $field['camera_ratio_width'] ) && $field['camera_ratio_width'] >= 1 ? $field['camera_ratio_width'] : '4', + 'attrs' => [ + 'min' => 1, + 'step' => 1, + ], + 'after' => esc_html__( 'Ratio Width', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-ratio-width-input', + ], + false + ) . '
              '; + + // Ratio Height field. + $ratio_height_field = '
              ' . $this->field_element( + 'text', + $field, + [ + 'slug' => 'camera_ratio_height', + 'type' => 'number', + 'value' => ! empty( $field['camera_ratio_height'] ) && $field['camera_ratio_height'] >= 1 ? $field['camera_ratio_height'] : '3', + 'attrs' => [ + 'min' => 1, + 'step' => 1, + ], + 'after' => esc_html__( 'Ratio Height', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-ratio-height-input', + ], + false + ) . '
              '; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'camera_custom_ratio', + 'content' => '
              ' . $ratio_width_field . $ratio_height_field . '
              ', + 'class' => array_merge( [ 'wpforms-file-upload-camera-custom-ratio' ], $custom_ratio_hidden_class ), + ] + ); + } + + /** + * Add camera time limit options. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function add_camera_time_limit_options( array $field ): void { + + $time_limit_label = $this->field_element( + 'label', + $field, + [ + 'slug' => 'camera_time_limit', + 'value' => esc_html__( 'Time Limit', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Set the time limit for camera recording.', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-time-limit-label', + ], + false + ); + + // Minutes field. + $minutes_field = '
              ' . $this->field_element( + 'text', + $field, + [ + 'slug' => 'camera_time_limit_minutes', + 'type' => 'number', + 'value' => ! empty( $field['camera_time_limit_minutes'] ) && $field['camera_time_limit_minutes'] >= 0 ? $field['camera_time_limit_minutes'] : '1', + 'attrs' => [ + 'min' => 0, + 'step' => 1, + ], + 'after' => esc_html__( 'Minutes', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-time-limit-minutes-input', + ], + false + ) . '
              '; + + // Seconds field. + $seconds_field = '
              ' . $this->field_element( + 'text', + $field, + [ + 'slug' => 'camera_time_limit_seconds', + 'type' => 'number', + 'value' => ! empty( $field['camera_time_limit_seconds'] ) && $field['camera_time_limit_seconds'] >= 0 && $field['camera_time_limit_seconds'] <= 59 ? $field['camera_time_limit_seconds'] : '30', + 'attrs' => [ + 'min' => 0, + 'max' => 59, + 'step' => 1, + ], + 'after' => esc_html__( 'Seconds', 'wpforms-lite' ), + 'class' => 'wpforms-file-upload-camera-time-limit-seconds-input', + ], + false + ) . '
              '; + + // Check if a format is video to determine time limit visibility. + $camera_format = ! empty( $field['camera_format'] ) ? $field['camera_format'] : 'photo'; + $time_limit_hidden_class = ( $this->is_camera_enabled_for_field( $field ) && $camera_format === 'video' ) ? [] : [ 'wpforms-hidden' ]; + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'camera_time_limit', + 'content' => $time_limit_label . '
              ' . $minutes_field . $seconds_field . '
              ', + 'class' => array_merge( [ 'wpforms-file-upload-camera-time-limit' ], $time_limit_hidden_class ), + ] + ); + } + + /** + * Whether the provided form has a camera field. + * + * @since 1.9.8 + * + * @param array|mixed $form Form data. + */ + protected function is_camera_enabled( $form ): bool { + + if ( empty( $form['fields'] ) ) { + return false; + } + + foreach ( $form['fields'] as $field ) { + if ( ! empty( $field['camera_enabled'] ) ) { + return true; + } + } + + return false; + } + + /** + * Whether the field is a camera field or has camera enabled. + * + * @since 1.9.8 + * + * @param array $field Field data and settings. + */ + private function is_camera_enabled_for_field( array $field ): bool { + + return $this->type === 'camera' || ! empty( $field['camera_enabled'] ); + } + + /** + * Get the camera time limit in seconds. + * + * @since 1.9.8 + * + * @param array $field Field data. + * + * @return int Camera time limit in seconds. + */ + public function get_camera_time_limit( array $field ): int { + + $field = wp_parse_args( + $field, + [ + 'camera_enabled' => false, + 'camera_format' => '', + 'camera_time_limit_minutes' => 0, + 'camera_time_limit_seconds' => 0, + ] + ); + + if ( empty( $field['camera_enabled'] ) || $field['camera_format'] !== 'video' ) { + return 0; + } + + return absint( $field['camera_time_limit_minutes'] ) * 60 + absint( $field['camera_time_limit_seconds'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ContentInput.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ContentInput.php new file mode 100755 index 00000000..e758418f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ContentInput.php @@ -0,0 +1,588 @@ +content_input_hooks(); + parent::__construct( $init ); + } + + /** + * Register hooks. + * + * @since 1.9.4 + */ + private function content_input_hooks(): void { + + add_action( 'wpforms_builder_enqueues', [ $this, 'builder_enqueues' ] ); + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'content_editor_tools_template' ] ); + add_filter( 'wpforms_builder_field_option_class', [ $this, 'builder_field_option_class' ], 10, 2 ); + add_filter( 'wpforms_builder_strings', [ $this, 'content_builder_strings' ], 10, 2 ); + add_filter( 'editor_stylesheets', [ $this, 'editor_stylesheets' ] ); + add_filter( 'media_view_strings', [ $this, 'edit_media_view_strings' ], 10, 2 ); + add_filter( 'teeny_mce_buttons', [ $this, 'teeny_mce_buttons' ], 10, 2 ); + } + + /** + * Content field option. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + */ + private function field_option_content( array $field ): void { + + $value = ( isset( $field['content'] ) && ! wpforms_is_empty_string( $field['content'] ) ) ? wp_kses( $field['content'], $this->get_allowed_html_tags() ) : ''; + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => 'content', + 'content' => $this->get_content_editor( $value, $field ), + ], + false + ); + $output .= wpforms_render( + 'fields/content/action-buttons', + [ + 'id' => $field['id'], + 'preview' => $this->get_input_string( 'preview' ), + 'expand' => $this->get_input_string( 'expand' ), + ], + true + ); + + printf( '
              %s
              ', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + /** + * Add class name to the field option top element. + * + * @since 1.9.4 + * + * @param string|mixed $css_class CSS classes. + * @param array $field Field data. + * + * @return string + */ + public function builder_field_option_class( $css_class, $field ): string { + + $css_class = (string) $css_class; + + return $this->type === $field['type'] ? $css_class . ' wpforms-field-has-tinymce' : $css_class; + } + + /** + * Localized strings for `content-field` JS script. + * + * @since 1.9.4 + * + * @param array|mixed $strings Localized strings. + * @param array $form The form element. + * + * @return array + * @noinspection PhpUnusedParameterInspection + */ + public function content_builder_strings( $strings, $form ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $strings = (array) $strings; + + $strings['content_field'] = [ + 'collapse' => wp_strip_all_tags( $this->get_input_string( 'collapse' ) ), + 'expand' => wp_strip_all_tags( $this->get_input_string( 'expand' ) ), + 'editor_default_value' => wp_kses( $this->get_input_string( 'editor_default_value' ), $this->get_allowed_html_tags() ), + 'content_editor_plugins' => $this->content_editor_plugins(), + 'content_editor_toolbar' => $this->content_editor_toolbar(), + 'content_editor_css_url' => $this->content_css_url(), + 'editor_height' => $this->get_editor_height(), + 'allowed_html' => array_keys( $this->get_allowed_html_tags() ), + 'invalid_elements' => $this->get_invalid_elements(), + 'quicktags_buttons' => $this->get_quicktags_buttons(), + 'body_class' => $this->get_editor_body_class(), + ]; + + return $this->add_supported_field_type( $strings, $this->type ); + } + + /** + * Add editor stylesheet. + * + * @since 1.9.4 + * + * @param array|mixed $stylesheets Editor stylesheets. + * + * @return array + */ + public function editor_stylesheets( $stylesheets ): array { + + $stylesheets = (array) $stylesheets; + + if ( wpforms_is_admin_page( 'builder' ) ) { + $stylesheets[] = $this->content_css_url(); + } + + return $stylesheets; + } + + /** + * Edit some media view strings to reference a form instead of a page/post. + * + * @since 1.9.4 + * + * @param array|mixed $strings List of media view strings. + * @param WP_Post $post Post object. + * + * @return array Modified media view strings. + * @noinspection SqlResolve + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function edit_media_view_strings( $strings, $post ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $strings = (array) $strings; + + if ( wpforms_is_admin_page( 'builder' ) ) { + $strings['insertIntoPost'] = esc_html__( /** @lang text */ 'Insert into form', 'wpforms-lite' ); + $strings['uploadedToThisPost'] = esc_html__( 'Uploaded to this form', 'wpforms-lite' ); + } + + return $strings; + } + + /** + * Remove fullscreen button if this is other tinymce editor instance than content field editor. + * + * @since 1.9.4 + * + * @param array|mixed $buttons Array of editor buttons. + * @param string $editor_id Editor textarea ID. + * + * @return array + */ + public function teeny_mce_buttons( $buttons, $editor_id ): array { + + $buttons = (array) $buttons; + + $is_other_editor = strpos( $editor_id, 'wpforms_panel_' ) === 0 || $editor_id === 'entry_note'; + $key = array_search( 'fullscreen', $buttons, true ); + + if ( $is_other_editor && $key !== false ) { + unset( $buttons[ $key ] ); + } + + return $buttons; + } + + /** + * Get default content editor plugins. + * + * @since 1.9.4 + * + * @return array Plugins array. + */ + private function content_editor_plugins(): array { + + $plugins = [ + 'charmap', + 'colorpicker', + 'hr', + 'link', + 'image', + 'lists', + 'paste', + 'tabfocus', + 'textcolor', + 'wordpress', + 'wpemoji', + 'wptextpattern', + 'wpeditimage', + ]; + + /** + * Get content editor plugins filter. + * + * @since 1.7.8 + * + * @param array $plugins Plugins array. + */ + return (array) apply_filters( 'wpforms_builder_content_input_get_content_editor_plugins', $plugins ); + } + + /** + * Get default content editor toolbar. + * + * @since 1.9.4 + * + * @return array Toolbar buttons array. + */ + private function content_editor_toolbar(): array { + + $toolbar = [ + 'formatselect', + 'bold', + 'italic', + 'underline', + 'strikethrough', + 'forecolor', + 'link', + 'bullist', + 'numlist', + 'blockquote', + 'alignleft', + 'aligncenter', + 'alignright', + ]; + + /** + * Get content editor toolbar buttons filter. + * + * @since 1.7.8 + * + * @param array $toolbar Toolbar buttons array. + */ + return (array) apply_filters( 'wpforms_builder_content_input_get_content_editor_toolbar', $toolbar ); + } + + /** + * Enqueue wpforms-content-field script. + * + * @since 1.9.4 + * + * @param string $view Current view. + * + * @noinspection PhpUnusedParameterInspection + */ + public function builder_enqueues( $view ): void { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + // Enqueue editor styles explicitly. Hack for broken styles when the Content field is deleted and Settings > Confirmation editor get broken. + // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion + wp_enqueue_style( + 'wpforms-editor-styles', + includes_url( 'css/editor.css' ) + ); + } + + /** + * Content editor tools template. + * + * @since 1.9.4 + */ + public function content_editor_tools_template(): void { + + ?> + + array_merge( $other_supported_field_types, [ $type ] ), + ]; + + return $strings; + } + + /** + * Get translatable string. + * + * @since 1.9.4 + * + * @param string $key String key. + * + * @return string + */ + private function get_input_string( $key ): string { + + if ( ! self::$translatable_strings ) { + self::$translatable_strings = [ + 'editor_default_value' => __( '

              Add Text and Images to Your Form With Ease

              To get started, replace this text with your own.

              ', 'wpforms-lite' ), + 'expand' => __( 'Expand Editor', 'wpforms-lite' ), + 'collapse' => __( 'Collapse Editor', 'wpforms-lite' ), + 'preview' => __( 'Update Preview', 'wpforms-lite' ), + ]; + } + + return self::$translatable_strings[ $key ] ?? ''; + } + + /** + * Show field preview in the right builder panel. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + private function content_input_preview( $field ): void { + + $content = $field['content'] ?? $this->get_input_string( 'editor_default_value' ); + ?> +
              + do_caption_shortcode( wpautop( $content ) ), $this->get_allowed_html_tags() ); ?> +
              +
              + true, + 'drag_drop_upload' => true, + 'textarea_name' => "fields[{$field['id']}][content]", + 'editor_height' => $this->get_editor_height(), + 'editor_class' => ! empty( $field['required'] ) ? 'wpforms-field-required' : '', + 'tinymce' => [ + 'init_instance_callback' => $this->is_disabled_field ? '' : 'wpformsContentFieldTinyMCECallback', + 'plugins' => implode( ',', $this->content_editor_plugins() ), + 'toolbar1' => implode( ',', $this->content_editor_toolbar() ), + 'invalid_elements' => $this->get_invalid_elements(), + 'relative_urls' => false, + 'remove_script_host' => false, + 'object_resizing' => false, + 'body_class' => $this->get_editor_body_class(), + ], + 'quicktags' => [ + 'buttons' => $this->get_quicktags_buttons(), + ], + ]; + + ob_start(); + wp_editor( $value, 'wpforms-field-option-' . $field['id'] . '-content', $settings ); + + return ob_get_clean(); + } + + /** + * Get invalid HTML in content editor. + * + * @since 1.9.4 + * + * @return string Invalid HTML elements. + */ + private function get_invalid_elements(): string { + + return 'form,input,textarea,select,option,script,embed,iframe'; + } + + /** + * Get the list of the `quicktags` buttons. + * + * @since 1.9.4 + * + * @return string Quicktags buttons. + */ + private function get_quicktags_buttons(): string { + + $quicktag_buttons = [ + 'strong', + 'em', + 'block', + 'del', + 'ins', + 'img', + 'ul', + 'ol', + 'li', + 'code', + 'link', + 'close', + ]; + + /** + * Get the list of the `quicktags` buttons filter. + * + * @since 1.7.8 + * + * @param string $quicktags_buttons Comma separated list of quicktags buttons. + */ + return implode( ',', apply_filters( 'wpforms_builder_content_input_get_quicktags_buttons', $quicktag_buttons ) ); + } + + /** + * Get content CSS url. + * + * @since 1.9.4 + * + * @return string + */ + private function content_css_url(): string { + + $min = wpforms_get_min_suffix(); + + return WPFORMS_PLUGIN_URL . "assets/css/builder/content-editor{$min}.css"; + } + + /** + * Get content editor height. + * + * @since 1.9.4 + * + * @retun int Editor textarea height. + */ + private function get_editor_height(): int { + + /** + * Get content editor height filter. + * + * @since 1.7.8 + * + * @param int $height Editor textarea height. + */ + return (int) apply_filters( 'wpforms_builder_content_input_get_editor_height', 204 ); + } + + /** + * Get allowed HTML tags for Content Input Field. + * + * @since 1.9.4 + * + * @return array + */ + protected function get_allowed_html_tags(): array { + + /** + * Filter allowed HTML tags in the content field input. + * + * @since 1.7.8 + * + * @param array $allowed_tags Allowed tags. + */ + return (array) apply_filters( 'wpforms_builder_content_input_get_allowed_html_tags', wpforms_get_allowed_html_tags_for_richtext_field() ); + } + + /** + * Get editor body class. + * + * @since 1.9.4 + * + * @return string + */ + private function get_editor_body_class(): string { + + return 'wpforms-content-field-editor-body'; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileDisplayTrait.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileDisplayTrait.php new file mode 100755 index 00000000..1979ad82 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileDisplayTrait.php @@ -0,0 +1,182 @@ +type ) { + return $val; + } + + // Process modern uploader. + if ( ! empty( $field['value_raw'] ) ) { + $values = $context === 'entry-table' ? array_slice( $field['value_raw'], 0, 3, true ) : $field['value_raw']; + $html = wpforms_chain( $values ) + ->map( + function ( $file ) use ( $context ) { + + if ( empty( $file['value'] ) || empty( $file['file_original'] ) ) { + return ''; + } + + return $this->get_file_link_html( $file, $context ) . '
              '; + } + ) + ->array_filter() + ->implode() + ->value(); + + if ( count( $values ) < count( $field['value_raw'] ) ) { + $html .= '…'; + } + + return $html; + } + + return $this->get_file_link_html( $field, $context ); + } + + /** + * Get file link HTML. + * + * @since 1.9.8 + * + * @param array $file File data. + * @param string $context Value display context. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + private function get_file_link_html( array $file, string $context ): string { + + $html = in_array( $context, [ 'email-html', 'entry-single' ], true ) ? $this->file_icon_html( $file ) : ''; + + $html .= sprintf( + '%s', + esc_url( $this->get_file_url( $file ) ), + $context === 'email-html' ? 'padding-left:10px;' : '', + esc_html( $this->get_file_name( $file ) ) + ); + + return $html; + } + + /** + * Get the URL of a file. + * + * @since 1.9.8 + * + * @param array $file File data. + * @param array $args Additional query arguments. + * + * @return string + */ + public function get_file_url( array $file, array $args = [] ): string { + + $file_url = $file['value'] ?? ''; + + if ( ! empty( $file['protection_hash'] ) ) { + $args = wp_parse_args( + $args, + [ + 'wpforms_uploaded_file' => $file['protection_hash'], + ] + ); + + $file_url = add_query_arg( $args, home_url() ); + } + + /** + * Allow modifying the URL of a file. + * + * @since 1.9.8 + * + * @param string $file_url File URL. + * @param array $file File data. + */ + return (string) apply_filters( 'wpforms_pro_fields_file_upload_get_file_url', $file_url, $file ); + } + + /** + * Get the name of a file. + * + * @since 1.9.8 + * + * @param array $file File data. + * + * @return string + */ + public function get_file_name( array $file ): string { + + if ( ! $this->is_file_protected( $file ) ) { + return $file['file_original']; + } + + $ext = $file['ext'] ?? ''; + + return sprintf( '%s.%s', hash( 'crc32b', $file['file_original'] ), $ext ); + } + + /** + * Check if the file is protected. + * + * @since 1.9.8 + * + * @param array $file_data File data. + * + * @return bool True if the file is protected, false otherwise. + */ + private function is_file_protected( array $file_data ): bool { + + return ! empty( $file_data['protection_hash'] ); + } + + /** + * Get file icon HTML. + * + * @since 1.9.8 + * + * @param array $file_data File data. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + public function file_icon_html( array $file_data ): string { + + $src = esc_url( $file_data['value'] ); + $ext_types = wp_get_ext_types(); + + if ( $this->is_file_protected( $file_data ) || ! in_array( $file_data['ext'], $ext_types['image'], true ) ) { + $src = wp_mime_type_icon( wp_ext2type( $file_data['ext'] ) ?? '' ); + } elseif ( $file_data['attachment_id'] ) { + $image = wp_get_attachment_image_src( $file_data['attachment_id'], [ 16, 16 ], true ); + $src = $image ? $image[0] : $src; + } + + return sprintf( '', esc_url( $src ) ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileEntriesEditTrait.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileEntriesEditTrait.php new file mode 100755 index 00000000..9d572d72 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileEntriesEditTrait.php @@ -0,0 +1,193 @@ +field_object, 'is_modern_upload' ) && + $this->field_object::is_modern_upload( $entry_field ) + ) { + // Check if there are any files in value_raw. + if ( ! empty( $entry_field['value_raw'] ) && is_array( $entry_field['value_raw'] ) ) { + foreach ( $entry_field['value_raw'] as $key => $field_data ) { + $html .= $this->get_file_item_html( $field_data, $is_media_file, $key ); + } + } + } else { + $html .= $this->get_file_item_html( $entry_field, $is_media_file ); + } + + echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + /** + * Get HTML for the file item. + * + * @since 1.9.8 + * + * @param array $field_data Field data. + * @param bool $is_media_file Is WP media. + * @param int|string $key Key for multiple items. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + private function get_file_item_html( array $field_data, bool $is_media_file, $key = 0 ): string { + + $html = '
              '; + + $html .= $this->field_object->file_icon_html( $field_data ); + + $html .= sprintf( + '%s', + esc_url( $this->field_object->get_file_url( $field_data ) ), + esc_html( $this->field_object->get_file_name( $field_data ) ) + ); + + $html .= sprintf( + '', + esc_attr( $field_data['id'] ), + esc_attr( $key ) + ); + + if ( $is_media_file ) { + $title = sprintf( + wp_kses( /* translators: %s - link to the Media Library. */ + __( 'Please use the default WordPress Media interface to remove this file.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + ], + ] + ), + esc_url( admin_url( 'upload.php' ) ) + ); + + $html .= sprintf( '', esc_html( $title ) ); + } else { + $html .= $this->remove_button_html(); + } + + $html .= '
              '; + + return $html; + } + + /** + * Get the remove button HTML. + * + * @since 1.9.8 + * + * @return string + */ + private function remove_button_html(): string { + + return ''; + } + + /** + * Format and sanitize a field while processing entry editing. + * + * @since 1.9.8 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param mixed $field_data Existing field data. + * @param array $form_data Form data and settings. + * + * @noinspection ReturnTypeCanBeDeclaredInspection*/ + public function format( $field_id, $field_submit, $field_data, $form_data ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + if ( + method_exists( $this->field_object, 'is_modern_upload' ) && + ! $this->field_object::is_modern_upload( $field_data ) + ) { + if ( ! is_array( $field_submit ) ) { + $field_data['value'] = ''; + $field_data['file_original'] = ''; + $field_data['ext'] = ''; + } + + wpforms()->obj( 'process' )->fields[ $field_id ] = $field_data; + + return; + } + + if ( ! isset( $field_data['value_raw'] ) || ! is_array( $field_submit ) ) { + $field_data['value_raw'] = ''; + $field_data['value'] = ''; + + wpforms()->obj( 'process' )->fields[ $field_id ] = $field_data; + + return; + } + + $field_data['value_raw'] = array_intersect_key( $field_data['value_raw'], array_combine( $field_submit, $field_submit ) ); + + $field_data['value'] = implode( "\n", array_column( $field_data['value_raw'], 'value' ) ); + + wpforms()->obj( 'process' )->fields[ $field_id ] = $field_data; + } + + /** + * Skip validation. + * + * @since 1.9.8 + * + * @param int $field_id Field ID. + * @param mixed $field_submit Field value that was submitted. + * @param mixed $field_data Existing field data. + * @param array $form_data Form data and settings. + * + * @noinspection ReturnTypeCanBeDeclaredInspection*/ + public function validate( $field_id, $field_submit, $field_data, $form_data ) { } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileMethodsTrait.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileMethodsTrait.php new file mode 100755 index 00000000..0b824ccb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/FileMethodsTrait.php @@ -0,0 +1,161 @@ +get_default_extensions(); + + // Allowed file extensions. + $extensions = ! empty( $this->field_data['extensions'] ) ? explode( ',', $this->field_data['extensions'] ) : $default_extensions; + + return wpforms_chain( $extensions ) + ->map( + static function ( $ext ) { + + return strtolower( preg_replace( '/[^A-Za-z0-9_-]/', '', $ext ) ); + } + ) + ->array_filter() + ->array_intersect( $default_extensions ) + ->value(); + } + + /** + * Determine the max-allowed file size in bytes as per field options. + * + * @since 1.9.8 + * + * @return int Number of bytes allowed. + */ + public function max_file_size(): int { + + if ( ! empty( $this->field_data['max_size'] ) ) { + + // Strip any suffix provided (e.g., M, MB, etc.), which leaves us with the raw MB value. + $max_size = preg_replace( '/[^0-9.]/', '', $this->field_data['max_size'] ); + + return wpforms_size_to_bytes( $max_size . 'M' ); + } + + return (int) wpforms_max_upload( true ); + } + + /** + * Get default extensions supported by WordPress + * without those that we manually denylist. + * + * @since 1.9.8 + * + * @return array + */ + protected function get_default_extensions(): array { + + return wpforms_chain( get_allowed_mime_types() ) + ->array_keys() + ->implode( '|' ) + ->explode( '|' ) + ->array_diff( $this->denylist ) + ->value(); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/NumberField.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/NumberField.php new file mode 100755 index 00000000..84f8f1c7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/NumberField.php @@ -0,0 +1,300 @@ + 0 ) + ) + ) { + $attrs['step'] = (string) $args['step']; + } + + $number_label_markup = $this->field_element( + 'label', + $field, + [ + 'slug' => $slug, + 'value' => $label, + 'tooltip' => $args['tooltip'] ?? '', + ], + false + ); + + $number_input_markup = $this->field_element( + 'text', + $field, + [ + 'type' => 'number', + 'slug' => $slug, + 'value' => is_numeric( $value ) ? (float) $value : '', + 'attrs' => $attrs, + 'class' => $args['class'] ?? '', + ], + false + ); + + $output = $this->field_element( + 'row', + $field, + [ + 'slug' => $slug, + 'content' => $number_label_markup . $number_input_markup, + ], + false + ); + + if ( ! $output ) { + return ''; + } + + if ( $echo_output ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $output; + } + + return $output; + } + + /** + * Helper function to create `min_max` field option markup. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $echo_output Print or return the value. Print by default. + * + * @return string + */ + private function field_number_option_min_max( $field, $args, $echo_output = true ) { + + $class = $args['class'] ?? 'number_min_max'; + $range_label_markup = $this->field_element( + 'label', + $field, + [ + 'slug' => 'min', + 'value' => $args['label'] ?? esc_html__( 'Range', 'wpforms-lite' ), + 'tooltip' => $args['tooltip'] ?? esc_html__( 'Define the minimum and the maximum values for the field.', 'wpforms-lite' ), + ], + false + ); + + $min_value = $field['min'] ?? null; + $input_min_args = [ + 'type' => 'number', + 'slug' => 'min', + 'value' => is_numeric( $min_value ) ? (float) $min_value : '', + 'class' => $class . '-min', + 'attrs' => [ + 'step' => 'any', + ], + ]; + + $range_input_min_markup = $this->field_element( + 'text', + $field, + $input_min_args, + false + ); + + $max_value = $field['max'] ?? null; + $input_max_args = [ + 'type' => 'number', + 'slug' => 'max', + 'value' => is_numeric( $max_value ) ? (float) $max_value : '', + 'class' => $class . '-max', + 'attrs' => [ + 'step' => 'any', + ], + ]; + + $range_input_max_markup = $this->field_element( + 'text', + $field, + $input_max_args, + false + ); + + return $this->field_element( + 'row', + $field, + [ + 'slug' => 'min_max', + 'content' => $range_label_markup . sprintf( + '
              +
              %s
              +
              %s
              +
              ', + $range_input_min_markup, + (int) $field['id'], + esc_html__( 'Minimum', 'wpforms-lite' ), + $range_input_max_markup, + (int) $field['id'], + esc_html__( 'Maximum', 'wpforms-lite' ) + ), + ], + $echo_output + ); + } + + /** + * Helper function to create `default_value` field option markup. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $echo_output Print or return the value. Print by default. + * + * @return string + */ + private function field_number_option_default_value( $field, $args, $echo_output = true ) { + + $default_value_args = [ + 'slug' => 'default_value', + 'label' => esc_html__( 'Default Value', 'wpforms-lite' ), + 'tooltip' => esc_html__( 'Enter a default value for this field.', 'wpforms-lite' ), + 'class' => $args['class'] ?? '', + 'value' => $args['value'] ?? '', + 'min' => $field['min'] ?? '', + 'max' => $field['max'] ?? '', + 'step' => $field['step'] ?? '', + ]; + + return $this->field_number_element( + $field, + $default_value_args, + $echo_output + ); + } + + /** + * Helper function to create `step` field option markup. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $args Field preview arguments. + * @param bool $echo_output Print or return the value. Print by default. + * + * @return string + */ + private function field_number_option_step( $field, $args, $echo_output = true ) { + + $step_args = [ + 'slug' => 'step', + 'label' => esc_html__( 'Increment', 'wpforms-lite' ), + 'tooltip' => $args['tooltip'] ?? esc_html__( 'Determines the increment between selectable values on the field.', 'wpforms-lite' ), + 'class' => $args['class'] ?? '', + 'min' => 0, + 'step' => 'any', + 'value' => 1, + ]; + + $min = is_numeric( $field['min'] ?? null ) ? (float) $field['min'] : null; + $max = is_numeric( $field['max'] ?? null ) ? (float) $field['max'] : null; + + if ( ! is_null( $min ) && ! is_null( $max ) ) { + $step_args['max'] = $max - $min; + } + + return $this->field_number_element( + $field, + $step_args, + $echo_output + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ProField.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ProField.php new file mode 100755 index 00000000..473a3c98 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ProField.php @@ -0,0 +1,619 @@ +is_pro = wpforms()->is_pro(); + $this->is_addon_initialized = ! empty( $this->addon_slug ) && wpforms_is_addon_initialized( $this->addon_slug ); + $this->is_disabled_field = $this->is_disabled_field(); + + // Add hooks. + add_filter( 'admin_init', [ $this, 'admin_init_pro_field' ] ); + add_filter( 'wpforms_builder_field_option_class', [ $this, 'filter_field_option_class' ], 10, 2 ); + add_filter( "wpforms_admin_builder_ajax_save_form_field_$this->type", [ $this, 'filter_save_form_field_data' ], 10, 3 ); + add_filter( 'wpforms_field_data', [ $this, 'filter_frontend_field_data' ], PHP_INT_MAX, 2 ); + add_filter( 'wpforms_helpers_form_pro_fields', [ $this, 'filter_form_pro_fields' ], PHP_INT_MAX, 2 ); + add_filter( 'wpforms_helpers_form_addons_edu_data', [ $this, 'filter_form_addons_edu_data' ], PHP_INT_MAX, 2 ); + add_filter( 'wpforms_field_preview_display_duplicate_button', [ $this, 'filter_field_preview_display_duplicate_button' ], 10, 2 ); + add_filter( 'wpforms_field_preview_class', [ $this, 'filter_field_preview_class' ], 10, 2 ); + add_filter( 'wpforms_entry_save_data', [ $this, 'filter_entry_save_data' ], 10, 3 ); + add_filter( 'wpforms_pro_admin_entries_table_facades_columns_get_field_columns_forbidden_fields', [ $this, 'filter_field_columns_forbidden_fields' ], 10, 2 ); + add_filter( 'wpforms_pro_admin_entries_export_configuration', [ $this, 'filter_entries_export_configuration' ], 10, 1 ); + add_filter( "wpforms_pro_admin_entries_edit_is_field_displayable_$this->type", [ $this, 'filter_is_field_displayable' ], 10, 3 ); + } + + /** + * Init Pro field on `admin_init` hook. + * + * @since 1.9.4 + */ + public function admin_init_pro_field(): void { + + $this->addon_edu_data = $this->get_field_addon_edu_data(); + } + + /** + * Get the Pro field options tab CSS class. + * + * @since 1.9.4 + * + * @param string|mixed $css_class CSS class. + * @param array $field Field data. + * + * @return string + * @noinspection PhpMissingParamTypeInspection + */ + public function filter_field_option_class( $css_class, $field ): string { + + $css_class = (string) $css_class; + + if ( $field['type'] !== $this->type ) { + return $css_class; + } + + $css_class .= empty( $this->is_disabled_field ) ? '' : ' wpforms-field-is-pro'; + + return trim( $css_class ); + } + + /** + * Filter field data before saving the form. + * + * @since 1.9.4 + * + * @param array $field_data Field data. + * @param array $form_data Forms data. + * @param array $saved_form_data Saved form data. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function filter_save_form_field_data( $field_data, $form_data, $saved_form_data ) { + + if ( empty( $this->is_disabled_field ) ) { + return $field_data; + } + + $field_id = $field_data['id'] ?? ''; + + // Prevent changes in the field data if it's a Pro field in Lite. + // The settings are disabled in the Form Builder, but users can still hijack the data. + // Therefore, return the saved field data if it exists. + return $saved_form_data['fields'][ $field_id ] ?? $field_data; + } + + /** + * Filter form pro fields array. + * + * @since 1.9.4 + * + * @param array|mixed $pro_fields Pro fields array. + * @param array $field Field data. + */ + public function filter_form_pro_fields( $pro_fields, array $field ): array { + + $pro_fields = is_array( $pro_fields ) ? $pro_fields : []; + + if ( isset( $field['type'] ) && $field['type'] === $this->type ) { + $pro_fields[] = $field; + } + + return $pro_fields; + } + + /** + * Filter the form addons educational data array. + * + * @since 1.9.4 + * + * @param array|mixed $addons_edu_data Addons educational data. + * @param array $field Field data. + */ + public function filter_form_addons_edu_data( $addons_edu_data, array $field ): array { + + $addons_edu_data = is_array( $addons_edu_data ) ? $addons_edu_data : []; + + if ( ! isset( $field['type'] ) || $field['type'] !== $this->type || empty( $this->addon_edu_data ) ) { + return $addons_edu_data; + } + + $addon = $this->addon_edu_data['slug'] ?? ''; + $addons_edu_data[ $addon ] = $this->addon_edu_data; + + return $addons_edu_data; + } + + /** + * Get the Pro field options notice. + * + * @since 1.9.4 + * + * @noinspection HtmlUnknownAttribute + */ + private function get_field_options_notice(): string { + + if ( empty( $this->is_disabled_field ) ) { + return ''; + } + + [ $name, $title, $content, $button_label, $button_utm ] = $this->get_field_options_notice_texts(); + + $action = $this->addon_edu_data['action'] ?? 'upgrade'; + $button_class = 'education-action-button'; + $button_attr = ''; + + if ( $action !== 'upgrade' ) { + $button_class = 'education-modal'; + $button_attr = sprintf( + 'data-nonce="%1$s" data-path="%2$s" data-url="%3$s" data-message="%4$s" data-field-type="%5$s" data-name="%6$s"', + esc_attr( wp_create_nonce( 'wpforms-admin' ) ), + $this->addon_edu_data['path'] ?? '', + $this->addon_edu_data['url'] ?? '', + $action === 'incompatible' ? $this->addon_edu_data['message'] : '', + esc_attr( $this->type ), + esc_attr( $name ) + ); + } + + return sprintf( + '
              +
              +

              %1$s

              +

              %2$s

              + +
              +
              ', + $title, + esc_html( $content ), + esc_attr( $button_class ), + esc_attr( $action ), + esc_html( $button_label ), + $button_attr, + esc_attr( $this->addon_edu_data['license_level'] ?? 'pro' ), + esc_attr( $button_utm ) + ); + } + + /** + * Get the Pro field options notice texts. + * + * @since 1.9.4 + */ + private function get_field_options_notice_texts(): array { + + $action = $this->addon_edu_data['action'] ?? 'upgrade'; + $addon_name = $this->addon_edu_data['title'] ?? ''; + $name = $this->name; + + $titles = [ + 'upgrade' => sprintf( /* translators: %1$s - Field name. */ + esc_html__( '%1$s is a Pro Feature', 'wpforms-lite' ), + $name + ), + 'incompatible' => esc_html__( 'Incompatible Addon', 'wpforms-lite' ), + ]; + + $contents = [ + 'upgrade' => sprintf( /* translators: %1$s - Field name. */ + esc_html__( 'Upgrade to gain access to the %1$s field and dozens of other powerful features to help you build smarter forms and grow your business.', 'wpforms-lite' ), + $name + ), + 'install' => sprintf( /* translators: %1$s - Addon name. */ + esc_html__( 'You have access to the %1$s, but it\'s not currently installed.', 'wpforms-lite' ), + $addon_name + ), + 'activate' => sprintf( /* translators: %1$s - Addon name. */ + esc_html__( 'You have access to the %1$s, but it\'s not currently activated.', 'wpforms-lite' ), + $addon_name + ), + 'incompatible' => sprintf( /* translators: %1$s - Addon name. */ + esc_html__( 'The %1$s is not compatible with this version of WPForms and requires an update.', 'wpforms-lite' ), + $addon_name + ), + ]; + + $button_labels = [ + 'upgrade' => esc_html__( 'Upgrade to Pro', 'wpforms-lite' ), + 'install' => esc_html__( 'Install Addon', 'wpforms-lite' ), + 'activate' => esc_html__( 'Activate Addon', 'wpforms-lite' ), + 'incompatible' => esc_html__( 'Update Addon', 'wpforms-lite' ), + ]; + + // If it's not an upgrade action, use the addon data. + if ( $action !== 'upgrade' ) { + $name = $addon_name; + $utm_name = $this->addon_edu_data['utm_content']; + } else { + $edu_fields = wpforms()->obj( 'education_fields' ); + $edu_field = $edu_fields ? $edu_fields->get_field( $this->type ) : null; + $utm_name = $edu_field['name_en'] ?? $this->type; // Fallback to the field type. + } + + $button_utm = sprintf( + 'AI Form - %1$s notice', + esc_html( $utm_name ) + ); + + return [ + $name, + $titles[ $action ] ?? $titles['upgrade'], + $contents[ $action ] ?? $contents['upgrade'], + $button_labels[ $action ] ?? $button_labels['upgrade'], + $button_utm, + ]; + } + + /** + * Determine if the field is disabled. + * + * @since 1.9.4 + */ + private function is_disabled_field(): bool { + + // It is a Pro field in Lite OR the addon is not initialized. + return ! ( $this->is_pro && ( empty( $this->addon_slug ) || $this->is_addon_initialized ) ); + } + + /** + * Get a preview option. + * + * @since 1.9.4 + * + * @param string $option Option name. + * @param array $field Field data. + * @param array $args Additional arguments. + * @param bool $do_echo Echo or return. + * + * @noinspection ReturnTypeCanBeDeclaredInspection + * @noinspection PhpMultipleClassDeclarationsInspection + */ + public function field_preview_option( $option, $field, $args = [], $do_echo = true ) { + + // Hide remaining elements, prevent incompatible addon field elements from being displayed. + if ( $option === 'hide-remaining' && ! empty( $this->is_disabled_field ) ) { + echo '
              '; + + return; + } + + parent::field_preview_option( $option, $field, $args, $do_echo ); + } + + /** + * Get the Pro field preview badge. + * + * @since 1.9.4 + */ + private function get_field_preview_badge(): string { + + if ( empty( $this->is_disabled_field ) ) { + return ''; + } + + $action = $this->addon_edu_data['action'] ?? ''; + + if ( $action === 'incompatible' ) { + return Helpers::get_badge( esc_html__( 'Update required', 'wpforms-lite' ) , 'lg', 'inline', 'red' ); + } + + // If it's an addon field in Pro AND the addon is not initialized, show the ADDON badge. + if ( in_array( $action, [ 'install' ,'activate' ], true ) ) { + return Helpers::get_badge( 'Addon', 'lg', 'inline', 'orange' ); + } + + return Helpers::get_badge( 'Pro', 'lg', 'inline', 'green' ); + } + + /** + * Get the addon educational data of the field. + * + * @since 1.9.4 + * + * @return array + */ + private function get_field_addon_edu_data(): array { + + if ( empty( $this->addon_slug ) || ! empty( $this->is_addon_initialized ) || ! is_admin() ) { + return []; + } + + $addons = Helpers::get_edu_addons(); + + return $addons[ 'wpforms-' . $this->addon_slug ] ?? []; + } + + /** + * Filter frontend field data to prevent rendering Pro fields in Lite. + * + * @since 1.9.4 + * + * @param array|mixed $field Field data. + * @param array $form_data Form data. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function filter_frontend_field_data( $field, $form_data ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $field = (array) $field; + $type = $field['type'] ?? ''; + + // If it's not a Pro field or the field type doesn't match, return the field data as is. + if ( empty( $this->is_pro_field ) || $type !== $this->type ) { + return $field; + } + + // If it's a Pro field in Lite OR the addon is not initialized, + // return an empty array to prevent rendering. + if ( ! empty( $this->is_disabled_field ) ) { + return []; + } + + return $field; + } + + /** + * Disallow field preview "Duplicate" button. + * + * @since 1.9.4 + * + * @param bool|mixed $display Display switch. + * @param array $field Field settings. + * + * @return bool + * @noinspection PhpMissingParamTypeInspection + */ + public function filter_field_preview_display_duplicate_button( $display, $field ): bool { + + if ( $field['type'] !== $this->type || empty( $this->is_disabled_field ) ) { + return (bool) $display; + } + + return false; + } + + /** + * Add a class to the field preview container. + * + * @since 1.9.4 + * + * @param string|mixed $css_class CSS class. + * @param array $field Field settings. + * + * @return string + * @noinspection PhpMissingParamTypeInspection + */ + public function filter_field_preview_class( $css_class, $field ): string { + + $css_class = (string) $css_class; + + if ( $field['type'] !== $this->type || empty( $this->is_disabled_field ) ) { + return $css_class; + } + + return trim( $css_class . ' wpforms-field-is-pro' ); + } + + /** + * Filter entry save data. + * + * @since 1.9.5 + * + * @param array|mixed $fields Entry fields data. + * @param array $entry Entry data. + * @param array $form_data Form data. + * + * @return array + * @noinspection PhpUnusedParameterInspection + */ + public function filter_entry_save_data( $fields, array $entry, array $form_data ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $fields = (array) $fields; + + // If it's not a disabled Pro field, return the fields as is. + if ( empty( $this->is_disabled_field ) ) { + return $fields; + } + + // Remove disabled Pro fields from the entry fields. + foreach ( $fields as $field_id => $field ) { + if ( isset( $field['type'] ) && $field['type'] === $this->type ) { + unset( $fields[ $field_id ] ); + } + } + + return $fields; + } + + /** + * Filter forbidden columns on the Form Entries page. + * + * @since 1.9.5 + * + * @param array|mixed $forbidden_fields Entry fields data. + * @param int|string $form_id Form ID. + * + * @return array + * @noinspection PhpUnusedParameterInspection + * @noinspection PhpUnusedLocalVariableInspection + */ + public function filter_field_columns_forbidden_fields( $forbidden_fields, $form_id ): array { + + $forbidden_fields = (array) $forbidden_fields; + + if ( empty( $this->is_disabled_field ) ) { + return $forbidden_fields; + } + + $form_data = $this->get_form_data( (int) $form_id ); + + if ( ! $form_data ) { + return $forbidden_fields; + } + + $fields = $form_data['fields'] ?? []; + + foreach ( $fields as $field_id => $field ) { + if ( isset( $field['type'] ) && $field['type'] === $this->type ) { + $forbidden_fields[] = $field['type']; + } + } + + return $forbidden_fields; + } + + /** + * Get form data by form ID and cache it. + * + * @since 1.9.5 + * + * @param int $form_id Form ID. + * + * @return array + */ + private function get_form_data( int $form_id ): array { + + $form_obj = wpforms()->obj( 'form' ); + + if ( ! $form_obj ) { + return []; + } + + // Cache the form data into static variable. + static $cached_form_data = []; + + if ( isset( $cached_form_data[ $form_id ] ) ) { + return $cached_form_data[ $form_id ]; + } + + $cached_form_data[ $form_id ] = (array) $form_obj->get( $form_id, [ 'content_only' => true ] ); + + return $cached_form_data[ $form_id ]; + } + + /** + * Filter entries export configuration. + * + * @since 1.9.5 + * + * @param array $config Export configuration. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + */ + public function filter_entries_export_configuration( $config ): array { + + $config = (array) $config; + + // If it's not a disabled Pro field, return the config as is. + if ( empty( $this->is_disabled_field ) ) { + return $config; + } + + if ( empty( $this->type ) ) { + return $config; + } + + $config['disallowed_fields'] = ! empty( $config['disallowed_fields'] ) ? (array) $config['disallowed_fields'] : []; + + // Add the disabled Pro field type to `disallowed_fields` if not already there. + if ( ! in_array( $this->type, $config['disallowed_fields'], true ) ) { + $config['disallowed_fields'][] = $this->type; + } + + return $config; + } + + /** + * Filter if field is displayable in the Entry Edit page. + * + * @since 1.9.5 + * + * @param bool|mixed $displayable Whether the field is displayable. + * @param array $field Field data. + * @param array $form_data Form data. + * + * @return bool + * @noinspection PhpUnusedParameterInspection + */ + public function filter_is_field_displayable( $displayable, array $field, array $form_data ): bool { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + if ( ! $this->is_disabled_field ) { + return (bool) $displayable; + } + + return false; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ReadOnlyField.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ReadOnlyField.php new file mode 100755 index 00000000..9acd12ac --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Traits/ReadOnlyField.php @@ -0,0 +1,148 @@ +type}", [ $this, 'read_only_save_form_field' ], 100, 3 ); + add_filter( 'wpforms_frontend_strings', [ $this, 'read_only_frontend_strings' ] ); + } + + /** + * Display the Read-Only toggle on the Advanced Options tab. + * + * @since 1.9.8 + * + * @param array $field Field data. + * + * @return void + */ + public function field_option_read_only_toggle( array $field ): void { + + if ( $field['type'] !== $this->type || ! $this->allow_read_only ) { + return; + } + + $value = $field['read_only'] ?? '0'; + $tooltip = esc_html__( 'Check this option to show the field’s value without allowing changes. It will still be submitted.', 'wpforms-lite' ); + + $output = $this->field_element( + 'toggle', + $field, + [ + 'slug' => 'read_only', + 'value' => $value, + 'desc' => esc_html__( 'Read-Only', 'wpforms-lite' ), + 'tooltip' => $tooltip, + ], + false + ); + + $this->field_element( + 'row', + $field, + [ + 'slug' => 'read_only', + 'content' => $output, + ] + ); + } + + /** + * Add a Read-Only field CSS class. + * + * @since 1.9.8 + * + * @param array|mixed $properties Field properties. + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @return array + * @noinspection PhpUnusedParameterInspection + */ + public function read_only_field_properties( $properties, array $field, array $form_data ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $properties = (array) $properties; + + if ( $field['type'] !== $this->type || ! $this->allow_read_only || empty( $field['read_only'] ) ) { + return $properties; + } + + $properties['container']['class'][] = 'wpforms-field-readonly'; + + return $properties; + } + + /** + * Filter field data before saving the form. + * + * @since 1.9.8 + * + * @param array $field_data Field data. + * @param array $form_data Forms data. + * @param array $saved_form_data Saved form data. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function read_only_save_form_field( $field_data, array $form_data, array $saved_form_data ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $field_data = (array) $field_data; + + // Unset the `required` field option if the field is Read-Only. + if ( ! empty( $field_data['read_only'] ) ) { + unset( $field_data['required'] ); + } + + return $field_data; + } + + /** + * Add read-only related strings to the frontend. + * + * @since 1.9.8 + * + * @param array|mixed $strings Frontend strings. + * + * @return array Frontend strings. + */ + public function read_only_frontend_strings( $strings ): array { + + $strings = (array) $strings; + $strings['readOnlyDisallowedFields'] = $strings['readOnlyDisallowedFields'] ?? []; + + if ( $this->allow_read_only ) { + return $strings; + } + + $strings['readOnlyDisallowedFields'][] = $this->type; + + return $strings; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Fields/Url/Field.php b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Url/Field.php new file mode 100755 index 00000000..d892ed81 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Fields/Url/Field.php @@ -0,0 +1,157 @@ +name = esc_html__( 'Website / URL', 'wpforms-lite' ); + $this->keywords = esc_html__( 'uri, link, hyperlink', 'wpforms-lite' ); + $this->type = 'url'; + $this->icon = 'fa-link'; + $this->order = 90; + $this->group = 'fancy'; + + $this->init_pro_field(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.4 + */ + protected function hooks() { + } + + /** + * Field options panel inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_options( $field ) { + + /** + * Basic field options. + */ + + // Options open markup. + $this->field_option( + 'basic-options', + $field, + [ + 'markup' => 'open', + 'after_title' => $this->get_field_options_notice(), + ] + ); + + // Label. + $this->field_option( 'label', $field ); + + // Description. + $this->field_option( 'description', $field ); + + // Required toggle. + $this->field_option( 'required', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'basic-options', $field, $args ); + + /* + * Advanced field options. + */ + + // Options open markup. + $args = [ + 'markup' => 'open', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + + // Size. + $this->field_option( 'size', $field ); + + // Placeholder. + $this->field_option( 'placeholder', $field ); + + // Default value. + $this->field_option( 'default_value', $field ); + + // Custom CSS classes. + $this->field_option( 'css', $field ); + + // Hide label. + $this->field_option( 'label_hide', $field ); + + // Options close markup. + $args = [ + 'markup' => 'close', + ]; + + $this->field_option( 'advanced-options', $field, $args ); + } + + /** + * Field preview inside the builder. + * + * @since 1.9.4 + * + * @param array $field Field data. + */ + public function field_preview( $field ) { + + // Define data. + $placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; + $default_value = ! empty( $field['default_value'] ) ? $field['default_value'] : ''; + + // Label. + $this->field_preview_option( + 'label', + $field, + [ + 'label_badge' => $this->get_field_preview_badge(), + ] + ); + + // Primary input. + echo ''; + + // Description. + $this->field_preview_option( 'description', $field ); + } + + /** + * Field display on the form front-end. + * + * @since 1.9.4 + * + * @param array $field Field data and settings. + * @param array $deprecated Deprecated field attributes. Use field properties. + * @param array $form_data Form data and settings. + */ + public function field_display( $field, $deprecated, $form_data ) { + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Honeypot.php b/wp-content/plugins/wpforms-lite/src/Forms/Honeypot.php new file mode 100755 index 00000000..81da3377 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Honeypot.php @@ -0,0 +1,84 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.6.2 + */ + public function hooks() { + + add_action( 'wpforms_frontend_output', [ $this, 'render' ], 15, 5 ); + } + + /** + * Return function to render the honeypot. + * + * @since 1.6.2 + * + * @param array $form_data Form data and settings. + */ + public function render( $form_data ) { + + if ( + empty( $form_data['settings']['honeypot'] ) || + '1' !== $form_data['settings']['honeypot'] + ) { + return; + } + + $names = [ 'Name', 'Phone', 'Comment', 'Message', 'Email', 'Website' ]; + + echo '
              '; + + echo ''; // phpcs:ignore + + echo ''; // phpcs:ignore + + echo '
              '; + } + + /** + * Validate honeypot. + * + * @since 1.6.2 + * + * @param array $form_data Form data. + * @param array $fields Fields. + * @param array $entry Form entry. + * + * @return bool|string False or an string with the error. + */ + public function validate( array $form_data, array $fields, array $entry ) { + + $honeypot = false; + + if ( + ! empty( $form_data['settings']['honeypot'] ) && + '1' === $form_data['settings']['honeypot'] && + ! empty( $entry['hp'] ) + ) { + $honeypot = esc_html__( 'WPForms honeypot field triggered.', 'wpforms-lite' ); + } + + return apply_filters( 'wpforms_process_honeypot', $honeypot, $fields, $entry, $form_data ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/IconChoices.php b/wp-content/plugins/wpforms-lite/src/Forms/IconChoices.php new file mode 100755 index 00000000..11c4d3a3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/IconChoices.php @@ -0,0 +1,624 @@ + '#0399ed', + 'modern' => '#066aab', + ]; + + /** + * How many icons to display initially and paginate in the Icon Picker. + * + * @since 1.7.9 + * + * @var int + */ + const DEFAULT_ICONS_PER_PAGE = 50; + + /** + * Absolute path to the cache directory. + * + * @since 1.7.9 + * + * @var string + */ + private $cache_base_path; + + /** + * Cache directory URL. + * + * @since 1.7.9 + * + * @var string + */ + private $cache_base_url; + + /** + * Absolute path to the icons data file. + * + * @since 1.7.9 + * + * @var string + */ + private $icons_data_file; + + /** + * Whether icon library is already installed. + * + * @since 1.7.9 + * + * @var bool + */ + private $is_installed; + + /** + * Default list of icon sizes. + * + * @since 1.7.9 + * + * @var array + */ + private $default_icon_sizes; + + /** + * Initialize class. + * + * @since 1.7.9 + */ + public function init() { + + $upload_dir = wpforms_upload_dir(); + + $this->cache_base_url = $upload_dir['url'] . '/icon-choices'; + $this->cache_base_path = $upload_dir['path'] . '/icon-choices'; + $this->icons_data_file = $this->cache_base_path . '/icons.json'; + + $this->default_icon_sizes = [ + 'large' => [ + 'label' => __( 'Large', 'wpforms-lite' ), + 'size' => 64, + ], + 'medium' => [ + 'label' => __( 'Medium', 'wpforms-lite' ), + 'size' => 48, + ], + 'small' => [ + 'label' => __( 'Small', 'wpforms-lite' ), + 'size' => 32, + ], + ]; + + $this->hooks(); + } + + /** + * Hook into WordPress lifecycle. + * + * @since 1.7.9 + */ + private function hooks() { + + // Add inline CSS with custom properties on the frontend. + add_action( 'wpforms_frontend_css', [ $this, 'css_custom_properties' ] ); + + // Add inline CSS with custom properties in the form builder. + if ( wpforms_is_admin_page( 'builder' ) ) { + add_action( 'admin_head', [ $this, 'css_custom_properties' ] ); + } + + // Load Font Awesome assets. + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues' ] ); + + // Send data to the frontend. + add_filter( 'wpforms_builder_strings', [ $this, 'get_strings' ], 10, 2 ); + + // Download and extract Font Awesome package. + add_action( 'wp_ajax_wpforms_icon_choices_install', [ $this, 'install' ] ); + } + + /** + * Get Font Awesome library data file. + * + * @since 1.8.3 + * + * @return string + */ + public function get_icons_data_file() { + + return $this->icons_data_file; + } + + /** + * Whether Font Awesome library is already installed or not. + * + * @since 1.7.9 + * + * @return bool + */ + private function is_installed() { + + if ( $this->is_installed !== null ) { + return $this->is_installed; + } + + $this->is_installed = file_exists( $this->icons_data_file ); + + return $this->is_installed; + } + + /** + * Whether Icon Choices mode is active on any of the fields in current form. + * + * @since 1.7.9 + * + * @return bool + */ + private function is_active() { + + $form_data = WPForms_Builder::instance()->form_data; + + return wpforms_has_field_setting( 'choices_icons', $form_data, false ); + } + + /** + * Install Font Awesome library via Ajax. + * + * @since 1.7.9 + */ + public function install() { + + // Run a security check. + check_ajax_referer( 'wpforms-builder', 'nonce' ); + + // Check for permissions. + if ( ! wpforms_current_user_can( 'edit_forms' ) ) { + wp_send_json_error(); + } + + $this->run_install( $this->cache_base_path ); + $this->is_installed = true; + + wp_send_json_success(); + } + + /** + * Run Install Font Awesome library from our server. + * + * @since 1.8.3 + * + * @param string $destination Destination path. + */ + public function run_install( $destination ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // WordPress assumes it's a plugin/theme and tries to get translations. We don't need that, and it breaks JS output. + remove_action( 'upgrader_process_complete', [ 'Language_Pack_Upgrader', 'async_upgrade' ], 20 ); + + if ( ! function_exists( 'request_filesystem_credentials' ) ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + } + + // Create the Upgrader with our custom skin that reports errors as WP JSON. + $installer = new PluginSilentUpgrader( new WP_Ajax_Upgrader_Skin() ); + + // The installer skin reports any errors via wp_send_json_error() with generic error messages. + $installer->init(); + $installer->run( + [ + 'package' => self::FONT_AWESOME_URL, + 'destination' => $destination, + ] + ); + } + + /** + * Load all necessary Font Awesome assets. + * + * @since 1.7.9 + * + * @param string $view Current Form Builder view (panel). + */ + public function enqueues( $view ) { + + if ( ! $this->is_installed() ) { + return; + } + + wp_enqueue_style( + 'wpforms-icon-choices-font-awesome', + $this->cache_base_url . '/css/fontawesome.min.css', + [], + self::FONT_AWESOME_VERSION + ); + + wp_enqueue_style( + 'wpforms-icon-choices-font-awesome-brands', + $this->cache_base_url . '/css/brands.min.css', + [], + self::FONT_AWESOME_VERSION + ); + + wp_enqueue_style( + 'wpforms-icon-choices-font-awesome-regular', + $this->cache_base_url . '/css/regular.min.css', + [], + self::FONT_AWESOME_VERSION + ); + + wp_enqueue_style( + 'wpforms-icon-choices-font-awesome-solid', + $this->cache_base_url . '/css/solid.min.css', + [], + self::FONT_AWESOME_VERSION + ); + } + + /** + * Define additional field properties specific to Icon Choices feature. + * + * @since 1.7.9 + * + * @see WPForms_Field_Checkbox::field_properties() + * @see WPForms_Field_Radio::field_properties() + * @see WPForms_Field_Payment_Checkbox::field_properties() + * @see WPForms_Field_Payment_Multiple::field_properties() + * + * @param array $properties Field properties. + * @param array $field Field settings. + * + * @return array + */ + public function field_properties( $properties, $field ) { + + $properties['input_container']['class'][] = 'wpforms-icon-choices'; + $properties['input_container']['class'][] = sanitize_html_class( 'wpforms-icon-choices-' . $field['choices_icons_style'] ); + $properties['input_container']['class'][] = sanitize_html_class( 'wpforms-icon-choices-' . $field['choices_icons_size'] ); + + $icon_color = isset( $field['choices_icons_color'] ) ? wpforms_sanitize_hex_color( $field['choices_icons_color'] ) : ''; + $icon_color = empty( $icon_color ) ? self::get_default_color() : $icon_color; + + $properties['input_container']['attr']['style'] = "--wpforms-icon-choices-color: {$icon_color};"; + + foreach ( $properties['inputs'] as $key => $inputs ) { + $properties['inputs'][ $key ]['container']['class'][] = 'wpforms-icon-choices-item'; + + if ( in_array( $field['choices_icons_style'], [ 'default', 'modern', 'classic' ], true ) ) { + $properties['inputs'][ $key ]['class'][] = 'wpforms-screen-reader-element'; + } + } + + return $properties; + } + + /** + * Display a single choice on the form front-end. + * + * @since 1.7.9 + * + * @see WPForms_Field_Checkbox::field_display() + * @see WPForms_Field_Radio::field_display() + * @see WPForms_Field_Payment_Checkbox::field_display() + * @see WPForms_Field_Payment_Multiple::field_display() + * + * @param array $field Field settings. + * @param array $choice Single choice item settings. + * @param string $type Field input type. + * @param string|null $label Custom label, used by Payment fields. + */ + public function field_display( $field, $choice, $type, $label = null ) { + + // Only Payment fields supply a custom label. + if ( ! $label ) { + $label = $choice['label']['text']; + } + + if ( is_array( $choice['label']['class'] ) && wpforms_is_empty_string( $label ) ) { + $choice['label']['class'][] = 'wpforms-field-label-inline-empty'; + } + + printf( + '', + wpforms_html_attributes( $choice['label']['id'], $choice['label']['class'], $choice['label']['data'], $choice['label']['attr'] ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $this->get_icon( $choice['icon'], $choice['icon_style'], $field['choices_icons_size'] ), + esc_attr( $type ), + wpforms_html_attributes( $choice['id'], $choice['class'], $choice['data'], $choice['attr'] ), + esc_attr( $choice['required'] ), + checked( '1', $choice['default'], false ), + wp_kses_post( $label ) + ); + } + + /** + * Output inline CSS custom properties (vars). + * + * @since 1.7.9 + * + * @param null|array $forms Frontend forms, if available. + * + * @return void + */ + public function css_custom_properties( $forms = null ) { + + $hook = current_action(); + + // On the frontend, we need these properties only if Icon Choices is in use. + if ( $hook === 'wpforms_frontend_css' && ! wpforms_has_field_setting( 'choices_icons', $forms, true ) ) { + return; + } + + $selectors = [ + 'wpforms_frontend_css' => '.wpforms-container', + 'admin_head' => '#wpforms-builder, .wpforms-icon-picker-container', + ]; + + /** + * Add CSS custom properties. + * + * @since 1.7.9 + * + * @param array $properties CSS custom properties using CSS syntax. + */ + $custom_properties = (array) apply_filters( 'wpforms_forms_icon_choices_css_custom_properties', [] ); + + $icon_sizes = $this->get_icon_sizes(); + + foreach ( $icon_sizes as $slug => $data ) { + $custom_properties[ "wpforms-icon-choices-size-{$slug}" ] = $data['size'] . 'px'; + } + + $custom_properties_css = ''; + + foreach ( $custom_properties as $property => $value ) { + $custom_properties_css .= "--{$property}: {$value};"; + } + + printf( + '', + esc_attr( $selectors[ $hook ] ), + esc_html( $custom_properties_css ) + ); + } + + /** + * Get available icon sizes. + * + * @since 1.7.9 + * + * @return array A list of all icon sizes. + */ + public function get_icon_sizes() { + + /** + * Allow modifying the icon sizes. + * + * @since 1.7.9 + * + * @param array $icon_sizes { + * Default icon sizes. + * + * @type string $key The icon slug. + * @type array $value { + * Individual icon size data. + * + * @type string $label Translatable label. + * @type int $size The size value. + * } + * } + * @param array $default_icon_sizes Default icon sizes for reference. + */ + $sizes = (array) apply_filters( 'wpforms_forms_icon_choices_get_icon_sizes', [], $this->default_icon_sizes ); + + return array_merge( $this->default_icon_sizes, $sizes ); + } + + /** + * Read icons metadata from disk. + * + * @since 1.7.9 + * + * @param array $strings Strings and values sent to the frontend. + * @param array $form Current form. + * + * @return array + */ + public function get_strings( $strings, $form ) { + + $strings['continue'] = esc_html__( 'Continue', 'wpforms-lite' ); + $strings['done'] = esc_html__( 'Done!', 'wpforms-lite' ); + $strings['uh_oh'] = esc_html__( 'Uh oh!', 'wpforms-lite' ); + + $strings['icon_choices'] = [ + 'is_installed' => false, + 'is_active' => $this->is_active(), + 'default_icon' => self::DEFAULT_ICON, + 'default_icon_style' => self::DEFAULT_ICON_STYLE, + 'default_color' => self::get_default_color(), + 'icons' => [], + 'icons_per_page' => self::DEFAULT_ICONS_PER_PAGE, + 'strings' => [ + 'install_prompt_content' => esc_html__( 'In order to use the Icon Choices feature, an icon library must be downloaded and installed. It\'s quick and easy, and you\'ll only have to do this once.', 'wpforms-lite' ), + 'install_title' => esc_html__( 'Installing Icon Library', 'wpforms-lite' ), + 'install_content' => esc_html__( 'This should only take a minute. Please don’t close or reload your browser window.', 'wpforms-lite' ), + 'install_success_content' => esc_html__( 'The icon library has been installed successfully. We will now save your form and reload the form builder.', 'wpforms-lite' ), + 'install_error_content' => wp_kses( + sprintf( /* translators: %s - WPForms Support URL. */ + __( 'There was an error installing the icon library. Please try again later or contact support if the issue persists.', 'wpforms-lite' ), + esc_url( + wpforms_utm_link( + 'https://wpforms.com/account/support/', + 'builder-modal', + 'Icon Library Install Failure' + ) + ) + ), + [ + 'a' => [ + 'href' => true, + 'target' => true, + 'rel' => true, + ], + ] + ), + 'reinstall_prompt_content' => esc_html__( 'The icon library appears to be missing or damaged. It will now be reinstalled.', 'wpforms-lite' ), + 'icon_picker_title' => esc_html__( 'Icon Picker', 'wpforms-lite' ), + 'icon_picker_description' => esc_html__( 'Browse or search for the perfect icon.', 'wpforms-lite' ), + 'icon_picker_search_placeholder' => esc_html__( 'Search 2000+ icons...', 'wpforms-lite' ), + 'icon_picker_not_found' => esc_html__( 'Sorry, we didn\'t find any matching icons.', 'wpforms-lite' ), + ], + ]; + + if ( ! $this->is_installed() ) { + return $strings; + } + + $strings['icon_choices']['is_installed'] = true; + $strings['icon_choices']['icons'] = $this->get_icons(); + + return $strings; + } + + /** + * Get an SVG icon code from a file for inline output in HTML. + * + * Note: the output does not need to escape. + * + * @since 1.7.9 + * + * @param string $icon Font Awesome icon name. + * @param string $style Font Awesome style (solid, brands). + * @param string|int $size Icon display size. + * + * @return string + */ + private function get_icon( string $icon, string $style, $size ): string { + + // Sanitize inputs. + $icon = sanitize_key( $icon ); + $style = sanitize_key( $style ); + $size = sanitize_key( (string) $size ); + + $icon_sizes = $this->get_icon_sizes(); + $filename = wp_normalize_path( (string) realpath( "{$this->cache_base_path}/svgs/{$style}/{$icon}.svg" ) ); + $allowed_dir = wp_normalize_path( (string) realpath( $this->cache_base_path . '/svgs' ) ); + + // Verify the file is within the allowed directory. + if ( strpos( $filename, $allowed_dir ) !== 0 ) { + return ''; + } + + if ( ! is_file( $filename ) || ! is_readable( $filename ) ) { + return ''; + } + + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + $svg = (string) file_get_contents( $filename ); + + if ( strpos( $svg, 'home_url = home_url(); + $this->scan_status = (string) get_option( FormsLocatorScanTask::SCAN_STATUS ); + + $this->wpforms_widget_title = __( 'WPForms Widget', 'wpforms-lite' ); + $this->text_widget_title = __( 'Text Widget', 'wpforms-lite' ); + $this->block_widget_title = __( 'Block Widget', 'wpforms-lite' ); + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.7.4 + */ + private function hooks() { + + // View hooks. + add_filter( 'wpforms_admin_forms_table_facades_columns_data', [ $this, 'add_column_data' ] ); + add_filter( 'wpforms_overview_table_column_value', [ $this, 'column_value' ], 10, 3 ); + add_filter( 'wpforms_overview_row_actions', [ $this, 'row_actions_all' ], 10, 2 ); + add_action( 'wpforms_overview_enqueue', [ $this, 'localize_overview_script' ] ); + + // Monitoring hooks. + add_action( 'save_post', [ $this, 'save_post' ], 10, 3 ); + add_action( 'post_updated', [ $this, 'post_updated' ], 10, 3 ); + add_action( 'wp_trash_post', [ $this, 'trash_post' ] ); + add_action( 'untrash_post', [ $this, 'untrash_post' ] ); + add_action( 'delete_post', [ $this, 'trash_post' ] ); + add_action( 'permalink_structure_changed', [ $this, 'permalink_structure_changed' ], 10, 2 ); + + $wpforms_widget_option = self::WPFORMS_WIDGET_OPTION; + $text_widget_option = self::TEXT_WIDGET_OPTION; + $block_widget_option = self::BLOCK_WIDGET_OPTION; + + add_action( "update_option_{$wpforms_widget_option}" , [ $this, 'update_option' ], 10, 3 ); + add_action( "update_option_{$text_widget_option}" , [ $this, 'update_option' ], 10, 3 ); + add_action( "update_option_{$block_widget_option}", [ $this, 'update_option' ], 10, 3 ); + } + + /** + * Add locations' column to the table columns data. + * + * @since 1.8.6 + * + * @param array|mixed $columns Columns data. + * + * @return array + */ + public function add_column_data( $columns ): array { + + $columns = (array) $columns; + $columns[ self::COLUMN_NAME ] = [ + 'label' => esc_html__( 'Locations', 'wpforms-lite' ), + 'label_html' => sprintf( + '%1$s' . + '', + esc_html__( 'Locations', 'wpforms-lite' ), + esc_html__( 'Form locations', 'wpforms-lite' ) + ), + ]; + + return $columns; + } + + /** + * Display column value. + * + * @since 1.7.4 + * + * @param mixed $value Column value. + * @param WP_Post $form Form. + * @param string $column_name Column name. + * + * @return mixed + */ + public function column_value( $value, $form, $column_name ) { + + if ( $column_name !== self::COLUMN_NAME ) { + return $value; + } + + $form_locations = get_post_meta( $form->ID, self::LOCATIONS_META, true ); + + if ( $form_locations === '' ) { + $empty_values = [ + '' => '—', + FormsLocatorScanTask::SCAN_STATUS_IN_PROGRESS => '...', + FormsLocatorScanTask::SCAN_STATUS_COMPLETED => '0', + ]; + + return $empty_values[ $this->scan_status ]; + } + + $values = $this->get_location_rows( $form_locations ); + + if ( ! $values ) { + return '0'; + } + + $column_value = sprintf( + '%d', + esc_attr__( 'View form locations', 'wpforms-lite' ), + count( $values ) + ); + + $column_value .= '

              ' . implode( '', $values ) . '

              '; + + return $column_value; + } + + /** + * Row actions for view "All". + * + * @since 1.7.4 + * + * @param array $row_actions Row actions. + * @param WP_Post $form Form object. + * + * @return array + */ + public function row_actions_all( $row_actions, $form ) { + + $form_locations = get_post_meta( $form->ID, self::LOCATIONS_META, true ); + + if ( ! $form_locations ) { + return $row_actions; + } + + $locations = [ + 'locations' => sprintf( + '%s', + esc_attr__( 'View form locations', 'wpforms-lite' ), + esc_html__( 'Locations', 'wpforms-lite' ) + ), + ]; + + // Insert Locations action before the first available position in the positions' list or at the end of $row_actions. + $positions = [ + 'preview_', + 'duplicate', + 'trash', + ]; + + $keys = array_keys( $row_actions ); + + foreach ( $positions as $position ) { + $pos = array_search( $position, $keys, true ); + + if ( $pos !== false ) { + break; + } + } + + $pos = $pos === false ? count( $row_actions ) : $pos; + + return array_slice( $row_actions, 0, $pos ) + $locations + array_slice( $row_actions, $pos ); + } + + /** + * Localize the overview script to pass translation strings. + * + * @since 1.7.4 + */ + public function localize_overview_script() { + + wp_localize_script( + 'wpforms-admin-forms-overview', + 'wpforms_forms_locator', + [ + 'paneTitle' => __( 'Form Locations', 'wpforms-lite' ), + 'close' => __( 'Close', 'wpforms-lite' ), + ] + ); + } + + /** + * Get id of the sidebar where the widget is positioned. + * + * @since 1.7.4 + * + * @param string $widget_id Widget id. + * + * @return string + */ + private function get_widget_sidebar_id( $widget_id ) { + + $sidebars_widgets = wp_get_sidebars_widgets(); + + foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widgets ) { + foreach ( $sidebar_widgets as $sidebar_widget ) { + if ( $widget_id === $sidebar_widget ) { + return (string) $sidebar_id; + } + } + } + + return ''; + } + + /** + * Get the name of the sidebar where the widget is positioned. + * + * @since 1.7.4 + * + * @param string $widget_id Widget id. + * + * @return string + */ + private function get_widget_sidebar_name( $widget_id ) { + + $sidebar_id = $this->get_widget_sidebar_id( $widget_id ); + + if ( ! $sidebar_id ) { + return ''; + } + + $sidebar = $this->get_sidebar( $sidebar_id ); + + return isset( $sidebar['name'] ) ? (string) $sidebar['name'] : ''; + } + + /** + * Retrieves the registered sidebar with the given ID. + * + * @since 1.7.4 + * + * @global array $wp_registered_sidebars The registered sidebars. + * + * @param string $id The sidebar ID. + * + * @return array|null The discovered sidebar, or null if it is not registered. + */ + private function get_sidebar( $id ) { + + if ( function_exists( 'wp_get_sidebar' ) ) { + return wp_get_sidebar( $id ); + } + + global $wp_registered_sidebars; + + if ( ! $wp_registered_sidebars ) { + return null; + } + + foreach ( $wp_registered_sidebars as $sidebar ) { + if ( $sidebar['id'] === $id ) { + return $sidebar; + } + } + + if ( $id === 'wp_inactive_widgets' ) { + return [ + 'id' => 'wp_inactive_widgets', + 'name' => __( 'Inactive widgets', 'wpforms-lite' ), + ]; + } + + return null; + } + + /** + * Get post location title. + * + * @since 1.7.4 + * + * @param array $form_location Form location. + * + * @return string + */ + private function get_post_location_title( $form_location ) { + + $title = $form_location['title']; + + if ( $this->is_wp_template( $form_location['type'] ) ) { + return __( 'Site editor template', 'wpforms-lite' ) . ': ' . $title; + } + + return $title; + } + + /** + * Whether locations' type is WP Template. + * + * @since 1.7.4.1 + * + * @param string $location_type Location type. + * + * @return bool + */ + private function is_wp_template( $location_type ) { + + return in_array( $location_type, [ self::WP_TEMPLATE, self::WP_TEMPLATE_PART ], true ); + } + + /** + * Whether a location type is standalone. + * + * @since 1.8.7 + * + * @param string $location_type Location type. + * + * @return bool + */ + private function is_standalone( string $location_type ): bool { + + return in_array( $location_type, self::STANDALONE_LOCATION_TYPES, true ); + } + + /** + * Get location title. + * + * @since 1.7.4 + * + * @param array $form_location Form location. + * + * @return string + */ + private function get_location_title( $form_location ) { + + if ( $form_location['type'] !== self::WIDGET ) { + return $this->get_post_location_title( $form_location ); + } + + $sidebar_name = $this->get_widget_sidebar_name( $form_location['id'] ); + + if ( ! $sidebar_name ) { + // The widget is not found. + return ''; + } + + $title = $form_location['title']; + + if ( ! $title ) { + if ( strpos( $form_location['id'], self::WPFORMS_WIDGET_PREFIX ) === 0 ) { + $title = $this->wpforms_widget_title; + } + + if ( strpos( $form_location['id'], 'text-' ) === 0 ) { + $title = $this->text_widget_title; + } + } + + return $sidebar_name . ': ' . $title; + } + + /** + * Get location url. + * + * @since 1.7.4 + * + * @param array $form_location Form location. + * + * @return string + */ + private function get_location_url( $form_location ) { + + // Get widget or wp_template url. + if ( $form_location['type'] === self::WIDGET || $this->is_wp_template( $form_location['type'] ) ) { + return ''; + } + + // Get standalone url. + if ( $this->is_standalone( $form_location['type'] ) ) { + return $form_location['url']; + } + + // Get post url. + if ( ! $this->is_post_visible( $form_location ) ) { + return ''; + } + + return $form_location['url']; + } + + /** + * Get location edit url. + * + * @since 1.7.4 + * + * @param array $form_location Form location. + * + * @return string + */ + private function get_location_edit_url( array $form_location ): string { + + // Get widget url. + if ( $form_location['type'] === self::WIDGET ) { + return current_user_can( 'edit_theme_options' ) ? admin_url( 'widgets.php' ) : ''; + } + + // Get standalone url. + if ( $this->is_standalone( $form_location['type'] ) ) { + return add_query_arg( + [ + 'page' => 'wpforms-builder', + 'view' => 'settings', + 'form_id' => $form_location['form_id'], + ], + admin_url( 'admin.php' ) + ); + } + + // Get post url. + if ( ! $this->is_post_visible( $form_location ) ) { + return ''; + } + + if ( $this->is_wp_template( $form_location['type'] ) ) { + return add_query_arg( + [ + 'postType' => $form_location['type'], + 'postId' => get_stylesheet() . '//' . str_replace( '/', '', $form_location['url'] ), + ], + admin_url( 'site-editor.php' ) + ); + } + + return (string) get_edit_post_link( $form_location['id'], '' ); + } + + + /** + * Get location information to output as a row in the location pane. + * + * @since 1.7.4 + * + * @param array $form_location Form location. + * + * @return string + * @noinspection PhpTernaryExpressionCanBeReducedToShortVersionInspection + * @noinspection ElvisOperatorCanBeUsedInspection + */ + private function get_location_row( $form_location ) { + + $title = $this->get_location_title( $form_location ); + + $title = $title ? $title : __( '(no title)', 'wpforms-lite' ); + + $location_url = $this->get_location_url( $form_location ); + $location_link = ''; + + if ( $location_url ) { + $location_full_url = $this->home_url . $location_url; + + // phpcs:ignore Generic.Commenting.DocComment.MissingShort + /** @noinspection HtmlUnknownTarget */ + $location_link = sprintf( + ' %2$s ', + esc_url( $location_full_url ), + esc_url( $location_url ) + ); + } + + $location_edit_url = $this->get_location_edit_url( $form_location ); + $location_edit_url = $location_edit_url ? $location_edit_url : '#'; + + // phpcs:ignore Generic.Commenting.DocComment.MissingShort + /** @noinspection HtmlUnknownTarget */ + $location_edit_link = sprintf( + '%2$s', + esc_url( $location_edit_url ), + esc_html( $title ) + ); + + // Escaped above. + return sprintf( + '%s', + $location_edit_link . wp_kses_post( urldecode( $location_link ) ) + ); + } + + /** + * Get location information to output as rows in the location pane. + * + * @since 1.7.4 + * + * @param array $form_locations Form locations. + * + * @return array + */ + private function get_location_rows( $form_locations ) { + + $rows = []; + + foreach ( $form_locations as $form_location ) { + $rows[] = $this->get_location_row( $form_location ); + } + + $rows = array_unique( array_filter( $rows ) ); + + uasort( + $rows, + static function ( $a, $b ) { + $pattern = '/href=".+widgets.php">(.+?)post_type, $this->get_post_types(), true ) || + ! in_array( $post->post_status, $this->get_post_statuses(), true ) + ) { + return; + } + + $form_ids = $this->get_form_ids( $post->post_content ); + + $this->update_form_locations_metas( null, $post, [], $form_ids ); + } + + /** + * Update form location on post_updated action. + * + * @since 1.7.4 + * + * @param int $post_id Post id. + * @param WP_Post $post_after Post after the update. + * @param WP_Post $post_before Post before the update. + * + * @noinspection PhpUnusedParameterInspection + */ + public function post_updated( $post_id, $post_after, $post_before ) { + + if ( + ! in_array( $post_after->post_type, $this->get_post_types(), true ) || + ! in_array( $post_after->post_status, $this->get_post_statuses(), true ) + ) { + return; + } + + $form_ids_before = $this->get_form_ids( $post_before->post_content ); + $form_ids_after = $this->get_form_ids( $post_after->post_content ); + + $this->update_form_locations_metas( $post_before, $post_after, $form_ids_before, $form_ids_after ); + } + + /** + * Update form locations on trash_post action. + * + * @since 1.7.4 + * + * @param int $post_id Post id. + */ + public function trash_post( $post_id ) { + + $post = get_post( $post_id ); + $form_ids_before = $this->get_form_ids( $post->post_content ); + $form_ids_after = []; + + $this->update_form_locations_metas( null, $post, $form_ids_before, $form_ids_after ); + } + + /** + * Update form locations on untrash_post action. + * + * @since 1.7.4 + * + * @param int $post_id Post id. + */ + public function untrash_post( $post_id ) { + + $post = get_post( $post_id ); + $form_ids_before = []; + $form_ids_after = $this->get_form_ids( $post->post_content ); + + $this->update_form_locations_metas( null, $post, $form_ids_before, $form_ids_after ); + } + + /** + * Prepare widgets for further search. + * + * @since 1.7.4 + * + * @param array|null $widgets Widgets. + * @param string $type Widget type. + * + * @return array + */ + private function prepare_widgets( $widgets, $type ) { + + $params = [ + 'wpforms' => [ + 'option' => self::WPFORMS_WIDGET_OPTION, + 'content' => 'form_id', + ], + 'text' => [ + 'option' => self::TEXT_WIDGET_OPTION, + 'content' => 'text', + ], + 'block' => [ + 'option' => self::BLOCK_WIDGET_OPTION, + 'content' => 'content', + ], + ]; + + if ( ! array_key_exists( $type, $params ) ) { + return []; + } + + $option = $params[ $type ]['option']; + $content = $params[ $type ]['content']; + + $widgets = $widgets ?? (array) get_option( $option, [] ); + + return array_filter( + $widgets, + static function ( $widget ) use ( $content ) { + + return isset( $widget[ $content ] ); + } + ); + } + + /** + * Search forms in WPForms widgets. + * + * @since 1.7.4 + * + * @param array $widgets Widgets. + * + * @return array + */ + private function search_in_wpforms_widgets( $widgets = null ) { + + $widgets = $this->prepare_widgets( $widgets, 'wpforms' ); + + $locations = []; + + foreach ( $widgets as $id => $widget ) { + $locations[] = [ + 'type' => self::WIDGET, + 'title' => $widget['title'], + 'form_id' => $widget['form_id'], + 'id' => self::WPFORMS_WIDGET_PREFIX . $id, + ]; + } + + return $locations; + } + + /** + * Search forms in text widgets. + * + * @since 1.7.4 + * + * @param array $widgets Widgets. + * + * @return array + */ + private function search_in_text_widgets( $widgets = null ) { + + $widgets = $this->prepare_widgets( $widgets, 'text' ); + + $locations = []; + + foreach ( $widgets as $id => $widget ) { + $form_ids = $this->get_form_ids( $widget['text'] ); + + foreach ( $form_ids as $form_id ) { + $locations[] = [ + 'type' => self::WIDGET, + 'title' => $widget['title'], + 'form_id' => $form_id, + 'id' => self::TEXT_WIDGET_PREFIX . $id, + ]; + } + } + + return $locations; + } + + /** + * Search forms in block widgets. + * + * @since 1.7.4 + * + * @param array $widgets Widgets. + * + * @return array + */ + private function search_in_block_widgets( $widgets = null ) { + + $widgets = $this->prepare_widgets( $widgets, 'block' ); + + $locations = []; + + foreach ( $widgets as $id => $widget ) { + $form_ids = $this->get_form_ids( $widget['content'] ); + + foreach ( $form_ids as $form_id ) { + $locations[] = [ + 'type' => self::WIDGET, + 'title' => $this->block_widget_title, + 'form_id' => $form_id, + 'id' => self::BLOCK_WIDGET_PREFIX . $id, + ]; + } + } + + return $locations; + } + + /** + * Search forms in widgets. + * + * @since 1.7.4 + * + * @return array + */ + public function search_in_widgets() { + + return array_merge( + $this->search_in_wpforms_widgets(), + $this->search_in_text_widgets(), + $this->search_in_block_widgets() + ); + } + + /** + * Get the difference of two arrays containing locations. + * + * @since 1.7.4 + * + * @param array $locations1 Locations to subtract from. + * @param array $locations2 Locations to subtract. + * + * @return array + */ + private function array_udiff( $locations1, $locations2 ) { + + return array_udiff( + $locations1, + $locations2, + static function ( $a, $b ) { + + return ( $a === $b ) ? 0 : - 1; + } + ); + } + + /** + * Remove locations from metas. + * + * @since 1.7.4 + * + * @param array $locations_to_remove Locations to remove. + * + * @return void + */ + private function remove_locations( $locations_to_remove ) { + + foreach ( $locations_to_remove as $location_to_remove ) { + $locations = get_post_meta( $location_to_remove['form_id'], self::LOCATIONS_META, true ); + + if ( ! $locations ) { + continue; + } + + foreach ( $locations as $key => $location ) { + if ( $location['id'] === $location_to_remove['id'] ) { + unset( $locations[ $key ] ); + } + } + + update_post_meta( $location_to_remove['form_id'], self::LOCATIONS_META, $locations ); + } + } + + /** + * Add locations to metas. + * + * @since 1.7.4 + * + * @param array $locations_to_add Locations to add. + * + * @return void + */ + private function add_locations( $locations_to_add ) { + + foreach ( $locations_to_add as $location_to_add ) { + $locations = get_post_meta( $location_to_add['form_id'], self::LOCATIONS_META, true ); + + if ( ! $locations ) { + $locations = []; + } + + $locations[] = $location_to_add; + + update_post_meta( $location_to_add['form_id'], self::LOCATIONS_META, $locations ); + } + } + + /** + * Update form locations on widget update. + * + * @since 1.7.4 + * + * @param mixed $old_value The old option value. + * @param mixed $value The new option value. + * @param string $option Option name. + */ + public function update_option( $old_value, $value, $option ) { + + switch ( $option ) { + case self::WPFORMS_WIDGET_OPTION: + $old_locations = $this->search_in_wpforms_widgets( $old_value ); + $new_locations = $this->search_in_wpforms_widgets( $value ); + break; + + case self::TEXT_WIDGET_OPTION: + $old_locations = $this->search_in_text_widgets( $old_value ); + $new_locations = $this->search_in_text_widgets( $value ); + break; + + case self::BLOCK_WIDGET_OPTION: + $old_locations = $this->search_in_block_widgets( $old_value ); + $new_locations = $this->search_in_block_widgets( $value ); + break; + + default: + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.AddEmptyLineBeforeReturnStatement + return; + } + + $this->remove_locations( $this->array_udiff( $old_locations, $new_locations ) ); + $this->add_locations( $this->array_udiff( $new_locations, $old_locations ) ); + } + + /** + * Delete locations and schedule new rescan on change of permalink structure. + * + * @since 1.7.4 + * + * @param string $old_permalink_structure The previous permalink structure. + * @param string $permalink_structure The new permalink structure. + * + * @noinspection PhpUnusedParameterInspection + */ + public function permalink_structure_changed( $old_permalink_structure, $permalink_structure ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + /** + * Run Forms Locator delete action. + * + * @since 1.7.4 + */ + do_action( FormsLocatorScanTask::DELETE_ACTION ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound + + /** + * Run Forms Locator scan action. + * + * @since 1.7.4 + */ + do_action( FormsLocatorScanTask::RESCAN_ACTION ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound + } + + /** + * Update form locations metas. + * + * @since 1.7.4 + * @since 1.8.2.3 Added `$post_before` parameter. + * + * @param WP_Post|null $post_before The post before the update. + * @param WP_Post $post_after The post after the update. + * @param array $form_ids_before Form IDs before the update. + * @param array $form_ids_after Form IDs after the update. + */ + private function update_form_locations_metas( $post_before, $post_after, $form_ids_before, $form_ids_after ) { + + // Determine which locations to remove and which to add. + $form_ids_to_remove = array_diff( $form_ids_before, $form_ids_after ); + $form_ids_to_add = array_diff( $form_ids_after, $form_ids_before ); + + // Loop through each form ID to remove the locations' meta. + foreach ( $form_ids_to_remove as $form_id ) { + update_post_meta( + $form_id, + self::LOCATIONS_META, + $this->get_locations_without_current_post( $form_id, $post_after->ID ) + ); + } + + // Determine the titles and slugs. + $old_title = $post_before->post_title ?? ''; + $old_slug = $post_before->post_name ?? ''; + $new_title = $post_after->post_title; + $new_slug = $post_after->post_name; + + // If the title and slug are the same and there are no form IDs to add, bail. + if ( empty( $form_ids_to_add ) && $old_title === $new_title && $old_slug === $new_slug ) { + return; + } + + // Merge the form IDs and remove duplicates. + $form_ids = array_unique( array_merge( $form_ids_to_add, $form_ids_after ) ); + + $this->save_location_meta( $form_ids, $post_after->ID, $post_after ); + } + + /** + * Save the location meta. + * + * @since 1.8.2.3 + * + * @param array $form_ids Form IDs. + * @param int $post_id Post ID. + * @param WP_Post $post_after Post after the update. + */ + private function save_location_meta( $form_ids, $post_id, $post_after ) { + + // Build the URL. + $url = get_permalink( $post_id ); + $url = ( $url === false || is_wp_error( $url ) ) ? '' : $url; + $url = str_replace( $this->home_url, '', $url ); + + // Loop through each Form ID and save the location meta. + foreach ( $form_ids as $form_id ) { + + $locations = $this->get_locations_without_current_post( $form_id, $post_id ); + + $locations[] = [ + 'type' => $post_after->post_type, + 'title' => $post_after->post_title, + 'form_id' => $form_id, + 'id' => $post_id, + 'status' => $post_after->post_status, + 'url' => $url, + ]; + + update_post_meta( $form_id, self::LOCATIONS_META, $locations ); + } + } + + /** + * Get post types for search in. + * + * @since 1.7.4 + * + * @return string[] + */ + public function get_post_types() { + + $args = [ + 'public' => true, + 'publicly_queryable' => true, + ]; + $post_types = get_post_types( $args, 'names', 'or' ); + + unset( $post_types['attachment'] ); + + $post_types[] = self::WP_TEMPLATE; + $post_types[] = self::WP_TEMPLATE_PART; + + return $post_types; + } + + /** + * Get post statuses for search in. + * + * @since 1.7.4 + * + * @return string[] + */ + public function get_post_statuses() { + + return [ 'publish', 'pending', 'draft', 'future', 'private' ]; + } + + /** + * Get form ids from the content. + * + * @since 1.7.4 + * + * @param string $content Content. + * + * @return int[] + */ + public function get_form_ids( $content ) { + + $form_ids = []; + + if ( + preg_match_all( + /** + * Extract id from conventional wpforms shortcode or wpforms block. + * Examples: + * [wpforms id="32" title="true" description="true"] + * + * In both, we should find 32. + */ + '#\[\s*wpforms.+id\s*=\s*"(\d+?)".*]|#', + $content, + $matches + ) + ) { + array_shift( $matches ); + $form_ids = array_map( + 'intval', + array_unique( array_filter( array_merge( ...$matches ) ) ) + ); + } + + return $form_ids; + } + + /** + * Get form locations without a current post. + * + * @since 1.7.4 + * + * @param int $form_id Form id. + * @param int $post_id Post id. + * + * @return array + */ + private function get_locations_without_current_post( $form_id, $post_id ) { + + $locations = get_post_meta( $form_id, self::LOCATIONS_META, true ); + + if ( ! is_array( $locations ) ) { + $locations = []; + } + + return array_filter( + $locations, + static function ( $location ) use ( $post_id ) { + + return $location['id'] !== $post_id; + } + ); + } + + /** + * Determine whether a post is visible. + * + * @since 1.7.4 + * + * @param array $location Post location. + * + * @return bool + */ + private function is_post_visible( $location ) { + + $edit_cap = 'edit_post'; + $read_cap = 'read_post'; + $post_id = $location['id']; + + if ( ! get_post_type_object( $location['type'] ) ) { + // Post type is not registered. + return false; + } + + $post_status_obj = get_post_status_object( $location['status'] ); + + if ( ! $post_status_obj ) { + // Post status is not registered, assume it's not public. + return current_user_can( $edit_cap, $post_id ); + } + + if ( $post_status_obj->public ) { + return true; + } + + if ( ! is_user_logged_in() ) { + // User must be logged in to view unpublished posts. + return false; + } + + if ( $post_status_obj->protected ) { + // User must have edit permissions on the draft to preview. + return current_user_can( $edit_cap, $post_id ); + } + + if ( $post_status_obj->private ) { + return current_user_can( $read_cap, $post_id ); + } + + return false; + } + + /** + * Build a standalone location. + * + * @since 1.8.7 + * + * @param int $form_id The form ID. + * @param array $form_data Form data. + * @param string $status Form status. + * + * @return array Location. + */ + public function build_standalone_location( int $form_id, array $form_data, string $status = 'publish' ): array { + + if ( empty( $form_id ) || empty( $form_data ) ) { + return []; + } + + // Form templates should not have any locations. + if ( get_post_type( $form_id ) === 'wpforms-template' ) { + return []; + } + + foreach ( self::STANDALONE_LOCATION_TYPES as $location_type ) { + if ( empty( $form_data['settings'][ "{$location_type}_enable" ] ) ) { + continue; + } + + return $this->build_standalone_location_type( $location_type, $form_id, $form_data, $status ); + } + + return []; + } + + /** + * Build a standalone location. + * + * @since 1.8.8 + * + * @param string $location_type Standalone location type. + * @param int $form_id The form ID. + * @param array $form_data Form data. + * @param string $status Form status. + * + * @return array Location. + */ + private function build_standalone_location_type( string $location_type, int $form_id, array $form_data, string $status ): array { + + $title_key = "{$location_type}_title"; + $slug_key = "{$location_type}_page_slug"; + $title = $form_data['settings'][ $title_key ] ?? ''; + $slug = $form_data['settings'][ $slug_key ] ?? ''; + + // Return the location array. + return [ + 'type' => $location_type, + 'title' => $title, + 'form_id' => (int) $form_data['id'], + 'id' => $form_id, + 'status' => $status, + 'url' => '/' . $slug . '/', + ]; + } + + /** + * Add standalone form locations to post meta. + * + * Post meta is used to store all forms' locations, + * which is displayed on the WPForms Overview page. + * + * @since 1.8.7 + * + * @param int $form_id Form ID. + * @param array $data Form data. + */ + public function add_standalone_location_to_locations_meta( int $form_id, array $data ) { + + // Build standalone location. + $location = $this->build_standalone_location( $form_id, $data ); + + // No location? Bail. + if ( empty( $location ) ) { + return; + } + + // Setup data. + $new_location[] = $location; + $post_meta = get_post_meta( $form_id, self::LOCATIONS_META, true ); + + // If there is post meta, merge it with the new location. + if ( ! empty( $post_meta ) ) { + + // Remove any previously set standalone locations. + $post_meta = $this->remove_standalone_location_from_array( $form_id, $post_meta ); + + // Merge locations and remove duplicates. + $new_location = array_unique( array_merge( $post_meta, $new_location ), SORT_REGULAR ); + } + + // Update post meta. + update_post_meta( $form_id, self::LOCATIONS_META, $new_location ); + } + + /** + * Remove a form page from an array. + * + * @since 1.8.7 + * + * @param int $form_id The form ID. + * @param array $post_meta The post meta. + * + * @return array $post_meta Filtered post meta. + */ + private function remove_standalone_location_from_array( int $form_id, array $post_meta ): array { + + // No form ID or post meta? Bail. + if ( empty( $form_id ) || empty( $post_meta ) ) { + return []; + } + + // Loop over all locations. + foreach ( $post_meta as $key => $location ) { + + // Verify the location keys exist. + if ( ! isset( $location['form_id'], $location['type'] ) ) { + continue; + } + + // If the form ID and location type match. + if ( $location['form_id'] === $form_id && $this->is_standalone( $location['type'] ) ) { + + // Unset the form page location. + unset( $post_meta[ $key ] ); + } + } + + return $post_meta; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Preview.php b/wp-content/plugins/wpforms-lite/src/Forms/Preview.php new file mode 100755 index 00000000..526c7837 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Preview.php @@ -0,0 +1,394 @@ +is_preview_page() ) { + return; + } + + $this->hooks(); + } + + /** + * Check if current page request meets requirements for form preview page. + * + * @since 1.5.1 + * + * @return bool + */ + public function is_preview_page(): bool { + + // Only proceed for the form preview page. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( empty( $_GET['wpforms_form_preview'] ) ) { + return false; + } + + // Only logged-in users can access the preview page. + if ( ! is_user_logged_in() ) { + return false; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $form_id = absint( $_GET['wpforms_form_preview'] ); + + // Make sure the user is allowed to preview the form. + if ( ! wpforms_current_user_can( 'view_form_single', $form_id ) ) { + return false; + } + + // Fetch form details. + $this->form_data = wpforms()->obj( 'form' )->get( $form_id, [ 'content_only' => true ] ); + + // Get the post type for preview item. + $this->post_type = get_post_type( $form_id ); + + // Check if this is a form template. + $this->is_form_template = $this->post_type === 'wpforms-template'; + + // Check valid form was found. + if ( empty( $this->form_data ) || empty( $this->form_data['id'] ) ) { + return false; + } + + return true; + } + + /** + * Hooks. + * + * @since 1.5.1 + */ + public function hooks() { + + add_filter( 'wpforms_frontend_assets_header_force_load', '__return_true' ); + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + add_action( 'pre_get_posts', [ $this, 'pre_get_posts' ] ); + add_filter( 'the_title', [ $this, 'the_title' ], 100, 1 ); + add_filter( 'the_content', [ $this, 'the_content' ], 999 ); + add_filter( 'get_the_excerpt', [ $this, 'the_content' ], 999 ); + add_filter( 'home_template_hierarchy', [ $this, 'force_page_template_hierarchy' ] ); + add_filter( 'frontpage_template_hierarchy', [ $this, 'force_page_template_hierarchy' ] ); + add_filter( 'wpforms_smarttags_process_page_title_value', [ $this, 'smart_tags_process_page_title_value' ], 10, 5 ); + add_filter( 'post_thumbnail_html', '__return_empty_string' ); + } + + /** + * Enqueue additional form preview styles. + * + * @since 1.8.8 + */ + public function enqueue_assets() { + + $min = wpforms_get_min_suffix(); + + // Enqueue the form preview styles. + wp_enqueue_style( + 'wpforms-preview', + WPFORMS_PLUGIN_URL . "assets/css/frontend/wpforms-form-preview{$min}.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Modify query, limit to one post. + * + * @since 1.5.1 + * @since 1.7.0 Added `page_id`, `post_type` and `post__in` query variables. + * + * @param \WP_Query $query The WP_Query instance. + */ + public function pre_get_posts( $query ) { + + if ( is_admin() || ! $query->is_main_query() ) { + return; + } + + $query->set( 'page_id', '' ); + $query->set( 'post_type', $this->post_type ?? 'wpforms' ); + $query->set( 'post__in', empty( $this->form_data['id'] ) ? [] : [ (int) $this->form_data['id'] ] ); + $query->set( 'posts_per_page', 1 ); + + // The preview page reads as the home page and as an non-singular posts page, neither of which are actually the case. + // So we hardcode the correct values for those properties in the query. + $query->is_home = false; + $query->is_singular = true; + $query->is_single = true; + } + + /** + * Customize form preview page title. + * + * @since 1.5.1 + * + * @param string $title Page title. + * + * @return string + */ + public function the_title( $title ) { + + if ( ! in_the_loop() ) { + return $title; + } + + if ( $this->is_form_template ) { + return sprintf( /* translators: %s - form name. */ + esc_html__( '%s Template Preview', 'wpforms-lite' ), + ! empty( $this->form_data['settings']['form_title'] ) ? sanitize_text_field( $this->form_data['settings']['form_title'] ) : esc_html__( 'Form Template', 'wpforms-lite' ) + ); + } + + return sprintf( /* translators: %s - form name. */ + esc_html__( '%s Preview', 'wpforms-lite' ), + ! empty( $this->form_data['settings']['form_title'] ) ? sanitize_text_field( $this->form_data['settings']['form_title'] ) : esc_html__( 'Form', 'wpforms-lite' ) + ); + } + + /** + * Customize form preview page content. + * + * @since 1.5.1 + * + * @return string + */ + public function the_content() { + + if ( ! isset( $this->form_data['id'] ) ) { + return ''; + } + + if ( ! wpforms_current_user_can( 'view_form_single', $this->form_data['id'] ) ) { + return ''; + } + + $admin_url = admin_url( 'admin.php' ); + + $links = []; + + if ( wpforms_current_user_can( 'edit_form_single', $this->form_data['id'] ) ) { + $links[] = [ + 'url' => esc_url( + add_query_arg( + [ + 'page' => 'wpforms-builder', + 'view' => 'fields', + 'form_id' => absint( $this->form_data['id'] ), + ], + $admin_url + ) + ), + 'text' => $this->is_form_template ? esc_html__( 'Edit Form Template', 'wpforms-lite' ) : esc_html__( 'Edit Form', 'wpforms-lite' ), + ]; + } + + if ( wpforms()->is_pro() && wpforms_current_user_can( 'view_entries_form_single', $this->form_data['id'] ) ) { + $links[] = [ + 'url' => esc_url( + add_query_arg( + [ + 'page' => 'wpforms-entries', + 'view' => 'list', + 'form_id' => absint( $this->form_data['id'] ), + ], + $admin_url + ) + ), + 'text' => esc_html__( 'View Entries', 'wpforms-lite' ), + ]; + } + + if ( + ! $this->is_form_template && + wpforms_current_user_can( wpforms_get_capability_manage_options(), $this->form_data['id'] ) && + wpforms()->obj( 'payment' )->get_by( 'form_id', $this->form_data['id'] ) + ) { + $links[] = [ + 'url' => esc_url( + add_query_arg( + [ + 'page' => 'wpforms-payments', + 'form_id' => absint( $this->form_data['id'] ), + ], + $admin_url + ) + ), + 'text' => esc_html__( 'View Payments', 'wpforms-lite' ), + ]; + } + + if ( ! empty( $_GET['new_window'] ) ) { // phpcs:ignore + $links[] = [ + 'url' => 'javascript:window.close();', + 'text' => esc_html__( 'Close this window', 'wpforms-lite' ), + ]; + } + + $content = ''; + + $content .= $this->add_preview_notice(); + + $content .= '

              '; + $content .= $this->is_form_template ? + esc_html__( 'This is a preview of the latest saved revision of your form template. If this preview does not match your template, save your changes and then refresh this page. This template preview is not publicly accessible.', 'wpforms-lite' ) : + esc_html__( 'This is a preview of the latest saved revision of your form. If this preview does not match your form, save your changes and then refresh this page. This form preview is not publicly accessible.', 'wpforms-lite' ); + + if ( ! empty( $links ) ) { + $content .= '
              '; + $content .= ''; + + foreach ( $links as $key => $link ) { + $content .= '' . $link['text'] . ''; + $l = array_keys( $links ); + + if ( end( $l ) !== $key ) { + $content .= ' | '; + } + } + + $content .= ''; + } + $content .= '

              '; + + $content .= '

              '; + $content .= sprintf( + wp_kses( + /* translators: %s - WPForms doc link. */ + __( 'For form testing tips, check out our complete guide!', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( + wpforms_utm_link( + 'https://wpforms.com/docs/how-to-properly-test-your-wordpress-forms-before-launching-checklist/', + $this->is_form_template ? 'Form Template Preview' : 'Form Preview', + 'Form Testing Tips Documentation' + ) + ) + ); + $content .= '

              '; + + $content .= do_shortcode( '[wpforms id="' . absint( $this->form_data['id'] ) . '"]' ); + + return $content; + } + + /** + * Add preview notice. + * + * @since 1.8.8 + * + * @return string HTML content. + */ + private function add_preview_notice(): string { + + if ( ! $this->is_form_template ) { + return ''; + } + + $content = '
              '; + $content .= sprintf( + '%s %s', + esc_html__( 'Heads up!', 'wpforms-lite' ), + esc_html__( 'You\'re viewing a preview of a form template.', 'wpforms-lite' ) + ); + + if ( wpforms()->is_pro() ) { + /** This filter is documented in wpforms/src/Pro/Tasks/Actions/PurgeTemplateEntryTask.php */ + $delay = (int) apply_filters( 'wpforms_pro_tasks_actions_purge_template_entry_task_delay', DAY_IN_SECONDS ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $message = sprintf( /* translators: %s - time period, e.g. 24 hours. */ + __( 'Entries are automatically deleted after %s.', 'wpforms-lite' ), + // The `- 1` hack is to avoid the "1 day" message in favor of "24 hours". + human_time_diff( time(), time() + $delay - 1 ) + ); + + $content .= sprintf( '

              %s

              ', esc_html( $message ) ); + } + + $content .= '
              '; + + return wp_kses_post( $content ); + } + + /** + * Force page template types. + * + * @since 1.7.2 + * + * @param array $templates A list of template candidates, in descending order of priority. + * + * @return array + */ + public function force_page_template_hierarchy( $templates ) { + + return [ 'page.php', 'single.php', 'index.php' ]; + } + + /** + * Adjust value of the {page_title} smart tag. + * + * @since 1.7.7 + * + * @param string $content Content. + * @param array $form_data Form data. + * @param array $fields List of fields. + * @param string $entry_id Entry ID. + * @param object $smart_tag_object The smart tag object or the Generic object for those cases when class unregistered. + * + * @return string + */ + public function smart_tags_process_page_title_value( $content, $form_data, $fields, $entry_id, $smart_tag_object ) { + + return sprintf( /* translators: %s - form name. */ + esc_html__( '%s Preview', 'wpforms-lite' ), + ! empty( $form_data['settings']['form_title'] ) ? sanitize_text_field( $form_data['settings']['form_title'] ) : esc_html__( 'Form', 'wpforms-lite' ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Submission.php b/wp-content/plugins/wpforms-lite/src/Forms/Submission.php new file mode 100755 index 00000000..f4fdf896 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Submission.php @@ -0,0 +1,280 @@ +fields = $fields; + $this->entry = $entry; + $this->form_id = $form_id; + $this->form_data = $form_data; + $this->date = gmdate( 'Y-m-d H:i:s' ); + + return $this; + } + + /** + * Prepare the submission data. + * + * @since 1.7.4 + * + * @return array|void + */ + public function prepare_entry_data() { + + /** + * Provide the opportunity to disable entry saving. + * + * @since 1.0.0 + * + * @param bool $entry_save Entry save flag. Defaults to true. + * @param array $fields Fields data. + * @param array $entry Entry data. + * @param array $form_data Form data. + */ + if ( ! apply_filters( 'wpforms_entry_save', true, $this->fields, $this->entry, $this->form_data ) ) { // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + return; + } + + $submitted_fields = $this->get_fields(); + $user_info = $this->get_user_info( $submitted_fields ); + + /** + * Information about the entry, that is ready to be saved into the main entries table, + * which is used for displaying a list of entries and partially for search. + * + * @since 1.5.9 + * + * @param array $entry_data Information about the entry, that will be saved into the DB. + * @param array $form_data Form data. + */ + return (array) apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_entry_save_args', + [ + 'form_id' => absint( $this->form_id ), + 'user_id' => absint( $user_info['user_id'] ), + 'fields' => wp_json_encode( $submitted_fields ), + 'ip_address' => sanitize_text_field( $user_info['user_ip'] ), + 'user_agent' => sanitize_text_field( $user_info['user_agent'] ), + 'date' => $this->date, + 'user_uuid' => sanitize_text_field( $user_info['user_uuid'] ), + ], + $this->form_data + ); + } + + /** + * Prepare the payment submission data. + * + * @since 1.8.2 + * + * @return array + */ + public function prepare_payment_data() { + + $submitted_fields = $this->get_fields(); + $total_amount = wpforms_get_total_payment( $submitted_fields ); + + /** + * Information about the payment, that is ready to be saved into the main payments table, + * which is used for displaying a list of payments and partially for search. + * + * @since 1.8.2 + * + * @param array $payment_data Information about the payment, that will be saved into the DB. + * @param array $fields Final/sanitized submitted field data. + * @param array $form_data Form data and settings. + */ + $payment_data = (array) apply_filters( + 'wpforms_forms_submission_prepare_payment_data', + [ + 'form_id' => absint( $this->form_id ), + 'subtotal_amount' => $total_amount, + 'total_amount' => $total_amount, + 'currency' => wpforms_get_currency(), + 'entry_id' => absint( $this->entry['entry_id'] ), + 'date_created_gmt' => $this->date, + 'date_updated_gmt' => $this->date, + ], + $submitted_fields, + $this->form_data + ); + + if ( empty( $payment_data['type'] ) ) { + $payment_data['type'] = ! empty( $payment_data['subscription_id'] ) ? 'subscription' : 'one-time'; + } + + return $payment_data; + } + + /** + * Prepare the payment meta data for each payment. + * + * @since 1.8.2 + * + * @return array + */ + public function prepare_payment_meta() { + + $submitted_fields = $this->get_fields(); + $user_info = $this->get_user_info( $submitted_fields ); + + /** + * Payment meta that is ready to be saved into the payments_meta table. + * + * @since 1.8.2 + * + * @param array $payment_meta Payment meta that will be saved into the DB. + * @param array $fields Final/sanitized submitted field data. + * @param array $form_data Form data and settings. + */ + return (array) apply_filters( + 'wpforms_forms_submission_prepare_payment_meta', + [ + 'fields' => ! $this->entry['entry_id'] ? wp_json_encode( $submitted_fields ) : '', + 'user_id' => absint( $user_info['user_id'] ), + 'user_agent' => sanitize_text_field( $user_info['user_agent'] ), + 'user_uuid' => sanitize_text_field( $user_info['user_uuid'] ), + 'ip_address' => sanitize_text_field( $user_info['user_ip'] ), + ], + $submitted_fields, + $this->form_data + ); + } + + /** + * Get entry fields. + * + * @since 1.8.2 + * + * @return array + */ + private function get_fields() { + + /** + * Filter the entry data before saving. + * + * @since 1.0.0 + * + * @param array $fields Fields data. + * @param array $entry Entry data. + * @param array $form_data Form data. + */ + return (array) apply_filters( 'wpforms_entry_save_data', $this->fields, $this->entry, $this->form_data ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Get user info. + * + * @since 1.8.2 + * + * @param array $fields Fields data. + * + * @return array + */ + private function get_user_info( $fields ) { + + $user_info = [ + 'user_ip' => '', + 'user_agent' => '', + 'user_id' => is_user_logged_in() ? get_current_user_id() : 0, + 'user_uuid' => wpforms_is_collecting_cookies_allowed() && ! empty( $_COOKIE['_wpfuuid'] ) ? sanitize_key( $_COOKIE['_wpfuuid'] ) : '', + ]; + + /** + * Allow developers disable saving user IP and User Agent within the entry. + * + * @since 1.5.1 + * + * @param bool $disable True if you need to disable storing IP and UA within the entry. Defaults to false. + * @param array $fields Fields data. + * @param array $form_data Form data. + */ + // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + $is_ip_disabled = apply_filters( 'wpforms_disable_entry_user_ip', '__return_false', $fields, $this->form_data ); + + // If GDPR enhancements are enabled and user details are disabled + // globally or in the form settings, discard the IP and UA. + if ( + ! $is_ip_disabled || + ! wpforms_is_collecting_ip_allowed( $this->form_data ) + ) { + return $user_info; + } + + $user_info['user_ip'] = wpforms_get_ip(); + + if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) { + return $user_info; + } + + $user_info['user_agent'] = substr( sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ), 0, 256 ); + + return $user_info; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Forms/Token.php b/wp-content/plugins/wpforms-lite/src/Forms/Token.php new file mode 100755 index 00000000..000314d3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Forms/Token.php @@ -0,0 +1,381 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.6.2 + */ + public function hooks() { + + add_filter( 'wpforms_frontend_form_atts', [ $this, 'add_token_to_form_atts' ], 10, 2 ); + add_filter( 'wpforms_frontend_strings', [ $this, 'add_frontend_strings' ] ); + add_action( 'wp_ajax_nopriv_wpforms_get_token', [ $this, 'ajax_get_token' ] ); + add_action( 'wp_ajax_wpforms_get_token', [ $this, 'ajax_get_token' ] ); + } + + /** + * Return a valid token. + * + * @since 1.6.2 + * @since 1.7.1 Added the $form_data argument. + * + * @param mixed $current True to use current time, otherwise a timestamp string. + * @param array $form_data Form data and settings. + * + * @return string Token. + */ + public function get( $current = true, $form_data = [] ) { + + // If $current was not passed, or it is true, we use the current timestamp. + // If $current was passed in as a string, we'll use that passed in timestamp. + if ( $current !== true ) { + $time = $current; + } else { + $time = time(); + } + + // Format the timestamp to be less exact, as we want to deal in days. + // June 19th, 2020 would get formatted as: 1906202017125. + // Day of the month, month number, year, day number of the year, week number of the year. + $token_data = gmdate( 'dmYzW', $time ); + + if ( ! empty( $form_data['id'] ) ) { + $token_data .= "::{$form_data['id']}"; + } + + // Combine our token date and our token salt, and md5 it. + return md5( $token_data . \WPForms\Helpers\Crypto::get_secret_key() ); + } + + /** + * Generate the array of valid tokens to check for. These include two days + * before the current date to account for long cache times. + * + * These two filters are available if a user wants to extend the times. + * 'wpforms_form_token_check_before_today' + * 'wpforms_form_token_check_after_today' + * + * @since 1.6.2 + * @since 1.7.1 Added the $form_data argument. + * + * @param array $form_data Form data and settings. + * + * @return array Array of all valid tokens to check against. + */ + public function get_valid_tokens( $form_data = [] ) { + + $current_date = time(); + + $valid_token_times_before = []; + + $days_in_5_years = 5 * 365; + + // Create an array of 5 years worth of days. + for ( $i = 1; $i <= $days_in_5_years; $i++ ) { + $valid_token_times_before[] = $i * DAY_IN_SECONDS; + } + + // Create our array of times to check before today. A user with a longer + // cache time can extend this. A user with a shorter cache time can remove times. + $valid_token_times_before = apply_filters( + 'wpforms_form_token_check_before_today', + $valid_token_times_before + ); + + // Mostly to catch edge cases like the form page loading and submitting on two different days. + // This probably won't be filtered by users too much, but they could extend it. + $valid_token_times_after = apply_filters( + 'wpforms_form_token_check_after_today', + [ + ( 45 * MINUTE_IN_SECONDS ), // Add in 45 minutes past today to catch some midnight edge cases. + ] + ); + + // Built up our valid tokens. + $valid_tokens = []; + + // Add in all the previous times we check. + foreach ( $valid_token_times_before as $time ) { + $valid_tokens[] = $this->get( $current_date - $time, $form_data ); + } + + // Add in our current date. + $valid_tokens[] = $this->get( $current_date, $form_data ); + + // Add in the times after our check. + foreach ( $valid_token_times_after as $time ) { + $valid_tokens[] = $this->get( $current_date + $time, $form_data ); + } + + return $valid_tokens; + } + + /** + * Check if the given token is valid or not. + * + * Tokens are valid for some period of time (see wpforms_token_validity_in_hours + * and wpforms_token_validity_in_days to extend the validation period). + * By default tokens are valid for day. + * + * @since 1.6.2 + * @since 1.7.1 Added the $form_data argument. + * + * @param string $token Token to validate. + * @param array $form_data Form data and settings. + * + * @return bool Whether the token is valid or not. + */ + public function verify( string $token, array $form_data = [] ): bool { + + // Check to see if our token is inside the valid tokens. + return in_array( $token, $this->get_valid_tokens( $form_data ), true ); + } + + /** + * Add the token to the form attributes. + * + * @since 1.6.2 + * @since 1.7.1 Added the $form_data argument. + * + * @param array $attrs Form attributes. + * @param array $form_data Form data and settings. + * + * @return array Form attributes. + */ + public function add_token_to_form_atts( array $attrs, array $form_data ) { + + $attrs['atts']['data-token'] = $this->get( true, $form_data ); + $attrs['atts']['data-token-time'] = time(); + + return $attrs; + } + + /** + * Validate Anti-spam if enabled. + * + * @since 1.6.2 + * + * @param array $form_data Form data. + * @param array $fields Fields. + * @param array $entry Form entry. + * + * @return bool|string True or a string with the error. + */ + public function validate( array $form_data, array $fields, array $entry ) { + + // Bail out if we don't have the antispam setting. + if ( empty( $form_data['settings']['antispam'] ) ) { + return true; + } + + // Bail out if the antispam setting isn't enabled. + if ( $form_data['settings']['antispam'] !== '1' ) { + return true; + } + + $is_valid_token = isset( $entry['token'] ) && $this->verify( (string) $entry['token'], $form_data ); + + if ( $this->process_antispam_filter_wrapper( $is_valid_token, $fields, $entry, $form_data ) ) { + return true; + } + + // Prepare the log data. + $form_title = $form_data['settings']['form_title'] ?? ''; + $form_id = $form_data['id'] ?? 'unknown'; + + if ( $is_valid_token ) { + // Token is OK, but antispam filter is not passed. + $log_message = 'Filter is not passed'; + $error_message = $this->get_antispam_filter_message(); + } else { + // Invalid token. + $log_message = 'Token is invalid'; + $error_message = $this->get_invalid_token_message(); + } + + wpforms_log( + 'Antispam: ' . $log_message, + [ + 'message' => $error_message, + 'referer' => esc_url_raw( (string) wp_get_referer() ), + 'form' => ! empty( $form_title ) ? $form_title . ' (ID: ' . $form_id . ')' : 'ID: ' . $form_id, + 'token' => $entry['token'] ?? '', + 'user_ip' => wpforms_get_ip(), + 'entry_data' => ! wpforms_setting( 'gdpr' ) ? $entry : 'Not logged', + ], + [ + 'type' => [ 'spam', 'error' ], + 'form_id' => $form_data['id'], + 'force' => true, + ] + ); + + return $error_message; + } + + /** + * Helper to run our filter on all the responses for the antispam checks. + * + * @since 1.6.2 + * + * @param bool $is_valid_not_spam Is valid entry or not. + * @param array $fields Form Fields. + * @param array $entry Form entry. + * @param array $form_data Form Data. + * + * @return bool Is valid or not. + */ + public function process_antispam_filter_wrapper( bool $is_valid_not_spam, array $fields, array $entry, array $form_data ): bool { + + /** + * Allows developers to filter the antispam check result. + * + * @since 1.6.2 + * + * @param bool $is_valid_not_spam True if entry valid, false otherwise. + * @param array $fields Fields data. + * @param array $entry Entry data. + * @param array $form_data Form data. + */ + return (bool) apply_filters( 'wpforms_process_antispam', $is_valid_not_spam, $fields, $entry, $form_data ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Helper to get the invalid token message. + * + * @since 1.6.2.1 + * + * @return string Invalid token message. + */ + private function get_invalid_token_message(): string { + + return $this->get_error_message( esc_html__( 'Antispam token is invalid.', 'wpforms-lite' ) ); + } + + /** + * Helper to get the antispam filter error message. + * + * @since 1.8.9 + * + * @return string Missing token message. + */ + private function get_antispam_filter_message(): string { + + return $this->get_error_message( esc_html__( 'Antispam filter did not allow your data to pass through.', 'wpforms-lite' ) ); + } + + /** + * Get error message depends on user. + * + * @since 1.6.4.1 + * + * @param string $text Message text. + * + * @return string + */ + private function get_error_message( string $text ): string { + + $text .= ' ' . esc_html__( 'Please reload the page and try submitting the form again.', 'wpforms-lite' ); + + return wpforms_current_user_can() ? $text . $this->maybe_get_support_text() : $text; + } + + /** + * If a user is a super admin, add a support link to the message. + * + * @since 1.6.2.1 + * + * @return string Support text if super admin, empty string if not. + */ + private function maybe_get_support_text(): string { + + // If a user isn't a super admin, don't return any text. + if ( ! is_super_admin() ) { + return ''; + } + + // If the user is an admin, return text with a link to support. + // We add a space here to separate the sentences, but outside the localized text to avoid it being removed. + return ' ' . sprintf( + /* translators: placeholders are links. */ + esc_html__( 'Please check out our %1$stroubleshooting guide%2$s for details on resolving this issue.', 'wpforms-lite' ), + '', + '' + ); + } + + /** + * Add token related strings to the frontend. + * + * @since 1.8.8 + * + * @param array|mixed $strings Frontend strings. + * + * @return array Frontend strings. + */ + public function add_frontend_strings( $strings ): array { + + $strings = (array) $strings; + + $strings['error_updating_token'] = esc_html__( + 'Error updating token. Please try again or contact support if the issue persists.', + 'wpforms-lite' + ); + $strings['network_error'] = esc_html__( + 'Network error or server is unreachable. Check your connection or try again later.', + 'wpforms-lite' + ); + + // Default token lifetime is 24 hours in seconds. + $token_lifetime = DAY_IN_SECONDS; + + /** + * Filter token cache lifetime in seconds. + * + * @since 1.8.8 + * + * @param integer $token_lifetime Token lifetime in seconds. + */ + $strings['token_cache_lifetime'] = apply_filters( 'wpforms_forms_token_cache_lifetime', $token_lifetime ); + + return $strings; + } + + /** + * Update token via ajax handler. + * + * @since 1.8.8 + */ + public function ajax_get_token() { + + $form_data = []; + $form_data['id'] = filter_input( INPUT_POST, 'formId', FILTER_VALIDATE_INT ); + + $response = [ + 'token' => $this->get( true, $form_data ), + ]; + + wp_send_json_success( $response ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Frontend/Amp.php b/wp-content/plugins/wpforms-lite/src/Frontend/Amp.php new file mode 100755 index 00000000..d7388a2d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Frontend/Amp.php @@ -0,0 +1,386 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + add_filter( 'amp_skip_post', [ $this, 'skip_post' ] ); + add_filter( 'wpforms_frontend_form_atts', [ $this, 'form_atts' ], -PHP_INT_MAX, 2 ); + add_action( 'wpforms_frontend_output', [ $this, 'output_state' ], -PHP_INT_MAX, 5 ); + } + + /** + * Check whether the current page is in AMP mode or not. + * + * @since 1.8.1 + * + * @return bool True if the current page is in AMP mode. + */ + public function is_amp(): bool { + + if ( is_null( $this->is_amp_mode ) ) { + $this->is_amp_mode = wpforms_is_amp(); + } + + return $this->is_amp_mode; + } + + /** + * Stop AMP output. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * + * @return bool True if we need to stop the output. + */ + public function stop_output( $form_data ): bool { + + // We need to stop output processing in case we are on AMP page. + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + if ( ! $this->should_stop_output() ) { + return false; + } + + $form_id = ! empty( $form_data['id'] ) ? (int) $form_data['id'] : 0; + $full_page_url = home_url( add_query_arg( 'nonamp', '1' ) . '#wpforms-' . $form_id ); + + /** + * Allow modifying the text or url for the full page on the AMP pages. + * + * @since 1.4.1.1 + * @since 1.7.1 Added $form_id, $full_page_url, and $form_data arguments. + * + * @param string $text Text. + * @param int $form_id Form id. + * @param string $full_page_url Full page url. + * @param array $form_data Form data and settings. + * + * @return string + */ + $text = (string) apply_filters( + 'wpforms_frontend_shortcode_amp_text', + sprintf( /* translators: %s - URL to a non-amp version of a page with the form. */ + __( 'Go to the full page to view and submit the form.', 'wpforms-lite' ), + esc_url( $full_page_url ) + ), + $form_id, + $full_page_url, + $form_data + ); + + printf( + '

              %s

              ', + wp_kses_post( $text ) + ); + + return true; + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Whether output should be stopped. + * + * @since 1.9.0 + * + * @return bool + */ + private function should_stop_output(): bool { + + if ( ! $this->is_amp() ) { + return false; + } + + /** + * Filters PRO status of the plugin. + * Returning `true` means that AMP stop loading. + * + * @since 1.5.4.2 + * + * @param bool $pro Pro status. + */ + if ( apply_filters( 'wpforms_amp_pro', wpforms()->is_pro() ) ) { // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + return true; + } + + return ( + ! defined( 'AMP__VERSION' ) || + version_compare( AMP__VERSION, '1.2', '<' ) || + ! is_ssl() + ); + } + + /** + * Disable AMP if query param is detected. + * + * This allows the full form to be accessible for Pro users or sites + * that do not have SSL. + * + * @since 1.8.1 + * + * @param bool $skip Skip AMP mode, display full post. + * + * @return bool + */ + public function skip_post( $skip ) { + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return isset( $_GET['nonamp'] ) ? true : $skip; + } + + /** + * Form attributes filter. + * + * @since 1.8.1 + * + * @param array $form_atts Form attributes. + * @param array $form_data Form data. + * + * @return array + */ + public function form_atts( $form_atts, $form_data ) { + + if ( ! $this->is_amp() ) { + return $form_atts; + } + + // Set submitting state. + if ( ! isset( $form_atts['atts']['on'] ) ) { + $form_atts['atts']['on'] = ''; + } else { + $form_atts['atts']['on'] .= ';'; + } + + $form_id = ! empty( $form_data['id'] ) ? (int) $form_data['id'] : 0; + + $form_atts['atts']['on'] .= sprintf( + 'submit:AMP.setState( %1$s ); submit-success:AMP.setState( %2$s ); submit-error:AMP.setState( %2$s );', + wp_json_encode( + [ + $this->get_form_amp_state_id( $form_id ) => [ 'submitting' => true ], + ] + ), + wp_json_encode( + [ + $this->get_form_amp_state_id( $form_id ) => [ 'submitting' => false ], + ] + ) + ); + + // Upgrade the form to be an amp-form to avoid sanitizer conversion. + if ( isset( $form_atts['atts']['action'] ) ) { + $form_atts['atts']['action-xhr'] = $form_atts['atts']['action']; + $form_atts['atts']['verify-xhr'] = $form_atts['atts']['action-xhr']; + + unset( $form_atts['atts']['action'] ); + } + + return $form_atts; + } + + /** + * Get the amp-state ID for a given form. + * + * @since 1.8.1 + * + * @param int $form_id Form ID. + * + * @return string State ID. + */ + private function get_form_amp_state_id( $form_id ) { + + return sprintf( 'wpforms_form_state_%d', $form_id ); + } + + /** + * Output AMP state. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * @param null $deprecated Deprecated. + * @param string $title Form title. + * @param string $description Form description. + * @param array $errors Errors. + * + * @noinspection PhpUnusedParameterInspection + */ + public function output_state( $form_data, $deprecated, $title, $description, $errors ) { + + if ( ! $this->is_amp() ) { + return; + } + + $state = [ 'submitting' => false ]; + + $form_id = ! empty( $form_data['id'] ) ? (int) $form_data['id'] : 0; + + printf( + '', + $this->get_form_amp_state_id( $form_id ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_json_encode( $state ) + ); + } + + /** + * Output submit success template. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * + * @return bool True if the template was printed. + */ + public function output_success_template( $form_data ) { + + if ( ! $this->is_amp() ) { + return false; + } + + $frontend = wpforms()->obj( 'frontend' ); + + if ( ! $frontend ) { + return false; + } + + $frontend->assets_confirmation( $form_data ); + + $class = (int) wpforms_setting( 'disable-css', '1' ) === 1 ? + 'wpforms-confirmation-container-full' : + 'wpforms-confirmation-container'; + + printf( + '
              ', + esc_attr( $class ) + ); + + return true; + } + + /** + * Output submit error template. + * + * @since 1.8.1 + * + * @return bool True if the template was printed. + */ + public function output_error_template() { + + if ( ! $this->is_amp() ) { + return false; + } + + echo '
              '; + + return true; + } + + /** + * Get text attribute. + * + * @since 1.8.1 + * + * @param int $form_id Form ID. + * @param array $settings Form settings. + * @param string $submit Submit button text. + * + * @return string + */ + public function get_text_attr( $form_id, $settings, $submit ) { + + return sprintf( + '%s.submitting ? %s : %s', + $this->get_form_amp_state_id( $form_id ), + wp_json_encode( $settings['submit_text_processing'], JSON_UNESCAPED_UNICODE ), + wp_json_encode( $submit, JSON_UNESCAPED_UNICODE ) + ); + } + + /** + * Output captcha. + * + * @since 1.8.1 + * + * @param bool $is_recaptcha_v3 Whether we use v3. + * @param array $captcha_settings Captcha settings. + * @param array $form_data Form data. + * + * @return bool + */ + public function output_captcha( $is_recaptcha_v3, $captcha_settings, $form_data ) { + + if ( ! $this->is_amp() ) { + return false; + } + + if ( $is_recaptcha_v3 ) { + + printf( + '', + esc_attr( $captcha_settings['site_key'] ), + esc_attr( 'wpforms_' . $form_data['id'] ) + ); + + return true; + } + + if ( is_super_admin() ) { + + $captcha_provider = $captcha_settings['provider'] === 'hcaptcha' ? esc_html__( 'hCaptcha', 'wpforms-lite' ) : esc_html__( 'Google reCAPTCHA v2', 'wpforms-lite' ); + + echo '
              '; + printf( + wp_kses( /* translators: %1$s - CAPTCHA provider name, %2$s - URL to reCAPTCHA documentation. */ + __( '%1$s is not supported by AMP and is currently disabled.
              Upgrade to reCAPTCHA v3 for full AMP support.
              Please note: this message is only displayed to site administrators.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + 'br' => [], + 'em' => [], + ] + ), + $captcha_provider, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'https://wpforms.com/docs/setup-captcha-wpforms/' + ); + echo '
              '; + + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Frontend/CSSVars.php b/wp-content/plugins/wpforms-lite/src/Frontend/CSSVars.php new file mode 100755 index 00000000..752db635 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Frontend/CSSVars.php @@ -0,0 +1,825 @@ + '3px', + 'field-border-style' => 'solid', + 'field-border-size' => '1px', + 'field-background-color' => self::WHITE, + 'field-border-color' => 'rgba( 0, 0, 0, 0.25 )', + 'field-text-color' => 'rgba( 0, 0, 0, 0.7 )', + 'field-menu-color' => self::WHITE, + + 'label-color' => 'rgba( 0, 0, 0, 0.85 )', + 'label-sublabel-color' => 'rgba( 0, 0, 0, 0.55 )', + 'label-error-color' => '#d63637', + + 'button-border-radius' => '3px', + 'button-border-style' => 'none', + 'button-border-size' => '1px', + 'button-background-color' => '#066aab', + 'button-border-color' => '#066aab', + 'button-text-color' => self::WHITE, + + 'page-break-color' => '#066aab', + + 'background-image' => 'none', + 'background-position' => 'center center', + 'background-repeat' => 'no-repeat', + 'background-size' => 'cover', + 'background-width' => '100px', + 'background-height' => '100px', + 'background-color' => 'rgba( 0, 0, 0, 0 )', + 'background-url' => 'url()', + + 'container-padding' => '0px', + 'container-border-style' => 'none', + 'container-border-width' => '1px', + 'container-border-color' => '#000000', + 'container-border-radius' => '3px', + ]; + + /** + * Container shadow vars and values. + * + * @since 1.8.8 + * + * @var array + */ + public const CONTAINER_SHADOW_SIZE = [ + 'none' => [ + 'box-shadow' => 'none', + ], + 'small' => [ + 'box-shadow' => '0px 3px 5px 0px rgba(0, 0, 0, 0.1)', + ], + 'medium' => [ + 'box-shadow' => '0px 10px 20px 0px rgba(0, 0, 0, 0.1)', + ], + 'large' => [ + 'box-shadow' => '0px 30px 50px -10px rgba(0, 0, 0, 0.15)', + ], + ]; + + /** + * Field Size vars and values. + * + * @since 1.8.1 + * + * @var array + */ + public const FIELD_SIZE = [ + 'small' => [ + 'input-height' => '31px', + 'input-spacing' => '10px', + 'font-size' => '14px', + 'line-height' => '17px', + 'padding-h' => '9px', + 'checkbox-size' => '14px', + 'sublabel-spacing' => '5px', + 'icon-size' => '0.75', + ], + 'medium' => [ + 'input-height' => '43px', + 'input-spacing' => '15px', + 'font-size' => '16px', + 'line-height' => '19px', + 'padding-h' => '14px', + 'checkbox-size' => '16px', + 'sublabel-spacing' => '5px', + 'icon-size' => '1', + ], + 'large' => [ + 'input-height' => '50px', + 'input-spacing' => '20px', + 'font-size' => '18px', + 'line-height' => '21px', + 'padding-h' => '14px', + 'checkbox-size' => '18px', + 'sublabel-spacing' => '10px', + 'icon-size' => '1.25', + ], + ]; + + /** + * Label Size vars and values. + * + * @since 1.8.1 + * + * @var array + */ + public const LABEL_SIZE = [ + 'small' => [ + 'font-size' => '14px', + 'line-height' => '17px', + 'sublabel-font-size' => '13px', + 'sublabel-line-height' => '16px', + ], + 'medium' => [ + 'font-size' => '16px', + 'line-height' => '19px', + 'sublabel-font-size' => '14px', + 'sublabel-line-height' => '17px', + ], + 'large' => [ + 'font-size' => '18px', + 'line-height' => '21px', + 'sublabel-font-size' => '16px', + 'sublabel-line-height' => '19px', + ], + ]; + + /** + * Button Size vars and values. + * + * @since 1.8.1 + * + * @var array + */ + public const BUTTON_SIZE = [ + 'small' => [ + 'font-size' => '14px', + 'height' => '37px', + 'padding-h' => '15px', + 'margin-top' => '5px', + ], + 'medium' => [ + 'font-size' => '17px', + 'height' => '41px', + 'padding-h' => '15px', + 'margin-top' => '10px', + ], + 'large' => [ + 'font-size' => '20px', + 'height' => '48px', + 'padding-h' => '20px', + 'margin-top' => '15px', + ], + ]; + + /** + * Spare variables. + * + * @since 1.8.8 + * + * @var array + */ + private const SPARE_VARS = [ 'field-border-color' ]; + + /** + * White color. + * + * @since 1.8.8 + * + * @var string + */ + private const WHITE = '#ffffff'; + + /** + * Render engine. + * + * @since 1.8.1 + * + * @var string + */ + private $render_engine; + + /** + * CSS variables. + * + * @since 1.8.1 + * + * @var array + */ + private $css_vars; + + /** + * Flag to check if root CSS vars were output. + * + * @since 1.8.1 + * + * @var bool + */ + private $is_root_vars_displayed; + + /** + * Initialize class. + * + * @since 1.8.1 + */ + public function init(): void { + + $this->init_vars(); + } + + /** + * CSS variables data. + * + * @since 1.8.1 + */ + private function init_vars(): void { + + $vars = []; + + $vars[':root'] = array_merge( + self::ROOT_VARS, + $this->get_complex_vars( 'field-size', self::FIELD_SIZE['medium'] ), + $this->get_complex_vars( 'label-size', self::LABEL_SIZE['medium'] ), + $this->get_complex_vars( 'button-size', self::BUTTON_SIZE['medium'] ), + $this->get_complex_vars( 'container-shadow-size', self::CONTAINER_SHADOW_SIZE['none'] ) + ); + + /** + * Allows developers to modify default CSS variables which output on the frontend. + * + * @since 1.8.1 + * + * @param array $vars CSS variables two-dimensional array. + * The first level keys is the CSS selector. + * Second level keys is the variable name without the `--wpforms-` prefix. + */ + $this->css_vars = apply_filters( 'wpforms_frontend_css_vars_init_vars', $vars ); + } + + /** + * Get complex CSS variables data. + * + * @since 1.8.1 + * + * @param string $prefix CSS variable prefix. + * @param array $values Values. + */ + public function get_complex_vars( string $prefix, array $values ): array { + + $vars = []; + + foreach ( $values as $key => $value ) { + $vars[ "{$prefix}-{$key}" ] = $value; + } + + return $vars; + } + + /** + * Get CSS variables data by selector. + * + * @since 1.8.1 + * + * @param string $selector Selector. + * + * @return array + */ + public function get_vars( string $selector = ':root' ): array { + + if ( empty( $this->css_vars[ $selector ] ) ) { + return []; + } + + return $this->css_vars[ $selector ]; + } + + /** + * Output root CSS variables. + * + * @since 1.8.1 + * @since 1.8.1.2 Added $force argument. + * @deprecated 1.9.3 + * + * @param bool $force Force output root variables. + * + * @noinspection PhpMissingParamTypeInspection + */ + public function output_root( $force = false ): void { + + _deprecated_function( __METHOD__, '1.9.3 of the WPForms plugin' ); + + if ( ! empty( $this->is_root_vars_displayed ) && empty( $force ) ) { + return; + } + + $this->output_selector_vars( ':root', $this->css_vars[':root'] ); + + $this->is_root_vars_displayed = true; + } + + /** + * Get root variables CSS. + * + * @since 1.9.3 + * + * @return string + */ + public function get_root_vars_css(): string { + + return $this->get_selector_vars_css( ':root', $this->css_vars[':root'] ); + } + + /** + * Output selector's CSS variables. + * + * @since 1.8.1 + * + * @param string $selector Selector. + * @param array $vars Variables data. + * @param string $style_id Style tag ID attribute. Optional. Default is an empty string. + * @param string|int $form_id Form ID. Optional. Default is an empty string. + */ + public function output_selector_vars( string $selector, array $vars, string $style_id = '', $form_id = '' ): void { + + if ( empty( $this->render_engine ) ) { + $this->render_engine = wpforms_get_render_engine(); + } + + if ( $this->render_engine === 'classic' ) { + return; + } + + // If this is not full "Base and Form Theme Styling", skip. + if ( (int) wpforms_setting( 'disable-css', '1' ) !== 1 ) { + return; + } + + $style_id = empty( $style_id ) ? 'wpforms-css-vars-' . $selector : $style_id; + + printf( + '', + sanitize_key( $style_id ), + $this->get_selector_vars_css( $selector, $vars, $form_id ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Output CSS vars for the form added as a shortcode. + * + * @since 1.9.7 + * + * @param array $atts Shortcode attributes. + */ + public function output_css_vars_for_shortcode( array $atts ): void { + + if ( empty( $atts['id'] ) ) { + return; + } + + $form_handler = wpforms()->obj( 'form' ); + + if ( ! $form_handler ) { + return; + } + + $form_id = (int) $atts['id']; + $form_data = $form_handler->get( $form_id, [ 'content_only' => true ] ); + + if ( empty( $form_data ) ) { + return; + } + + $attr = isset( $form_data['settings']['themes'] ) ? (array) $form_data['settings']['themes'] : []; + $attr = $this->maybe_override_attributes( $attr ); + + $css_vars = $this->get_customized_css_vars( $attr ); + $css_vars = $this->add_css_vars_units( $css_vars ); + + $selector = "#wpforms-{$form_id}"; + $style_id = "wpforms-css-vars-{$form_id}"; + + $this->output_selector_vars( $selector, $css_vars, $style_id, $form_id ); + $this->output_custom_css( $attr, $selector, $style_id ); + } + + /** + * Output custom CSS. + * + * @since 1.9.7 + * + * @param array $attr Attributes. + * @param string $selector Selector. + * @param string $style_id Style ID. + * + * @noinspection PhpMissingParamTypeInspection + */ + private function output_custom_css( array $attr, string $selector, string $style_id ): void { + + if ( wpforms_get_render_engine() === 'classic' ) { + return; + } + + $custom_css = trim( $attr['customCss'] ?? '' ); + + if ( empty( $custom_css ) ) { + return; + } + + printf( + '', + sanitize_key( $style_id ), + $selector, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_strip_all_tags( $custom_css ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + + /** + * Maybe override attributes with themes.json settings. + * + * @since 1.9.7 + * + * @param array $attr Attributes. + * + * @return array + */ + private function maybe_override_attributes( array $attr ): array { + + $theme_slug = (string) ( $attr['wpformsTheme'] ?? '' ); + + if ( empty( $theme_slug ) ) { + return $attr; + } + + $attr = $this->normalize_background_url( $attr ); + + $theme_data = $this->get_themes_data_object()->get_theme( $theme_slug ); + $settings = $theme_data['settings'] ?? []; + + return array_merge( $attr, $settings ); + } + + /** + * Normalize background URL. + * + * Check if the background URL is not wrapped in url() and add it if needed. + * + * @since 1.9.7 + * + * @param array $attr Attributes. + */ + private function normalize_background_url( array $attr ): array { + + if ( ! isset( $attr['backgroundUrl'] ) ) { + return $attr; + } + + if ( strpos( $attr['backgroundUrl'], 'url(' ) === 0 ) { + return $attr; + } + + $attr['backgroundUrl'] = 'url(' . $attr['backgroundUrl'] . ')'; + + return $attr; + } + + /** + * Get themes data object. + * + * @since 1.9.7 + * + * @return ThemesData + */ + private function get_themes_data_object(): ThemesData { + + if ( wpforms()->is_pro() ) { + return new ProThemesData( new StockPhotos() ); + } + + return new LiteThemesData(); + } + + /** + * Add CSS vars units. + * + * Form builder saves values without pixels, we need to add them before outputting as CSS vars. + * + * @since 1.9.7 + * + * @param array $css_vars CSS vars. + * + * @return array + */ + private function add_css_vars_units( array $css_vars ): array { + + $has_pixels = [ + 'field-border-size', + 'field-border-radius', + 'button-border-size', + 'button-border-radius', + 'container-padding', + 'container-border-width', + 'container-border-radius', + ]; + + foreach ( $has_pixels as $key ) { + if ( isset( $css_vars[ $key ] ) && is_numeric( $css_vars[ $key ] ) && $css_vars[ $key ] > 0 ) { + $css_vars[ $key ] .= 'px'; + } + } + + return $css_vars; + } + + /** + * Get selector variables CSS. + * + * @since 1.9.3 + * + * @param string $selector Selector. + * @param array $vars Variables data. + * @param string|int $form_id Form ID. Optional. Default is an empty string. + * + * @return string + */ + private function get_selector_vars_css( string $selector, array $vars, $form_id = '' ): string { + + return sprintf( + '%1$s { + %2$s + }', + $selector, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_strip_all_tags( $this->get_vars_css( $vars, $form_id ) ) + ); + } + + /** + * Pre print vars filter. + * + * @since 1.8.8 + * + * @param array $vars Variables data. + * @param string|int $form_id Form ID. Optional. Default is an empty string. + * + * @return array + */ + private function get_pre_print_vars( array $vars, $form_id = '' ): array { + + // Normalize the `background-url` variable. + if ( isset( $vars['background-url'] ) ) { + $vars['background-url'] = $vars['background-url'] === 'url()' ? 'none' : $vars['background-url']; + } + + /** + * Filter CSS variables right before printing the CSS. + * + * @since 1.8.8 + * + * @param array $vars CSS variables. + * @param int $form_id Form ID. Optional. Default is an empty string. + */ + return (array) apply_filters( 'wpforms_frontend_css_vars_pre_print_filter', $vars, $form_id ); + } + + /** + * Generate CSS code from given vars data. + * + * @since 1.8.1 + * + * @param array $vars Variables data. + * @param string|int $form_id Form ID. Optional. Default is an empty string. + */ + private function get_vars_css( array $vars, $form_id = '' ): string { + + $vars = $this->get_pre_print_vars( $vars, $form_id ); + $result = ''; + + foreach ( $vars as $name => $value ) { + if ( ! is_string( $value ) ) { + continue; + } + + if ( $value === '0' ) { + $value = '0px'; + } + + $result .= "--wpforms-{$name}: {$value};\n"; + + if ( in_array( $name, self::SPARE_VARS, true ) ) { + $result .= "--wpforms-{$name}-spare: {$value};\n"; + } + } + + return $result; + } + + /** + * Get customized CSS vars. + * + * @since 1.8.3 + * + * @param array $attr Attributes passed by integration. + * + * @return array + */ + public function get_customized_css_vars( array $attr ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $root_css_vars = $this->get_vars(); + $css_vars = []; + + foreach ( $attr as $key => $value ) { + + $var_name = strtolower( preg_replace( '/[A-Z]/', '-$0', $key ) ); + + // Skip an attribute that is not the CSS var or has the default value. + if ( empty( $root_css_vars[ $var_name ] ) || $root_css_vars[ $var_name ] === $value ) { + continue; + } + + $css_vars[ $var_name ] = $value; + } + + // Reset border size in case of border style is `none`. + $css_vars = $this->maybe_reset_border( $css_vars, 'field-border' ); + $css_vars = $this->maybe_reset_border( $css_vars, 'button-border' ); + + // Set the button alternative background color and use border color for accent in case of transparent color. + $button_bg_color = $css_vars['button-background-color'] ?? $root_css_vars['button-background-color']; + + if ( $this->is_transparent_color( $button_bg_color ) ) { + $css_vars['button-background-color-alt'] = $button_bg_color; + + $border_color = $css_vars['button-border-color'] ?? $root_css_vars['button-border-color']; + + $css_vars['button-background-color'] = $this->is_transparent_color( $border_color ) ? $root_css_vars['button-background-color'] : $border_color; + $button_bg_color = $css_vars['button-background-color']; + } + + $button_bg_color = strtolower( $button_bg_color ); + + // Set the button alternative text color in case if the background and text color are identical. + $button_text_color = strtolower( $css_vars['button-text-color'] ?? $root_css_vars['button-text-color'] ); + + if ( $button_bg_color === $button_text_color || $this->is_transparent_color( $button_text_color ) ) { + $css_vars['button-text-color-alt'] = $this->get_contrast_color( $button_bg_color ); + } + + $size_css_vars = $this->get_size_css_vars( $attr ); + + return array_merge( $css_vars, $size_css_vars ); + } + + /** + * Reset border size in case of border style is `none`. + * + * @since 1.9.7 + * + * @param array $css_vars CSS vars. + * @param string $key Key. + * + * @return array + */ + private function maybe_reset_border( array $css_vars, string $key ): array { + + $style_key = $key . '-style'; + $size_key = $key . '-size'; + + if ( isset( $css_vars[ $style_key ] ) && $css_vars[ $style_key ] === 'none' ) { + $css_vars[ $size_key ] = '0px'; + } + + return $css_vars; + } + + /** + * Checks if the provided color has transparency. + * + * @since 1.8.8 + * + * @param string $color The color to check. + * + * @return bool + */ + private function is_transparent_color( string $color ): bool { + + $rgba = $this->get_color_as_rgb_array( $color ); + + $opacity_threshold = 0.33; + $opacity = $rgba[3] ?? 1; + + return $opacity < $opacity_threshold; + } + + /** + * Get contrast color relative to a given color. + * + * @since 1.8.8 + * + * @param string|array $color The color. + * + * @return string + */ + private function get_contrast_color( $color ): string { + + $rgba = is_array( $color ) ? $color : $this->get_color_as_rgb_array( $color ); + $avg = (int) ( ( ( array_sum( $rgba ) ) / 3 ) * ( $rgba[3] ?? 1 ) ); + + return $avg < 128 ? '#ffffff' : '#000000'; + } + + /** + * Get size CSS vars. + * + * @since 1.8.3 + * @since 1.8.8 Removed $css_vars argument. + * + * @param array $attr Attributes passed by integration. + * + * @return array + */ + private function get_size_css_vars( array $attr ): array { + + $size_items = [ 'field', 'label', 'button', 'container-shadow' ]; + $size_css_vars = []; + + foreach ( $size_items as $item ) { + + $item_attr = preg_replace_callback( + '/-(\w)/', + static function ( $matches ) { + + return strtoupper( $matches[1] ); + }, + $item + ); + + $item_attr .= 'Size'; + + $item_key = $item . '-size'; + $item_constant = 'self::' . str_replace( '-', '_', strtoupper( $item ) ) . '_SIZE'; + + if ( empty( $attr[ $item_attr ] ) ) { + continue; + } + + $size_css_vars[] = $this->get_complex_vars( $item_key, constant( $item_constant )[ $attr[ $item_attr ] ] ); + } + + return empty( $size_css_vars ) ? [] : array_merge( ...$size_css_vars ); + } + + /** + * Get color as an array of RGB(A) values. + * + * @since 1.8.8 + * + * @param string $color Color. + * + * @return array|bool Color as an array of RGBA values. False on error. + */ + private function get_color_as_rgb_array( string $color ) { + + // Remove # from the beginning of the string and remove whitespaces. + $color = preg_replace( '/^#/', '', strtolower( trim( $color ) ) ); + $color = str_replace( ' ', '', (string) $color ); + + if ( $color === 'transparent' ) { + $color = 'rgba(0,0,0,0)'; + } + + $rgba = $color; + $rgb_array = []; + + // Check if color is in HEX(A) format. + $is_hex = preg_match( '/[0-9a-f]{6,8}$/', $rgba ); + + if ( $is_hex ) { + // Search and split HEX(A) color into an array of char couples. + preg_match_all( '/\w\w/', $rgba, $rgb_array ); + + $rgb_array = array_map( + static function ( $value ) { + + return hexdec( '0x' . $value ); + }, + $rgb_array[0] ?? [] + ); + $rgb_array[3] = ( $rgb_array[3] ?? 255 ) / 255; + } else { + $rgba = preg_replace( '/[^\d,.]/', '', $rgba ); + $rgb_array = explode( ',', $rgba ); + } + + return $rgb_array; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Frontend/Captcha.php b/wp-content/plugins/wpforms-lite/src/Frontend/Captcha.php new file mode 100755 index 00000000..8da4bde3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Frontend/Captcha.php @@ -0,0 +1,670 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.8.1 + */ + private function hooks() { + + // Filters. + add_filter( 'script_loader_tag', [ $this, 'set_defer_attribute' ], 10, 3 ); + + // Actions. + add_action( 'send_headers', [ $this, 'send_headers' ] ); + add_action( 'wpforms_frontend_output', [ $this, 'recaptcha' ], 20, 5 ); + add_action( 'wp_enqueue_scripts', [ $this, 'recaptcha_noconflict' ], 9999 ); + add_action( 'wp_footer', [ $this, 'recaptcha_noconflict' ], 19 ); + add_action( 'wpforms_wp_footer', [ $this, 'assets_recaptcha' ] ); + } + + /** + * Send HTTP headers to prevent warning in the browser console. + * + * @since 1.9.8.3 + */ + public function send_headers(): void { + + if ( headers_sent() ) { + return; + } + + $urls = '"https://www.google.com" "https://www.gstatic.com" "https://recaptcha.net" "https://challenges.cloudflare.com" "https://hcaptcha.com"'; + + header( + 'Permissions-Policy: ' . + "private-state-token-redemption=(self $urls), " . + "private-state-token-issuance=(self $urls)", + false + ); + } + + /** + * CAPTCHA output if configured. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * @param null $deprecated Deprecated in v1.3.7, previously was $form object. + * @param bool $title Whether to display form title. + * @param bool $description Whether to display form description. + * @param array $errors List of all errors filled in WPForms_Process::process(). + * + * @noinspection HtmlUnknownAttribute + * @noinspection PhpUnusedParameterInspection + */ + public function recaptcha( $form_data, $deprecated, $title, $description, $errors ) { + + // Check that CAPTCHA is configured in the settings. + $captcha_settings = $this->get_form_captcha_settings( $form_data ); + + if ( ! $captcha_settings ) { + return; + } + + $frontend = wpforms()->obj( 'frontend' ); + + $container_classes = [ 'wpforms-recaptcha-container', 'wpforms-is-' . $captcha_settings['provider'] ]; + + if ( $captcha_settings['provider'] === 'recaptcha' ) { + $container_classes[] = 'wpforms-is-recaptcha-type-' . $captcha_settings['recaptcha_type']; + } + + printf( + '
              ', + wpforms_sanitize_classes( $container_classes, true ), + $frontend->pages ? 'style="display:none;"' : '' + ); + + $this->print_recaptcha_fields( $captcha_settings, $form_data ); + + if ( ! empty( $errors['recaptcha'] ) ) { + $frontend->form_error( 'recaptcha', $errors['recaptcha'] ); + } + + echo '
              '; + } + + /** + * Get a provider-specific captcha class. + * + * @since 1.9.8.3 + * + * @param string $provider Captcha provider. + * + * @return string + */ + private function get_captcha_class( string $provider ): string { + + $classes = [ + 'recaptcha' => 'g-recaptcha', + 'hcaptcha' => 'h-captcha', + 'turnstile' => 'cf-turnstile', + ]; + + return $classes[ $provider ] ?? 'g-recaptcha'; + } + + /** + * Get recaptcha data. + * + * @since 1.8.6 + * + * @param array $captcha_settings Captcha settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + private function get_recaptcha_data( array $captcha_settings, array $form_data ): array { + + /** + * Filters captcha sitekey. + * + * @since 1.7.1 + * + * @param array $sitekey Sitekey. + * @param array $form_data Form data and settings. + */ + $data = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_frontend_recaptcha', + [ 'sitekey' => $captcha_settings['site_key'] ], + $form_data + ); + + $is_recaptcha = $captcha_settings['provider'] === 'recaptcha'; + $is_turnstile = $captcha_settings['provider'] === 'turnstile'; + + if ( $is_recaptcha && $captcha_settings['recaptcha_type'] === 'invisible' ) { + $data['size'] = 'invisible'; + } + + if ( ! $is_turnstile ) { + return $data; + } + + /** + * Filter Turnstile action value. + * + * @since 1.8.1 + * + * @param string $action Action value. Can only contain up to 32 alphanumeric characters including _ and -. + * @param array $form_data Form data and settings. + */ + $data['action'] = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_frontend_recaptcha_turnstile_action', + sprintf( + 'FormID-%d', + $form_data['id'] + ), + $form_data + ); + + return $data; + } + + /** + * Print recaptcha fields. + * + * @since 1.8.6 + * + * @param array $captcha_settings Captcha settings. + * @param array $form_data Form data and settings. + */ + private function print_recaptcha_fields( array $captcha_settings, array $form_data ) { + + $data = $this->get_recaptcha_data( $captcha_settings, $form_data ); + $is_recaptcha = $captcha_settings['provider'] === 'recaptcha'; + $is_recaptcha_v3 = $is_recaptcha && $captcha_settings['recaptcha_type'] === 'v3'; + + if ( $is_recaptcha_v3 ) { + // The value adds via JS code. + echo ''; + + return; + } + + $captcha_class = $this->get_captcha_class( $captcha_settings['provider'] ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              '; + + if ( $is_recaptcha && $captcha_settings['recaptcha_type'] === 'invisible' ) { + return; + } + + printf( + '', + esc_attr( $captcha_settings['provider'] ) + ); + } + + /** + * Get captcha settings for form output. + * Return null if captcha is disabled. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * + * @return array|null + * @noinspection NullPointerExceptionInspection + */ + private function get_form_captcha_settings( $form_data ) { + + $captcha_settings = wpforms_get_captcha_settings(); + + if ( + empty( $captcha_settings['provider'] ) || + $captcha_settings['provider'] === 'none' || + empty( $captcha_settings['site_key'] ) || + empty( $captcha_settings['secret_key'] ) + ) { + return null; + } + + // Check that the CAPTCHA is configured for the specific form. + if ( + ! isset( $form_data['settings']['recaptcha'] ) || + $form_data['settings']['recaptcha'] !== '1' + ) { + return null; + } + + $is_recaptcha_v3 = $captcha_settings['provider'] === 'recaptcha' && $captcha_settings['recaptcha_type'] === 'v3'; + + if ( wpforms()->obj( 'amp' )->output_captcha( $is_recaptcha_v3, $captcha_settings, $form_data ) ) { + return null; + } + + return $captcha_settings; + } + + /** + * Google reCAPTCHA no-conflict mode. + * + * When enabled in the WPForms settings, forcefully remove all other + * reCAPTCHA enqueues to prevent conflicts. Filter can be used to target + * specific pages, etc. + * + * @since 1.4.5 + * @since 1.6.4 Added hCaptcha support. + */ + public function recaptcha_noconflict() { + + $captcha_settings = wpforms_get_captcha_settings(); + + if ( + empty( $captcha_settings['provider'] ) || + $captcha_settings['provider'] === 'none' || + empty( wpforms_setting( 'recaptcha-noconflict' ) ) || + /** + * Filters recaptcha no conflict flag. + * + * @since 1.6.4 + * + * @param bool $recaptcha_no_conflict No conflict flag. + */ + ! apply_filters( 'wpforms_frontend_recaptcha_noconflict', true ) // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ) { + return; + } + + $scripts = wp_scripts(); + $urls = [ 'google.com/recaptcha', 'gstatic.com/recaptcha', 'hcaptcha.com/1' ]; + + foreach ( $scripts->queue as $handle ) { + + // Skip the WPForms javascript-assets. + if ( + ! isset( $scripts->registered[ $handle ] ) || + false !== strpos( $scripts->registered[ $handle ]->handle, 'wpforms' ) + ) { + return; + } + + foreach ( $urls as $url ) { + if ( false !== strpos( $scripts->registered[ $handle ]->src, $url ) ) { + wp_dequeue_script( $handle ); + wp_deregister_script( $handle ); + break; + } + } + } + } + + /** + * Load the assets needed for the CAPTCHA. + * + * @since 1.6.2 + * @since 1.6.4 Added hCaptcha support. + * + * @param array $forms Forms being displayed. + */ + public function assets_recaptcha( $forms ) { + + $captcha_settings = $this->get_assets_captcha_settings( $forms ); + + if ( ! $captcha_settings ) { + return; + } + + $is_recaptcha_v3 = $captcha_settings['provider'] === 'recaptcha' && $captcha_settings['recaptcha_type'] === 'v3'; + $recaptcha_url = $is_recaptcha_v3 ? + 'https://www.google.com/recaptcha/api.js?render=' . $captcha_settings['site_key'] : + /** + * For backward compatibility reason we have to filter only the v2 reCAPTCHA. + * + * @since 1.4.0 + * + * @param string $url The reCaptcha v2 URL. + */ + apply_filters( 'wpforms_frontend_recaptcha_url', 'https://www.google.com/recaptcha/api.js?onload=wpformsRecaptchaLoad&render=explicit' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $captcha_api_array = [ + 'hcaptcha' => 'https://hcaptcha.com/1/api.js?onload=wpformsRecaptchaLoad&render=explicit&recaptchacompat=off', + 'recaptcha' => $recaptcha_url, + 'turnstile' => 'https://challenges.cloudflare.com/turnstile/v0/api.js?onload=wpformsRecaptchaLoad&render=explicit', + ]; + /** + * Filter the CAPTCHA API URL. + * + * @since 1.6.4 + * + * @param string $captcha_api The CAPTCHA API URL. + */ + $captcha_api = apply_filters( 'wpforms_frontend_captcha_api', $captcha_api_array[ $captcha_settings['provider'] ] ); + $in_footer = ! wpforms_is_frontend_js_header_force_load(); + + wp_enqueue_script( + 'wpforms-recaptcha', + $captcha_api, + $is_recaptcha_v3 ? [] : [ 'jquery' ], + null, // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion + $in_footer + ); + + /** + * Filter the string containing the CAPTCHA JavaScript to be added. + * + * @since 1.6.4 + * + * @param string $captcha_inline The CAPTCHA JavaScript. + */ + $captcha_inline = apply_filters( + 'wpforms_frontend_captcha_inline_script', + $this->get_captcha_inline_script( $captcha_settings ) + ); + + wp_add_inline_script( 'wpforms-recaptcha', $captcha_inline ); + } + + /** + * Get captcha settings for assets output. + * Return null if captcha is disabled. + * + * @since 1.8.1 + * + * @param array $forms Forms being displayed. + * + * @return array|null + * @noinspection NullPointerExceptionInspection + */ + private function get_assets_captcha_settings( $forms ) { + + /** + * Filters disable captcha switch. + * + * @since 1.6.2 + * + * @param bool $is_captcha_disabled Whether captcha is disabled. + */ + if ( apply_filters( 'wpforms_frontend_recaptcha_disable', false ) ) { // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + return null; + } + + // Load CAPTCHA support if form supports it. + $captcha_settings = wpforms_get_captcha_settings(); + + if ( + empty( $captcha_settings['provider'] ) || + $captcha_settings['provider'] === 'none' || + empty( $captcha_settings['site_key'] ) || + empty( $captcha_settings['secret_key'] ) + ) { + return null; + } + + // Whether at least 1 form on a page has CAPTCHA enabled. + $captcha = false; + + foreach ( $forms as $form ) { + if ( ! empty( $form['settings']['recaptcha'] ) ) { + $captcha = true; + + break; + } + } + + // Return early. + if ( ! $captcha && ! wpforms()->obj( 'frontend' )->assets_global() ) { + return null; + } + + return $captcha_settings; + } + + /** + * Retrieve the string containing the CAPTCHA inline javascript. + * + * @since 1.6.4 + * + * @param array $captcha_settings The CAPTCHA settings. + * + * @return string + * @noinspection JSUnusedLocalSymbols + * @noinspection UnnecessaryLocalVariableJS + * @noinspection JSUnresolvedVariable + * @noinspection JSDeprecatedSymbols + * @noinspection JSUnresolvedFunction + */ + protected function get_captcha_inline_script( $captcha_settings ) { + + // IE11 polyfills for native `matches()` and `closest()` methods. + $polyfills = /** @lang JavaScript */ + 'if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + if (!Element.prototype.closest) { + Element.prototype.closest = function (s) { + var el = this; + do { + if (Element.prototype.matches.call(el, s)) { return el; } + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + return null; + }; + } + '; + + // Native equivalent for jQuery's `trigger()` method. + $dispatch = /** @lang JavaScript */ + 'var wpformsDispatchEvent = function (el, ev, custom) { + var e = document.createEvent(custom ? "CustomEvent" : "HTMLEvents"); + custom ? e.initCustomEvent(ev, true, true, false) : e.initEvent(ev, true, true); + el.dispatchEvent(e); + }; + '; + + // Update container class after changing Turnstile type. + $turnstile_update_class = /** @lang JavaScript */ + 'var turnstileUpdateContainer = function (el) { + + let form = el.closest( "form" ), + iframeWrapperHeight = el.offsetHeight; + + parseInt(iframeWrapperHeight) === 0 ? + form.querySelector(".wpforms-is-turnstile").classList.add( "wpforms-is-turnstile-invisible" ) : + form.querySelector(".wpforms-is-turnstile").classList.remove( "wpforms-is-turnstile-invisible" ); + }; + '; + + // Captcha callback, used by hCaptcha and checkbox reCaptcha v2. + $callback = /** @lang JavaScript */ + 'var wpformsRecaptchaCallback = function (el) { + var hdn = el.parentNode.querySelector(".wpforms-recaptcha-hidden"); + var err = el.parentNode.querySelector("#g-recaptcha-hidden-error"); + hdn.value = "1"; + wpformsDispatchEvent(hdn, "change", false); + hdn.classList.remove("wpforms-error"); + err && hdn.parentNode.removeChild(err); + }; + '; + + $sync = /** @lang JavaScript */ + 'const wpformsRecaptchaSync = ( func ) => { + return function() { + const context = this; + const args = arguments; + + // Sync with jQuery ready event. + jQuery( document ).ready( function() { + func.apply( context, args ); + } ); + } + }; + '; + + if ( $captcha_settings['provider'] === 'hcaptcha' ) { + $data = $dispatch; + $data .= $callback; + + $data .= /** @lang JavaScript */ + 'var wpformsRecaptchaLoad = function () { + Array.prototype.forEach.call(document.querySelectorAll(".h-captcha"), function (el) { + var captchaID = hcaptcha.render(el, { + callback: function () { + wpformsRecaptchaCallback(el); + } + }); + el.setAttribute("data-recaptcha-id", captchaID); + }); + wpformsDispatchEvent(document, "wpformsRecaptchaLoaded", true); + }; + '; + + return $data; + } + + if ( $captcha_settings['provider'] === 'turnstile' ) { + $data = $dispatch; + $data .= $callback; + $data .= $turnstile_update_class; + + $data .= /** @lang JavaScript */ + 'var wpformsRecaptchaLoad = function () { + Array.prototype.forEach.call(document.querySelectorAll(".cf-turnstile"), function (el) { + let form = el.closest( "form" ), + formId = form.dataset.formid, + captchaID = turnstile.render(el, { + theme: "' . $captcha_settings['theme'] . '", + callback: function () { + turnstileUpdateContainer(el); + wpformsRecaptchaCallback(el); + }, + "timeout-callback": function() { + turnstileUpdateContainer(el); + } + }); + el.setAttribute("data-recaptcha-id", captchaID); + }); + + wpformsDispatchEvent( document, "wpformsRecaptchaLoaded", true ); + }; + '; + + return $data; + } + + if ( $captcha_settings['recaptcha_type'] === 'v3' ) { + $data = $dispatch; + + $data .= /** @lang JavaScript */ + 'var wpformsRecaptchaV3Execute = function ( callback ) { + grecaptcha.execute( "' . $captcha_settings['site_key'] . '", { action: "wpforms" } ).then( function ( token ) { + Array.prototype.forEach.call( document.getElementsByName( "wpforms[recaptcha]" ), function ( el ) { + el.value = token; + } ); + if ( typeof callback === "function" ) { + return callback(); + } + } ); + } + grecaptcha.ready( function () { + wpformsDispatchEvent( document, "wpformsRecaptchaLoaded", true ); + } ); + '; + } elseif ( $captcha_settings['recaptcha_type'] === 'invisible' ) { + $data = $polyfills; + $data .= $dispatch; + $data .= $sync; + + $data .= /** @lang JavaScript */ + 'var wpformsRecaptchaLoad = wpformsRecaptchaSync( function () { + Array.prototype.forEach.call(document.querySelectorAll(".g-recaptcha"), function (el) { + try { + var recaptchaID = grecaptcha.render(el, { + "callback": function () { + wpformsRecaptchaCallback(el); + }, + "error-callback": function () { + wpformsRecaptchaErrorCallback(el); + } + }, true); + el.closest("form").querySelector("button[type=submit]").recaptchaID = recaptchaID; + } catch (error) {} + }); + wpformsDispatchEvent(document, "wpformsRecaptchaLoaded", true); + } ); + var wpformsRecaptchaCallback = function (el) { + var $form = el.closest("form"); + if (typeof wpforms.formSubmit === "function") { + wpforms.formSubmit($form); + } else { + $form.querySelector("button[type=submit]").recaptchaID = false; + $form.submit(); + } + }; + var wpformsRecaptchaErrorCallback = function (el) { + var $form = el.closest("form"); + $form.querySelector("button[type=submit]").dataset.captchaInvalid = true; + }; + '; + } else { + $data = $dispatch; + $data .= $callback; + + $data .= /** @lang JavaScript */ + 'var wpformsRecaptchaLoad = function () { + Array.prototype.forEach.call(document.querySelectorAll(".g-recaptcha"), function (el) { + try { + var recaptchaID = grecaptcha.render(el, { + callback: function () { + wpformsRecaptchaCallback(el); + } + }); + el.setAttribute("data-recaptcha-id", recaptchaID); + } catch (error) {} + }); + wpformsDispatchEvent(document, "wpformsRecaptchaLoaded", true); + }; + '; + } + + return $data; + } + + /** + * Cloudflare Turnstile captcha requires defer attribute. + * + * @since 1.8.1 + * + * @param string $tag HTML for the script tag. + * @param string $handle Handle of script. + * @param string $src Src of script. + * + * @return string + */ + public function set_defer_attribute( $tag, $handle, $src ) { + + $captcha_settings = wpforms_get_captcha_settings(); + + if ( $captcha_settings['provider'] !== 'turnstile' ) { + return $tag; + } + + if ( $handle !== 'wpforms-recaptcha' ) { + return $tag; + } + + return str_replace( ' src', ' defer src', $tag ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Frontend/Classic.php b/wp-content/plugins/wpforms-lite/src/Frontend/Classic.php new file mode 100755 index 00000000..aab95184 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Frontend/Classic.php @@ -0,0 +1,406 @@ +', + wpforms_sanitize_classes( $classes, true ), + absint( $form_data['id'] ) + ); + } + + /** + * Close form container. + * + * @since 1.8.1 + */ + public function form_container_close() { + + echo ' '; + } + + /** + * The form has no fields. + * + * @since 1.8.1 + */ + public function form_is_empty() { + + echo ''; + } + + /** + * Noscript message. + * + * @since 1.8.1 + * + * @param string $msg Noscript message. + */ + public function noscript( $msg ) { + + printf( + '', + esc_html( $msg ) + ); + } + + + /** + * Display form error. + * + * @since 1.8.1 + * + * @param string $type Error type. + * @param string $error Error text. + */ + public function form_error( $type, $error ) { + + switch ( $type ) { + case 'header': + case 'footer': + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              ' . wpautop( wpforms_sanitize_error( $error ) ) . '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + break; + + case 'header_styled': + case 'footer_styled': + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
              ' . wpautop( wpforms_sanitize_error( $error ) ) . '
              '; + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped + break; + + case 'recaptcha': + echo ''; + break; + } + } + + /** + * Open fields area container. + * + * @since 1.8.1 + */ + public function fields_area_open() { + + echo '
              '; + } + + /** + * Close fields area container. + * + * @since 1.8.1 + */ + public function fields_area_close() { + + echo '
              '; + } + + /** + * Open container for each field. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + * @noinspection PhpUnusedParameterInspection + */ + public function field_container_open( $field, $form_data ) { + + $container = $field['properties']['container']; + $container['data']['field-id'] = wpforms_validate_field_id( $field['id'] ); + + printf( + '
              ', + wpforms_html_attributes( $container['id'], $container['class'], $container['data'], $container['attr'] ) + ); + } + + /** + * Close container markup for each field. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function field_container_close( $field, $form_data ) { + + echo '
              '; + } + + /** + * Open fieldset. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function field_fieldset_open( $field, $form_data ) { + } + + /** + * Close fieldset. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function field_fieldset_close( $field, $form_data ) { + } + + /** + * Field label. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + * @noinspection PhpUnusedParameterInspection + */ + public function field_label( $field, $form_data ) { + + if ( empty( $field['properties']['label'] ) ) { + return; + } + + $label = $field['properties']['label']; + $required = $label['required'] ? wpforms_get_field_required_label() : ''; + + printf( + '', + wpforms_html_attributes( $label['id'], $label['class'], $label['data'], $label['attr'] ), + esc_html( $label['value'] ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $required + ); + } + + /** + * Field error. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + * @noinspection PhpUnusedParameterInspection + */ + public function field_error( $field, $form_data ) { + + if ( empty( $field['properties']['error'] ) ) { + return; + } + + $error = $field['properties']['error']; + + printf( + '', + wpforms_html_attributes( $error['id'], $error['class'], $error['data'], $error['attr'] ), + esc_html( $error['value'] ) + ); + } + + /** + * Field description. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + * @noinspection PhpUnusedParameterInspection + */ + public function field_description( $field, $form_data ) { + + if ( empty( $field['properties']['description'] ) ) { + return; + } + + $description = $field['properties']['description']; + + printf( + '
              %s
              ', + wpforms_html_attributes( $description['id'], $description['class'], $description['data'], $description['attr'] ), + do_shortcode( $description['value'] ) + ); + } + + /** + * Confirmation. + * + * @since 1.8.1 + * + * @param string $confirmation_message Confirmation message. + * @param string $class CSS class. + * @param array $form_data Form data and settings. + */ + public function confirmation( $confirmation_message, $class, $form_data ) { + + $form_id = isset( $form_data['id'] ) ? $form_data['id'] : 0; + + printf( + '
              %s
              ', + wpforms_sanitize_classes( $class ), + absint( $form_id ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $confirmation_message + ); + } + + /** + * Form head container. Form title and description. + * + * @since 1.8.1 + * + * @param bool $title Whether to display form title. + * @param bool $description Whether to display form description. + * @param array $form_data Form data. + */ + public function form_head_container( $title, $description, $form_data ) { + + $settings = $form_data['settings']; + + echo '
              '; + + if ( $title === true && ! empty( $settings['form_title'] ) ) { + echo '
              ' . esc_html( $settings['form_title'] ) . '
              '; + } + + if ( $description === true && ! empty( $settings['form_desc'] ) ) { + echo '
              '; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo wpforms_process_smart_tags( $settings['form_desc'], $form_data, [], '', 'form-description' ); + echo '
              '; + } + + echo '
              '; + } + + /** + * Open submit container. + * + * @since 1.8.1 + * + * @param int $pages Information for multi-page forms. + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + * @noinspection HtmlUnknownAttribute + */ + public function submit_container_open( $pages, $form_data ) { + + printf( '
              ', $pages ? 'style="display:none;"' : '' ); + } + + /** + * Submit button. + * + * @since 1.8.1 + * + * @param int $form_id Form ID. + * @param string $submit Submit text. + * @param array $classes CSS classes. + * @param array $data_attrs Data attributes. + * @param array $attrs Other attributes. + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function submit_button( $form_id, $submit, $classes, $data_attrs, $attrs, $form_data ) { + + printf( + '', + wpforms_html_attributes( + sprintf( 'wpforms-submit-%d', absint( $form_id ) ), + $classes, + $data_attrs, + $attrs + ), + esc_html( $submit ) + ); + } + + /** + * Submit button. + * + * @since 1.8.1 + * + * @param string $src Spinner image src attribute. + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function submit_spinner( $src, $form_data ) { + + printf( + '', + esc_url( $src ), + esc_attr__( 'Loading', 'wpforms-lite' ) + ); + } + + /** + * Open submit container. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * + * @noinspection PhpUnusedParameterInspection + */ + public function submit_container_close( $form_data ) { + + echo '
              '; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Frontend/Frontend.php b/wp-content/plugins/wpforms-lite/src/Frontend/Frontend.php new file mode 100755 index 00000000..b16d4f41 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Frontend/Frontend.php @@ -0,0 +1,2290 @@ +forms = []; + $this->amp_obj = wpforms()->obj( 'amp' ); + $this->css_vars_obj = wpforms()->obj( 'css_vars' ); + + $this->init_render_engine( wpforms_get_render_engine() ); + $this->hooks(); + + // Register shortcode. + add_shortcode( 'wpforms', [ $this, 'shortcode' ] ); + } + + /** + * Register hooks. + * + * @since 1.8.1 + */ + private function hooks(): void { + + // Actions. + add_action( 'init', [ $this, 'init_style_settings' ] ); + add_action( 'wpforms_frontend_output_success', [ $this, 'confirmation' ], 10, 3 ); + add_action( 'wpforms_frontend_output', [ $this, 'head' ], 5, 5 ); + add_action( 'wpforms_frontend_output', [ $this, 'fields' ], 10, 5 ); + add_action( 'wpforms_display_field_before', [ $this, 'field_container_open' ], 5, 2 ); + add_action( 'wpforms_display_field_before', [ $this, 'field_fieldset_open' ], 10, 2 ); + add_action( 'wpforms_display_field_before', [ $this, 'field_label' ], 15, 2 ); + add_action( 'wpforms_display_field_before', [ $this, 'field_description' ], 20, 2 ); + add_action( 'wpforms_display_field_after', [ $this, 'field_error' ], 3, 2 ); + add_action( 'wpforms_display_field_after', [ $this, 'field_description' ], 5, 2 ); + add_action( 'wpforms_display_field_after', [ $this, 'field_fieldset_close' ], 10, 2 ); + add_action( 'wpforms_display_field_after', [ $this, 'field_container_close' ], 15, 2 ); + add_action( 'wpforms_frontend_output', [ $this, 'foot' ], 25, 5 ); + add_action( 'wp_enqueue_scripts', [ $this, 'assets_header' ] ); + add_action( 'wp_footer', [ $this, 'assets_footer' ], 15 ); + add_action( 'wp_footer', [ $this, 'missing_assets_error_js' ], 20 ); + add_action( 'wp_footer', [ $this, 'footer_end' ], 99 ); + } + + /** + * Initialize render engine. + * + * @since 1.8.1 + * + * @param string $engine Render engine slug, `classic` or `modern`. + */ + public function init_render_engine( string $engine ): void { + + $this->render_engine = $engine; + $this->render_obj = wpforms()->obj( "frontend_{$this->render_engine}" ); + + $this->render_obj->hooks(); + } + + /** + * Initialize form styling settings. + * + * @since 1.8.1 + */ + public function init_style_settings(): void { + + // Skip if modern markup settings are already set. + $modern_markup_is_set = wpforms_setting( 'modern-markup-is-set' ); + + if ( $modern_markup_is_set ) { + return; + } + + $settings = (array) get_option( 'wpforms_settings', [] ); + $count_posts = wp_count_posts( 'wpforms' ); + + // Set the Modern markup checkbox to the checked state for all new users. + $settings['modern-markup'] = ( $count_posts->publish + $count_posts->trash ) === 0 ? '1' : '0'; + $settings['modern-markup-is-set'] = true; + + // Hide the Modern markup checkbox for all new users. + if ( $settings['modern-markup'] ) { + $settings['modern-markup-hide-setting'] = true; + } + + update_option( 'wpforms_settings', $settings ); + } + + /** + * Primary function to render a form on the frontend. + * + * @since 1.8.1 + * + * @param int $id Form ID. + * @param bool $title Whether to display form title. + * @param bool $description Whether to display form description. + */ + public function output( $id, $title = false, $description = false ): void { + + if ( empty( $id ) ) { + return; + } + + // Grab the form data, if not found, then we bail. + $form = $this->get_form( $id ); + + if ( $form === null || empty( $form->post_content ) ) { + return; + } + + // We should display only the published form. + if ( ! empty( $form->post_status ) && $form->post_status !== 'publish' ) { + return; + } + + // Decode the form data. + $form_data = wpforms_decode( $form->post_content ); + + // Skip if the form data is empty. + if ( empty( $form_data ) ) { + return; + } + + // Basic information. + /** + * Filter frontend form data. + * + * @since 1.4.3 + * + * @param array $form_data Form data. + */ + $form_data = (array) apply_filters( 'wpforms_frontend_form_data', $form_data ); + $form_id = absint( $form->ID ); + $this->action = esc_url_raw( remove_query_arg( 'wpforms' ) ); + $errors = empty( wpforms()->obj( 'process' )->errors[ $form_id ] ) ? [] : wpforms()->obj( 'process' )->errors[ $form_id ]; + $title = filter_var( $title, FILTER_VALIDATE_BOOLEAN ); + $description = filter_var( $description, FILTER_VALIDATE_BOOLEAN ); + + // Pass the current form data to the render object. + $this->render_obj->form_data = $form_data; + + if ( $this->stop_output( $form, $form_data ) ) { + return; + } + + // All checks have passed, so calculate multipage details for the form. + $this->pages = $this->get_pages( $form_data ); + + /** + * Allow modifying a form action attribute. + * + * @since 1.1.2 + * + * @param string $action Action attribute. + * @param array $form_data Form data and settings. + * @param null $deprecated A deprecated argument. + */ + $this->action = apply_filters( 'wpforms_frontend_form_action', $this->action, $form_data, null ); + + $form_classes = [ 'wpforms-validate', 'wpforms-form' ]; + + if ( ! empty( $form_data['settings']['ajax_submit'] ) && ! $this->amp_obj->is_amp() ) { + $form_classes[] = 'wpforms-ajax-form'; + } + + $form_atts = [ + 'id' => sprintf( 'wpforms-form-%d', absint( $form_id ) ), + 'class' => $form_classes, + 'data' => [ + 'formid' => absint( $form_id ), + ], + 'atts' => [ + 'method' => 'post', + 'enctype' => 'multipart/form-data', + 'action' => esc_url( $this->action ), + ], + ]; + + /** + * Allow modifying form attributes. + * + * @since 1.4.5 + * + * @param array $form_atts Form attributes. + * @param array $form_data Form data and settings. + */ + $form_atts = apply_filters( 'wpforms_frontend_form_atts', $form_atts, $form_data ); + + $this->form_container_open( $form_data, $form ); + + // Reset rendered fields array. + $this->rendered_fields = []; + + /** + * Fires before form output. + * + * @since 1.5.4.2 + * + * @param array $form_data Form data. + * @param WP_Post $form Form. + */ + do_action( 'wpforms_frontend_output_form_before', $form_data, $form ); + + echo '
              '; + + /** + * Fires before closing the form. + * + * @since 1.0.0 + * + * @param array $form_data Form data. + * @param null $deprecated Null. + * @param bool $title Whether to display form title. + * @param bool $description Whether to display form description. + * @param array $errors Form processing errors. + */ + do_action( 'wpforms_frontend_output', $form_data, null, $title, $description, $errors ); + + echo '
              '; + + /** + * Allow adding content after a form. + * + * @since 1.5.4.2 + * + * @param array $form_data Form data and settings. + * @param WP_Post $form Form post type. + */ + do_action( 'wpforms_frontend_output_form_after', $form_data, $form ); + + $this->form_container_close( $form_data, $form ); + + // Add a form to class property that tracks all forms in a page. + $this->forms[ $form_id ] = $form_data; + + // Optional debug information if WPFORMS_DEBUG is defined. + wpforms_debug_data( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing + + /** + * Fires after frontend output. + * + * @since 1.0.0 + * + * @param array $form_data Form data and settings. + * @param WP_Post $form Form post type. + */ + do_action( 'wpforms_frontend_output_after', $form_data, $form ); + } + + /** + * Get form. + * + * @since 1.8.1 + * + * @param int|string|false $id Form id. + * + * @return array|WP_Post|null + * @noinspection NullPointerExceptionInspection + */ + private function get_form( $id ) { + + if ( empty( $id ) ) { + return null; + } + + // Grab the form data, if not found, then we bail. + $form = wpforms()->obj( 'form' )->get( (int) $id ); + + if ( empty( $form ) ) { + return null; + } + + // We should display only the published form. + if ( ! empty( $form->post_status ) && $form->post_status !== 'publish' ) { + return null; + } + + return $form; + } + + /** + * Check whether we should stop the output. + * + * @since 1.8.1 + * + * @param WP_Post $form Form. + * @param array $form_data Form data. + * + * @return bool + */ + private function stop_output( WP_Post $form, array $form_data ): bool { + + $form_id = absint( $form->ID ); + + /** + * Is the form empty? + * Check before output the form on the frontend. + * + * @since 1.7.7 + * + * @param bool $form_is_empty Is the form empty? + * @param array $form_data Form data. + */ + $form_is_empty = apply_filters( 'wpforms_frontend_output_form_is_empty', empty( $form_data['fields'] ), $form_data ); + + // If the form does not contain any fields - do not proceed. + if ( $form_is_empty ) { + $this->render_obj->form_is_empty(); + + return true; + } + + // We need to stop output processing in case we are on the AMP page. + if ( $this->amp_obj->stop_output( $form_data ) ) { + return true; + } + + // Add url query var wpforms_form_id to track post_max_size overflows. + if ( in_array( 'file-upload', wp_list_pluck( $form_data['fields'], 'type' ), true ) ) { + $this->action = add_query_arg( 'wpforms_form_id', $form_id, $this->action ); + } + + /** + * Fires before form data output. + * + * @since 1.0.0 + * + * @param array $form_data Form data. + * @param WP_Post $form Form. + */ + do_action( 'wpforms_frontend_output_before', $form_data, $form ); + + if ( $this->output_success( $form ) ) { + return true; + } + + /** + * Allow filter to return early if some condition is not met. + * + * @since 1.0.0 + * + * @param bool $load Load frontend flag. + * @param array $form_data Form data. + * @param null $deprecated Deprecated. + */ + if ( ! apply_filters( 'wpforms_frontend_load', true, $form_data, null ) ) { + + $this->form_container_open( $form_data, $form ); + + /** + * Fires when the frontend is not loaded. + * + * @since 1.4.8 + * + * @param array $form_data Form data. + * @param WP_Post $form Form. + */ + do_action( 'wpforms_frontend_not_loaded', $form_data, $form ); + + $this->form_container_close( $form_data, $form ); + + return true; + } + + return false; + } + + /** + * Get pages. + * + * @since 1.8.1 + * + * @param array $form_data Form data. + * + * @return array|false + * @noinspection PhpTernaryExpressionCanBeReducedToShortVersionInspection + * @noinspection ElvisOperatorCanBeUsedInspection + */ + private function get_pages( array $form_data ) { + + $pages = wpforms_get_pagebreak_details( $form_data ); + + return $pages ? $pages : false; + } + + /** + * Check whether the output was successful. + * + * @since 1.8.1 + * + * @param WP_Post $form Form. + * + * @return bool + */ + private function output_success( WP_Post $form ): bool { + + $form_id = absint( $form->ID ); + $process = wpforms()->obj( 'process' ); + + if ( ! $process ) { + return false; + } + + $form_data = $process->form_data; + $errors = empty( $process->errors[ $form_id ] ) ? [] : $process->errors[ $form_id ]; + + // Check for return hash. + if ( + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + ! empty( $_GET['wpforms_return'] ) && + $process->valid_hash && + (int) $form_data['id'] === $form_id + ) { + $this->form_container_open( $form_data, $form ); + + /** + * Fires at successful output. + * + * @since 1.4.5 + * + * @param array $form_data Form data. + * @param array $fields Form fields. + * @param int $entry_id Form ID. + */ + do_action( 'wpforms_frontend_output_success', $form_data, $process->fields, $process->entry_id ); + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + wpforms_debug_data( $_POST ); + + $this->form_container_close( $form_data, $form ); + + return true; + } + + // Check for the error-free completed form. + if ( + // phpcs:disable WordPress.Security.NonceVerification.Missing + empty( $errors ) && + ! empty( $form_data ) && + ! empty( $_POST['wpforms']['id'] ) && + (int) $_POST['wpforms']['id'] === $form_id + // phpcs:enable WordPress.Security.NonceVerification.Missing + ) { + // There is no need for a container wrapper when a form is submitted through AJAX. + $this->form_container_open( $form_data, $form ); + + /** This action is documented in the same method, several lines above. */ + do_action( 'wpforms_frontend_output_success', $form_data, $process->fields, $process->entry_id ); + + $this->form_container_close( $form_data, $form ); + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + wpforms_debug_data( $_POST ); + + return true; + } + + return false; + } + + /** + * Display a form confirmation message. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * @param array $fields Sanitized field data. + * @param int $entry_id Entry id. + */ + public function confirmation( $form_data, $fields = [], $entry_id = 0 ): void { + + $form_data = (array) $form_data; + + // In AMP, just print template. + if ( $this->amp_obj->output_success_template( $form_data ) ) { + return; + } + + [ $fields, $entry_id ] = $this->prepare_confirmation_args( $fields, $entry_id ); + + $process = wpforms()->obj( 'process' ); + + if ( ! $process ) { + return; + } + + $confirmation = $process->get_current_confirmation(); + $confirmation_message = $process->get_confirmation_message( $form_data, $fields, $entry_id ); + + // Only display if a confirmation message has been configured. + if ( empty( $confirmation ) || empty( $confirmation_message ) ) { + return; + } + + // Load confirmation-specific assets. + $this->assets_confirmation( $form_data ); + + /** + * Fires once before the confirmation message. + * + * @since 1.6.9 + * + * @param array $confirmation Current confirmation data. + * @param array $form_data Form data and settings. + * @param array $fields Sanitized field data. + * @param int $entry_id Entry id. + */ + do_action( 'wpforms_frontend_confirmation_message_before', $confirmation, $form_data, $fields, $entry_id ); + + $class = (int) wpforms_setting( 'disable-css', '1' ) === 1 ? + 'wpforms-confirmation-container-full' : + 'wpforms-confirmation-container'; + + $class .= $this->confirmation_message_scroll ? ' wpforms-confirmation-scroll' : ''; + + $this->render_obj->confirmation( $confirmation_message, $class, $form_data ); + + /** + * Fires once after the confirmation message. + * + * @since 1.6.9 + * + * @param array $confirmation Current confirmation data. + * @param array $form_data Form data and settings. + * @param array $fields Sanitized field data. + * @param int $entry_id Entry id. + */ + do_action( 'wpforms_frontend_confirmation_message_after', $confirmation, $form_data, $fields, $entry_id ); + } + + /** + * Prepare confirmation arguments. + * + * @since 1.8.1 + * + * @param array $fields Sanitized field data. + * @param int $entry_id Entry id. + * + * @return array + */ + private function prepare_confirmation_args( $fields = [], $entry_id = 0 ): array { + + // phpcs:disable WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + + if ( empty( $fields ) ) { + $fields = ! empty( $_POST['wpforms']['complete'] ) ? $_POST['wpforms']['complete'] : []; + } + + if ( empty( $entry_id ) ) { + $entry_id = ! empty( $_POST['wpforms']['entry_id'] ) ? $_POST['wpforms']['entry_id'] : 0; + } + + // phpcs:enable WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + + return [ $fields, $entry_id ]; + } + + /** + * Form container classes. + * + * @since 1.7.9 + * + * @param array $form_data Form data and settings. + * + * @return array + */ + private function get_container_classes( $form_data ): array { + + $classes = (int) wpforms_setting( 'disable-css', '1' ) === 1 ? [ 'wpforms-container-full' ] : []; + + /** + * Allow form container classes to be filtered and user-defined classes. + * + * @since 1.0.0 + * + * @param array $classes Classes. + * @param array $form_data Form data and settings. + */ + $classes = (array) apply_filters( 'wpforms_frontend_container_class', $classes, $form_data ); + + if ( ! empty( $form_data['settings']['form_class'] ) ) { + $classes = array_merge( $classes, explode( ' ', $form_data['settings']['form_class'] ) ); + } + + return $classes; + } + + /** + * Display the opening container markup for a form. + * + * @since 1.7.9 + * + * @param array $form_data Form data and settings. + * @param WP_Post $form Form post type. + */ + private function form_container_open( $form_data, $form ): void { + + /** + * Fires before container open tag. + * + * @since 1.5.4.2 + * + * @param array $form_data Form data and settings. + * @param WP_Post $form Form post type. + */ + do_action( 'wpforms_frontend_output_container_before', $form_data, $form ); + + $classes = $this->get_container_classes( $form_data ); + + $this->render_obj->form_container_open( $classes, $form_data ); + } + + /** + * Display the closing container markup for a form. + * + * @since 1.7.9 + * + * @param array $form_data Form data and settings. + * @param WP_Post $form Form post type. + */ + private function form_container_close( $form_data, $form ): void { + + $this->render_obj->form_container_close(); + + /** + * Fires after container close tag. + * + * @since 1.5.4.2 + * + * @param array $form_data Form data and settings. + * @param WP_Post $form Form post type. + */ + do_action( 'wpforms_frontend_output_container_after', $form_data, $form ); + } + + /** + * Form head area, for displaying form title and description if enabled. + * + * @since 1.8.1 + * + * @param array $form_data Form data and settings. + * @param null $deprecated Deprecated in v1.3.7, previously was $form object. + * @param bool $title Whether to display form title. + * @param bool $description Whether to display form description. + * @param array $errors List of all errors filled in WPForms_Process::process(). + * + * @noinspection PhpUnusedParameterInspection + */ + public function head( array $form_data, $deprecated, bool $title, bool $description, $errors ): void { + + // Output title and/or description. + if ( $title === true || $description === true ) { + $this->render_obj->form_head_container( $title, $description, $form_data ); + } + + /** + * Filters ', + esc_html( $msg ) + ); + } + + /** + * Display form error. + * + * @since 1.8.1 + * + * @param string $type Error type. + * @param string $error Error text. + */ + public function form_error( $type, $error ) { + + switch ( $type ) { + case 'header': + case 'footer': + printf( + '', + esc_attr( $this->form_data['id'] ?? 0 ), + esc_attr( $type ), + esc_html__( 'Form error message', 'wpforms-lite' ), + wpautop( wpforms_sanitize_error( $error ) ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + + case 'header_styled': + case 'footer_styled': + printf( + '', + esc_attr( $this->form_data['id'] ), + esc_attr( $type ), + esc_html__( 'Form error message', 'wpforms-lite' ), + wpautop( wpforms_sanitize_error( $error ) ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + + case 'header_styled': + case 'footer_styled': + printf( + '', + esc_attr( $this->form_data['id'] ), + esc_attr( $type ), + esc_html__( 'Form error message', 'wpforms-lite' ), + wpautop( wpforms_sanitize_error( $error ) ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + + case 'header_styled': + case 'footer_styled': + printf( + '', + esc_attr( $this->form_data['id'] ), + esc_attr( $type ), + esc_html__( 'Form error message', 'wpforms-lite' ), + wpautop( wpforms_sanitize_error( $error ) ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + + case 'recaptcha': + printf( + ' + %1$s%2$s + ', + esc_attr__( 'Recaptcha error message', 'wpforms-lite' ), + wpforms_sanitize_error( $error ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + break; + } + } + + /** + * Field label markup. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + */ + public function field_label( $field, $form_data ) { + + // Do not need to output label if the field requires fieldset. + if ( $this->is_field_requires_fieldset( $field ) ) { + return; + } + + if ( ! empty( $field['label_hide'] ) ) { + $field['properties']['label']['attr']['aria-hidden'] = 'false'; + } + + parent::field_label( $field, $form_data ); + } + + /** + * Open fieldset markup. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + */ + public function field_fieldset_open( $field, $form_data ) { + + if ( ! $this->is_field_requires_fieldset( $field ) ) { + return; + } + + if ( ! empty( $field['label_hide'] ) ) { + $field['properties']['label']['attr']['aria-hidden'] = 'false'; + } + + $label = $field['properties']['label']; + $required = $label['required'] ? wpforms_get_field_required_label() : ''; + + unset( $label['attr']['for'] ); + + printf( + '
              %s%s', + wpforms_html_attributes( $label['id'], $label['class'], $label['data'], $label['attr'] ), + esc_html( $label['value'] ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $required + ); + } + + /** + * Close fieldset markup. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + */ + public function field_fieldset_close( $field, $form_data ) { + + if ( ! $this->is_field_requires_fieldset( $field ) ) { + return; + } + + echo '
              '; + } + + /** + * Whether the field requires fieldset markup. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + */ + private function is_field_requires_fieldset( $field ) { + + if ( empty( $field['type'] ) ) { + return false; + } + + /** + * Determine whether the field is requires fieldset+legend markup on the frontend. + * + * @since 1.8.1 + * + * @param bool $requires_fieldset True if requires. Defaults to false. + * @param array $field Field data. + */ + return (bool) apply_filters( "wpforms_frontend_modern_is_field_requires_fieldset_{$field['type']}", false, $field ); + } + + /** + * Field error. + * + * @since 1.8.1 + * + * @param array $field Field data and settings. + * @param array $form_data Form data and settings. + * + * @noinspection HtmlUnknownAttribute + */ + public function field_error( $field, $form_data ) { + + if ( empty( $field['properties']['error'] ) ) { + return; + } + + $error = $field['properties']['error']; + + printf( + '%2$s', + wpforms_html_attributes( $error['id'], $error['class'], $error['data'], $error['attr'] ), + esc_html( $error['value'] ) + ); + } + + /** + * Define additional field properties. + * + * @since 1.8.1 + * + * @param array $properties Field properties. + * @param array $field Field settings. + * @param array $form_data Form data and settings. + * + * @return array + */ + public function field_properties( $properties, $field, $form_data ) { + + $field_id = "wpforms-{$form_data['id']}-field_{$field['id']}"; + $desc_id = "{$field_id}-description"; + + // Add `id` to field description. + $properties['description']['id'] = $desc_id; + + // Add attributes to error message. + $properties['error']['attr']['role'] = 'alert'; + $properties['error']['attr']['aria-label'] = esc_html__( 'Error message', 'wpforms-lite' ); + $properties['error']['attr']['id'] = $properties['error']['attr']['for'] . '-error'; + $properties['error']['attr']['for'] = ''; + + foreach ( $properties['inputs'] as $input => $input_data ) { + + // Add `aria-errormessage` to inputs (except hidden according to W3C requirements). + if ( ! empty( $input_data['id'] ) && $field['type'] !== 'hidden' ) { + $properties['inputs'][ $input ]['attr']['aria-errormessage'] = "{$input_data['id']}-error"; + } + + // Add `aria-describedby` to inputs. + if ( ! empty( $field['description'] ) ) { + $properties['inputs'][ $input ]['attr']['aria-describedby'] = $desc_id; + } + } + + return $properties; + } + + /** + * Required label (asterisk) markup. + * + * @since 1.8.1 + * + * @param string $label_html Required label markup. + * + * @return string + */ + public function get_field_required_label( $label_html ) { + + return ' '; + } + + /** + * Modify javascript `wpforms_settings` properties on the front end. + * + * @since 1.8.1 + * + * @param array $strings Array `wpforms_settings` properties. + * + * @return array + */ + public function frontend_strings( $strings ) { + + $strings['isModernMarkupEnabled'] = wpforms_get_render_engine() === 'modern'; + $strings['formErrorMessagePrefix'] = esc_html__( 'Form error message', 'wpforms-lite' ); + $strings['errorMessagePrefix'] = esc_html__( 'Error message', 'wpforms-lite' ); + $strings['submitBtnDisabled'] = esc_html__( 'Submit button is disabled during form submission.', 'wpforms-lite' ); + + return $strings; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/CacheBase.php b/wp-content/plugins/wpforms-lite/src/Helpers/CacheBase.php new file mode 100755 index 00000000..9df4210f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/CacheBase.php @@ -0,0 +1,569 @@ +update_settings(); + + $this->cache_key = $this->settings['cache_file']; + $this->cache_dir = $this->get_cache_dir(); // See comment in the method. + $this->cache_file = $this->cache_dir . $this->settings['cache_file']; + + // Do not update caches on heartbeat events. + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $action = isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : ''; + + if ( $action === 'heartbeat' ) { + return; + } + + if ( ! $this->allow_load() ) { + return; + } + + // Quit if settings weren't provided. + if ( + empty( $this->settings['remote_source'] ) || + empty( $this->settings['cache_file'] ) + ) { + return; + } + + $this->hooks(); + } + + /** + * Base hooks. + * + * @since 1.6.8 + */ + private function hooks(): void { + + add_action( 'shutdown', [ $this, 'cache_dir_complete' ] ); + + if ( empty( $this->settings['update_action'] ) ) { + return; + } + + // Schedule recurring updates. + add_action( 'admin_init', [ $this, 'schedule_update_cache' ] ); + add_action( $this->settings['update_action'], [ $this, 'update' ] ); + + // Sync cache updates. + add_action( 'wpforms_helpers_cache_base_sync_updates', [ $this, 'sync_updates' ] ); + } + + /** + * Sync cache updates. + * + * If one update has been done, run the update for other caches. + * + * @since 1.8.9 + * + * @noinspection PhpCastIsUnnecessaryInspection + * @noinspection UnnecessaryCastingInspection + */ + public function sync_updates(): void { + + // Prevent infinite loop. + if ( $this->syncing_updates ) { + foreach ( (array) static::SYNC_WITH as $classname ) { + $cache = wpforms()->obj( $classname ); + + if ( ! $cache instanceof self ) { + continue; + } + + $cache->update( true ); + } + } + } + + /** + * Set up settings. + * + * @since 1.6.8 + */ + private function update_settings(): void { + + $default_settings = [ + + // Remote source URL. + // For instance: 'https://wpformsapi.com/feeds/v1/addons/'. + 'remote_source' => '', + + // Request timeout in seconds. + 'timeout' => 10, + + // Cache file. + // Just file name. For instance: 'addons.json'. + 'cache_file' => '', + + // Cache time to live in seconds. + 'cache_ttl' => WEEK_IN_SECONDS, + + // Scheduled update action. + // For instance: 'wpforms_admin_addons_cache_update'. + 'update_action' => '', + // Additional query args for the remote source URL. + 'query_args' => [], + ]; + + $this->settings = wp_parse_args( $this->setup(), $default_settings ); + } + + /** + * Provide settings. + * + * @since 1.6.8 + * + * @return array Settings array. + */ + abstract protected function setup(); + + /** + * Get a cache directory path. + * + * @since 1.6.8 + * + * @return string + */ + protected function get_cache_dir() { + + return File::get_cache_dir(); + } + + /** + * Get data from cache or from API call. + * + * @since 1.8.2 + * + * @return array + */ + public function get() { + + $cache = $this->get_from_cache(); + + if ( ! empty( $cache ) && ! $this->is_expired_cache() ) { + return $cache; + } + + $this->update(); + + return $this->get_from_cache(); + } + + /** + * Determine if the cache is expired. + * + * @since 1.8.2 + * + * @return bool + */ + private function is_expired_cache(): bool { + + return $this->cache_time() + $this->settings['cache_ttl'] < time(); + } + + /** + * Get cache creation time. + * + * @since 1.8.2 + * + * @return int + */ + private function cache_time(): int { + + return (int) Transient::get( $this->cache_key ); + } + + /** + * Determine if the cache file exists. + * + * @since 1.8.2 + * + * @return bool + */ + private function exists(): bool { + + return is_file( $this->cache_file ) && is_readable( $this->cache_file ); + } + + /** + * Get cache from a cache file. + * + * @since 1.8.2 + * + * @return array + */ + private function get_from_cache(): array { + + if ( ! $this->exists() ) { + return []; + } + + $content = File::get_contents( $this->cache_file ); + + // Do not decrypt non-encrypted legacy files, they will be encrypted on the scheduled update. + if ( static::ENCRYPT && ! wpforms_is_json( $content ) ) { + $content = Crypto::decrypt( $content ); + } + + return (array) json_decode( $content, true ); + } + + /** + * Update cache. + * + * @since 1.8.2 + * + * @param bool $force Force update. + * + * @return bool + */ + public function update( bool $force = false ): bool { + + if ( + ! $force && + time() < $this->cache_time() + self::REQUEST_LOCK_TIME * MINUTE_IN_SECONDS + ) { + return false; + } + + Transient::set( $this->cache_key, time(), $this->settings['cache_ttl'] ); + + if ( ! wp_mkdir_p( $this->cache_dir ) ) { + return false; + } + + $data = $this->perform_remote_request(); + $content = wp_json_encode( $data ); + + $this->maybe_update_transient( $data ); + + if ( static::ENCRYPT ) { + $content = Crypto::encrypt( $content ); + } + + if ( ! File::put_contents( $this->cache_file, $content ) ) { + return false; + } + + if ( ! $this->syncing_updates ) { + $this->syncing_updates = true; + + /** + * Action hook after the cache has been updated. + * + * @since 1.8.9 + */ + do_action( 'wpforms_helpers_cache_base_sync_updates' ); + } + + $this->updated = true; + + return true; + } + + /** + * Get data from API. + * + * @since 1.8.2 + * + * @return array + */ + protected function perform_remote_request(): array { + + $query_args = $this->settings['query_args'] ?? []; + + $request_url = add_query_arg( $query_args, $this->settings['remote_source'] ); + $user_agent = wpforms_get_default_user_agent(); + $request = wp_remote_get( + $request_url, + [ + 'timeout' => $this->settings['timeout'], + 'user-agent' => $user_agent, + ] + ); + + $request_url_log = remove_query_arg( [ 'tgm-updater-key' ], $request_url ); + + // Log if the request failed. + if ( is_wp_error( $request ) ) { + $this->add_log( + 'Cached data: HTTP request error', + [ + 'class' => static::class, + 'request_url' => $request_url_log, + 'error' => $request->get_error_message(), + 'error_data' => $request->get_error_data(), + ], + 'error' + ); + + return []; + } + + $response_code = wp_remote_retrieve_response_code( $request ); + $raw_headers = wp_remote_retrieve_headers( $request ); + $response_headers = is_object( $raw_headers ) ? $raw_headers->getAll() : (array) $raw_headers; + $response_body = wp_remote_retrieve_body( $request ); + $response_body_len = strlen( $response_body ); + $response_body_log = $response_body_len > 1024 ? "(First 1 kB):\n" . substr( trim( $response_body ), 0, 1024 ) . '...' : trim( $response_body ); + $response_body_log = esc_html( $response_body_log ); + + $log_data = [ + 'class' => static::class, + 'request_url' => $request_url_log, + 'code' => $response_code, + 'headers' => $response_headers, + 'content_length' => $response_body_len, + 'body' => $response_body_log, + ]; + + // Log the response details in debug mode. + if ( wpforms_debug() ) { + $this->add_log( 'Cached data: Response details', $log_data ); + } + + // Log the error if the response code is not 2xx or 3xx. + if ( $response_code > 399 ) { + $this->add_log( 'Cached data: HTTP request error', $log_data, 'error' ); + + return []; + } + + $json = trim( $response_body ); + $data = json_decode( $json, true ); + + if ( empty( $data ) ) { + $message = $data === null ? 'Invalid JSON' : 'Empty JSON'; + + $log_data = array_merge( + $log_data, + [ + 'json_result' => $message, + 'cache_file' => $this->settings['cache_file'], + 'remote_source' => $this->settings['remote_source'], + ] + ); + + $this->add_log( 'Cached data: ' . $message, $log_data, 'error' ); + + return []; + } + + return $this->prepare_cache_data( $data ); + } + + /** + * Add log. + * + * @since 1.8.9 + * + * @param string $title Log title. + * @param array $data Log data. + * @param string $type Log type. + */ + protected function add_log( string $title, array $data, string $type = 'log' ): void { + + wpforms_log( + $title, + $data, + [ + 'type' => [ $type ], + ] + ); + } + + /** + * Schedule updates. + * + * @since 1.6.8 + */ + public function schedule_update_cache(): void { + + // Just skip if not need to register a scheduled action. + if ( empty( $this->settings['update_action'] ) ) { + return; + } + + $tasks = wpforms()->obj( 'tasks' ); + + if ( + ! $tasks instanceof Tasks || + $tasks->is_scheduled( $this->settings['update_action'] ) !== false + ) { + return; + } + + $tasks->create( $this->settings['update_action'] ) + ->recurring( time() + $this->settings['cache_ttl'], $this->settings['cache_ttl'] ) + ->params() + ->register(); + } + + /** + * Complete the cache directory. + * + * @since 1.6.8 + */ + public function cache_dir_complete(): void { + + if ( ! $this->updated ) { + return; + } + + wpforms_create_upload_dir_htaccess_file(); + wpforms_create_cache_dir_htaccess_file(); + wpforms_create_index_html_file( $this->cache_dir ); + wpforms_create_index_php_file( $this->cache_dir ); + } + + /** + * Invalidate cache. + * + * @since 1.8.7 + */ + public function invalidate_cache(): void { + + Transient::delete( $this->cache_key ); + } + + /** + * Prepare data to store in a local cache. + * + * @since 1.6.8 + * + * @param array|mixed $data Raw data received by the remote request. + * + * @return array Prepared data for caching. + */ + protected function prepare_cache_data( $data ): array { + + if ( empty( $data ) || ! is_array( $data ) ) { + return []; + } + + return $data; + } + + /** + * Maybe update transient duration time. + * + * Allows updating transient duration time if it's less than expiration time. + * To do this, overwrite this method in child classes. + * + * @since 1.8.7 + * + * @param array $data Data received by the remote request. + * + * @return bool|array + */ + protected function maybe_update_transient( array $data ) { + + return $data; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/Chain.php b/wp-content/plugins/wpforms-lite/src/Helpers/Chain.php new file mode 100755 index 00000000..00e65280 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/Chain.php @@ -0,0 +1,416 @@ +value = $value; + } + + /** + * Bind some function to value. + * + * @since 1.5.6 + * + * @param mixed $fn Some function. + * + * @return Chain + */ + public function bind( $fn ) { + + $this->value = $fn( $this->value ); + + return $this; + } + + /** + * Get value. + * + * @since 1.5.6 + * + * @return mixed + */ + public function value() { + + return $this->value; + } + + /** + * Magic call. + * + * @since 1.5.6 + * + * @param string $name Method name. + * @param array $params Parameters. + * + * @throws BadFunctionCallException Invalid function is called. + * + * @return Chain + */ + public function __call( $name, $params ) { + + if ( in_array( $name, $this->allowed_methods(), true ) ) { + + $params = $params === null ? [] : $params; + + array_unshift( $params, $this->value ); + + $this->value = call_user_func_array( $name, array_values( $params ) ); + + return $this; + } + + throw new BadFunctionCallException( esc_html( "Provided function { $name } is not allowed. See Chain::allowed_methods()." ) ); + } + + /** + * Join array elements with a string. + * + * @since 1.5.6 + * + * @param string $glue Defaults to an empty string. + * + * @return Chain + */ + public function implode( $glue = '' ) { + + $this->value = implode( $glue, $this->value ); + + return $this; + } + + /** + * Split a string by a string. + * + * @since 1.5.6 + * + * @param string $delimiter The boundary string. + * + * @return Chain + */ + public function explode( $delimiter ) { + + $this->value = explode( $delimiter, $this->value ); + + return $this; + } + + /** + * Apply the callback to the elements of the given arrays. + * + * @since 1.5.6 + * + * @param callable $cb Callback. + * + * @return Chain + */ + public function map( $cb ) { + + $this->value = array_map( $cb, $this->value ); + + return $this; + } + + /** + * Pop array. + * + * @since 1.5.6 + * + * @return Chain + */ + public function pop() { + + $this->value = array_pop( $this->value ); + + return $this; + } + + /** + * Run first or second callback based on a condition. + * + * @since 1.5.6 + * + * @param callable $condition Condition function. + * @param callable $true_result If condition will return true we run this function. + * @param callable $false_result If condition will return false we run this function. + * + * @return Chain + */ + public function iif( $condition, $true_result, $false_result = null ) { + + if ( ! is_callable( $false_result ) ) { + $false_result = function() { + return ''; + }; + } + $this->value = array_map( + function( $el ) use ( $condition, $true_result, $false_result ) { + if ( call_user_func( $condition, $el ) ) { + return call_user_func( $true_result, $el ); + } + return call_user_func( $false_result, $el ); + }, + $this->value + ); + + return $this; + } + + /** + * All allowed methods to work with data. + * + * @since 1.5.6 + * + * @return array + */ + public function allowed_methods() { + + return [ + 'array_change_key_case', + 'array_chunk', + 'array_column', + 'array_combine', + 'array_count_values', + 'array_diff_assoc', + 'array_diff_key', + 'array_diff_uassoc', + 'array_diff_ukey', + 'array_diff', + 'array_fill_keys', + 'array_fill', + 'array_filter', + 'array_flip', + 'array_intersect_assoc', + 'array_intersect_key', + 'array_intersect_uassoc', + 'array_intersect_ukey', + 'array_intersect', + 'array_key_first', + 'array_key_last', + 'array_keys', + 'array_map', + 'array_merge_recursive', + 'array_merge', + 'array_pad', + 'array_pop', + 'array_product', + 'array_rand', + 'array_reduce', + 'array_replace_recursive', + 'array_replace', + 'array_reverse', + 'array_shift', + 'array_slice', + 'array_splice', + 'array_sum', + 'array_udiff_assoc', + 'array_udiff_uassoc', + 'array_udiff', + 'array_uintersect_assoc', + 'array_uintersect_uassoc', + 'array_uintersect', + 'array_unique', + 'array_values', + 'count', + 'current', + 'end', + 'key', + 'next', + 'prev', + 'range', + 'reset', + 'implode', + 'ltrim', + 'rtrim', + 'md5', + 'str_getcsv', + 'str_ireplace', + 'str_pad', + 'str_repeat', + 'str_rot13', + 'str_shuffle', + 'str_split', + 'str_word_count', + 'strcasecmp', + 'strchr', + 'strcmp', + 'strcoll', + 'strcspn', + 'strip_tags', + 'stripcslashes', + 'stripos', + 'stripslashes', + 'stristr', + 'strlen', + 'strnatcasecmp', + 'strnatcmp', + 'strncasecmp', + 'strncmp', + 'strpbrk', + 'strpos', + 'strrchr', + 'strrev', + 'strripos', + 'strrpos', + 'strspn', + 'strstr', + 'strtok', + 'strtolower', + 'strtoupper', + 'strtr', + 'substr_compare', + 'substr_count', + 'substr_replace', + 'substr', + 'trim', + 'ucfirst', + 'ucwords', + 'vfprintf', + 'vprintf', + 'vsprintf', + 'wordwrap', + ]; + } + + /** + * Create myself. + * + * @since 1.5.6 + * + * @param mixed $value Current. + * + * @return Chain + */ + public static function of( $value = null ) { + + return new self( $value ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/Crypto.php b/wp-content/plugins/wpforms-lite/src/Helpers/Crypto.php new file mode 100755 index 00000000..c79d18a4 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/Crypto.php @@ -0,0 +1,130 @@ +get_results( + $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ), + 'ARRAY_N' + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + + $tables = ! empty( $tables ) ? wp_list_pluck( $tables, 0 ) : []; + + self::set_existing_tables_cache( $tables, $table_name ); + + return self::$existing_tables[ $table_name ] ?? []; + } + + /** + * Get the list of all existing custom tables starting with `wpforms_*` and cache the result. + * + * @since 1.8.7 + * + * @return array List of table names. + */ + public static function get_existing_custom_tables(): array { + + global $wpdb; + + return self::get_existing_tables( "{$wpdb->prefix}wpforms_%" ); + } + + /** + * Check if the database table exists and cache the result. + * + * @since 1.8.7 + * + * @param string $table_name Table name. Can have SQL wildcard. + * + * @return bool + */ + public static function table_exists( string $table_name ): bool { + + /** + * Filters existence of a table before a request to the database is executed. + * + * @since 1.8.7 + * + * @param integer $exists Table exists. + * @param string $table_name Table name. + */ + if ( apply_filters( 'wpforms_helpers_db_pre_table_exists', false, $table_name ) ) { + return true; + } + + foreach ( self::get_existing_tables( $table_name ) as $existing_table ) { + if ( self::wildcard_match( $table_name, $existing_table ) ) { + return true; + } + } + + return false; + } + + /** + * Get the list of existing tables from cache. + * + * @since 1.8.7 + * + * @param string $table_name Table name. Can have SQL wildcard. + * + * @return array List of table names. + */ + private static function get_existing_tables_cache( string $table_name ): array { + + $tables = Transient::get( self::EXISTING_TABLES_TRANSIENT_NAME ); + self::$existing_tables = $tables ? $tables : []; + + return self::$existing_tables[ $table_name ] ?? []; + } + + /** + * Set existing tables cache. + * + * @since 1.8.7 + * + * @param array $tables Existing tables with given table name. + * @param string $table_name Table name. + * + * @return void + */ + private static function set_existing_tables_cache( array $tables, string $table_name ) { + + if ( empty( $tables ) ) { + return; + } + + self::$existing_tables[ $table_name ] = $tables; + + /** + * Filters existing tables transient expiration time. + * + * @since 1.8.7 + * + * @param integer $expiration Expiration time. + */ + $expiration = apply_filters( 'wpforms_helpers_db_existing_tables_transient_expiration', self::EXISTING_TABLES_TRANSIENT_EXPIRATION ); + + Transient::set( self::EXISTING_TABLES_TRANSIENT_NAME, self::$existing_tables, $expiration ); + } + + /** + * Flush existing tables cache. + * + * @since 1.9.0 + * + * @return void + */ + public static function flush_existing_tables_cache() { + + self::$existing_tables = []; + + Transient::delete( self::EXISTING_TABLES_TRANSIENT_NAME ); + } + + /** + * Wildcard match. + * Works as MySQL LIKE match. + * + * @since 1.8.7 + * + * @param string $pattern Pattern. + * @param string $subject String to search into. + * + * @return false|int + */ + private static function wildcard_match( string $pattern, string $subject ) { + + $regex = str_replace( + [ '%', '_' ], // MySQL wildcard chars. + [ '.*', '.' ], // Regexp chars. + preg_quote( $pattern, '/' ) + ); + + return preg_match( '/^' . $regex . '$/is', $subject ); + } + + /** + * Check if all custom tables exist. + * + * @since 1.9.0 + * + * @return bool True if all custom tables exist. False if any is missing. + */ + public static function custom_tables_exist(): bool { + + global $wpdb; + + $existing_tables = self::get_existing_custom_tables(); + $custom_tables = wpforms()->is_pro() ? WPForms_Pro::CUSTOM_TABLES : WPForms_Lite::CUSTOM_TABLES; + + foreach ( $custom_tables as $table_name => $handler_class ) { + if ( ! in_array( $wpdb->prefix . $table_name, $existing_tables, true ) ) { + return false; + } + } + + return true; + } + + /** + * Create all custom DB tables. + * + * @since 1.9.0 + * + * @param bool $flush_cache Clear existing custom tables cache. + * + * @noinspection PhpPossiblePolymorphicInvocationInspection + */ + public static function create_custom_tables( bool $flush_cache = false ) { + + global $wpdb; + + if ( $flush_cache ) { + self::flush_existing_tables_cache(); + } + + $existing_tables = self::get_existing_custom_tables(); + $custom_tables = wpforms()->is_pro() ? WPForms_Pro::CUSTOM_TABLES : WPForms_Lite::CUSTOM_TABLES; + $created = false; + + foreach ( $custom_tables as $table_name => $handler_class ) { + if ( in_array( $wpdb->prefix . $table_name, $existing_tables, true ) ) { + continue; + } + + /** + * Child class of WPForms_DB. + * + * @var $handler WPForms_DB + */ + $handler = new $handler_class(); + + // Create a table. + $handler->create_table(); + + $created = true; + } + + if ( $created ) { + Transient::delete( self::EXISTING_TABLES_TRANSIENT_NAME ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/File.php b/wp-content/plugins/wpforms-lite/src/Helpers/File.php new file mode 100755 index 00000000..541aa9c2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/File.php @@ -0,0 +1,409 @@ + [ 'error' ] ] + ); + + return null; + } + + $is_filesystem_setup = true; + + return $wp_filesystem; + } + + /** + * Get file contents. + * + * @since 1.8.6 + * + * @param string $file File path. + * + * @return string|false + */ + public static function get_contents( $file ) { + + $filesystem = self::get_filesystem(); + + if ( + ! $filesystem + || ! $filesystem->is_readable( $file ) + || $filesystem->is_dir( $file ) + ) { + return false; + } + + return $filesystem->size( $file ) > 0 ? $filesystem->get_contents( $file ) : ''; + } + + /** + * Save file contents. + * + * @since 1.8.6 + * + * @param string $file File path. + * @param string $content File content. + * + * @return bool + */ + public static function put_contents( $file, $content ): bool { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem ) { + return false; + } + + return $filesystem->put_contents( $file, $content ); + } + + /** + * Determine whether a file or directory exists. + * + * @since 1.9.1 + * + * @param string $path Path to a file or directory. + * + * @return bool Whether $path exists or not. + */ + public static function exists( string $path ): bool { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem ) { + return false; + } + + return $filesystem->exists( $path ); + } + + /** + * Copies a file. + * + * @since 1.9.1 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * + * @return bool True on success, false on failure. + */ + public static function copy( string $source, string $destination, bool $overwrite = false ): bool { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem ) { + return false; + } + + return $filesystem->copy( $source, $destination, $overwrite ); + } + + /** + * Move a file or files from source to destination. + * + * @since 1.8.8 + * + * @param string $source Source file or glob pattern. + * @param string $destination Destination file or directory. + * + * @return bool + */ + public static function move( string $source, string $destination ): bool { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem ) { + return false; + } + + foreach ( glob( $source ) as $filename ) { + $move = $filesystem->move( $filename, $destination . basename( $filename ), true ); + + if ( ! $move ) { + return false; + } + } + + return true; + } + + /** + * Delete a file or directory. + * + * @since 1.8.8 + * + * @param string $file Path to the file or directory. + * + * @return bool + */ + public static function delete( string $file ): bool { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem ) { + return false; + } + + return $filesystem->delete( $file, true ); + } + + /** + * Create a directory. + * + * @since 1.8.8 + * + * @param string $dir Path directory. + * + * @return bool True on success, false on failure. If the directory already exists, this method will return true. + */ + public static function mkdir( string $dir ): bool { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem ) { + return false; + } + + if ( $filesystem->is_dir( $dir ) ) { + return true; + } + + return $filesystem->mkdir( $dir ); + } + + /** + * Gets details for files in a directory or a specific file. + * + * @since 1.8.8 + * + * @param string $dir Path directory. + * + * @return array|bool + */ + public static function dirlist( string $dir ) { + + $filesystem = self::get_filesystem(); + + if ( ! $filesystem || ! $filesystem->is_dir( $dir ) ) { + return false; + } + + return $filesystem->dirlist( $dir, false ); + } + + /** + * Get the upload directory path. + * + * @since 1.8.7 + * + * @return string + */ + public static function get_upload_dir(): string { + + static $upload_dir; + + if ( $upload_dir ) { + /** + * Since wpforms_upload_dir() relies on hooks, and hooks can be added unpredictably, + * we need to cache the result of this method. + * Otherwise, it is a risk to save a cache file to one dir and try to get from another. + */ + return $upload_dir; + } + + $wpforms_upload_dir = wpforms_upload_dir(); + $wpforms_upload_path = ! empty( $wpforms_upload_dir['path'] ) + ? $wpforms_upload_dir['path'] + : WP_CONTENT_DIR . '/uploads/wpforms'; + $upload_dir = trailingslashit( wp_normalize_path( $wpforms_upload_path ) ); + + return $upload_dir; + } + + /** + * Get the upload directory URL. + * + * @since 1.9.7.3 + * + * @return string + */ + public static function get_upload_url(): string { + + static $upload_url; + + if ( $upload_url ) { + /** + * Since wpforms_upload_dir() relies on hooks, and hooks can be added unpredictably, + * we need to cache the result of this method. + * Otherwise, it is a risk to save a cache file to one dir and try to get from another. + */ + return $upload_url; + } + + $wpforms_upload_dir = wpforms_upload_dir(); + + return ! empty( $wpforms_upload_dir['url'] ) + ? $wpforms_upload_dir['url'] + : WP_CONTENT_URL . '/uploads/wpforms'; + } + + /** + * Get the cache directory path. + * + * @since 1.8.6 + * + * @return string + */ + public static function get_cache_dir(): string { + + static $cache_dir; + + if ( $cache_dir ) { + /** + * Since wpforms_upload_dir() relies on hooks, and hooks can be added unpredictably, + * we need to cache the result of this method. + * Otherwise, it is a risk to save a cache file to one dir and try to get from another. + */ + return $cache_dir; + } + + $cache_dir = self::get_upload_dir() . 'cache/'; + + return $cache_dir; + } + + /** + * Check whether the file is already updated. + * + * @since 1.8.7 + * + * @param string $filename Filename. + * @param string $cache_key Cache key. + * + * @return bool + */ + public static function is_file_updated( string $filename, string $cache_key = '' ): bool { + + $filename = wp_normalize_path( $filename ); + $cache_key = $cache_key ? $cache_key : 'wpforms_' . $filename . '_file'; + + if ( ! is_file( $filename ) ) { + return false; + } + + $cached_stat = Transient::get( $cache_key ); + $stat = array_intersect_key( + stat( $filename ), + [ + 'size' => 0, + 'mtime' => 0, + 'ctime' => 0, + ] + ); + + if ( $cached_stat === $stat ) { + return true; + } + + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.unlink_unlink + @unlink( $filename ); + + return false; + } + + /** + * Save file updated stat. + * + * @since 1.8.7 + * + * @param string $filename Filename. + * @param string $cache_key Cache key. + * + * @return void + */ + public static function save_file_updated_stat( string $filename, string $cache_key = '' ): void { + + $filename = wp_normalize_path( $filename ); + $cache_key = $cache_key ? $cache_key : 'wpforms_' . $filename . '_file'; + + clearstatcache( true, $filename ); + + $stat = array_intersect_key( + stat( $filename ), + [ + 'size' => 0, + 'mtime' => 0, + 'ctime' => 0, + ] + ); + + Transient::set( $cache_key, $stat ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/Form.php b/wp-content/plugins/wpforms-lite/src/Helpers/Form.php new file mode 100755 index 00000000..03b5ffc5 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/Form.php @@ -0,0 +1,70 @@ + '', // Please always pass this. + 'destination' => '', // And this + 'clear_destination' => false, + 'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please + 'clear_working' => true, + 'is_multi' => false, + 'hook_extra' => [], // Pass any extra $hook_extra args here, this will be passed to any hooked filters. + ]; + + $options = wp_parse_args( $options, $defaults ); + + /** + * Filter the package options before running an update. + * + * See also {@see 'upgrader_process_complete'}. + * + * @since 4.3.0 + * + * @param array $options { + * Options used by the upgrader. + * + * @type string $package Package for update. + * @type string $destination Update location. + * @type bool $clear_destination Clear the destination resource. + * @type bool $clear_working Clear the working resource. + * @type bool $abort_if_destination_exists Abort if the Destination directory exists. + * @type bool $is_multi Whether the upgrader is running multiple times. + * @type array $hook_extra { + * Extra hook arguments. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type string $plugin Path to the plugin file relative to the plugins directory. + * @type string $theme The stylesheet or template name of the theme. + * @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme', + * or 'core'. + * @type object $language_update The language pack update offer. + * } + * } + */ + $options = apply_filters( 'upgrader_package_options', $options ); + + if ( ! $options['is_multi'] ) { // call $this->header separately if running multiple times + $this->skin->header(); + } + + // Connect to the Filesystem first. + $res = $this->fs_connect( [ WP_CONTENT_DIR, $options['destination'] ] ); + // Mainly for non-connected filesystem. + if ( ! $res ) { + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return false; + } + + $this->skin->before(); + + if ( is_wp_error( $res ) ) { + $this->skin->error( $res ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $res; + } + + /* + * Download the package (Note, This just returns the filename + * of the file if the package is a local file) + */ + $download = $this->download_package( $options['package'], true ); + + // Allow for signature soft-fail. + // WARNING: This may be removed in the future. + if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) { + + // Don't output the 'no signature could be found' failure message for now. + if ( (string) $download->get_error_code() !== 'signature_verification_no_signature' || WP_DEBUG ) { + // Outout the failure error as a normal feedback, and not as an error: + //$this->skin->feedback( $download->get_error_message() ); + + // Report this failure back to WordPress.org for debugging purposes. + wp_version_check( + [ + 'signature_failure_code' => $download->get_error_code(), + 'signature_failure_data' => $download->get_error_data(), + ] + ); + } + + // Pretend this error didn't happen. + $download = $download->get_error_data( 'softfail-filename' ); + } + + if ( is_wp_error( $download ) ) { + $this->skin->error( $download ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $download; + } + + $delete_package = ( (string) $download !== (string) $options['package'] ); // Do not delete a "local" file. + + // Unzips the file into a temporary directory. + $working_dir = $this->unpack_package( $download, $delete_package ); + if ( is_wp_error( $working_dir ) ) { + $this->skin->error( $working_dir ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $working_dir; + } + + // With the given options, this installs it to the destination directory. + $result = $this->install_package( + [ + 'source' => $working_dir, + 'destination' => $options['destination'], + 'clear_destination' => $options['clear_destination'], + 'abort_if_destination_exists' => $options['abort_if_destination_exists'], + 'clear_working' => $options['clear_working'], + 'hook_extra' => $options['hook_extra'], + ] + ); + + $this->skin->set_result( $result ); + if ( is_wp_error( $result ) ) { + $this->skin->error( $result ); + //$this->skin->feedback( 'process_failed' ); + } else { + // Installation succeeded. + //$this->skin->feedback( 'process_success' ); + } + + $this->skin->after(); + + if ( ! $options['is_multi'] ) { + + /** + * Fire when the upgrader process is complete. + * + * See also {@see 'upgrader_package_options'}. + * + * @since 3.6.0 + * @since 3.7.0 Added to WP_Upgrader::run(). + * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`. + * + * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a + * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or + * Language_Pack_Upgrader instance. + * @param array $hook_extra { + * Array of bulk item update data. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type array $plugins Array of the basename paths of the plugins' main files. + * @type array $themes The theme slugs. + * @type array $translations { + * Array of translations update data. + * + * @type string $language The locale the translation is for. + * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'. + * @type string $slug Text domain the translation is for. The slug of a theme/plugin or + * 'default' for core translations. + * @type string $version The version of a theme, plugin, or core. + * } + * } + */ + do_action( 'upgrader_process_complete', $this, $options['hook_extra'] ); + + $this->skin->footer(); + } + + return $result; + } + + /** + * Toggle maintenance mode for the site. + * + * Create/delete the maintenance file to enable/disable maintenance mode. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem Subclass + * + * @param bool $enable True to enable maintenance mode, false to disable. + */ + public function maintenance_mode( $enable = false ) { + global $wp_filesystem; + $file = $wp_filesystem->abspath() . '.maintenance'; + if ( $enable ) { + //$this->skin->feedback( 'maintenance_start' ); + // Create maintenance file to signal that we are upgrading + $maintenance_string = ''; + $wp_filesystem->delete( $file ); + $wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE ); + } elseif ( ! $enable && $wp_filesystem->exists( $file ) ) { + //$this->skin->feedback( 'maintenance_end' ); + $wp_filesystem->delete( $file ); + } + } + + /** + * Download a package. + * + * @since 2.8.0 + * @since 5.5.0 Added the `$hook_extra` parameter. + * + * @param string $package The URI of the package. If this is the full path to an + * existing local file, it will be returned untouched. + * @param bool $check_signatures Whether to validate file signatures. Default false. + * @param array $hook_extra Extra arguments to pass to the filter hooks. Default empty array. + * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object. + */ + public function download_package( $package, $check_signatures = false, $hook_extra = [] ) { + + /** + * Filters whether to return the package. + * + * @since 3.7.0 + * @since 5.5.0 Added the `$hook_extra` parameter. + * + * @param bool $reply Whether to bail without returning the package. + * Default false. + * @param string $package The package file name. + * @param WP_Upgrader $this The WP_Upgrader instance. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $reply = apply_filters( 'upgrader_pre_download', false, $package, $this, $hook_extra ); + if ( false !== $reply ) { + return $reply; + } + + if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) { // Local file or remote? + return $package; // Must be a local file. + } + + if ( empty( $package ) ) { + return new WP_Error( 'no_package', $this->strings['no_package'] ); + } + + //$this->skin->feedback( 'downloading_package', $package ); + + $download_file = download_url( $package, 300, $check_signatures ); + + if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) { + return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() ); + } + + return $download_file; + } + + /** + * Unpack a compressed package file. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $package Full path to the package file. + * @param bool $delete_package Optional. Whether to delete the package file after attempting + * to unpack it. Default true. + * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure. + */ + public function unpack_package( $package, $delete_package = true ) { + global $wp_filesystem; + + //$this->skin->feedback( 'unpack_package' ); + + $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/'; + + //Clean up contents of upgrade directory beforehand. + $upgrade_files = $wp_filesystem->dirlist( $upgrade_folder ); + if ( ! empty( $upgrade_files ) ) { + foreach ( $upgrade_files as $file ) { + $wp_filesystem->delete( $upgrade_folder . $file['name'], true ); + } + } + + // We need a working directory - Strip off any .tmp or .zip suffixes + $working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' ); + + // Clean up working directory + if ( $wp_filesystem->is_dir( $working_dir ) ) { + $wp_filesystem->delete( $working_dir, true ); + } + + // Unzip package to working directory + $result = unzip_file( $package, $working_dir ); + + // Once extracted, delete the package if required. + if ( $delete_package ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.unlink_unlink + unlink( $package ); + } + + if ( is_wp_error( $result ) ) { + $wp_filesystem->delete( $working_dir, true ); + if ( $result->get_error_code() === 'incompatible_archive' ) { + return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() ); + } + + return $result; + } + + return $working_dir; + } + + /** + * Install a package. + * + * Copies the contents of a package form a source directory, and installs them in + * a destination directory. Optionally removes the source. It can also optionally + * clear out the destination folder if it already exists. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * @global array $wp_theme_directories + * + * @param array|string $args { + * Optional. Array or string of arguments for installing a package. Default empty array. + * + * @type string $source Required path to the package source. Default empty. + * @type string $destination Required path to a folder to install the package in. + * Default empty. + * @type bool $clear_destination Whether to delete any files already in the destination + * folder. Default false. + * @type bool $clear_working Whether to delete the files form the working directory + * after copying to the destination. Default false. + * @type bool $abort_if_destination_exists Whether to abort the installation if + * the destination folder already exists. Default true. + * @type array $hook_extra Extra arguments to pass to the filter hooks called by + * WP_Upgrader::install_package(). Default empty array. + * } + * + * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure. + */ + public function install_package( $args = [] ) { + + global $wp_filesystem, $wp_theme_directories; + + $defaults = [ + 'source' => '', // Please always pass this + 'destination' => '', // and this + 'clear_destination' => false, + 'clear_working' => false, + 'abort_if_destination_exists' => true, + 'hook_extra' => [], + ]; + + $args = wp_parse_args( $args, $defaults ); + + // These were previously extract()'d. + $source = $args['source']; + $destination = $args['destination']; + $clear_destination = $args['clear_destination']; + + wpforms_set_time_limit( 300 ); + + if ( empty( $source ) || empty( $destination ) ) { + return new WP_Error( 'bad_request', $this->strings['bad_request'] ); + } + //$this->skin->feedback( 'installing_package' ); + + /** + * Filter the install response before the installation has started. + * + * Returning a truthy value, or one that could be evaluated as a WP_Error + * will effectively short-circuit the installation, returning that value + * instead. + * + * @since 2.8.0 + * + * @param bool|WP_Error $response Response. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] ); + + if ( is_wp_error( $res ) ) { + return $res; + } + + // Retain the Original source and destinations. + $remote_source = $args['source']; + $local_destination = $destination; + + $source_files = array_keys( $wp_filesystem->dirlist( $remote_source ) ); + $remote_destination = $wp_filesystem->find_folder( $local_destination ); + $count_source_files = count( $source_files ); + + // Locate which directory to copy to the new folder, This is based on the actual folder holding the files. + if ( $count_source_files === 1 && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) { // Only one folder? Then we want its contents. + $source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] ); + } elseif ( $count_source_files === 0 ) { + return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); // There are no files? + } else { // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename. + $source = trailingslashit( $args['source'] ); + } + + /** + * Filter the source file location for the upgrade package. + * + * @since 2.8.0 + * @since 4.4.0 The $hook_extra parameter became available. + * + * @param string $source File source location. + * @param string $remote_source Remote file source location. + * @param WP_Upgrader $this WP_Upgrader instance. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] ); + + if ( is_wp_error( $source ) ) { + return $source; + } + + // Has the source location changed? If so, we need a new source_files list. + if ( $source !== $remote_source ) { + $source_files = array_keys( $wp_filesystem->dirlist( $source ) ); + } + + /* + * Protection against deleting files in any important base directories. + * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the + * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending + * to copy the directory into the directory, whilst they pass the source + * as the actual files to copy. + */ + $protected_directories = [ ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' ]; + + if ( is_array( $wp_theme_directories ) ) { + $protected_directories = array_merge( $protected_directories, $wp_theme_directories ); + } + + if ( in_array( $destination, $protected_directories ) ) { + $remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) ); + $destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) ); + } + + if ( $clear_destination ) { + // We're going to clear the destination if there's something there. + $removed = $this->clear_destination( $remote_destination ); + + /** + * Filter whether the upgrader cleared the destination. + * + * @since 2.8.0 + * + * @param mixed $removed Whether the destination was cleared. true on success, WP_Error on failure. + * @param string $local_destination The local package destination. + * @param string $remote_destination The remote package destination. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] ); + + if ( is_wp_error( $removed ) ) { + return $removed; + } + } elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) { + // If we're not clearing the destination folder and something exists there already, Bail. + // But first check to see if there are actually any files in the folder. + $_files = $wp_filesystem->dirlist( $remote_destination ); + + if ( ! empty( $_files ) ) { + $wp_filesystem->delete( $remote_source, true ); // Clear out the source files. + + return new WP_Error( 'folder_exists', $this->strings['folder_exists'], $remote_destination ); + } + } + + // Create destination if needed. + if ( ! $wp_filesystem->exists( $remote_destination ) ) { + if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) { + return new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination ); + } + } + + // Copy new version of item into place. + $result = copy_dir( $source, $remote_destination ); + + if ( is_wp_error( $result ) ) { + if ( $args['clear_working'] ) { + $wp_filesystem->delete( $remote_source, true ); + } + + return $result; + } + + // Clear the Working folder? + if ( $args['clear_working'] ) { + $wp_filesystem->delete( $remote_source, true ); + } + + $destination_name = basename( str_replace( $local_destination, '', $destination ) ); + + if ( $destination_name === '.' ) { + $destination_name = ''; + } + + $this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' ); + + /** + * Filter the installation response after the installation has finished. + * + * @since 2.8.0 + * + * @param bool $response Installation response. + * @param array $hook_extra Extra arguments passed to hooked filters. + * @param array $result Installation result data. + */ + $res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result ); + + if ( is_wp_error( $res ) ) { + $this->result = $res; + + return $res; + } + + // Bombard the calling function will all the info which we've just used. + return $this->result; + } + + /** + * Install a plugin package. + * + * @since 1.6.3 + * + * @param string $package The full local path or URI of the package. + * @param array $args Optional. Other arguments for installing a plugin package. Default empty array. + * + * @return bool|\WP_Error True if the installation was successful, false or a WP_Error otherwise. + */ + public function install( $package, $args = [] ) { + + $result = parent::install( $package, $args ); + if ( true === $result ) { + do_action( 'wpforms_plugin_installed', $package ); + } + + return $result; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/Templates.php b/wp-content/plugins/wpforms-lite/src/Helpers/Templates.php new file mode 100755 index 00000000..38b934d2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/Templates.php @@ -0,0 +1,225 @@ + trailingslashit( get_stylesheet_directory() ) . $template_dir, + 10 => trailingslashit( get_template_directory() ) . $template_dir, + 200 => trailingslashit( WPFORMS_PLUGIN_DIR ) . 'templates', + ]; + + $file_paths = \apply_filters( 'wpforms_helpers_templates_get_theme_template_paths', $file_paths ); + + // Sort the file paths based on priority. + \ksort( $file_paths, SORT_NUMERIC ); + + return \array_map( 'trailingslashit', $file_paths ); + } + + /** + * Locate a template and return the path for inclusion. + * + * @since 1.5.4 + * + * @param string $template_name Template name. + * + * @return string + */ + public static function locate( $template_name ) { + + // Trim off any slashes from the template name. + $template_name = \ltrim( $template_name, '/' ); + + if ( empty( $template_name ) ) { + return \apply_filters( 'wpforms_helpers_templates_locate', '', $template_name ); + } + + $located = ''; + + // Try locating this template file by looping through the template paths. + foreach ( self::get_theme_template_paths() as $template_path ) { + if ( \file_exists( $template_path . $template_name ) ) { + $located = $template_path . $template_name; + break; + } + } + + return \apply_filters( 'wpforms_helpers_templates_locate', $located, $template_name ); + } + + /** + * Include a template. + * Use 'require' if $args are passed or 'load_template' if not. + * + * @since 1.5.4 + * + * @param string $template_name Template name. + * @param array $args Arguments. + * @param bool $extract Extract arguments. + * + * @throws \RuntimeException If extract() tries to modify the scope. + */ + public static function include_html( $template_name, $args = [], $extract = false ) { + + $template_name .= '.php'; + + // Allow 3rd party plugins to filter template file from their plugin. + $located = \apply_filters( 'wpforms_helpers_templates_include_html_located', self::locate( $template_name ), $template_name, $args, $extract ); + $args = \apply_filters( 'wpforms_helpers_templates_include_html_args', $args, $template_name, $extract ); + + if ( empty( $located ) || ! \is_readable( $located ) ) { + return; + } + + // Load template WP way if no arguments were passed. + if ( empty( $args ) ) { + \load_template( $located, false ); + return; + } + + $extract = \apply_filters( 'wpforms_helpers_templates_include_html_extract_args', $extract, $template_name, $args ); + + if ( $extract && \is_array( $args ) ) { + + $created_vars_count = extract( $args, EXTR_SKIP ); // phpcs:ignore WordPress.PHP.DontExtract + + // Protecting existing scope from modification. + if ( count( $args ) !== $created_vars_count ) { + throw new \RuntimeException( 'Extraction failed: variable names are clashing with the existing ones.' ); + } + } + + require $located; + } + + /** + * Like self::include_html, but returns the HTML instead of including. + * + * @since 1.5.4 + * + * @param string $template_name Template name. + * @param array $args Arguments. + * @param bool $extract Extract arguments. + * + * @return string + */ + public static function get_html( $template_name, $args = [], $extract = false ) { + + \ob_start(); + self::include_html( $template_name, $args, $extract ); + return \ob_get_clean(); + } + + /** + * Validate that a file path is safe and within the expected path(s). + * + * Author Scott Kingsley Clark, Pods Framework. + * Refactored to reduce cyclomatic complexity. + * + * @since 1.7.5.5 + * + * @link https://github.com/pods-framework/pods/commit/ea53471e58e638dec06957edc38f9fa86607652c + * + * @param string $path The file path. + * @param null|array|string $paths_to_check The list of path types to check, defaults to just checking 'wpforms'. + * Available: 'wpforms', 'plugins', 'theme', + * or 'all' to check all supported paths. + * + * @return false|string False if the path was not allowed or did not exist, otherwise it returns the normalized path. + */ + public static function validate_safe_path( $path, $paths_to_check = null ) { + + static $available_checks; + + if ( ! $available_checks ) { + $available_checks = [ + 'wpforms' => realpath( WPFORMS_PLUGIN_DIR ), + 'plugins' => [ + realpath( WP_PLUGIN_DIR ), + realpath( WPMU_PLUGIN_DIR ), + ], + 'theme' => [ + realpath( get_stylesheet_directory() ), + realpath( get_template_directory() ), + ], + ]; + + $available_checks['plugins'] = array_unique( array_filter( $available_checks['plugins'] ) ); + $available_checks['theme'] = array_unique( array_filter( $available_checks['theme'] ) ); + $available_checks = array_filter( $available_checks ); + } + + $paths_to_check = $paths_to_check === null ? [ 'wpforms' ] : $paths_to_check; + $paths_to_check = $paths_to_check === 'all' ? array_keys( $available_checks ) : $paths_to_check; + $paths_to_check = (array) $paths_to_check; + + if ( empty( $paths_to_check ) ) { + return false; + } + + $path = wp_normalize_path( trim( (string) $path ) ); + + $match_count = 1; + + // Replace the ../ usage as many times as it may need to be replaced. + while ( $match_count ) { + $path = str_replace( '../', '', $path, $match_count ); + } + + $path = realpath( $path ); + + foreach ( $paths_to_check as $check_type ) { + if ( self::has_match( $path, $available_checks, $check_type ) ) { + return $path; + } + } + + return false; + } + + /** + * Whether path matches. + * + * @since 1.7.5.5 + * + * @param string|bool $path Path. + * @param array $available_checks Available checks. + * @param string $check_type Check type. + * + * @return bool + */ + private static function has_match( $path, $available_checks, $check_type ) { + + if ( ! $path || ! isset( $available_checks[ $check_type ] ) ) { + return false; + } + + $check_type_paths = (array) $available_checks[ $check_type ]; + + foreach ( $check_type_paths as $path_to_check ) { + if ( 0 === strpos( $path, $path_to_check ) && file_exists( $path ) ) { + return true; + } + } + + return false; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Helpers/Transient.php b/wp-content/plugins/wpforms-lite/src/Helpers/Transient.php new file mode 100755 index 00000000..61638966 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Helpers/Transient.php @@ -0,0 +1,279 @@ +query( + $wpdb->prepare( + "DELETE FROM $wpdb->options + WHERE option_name LIKE %s", + $wpdb->esc_like( self::OPTION_PREFIX ) . '%' + ) + ); + } + + /** + * Delete all expired WPForms transients. + * + * The multi-table delete syntax is used to delete the transient record + * from table 'a', and the corresponding transient_timeout record from table 'b'. + * + * @since 1.6.3.1 + * + * @return int|false Number of rows affected/selected or false on error + */ + public static function delete_all_expired() { + + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + return $wpdb->query( + $wpdb->prepare( + "DELETE a, b FROM $wpdb->options a, $wpdb->options b + WHERE a.option_name LIKE %s + AND a.option_name NOT LIKE %s + AND b.option_name = CONCAT( %s, SUBSTRING( a.option_name, %d ) ) + AND b.option_value < %d", + $wpdb->esc_like( self::OPTION_PREFIX ) . '%', + $wpdb->esc_like( self::TIMEOUT_PREFIX ) . '%', + self::TIMEOUT_PREFIX, + strlen( self::OPTION_PREFIX ) + 1, + time() + ) + ); + } + + /** + * Check if transient is expired. + * + * @since 1.6.3.1 + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * + * @return bool true if expired, false otherwise + */ + public static function is_expired( $transient ) { + + $timeout = self::get_timeout( $transient ); + + // If there's no timeout data found, the transient is considered to be valid. + if ( $timeout === false ) { + return false; + } + + if ( $timeout >= time() ) { + return false; + } + + return true; + } + + /** + * Get a transient option value. + * + * @since 1.6.3.1 + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * + * @return mixed Value set for the option. + */ + private static function get_option( $transient ) { + + return get_option( self::OPTION_PREFIX . $transient ); + } + + /** + * Get a transient timeout option value. + * + * @since 1.6.3.1 + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * + * @return mixed Value set for the option. + */ + private static function get_timeout( $transient ) { + + return get_option( self::TIMEOUT_PREFIX . $transient ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/AI.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/AI.php new file mode 100755 index 00000000..e8997b58 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/AI.php @@ -0,0 +1,75 @@ +init(); + } + + return ! Helpers::is_disabled(); + } + + /** + * Load the integration classes. + * + * @since 1.9.1 + */ + public function load() { + + if ( wpforms_is_admin_page( 'builder' ) ) { + ( new Enqueues() )->init(); + ( new FieldOption() )->init(); + ( new FormsEnqueues() )->init(); + } + + if ( wpforms_is_admin_page( 'templates' ) ) { + ( new TemplatesPage() )->init(); + } + + if ( wpforms_is_admin_ajax() ) { + $this->load_ajax_classes(); + } + } + + /** + * Load AJAX classes. + * + * @since 1.9.1 + */ + protected function load_ajax_classes() { + + ( new FieldOption() )->init(); + ( new ChoicesAjax() )->init(); + ( new FormsAjax() )->init(); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/API.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/API.php new file mode 100755 index 00000000..886e4082 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/API.php @@ -0,0 +1,124 @@ +request = new Request(); + } + + /** + * Rate the response. + * + * @since 1.9.1 + * + * @param bool $helpful Whether the response was helpful. + * @param string $response_id Response ID to rate. + * + * @return array + */ + public function rate( bool $helpful, string $response_id ): array { + + $args = [ + 'helpful' => $helpful, + 'responseId' => $response_id, + ]; + + $endpoint = '/rate-response'; + + $response = $this->request->post( $endpoint, $args ); + + if ( $response->has_errors() ) { + $error_data = $response->get_error_data(); + + Helpers::log_error( $response->get_log_message( $error_data ), $endpoint, $args ); + + return $error_data; + } + + return $response->get_body(); + } + + /** + * Get the limit for the API request. + * Returns limit set by the filter or the default limit. + * The limit is capped at LIMIT_MAX. + * + * @since 1.9.1 + * + * @return int + */ + protected function get_limit(): int { + + return min( + /** + * Filter the limit for the API request. + * + * @since 1.9.1 + * + * @param int $limit Limit for the API request. + */ + (int) apply_filters( 'wpforms_integrations_ai_api_get_limit', self::LIMIT ), // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + self::LIMIT_MAX + ); + } + + /** + * Prepare the prompt. + * + * @since 1.9.1 + * + * @param string $prompt Prompt text. + * + * @return string + */ + protected function prepare_prompt( string $prompt ): string { + + // Remove any HTML tags. + $prompt = wp_strip_all_tags( $prompt ); + + // Remove any extra spaces. + $prompt = preg_replace( '/\s+/', ' ', $prompt ); + + // Remove any extra characters. + return trim( $prompt, ' .,!?;:' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Choices.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Choices.php new file mode 100755 index 00000000..a8c32064 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Choices.php @@ -0,0 +1,66 @@ + $this->prepare_prompt( $prompt ), + 'limit' => $this->get_limit(), + ]; + + if ( ! empty( $session_id ) ) { + $args['sessionId'] = $session_id; + } + + $endpoint = '/ai-choices'; + + $response = $this->request->post( $endpoint, $args ); + + if ( $response->has_errors() ) { + $error_data = $response->get_error_data(); + + Helpers::log_error( $response->get_log_message( $error_data ), $endpoint, $args ); + + return $error_data; + } + + $result = $response->get_body(); + + // Limit the number of choices. + // In some cases, the API may return more choices than requested. + $choices = array_slice( $result['choices'], 0, $this->get_limit() ); + + // Remove numeration from choices. + $choices = array_map( + static function ( $choice ) { + + return preg_replace( '/^\d+\.\s+/', '', $choice ); + }, + $choices + ); + + $result['choices'] = $choices; + + return $result; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Forms.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Forms.php new file mode 100755 index 00000000..08eb8dba --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Forms.php @@ -0,0 +1,411 @@ + $this->prepare_prompt( $prompt ), + 'limit' => $this->get_limit(), + ]; + + if ( ! empty( $session_id ) ) { + $args['sessionId'] = $session_id; + } + + // Flag requests from Lite plugin. + $args['lite'] = ! wpforms()->is_pro(); + + // Add available addons to the request arguments. + $args['addons'] = $this->get_available_addons(); + + // Add GDPR setting to the request arguments. + $args['gdpr'] = wpforms_setting( 'gdpr' ); + + // Add a Page break field support. + $args['pagebreak'] = true; + + // Add prompt debug info support. + $args['debug'] = defined( 'WPFORMS_AI_DEBUG' ) && WPFORMS_AI_DEBUG; + + $response = $this->request->post( self::ENDPOINT, $args ); + + if ( $response->has_errors() ) { + $error_data = $response->get_error_data(); + + Helpers::log_error( $response->get_log_message( $error_data ), self::ENDPOINT, $args ); + + return $error_data; + } + + return $this->normalize_form_data( $response->get_body() ); + } + + /** + * Get available addons. + * + * @since 1.9.2 + * + * @return array + */ + private function get_available_addons(): array { + + // Since starting from 1.9.4, we display unavailable addon fields in Lite and all Pro licenses, + // we need to return all required addons to let AI generate addon fields. + return FormsAjax::FORM_GENERATOR_REQUIRED_ADDONS; + } + + /** + * Normalize form data. + * + * @since 1.9.2 + * + * @param array $form_data Form data. + * + * @return array + */ + private function normalize_form_data( array $form_data ): array { + + // Recursively normalize form data. + $form_data = $this->normalize_form_data_recursive( $form_data ); + + // Fix fields data. + $form_data = $this->fix_fields_data( $form_data ); + + // Notifications and confirmations arrays should be indexed from 1. + if ( ! empty( $form_data['settings']['notifications'] ) ) { + $form_data['settings']['notifications'] = array_combine( + range( 1, count( $form_data['settings']['notifications'] ) ), + array_values( $form_data['settings']['notifications'] ) + ); + } + + if ( ! empty( $form_data['settings']['confirmations'] ) ) { + $form_data['settings']['confirmations'] = array_combine( + range( 1, count( $form_data['settings']['confirmations'] ) ), + array_values( $form_data['settings']['confirmations'] ) + ); + } + + $form_data['form_title'] = empty( $form_data['form_title'] ) ? esc_html__( 'Untitled Form', 'wpforms-lite' ) : $form_data['form_title']; + $form_data['settings']['form_title'] = $form_data['form_title']; + + return $form_data; + } + + /** + * Normalize form data recursive. + * + * @since 1.9.2 + * + * @param array $form_data Form data. + * + * @return array + */ + private function normalize_form_data_recursive( array $form_data ): array { + + foreach ( $form_data as $key => $value ) { + if ( is_array( $value ) ) { + $form_data[ $key ] = $this->normalize_form_data_recursive( $value ); + } + + // Convert `false` and `true` values to '0' and '1'. + $form_data[ $key ] = $form_data[ $key ] === false ? '0' : $form_data[ $key ]; + $form_data[ $key ] = $form_data[ $key ] === true ? '1' : $form_data[ $key ]; + + // Remove null values. + if ( $form_data[ $key ] === null ) { + unset( $form_data[ $key ] ); + } + } + + return $form_data; + } + + /** + * Fix fields' data. + * + * @since 1.9.2 + * + * @param array $form_data Form data. + * + * @return array + */ + private function fix_fields_data( array $form_data ): array { + + $updated_fields_data = []; + $page_breaks = []; + + // Fix array keys. The key should be identical to `id`. + foreach ( $form_data['fields'] as $field_data ) { + $updated_fields_data[ (string) $field_data['id'] ] = $field_data; + } + + $form_data['fields'] = $updated_fields_data; + + // Fix choice values and choices array indexes. + foreach ( $form_data['fields'] as $id => $field_data ) { + $field_data = $this->fix_field_defaults( $field_data ); + $form_data['fields'][ $id ] = $this->fix_choices( $field_data ); + } + + // Fix conditional logic rules and detect page breaks. + foreach ( $form_data['fields'] as $id => $field_data ) { + $form_data['fields'][ $id ] = $this->fix_field_cl( $field_data, $form_data ); + + if ( $field_data['type'] === 'pagebreak' ) { + $page_breaks[] = $id; + } + } + + // Fix page breaks. + if ( ! empty( $page_breaks ) ) { + $form_data = $this->fix_page_breaks( $form_data, $page_breaks ); + } + + return $form_data; + } + + /** + * Fix field's conditional logic rules. + * + * @since 1.9.2 + * + * @param array $field Field data. + * @param array $form_data Form data. + * + * @return array + */ + private function fix_field_cl( array $field, array $form_data ): array { + + if ( empty( $field['conditionals'] ) || empty( $field['conditional_logic'] ) ) { + return $field; + } + + // Loop groups. + foreach ( $field['conditionals'] as $group_key => $group ) { + + // Loop rules. + foreach ( $group as $rule_key => $rule ) { + $choices = $form_data['fields'][ $rule['field'] ]['choices'] ?? []; + + // We only need to update rules for choice-based fields. + if ( empty( $choices ) ) { + continue; + } + + // AI uses choice value, but we should use the index of the choice in the `choices` array. + $field['conditionals'][ $group_key ][ $rule_key ]['value'] = $this->get_choice_index( $choices, $rule['value'] ); + + // Continue if the operator is supported by the choice-based field. + if ( in_array( $rule['operator'], [ '==', '!=', 'e', '!e' ], true ) ) { + continue; + } + + // Fix `operator` value for choice-based fields. + $rule['operator'] = in_array( $rule['operator'], [ 'c', '^', '>', '<' ], true ) ? '==' : $rule['operator']; + $rule['operator'] = in_array( $rule['operator'], [ '!c', '~' ], true ) ? '!=' : $rule['operator']; + + $field['conditionals'][ $group_key ][ $rule_key ]['operator'] = $rule['operator']; + } + } + + return $field; + } + + /** + * Find choice index in the `choices` array. + * + * @since 1.9.2 + * + * @param array $choices Choices data. + * @param string $value Value to find in choices. + * + * @return string|null + */ + private function get_choice_index( array $choices, string $value ) { + + $index = array_search( $value, array_column( $choices, 'value' ), true ); + + if ( $index === false ) { + $index = array_search( $value, array_column( $choices, 'label' ), true ); + } + + $choices_keys = array_keys( $choices ); + + return $index === false ? null : $choices_keys[ $index ]; + } + + /** + * Add missing default attributes to the field. + * + * @since 1.9.4 + * + * @param array $field Field data. + * + * @return array + */ + private function fix_field_defaults( array $field ): array { + + /** + * Allow the default field settings to be filtered. + * + * @since 1.0.8 + * + * @param array $field Default field settings. + */ + $field = (array) apply_filters( 'wpforms_field_new_default', $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + // Set the defaults for certain fields. + if ( $field['type'] === 'content' ) { + $field['label'] = empty( $field['label'] ) ? esc_html__( 'Content', 'wpforms-lite' ) : $field['label']; + } + + if ( $field['type'] === 'richtext' ) { + $field['default_value'] = ''; + } + + return $field; + } + + /** + * Fix choices. + * + * Remove unnecessary values from choices. + * + * @since 1.9.2 + * + * @param array $field Field data. + * + * @return array + */ + private function fix_choices( array $field ): array { + + if ( empty( $field['choices'] ) ) { + return $field; + } + + // Remove values from choices for non-payment fields. + if ( ! in_array( $field['type'], [ 'payment-multiple', 'payment-checkbox', 'payment-select' ], true ) ) { + // Remove values from choices. + foreach ( $field['choices'] as $i => $choice ) { + $field['choices'][ $i ]['value'] = ''; + } + } + + $updated_choices = []; + + // Update array keys to start from 1. + foreach ( $field['choices'] as $i => $choice ) { + $updated_choices[ $i + 1 ] = $choice; + } + + $field['choices'] = $updated_choices; + + return $field; + } + + /** + * Fix page breaks. + * + * Add top and bottom page breaks to the form, set `nav_align` for all page breaks. + * + * @since 1.9.3 + * + * @param array $form_data Form data. + * @param array $page_breaks Page break IDs. + * + * @return array + */ + private function fix_page_breaks( array $form_data, array $page_breaks ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + reset( $form_data['fields'] ); + + $max_field_id = max( array_keys( $form_data['fields'] ) ); + + // Update or add the top page break. + $first_field_id = key( $form_data['fields'] ); + + // If the first field is a page break, use its ID, otherwise create a new one. + if ( $form_data['fields'][ $first_field_id ]['type'] === 'pagebreak_top' ) { + $top_id = $first_field_id; + } else { + $top_id = '0'; + $form_data['fields'] = [ $top_id => [] ] + $form_data['fields']; + } + + $form_data['fields'][ $top_id ] = [ + 'type' => 'pagebreak', + 'id' => $top_id, + 'position' => 'top', + 'indicator' => 'progress', + 'indicator_color' => PagebreakField::get_default_indicator_color(), + 'title' => $form_data['fields'][ $top_id ]['title'] ?? '', + 'nav_align' => $form_data['fields'][ $top_id ]['nav_align'] ?? 'left', + ]; + + // Remove the Previous button from the first normal pagebreak. + $form_data['fields'][ $page_breaks[0] ]['prev'] = ''; + $form_data['fields'][ $page_breaks[0] ]['prev_toggle'] = ''; + + end( $form_data['fields'] ); + + // Update or add the bottom page break. + // If the last field is a page break, use its ID, otherwise create a new one. + $last_field_id = key( $form_data['fields'] ); + $last_field = $form_data['fields'][ key( $form_data['fields'] ) ]; + $bottom_id = $last_field['type'] === 'pagebreak_bottom' ? $last_field_id : (string) ++$max_field_id; + $form_data['fields'][ $bottom_id ] = [ + 'type' => 'pagebreak', + 'id' => $bottom_id, + 'position' => 'bottom', + 'title' => '', + 'prev' => $form_data['fields'][ $bottom_id ]['prev'] ?? '', + 'prev_toggle' => $form_data['fields'][ $bottom_id ]['prev_toggle'] ?? '', + ]; + + // Remove the Previous button from the bottom pagebreak. + if ( empty( $form_data['fields'][ $bottom_id ]['prev_toggle'] ) ) { + unset( $form_data['fields'][ $bottom_id ]['prev'], $form_data['fields'][ $bottom_id ]['prev_toggle'] ); + } + + // Prevent wrong pagebreaks. + foreach ( $form_data['fields'] as $d => $field ) { + $field['type'] = $field['type'] === 'pagebreak_top' ? 'pagebreak' : $field['type']; + $field['type'] = $field['type'] === 'pagebreak_bottom' ? 'pagebreak' : $field['type']; + + $form_data['fields'][ $d ] = $field; + } + + return $form_data; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Request.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Request.php new file mode 100755 index 00000000..200f120e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Request.php @@ -0,0 +1,160 @@ +request( 'POST', $endpoint, $args ); + } + + /** + * Make a request to the API. + * + * @since 1.9.1 + * + * @param string $method Request method. + * @param string $endpoint Endpoint to request. + * @param array $args Arguments to send. + * + * @return Response Response from the API. + */ + private function request( string $method, string $endpoint, array $args ): Response { + + // Once mark AI features as used when making a first request. + Helpers::set_ai_used(); + + // Add domain to the request. + $args['domain'] = preg_replace( '/(https?:\/\/)?(www\.)?(.*)\/?/', '$3', home_url() ); + + $args = $this->maybe_add_lite_connect_credentials( $args ); + + $options = [ + 'method' => $method, + 'headers' => $this->get_headers(), + 'timeout' => $this->get_timeout(), + 'body' => wp_json_encode( $args ), + ]; + + $url = $this->get_request_url( $endpoint ); + + return new Response( wp_safe_remote_request( $url, $options ) ); + } + + /** + * Get AI API request URL. + * + * @since 1.9.3 + * + * @param string $endpoint Endpoint to request. + * + * @return string + */ + private function get_request_url( string $endpoint ): string { + + /** + * Filter AI API request URL. + * + * @since 1.9.3 + * + * @param string $url API request URL. + * @param string $endpoint Endpoint to request. + */ + return (string) apply_filters( 'wpforms_integrations_aiapi_http_request_url', self::URL . $endpoint, $endpoint ); + } + + /** + * Maybe add Lite Connect credentials to the request. + * + * @since 1.9.1 + * + * @param array $args Arguments to send. + * + * @return array + */ + private function maybe_add_lite_connect_credentials( array $args ): array { + + if ( wpforms()->is_pro() ) { + return $args; + } + + if ( ! LiteConnect::is_allowed() || ! LiteConnect::is_enabled() ) { + return $args; + } + + return array_merge( $args, Integration::get_site_credentials() ); + } + + /** + * Retrieve request headers. + * + * @since 1.9.1 + * + * @return array + */ + private function get_headers(): array { + + $headers = [ + 'Content-Type' => 'application/json', + ]; + + if ( wpforms()->is_pro() ) { + $headers['x-wpforms-licensekey'] = wpforms_get_license_key(); + } + + return $headers; + } + + /** + * Retrieve request timeout. + * + * @since 1.9.1 + * + * @return int + */ + private function get_timeout(): int { + + /** + * Filter the API request timeout. + * + * @since 1.9.1 + * + * @param int $timeout Request timeout. + */ + return (int) apply_filters( 'wpforms_integrations_ai_api_http_request_timeout', self::TIMEOUT ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Response.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Response.php new file mode 100755 index 00000000..e9dc5f4d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/API/Http/Response.php @@ -0,0 +1,136 @@ +response = $response; + } + + /** + * Retrieve only the body from the raw response. + * + * @since 1.9.1 + * + * @return array The body of the response. + */ + public function get_body(): array { + + $body = wp_remote_retrieve_body( $this->response ); + + if ( empty( $body ) ) { + return []; + } + + return json_decode( $body, true ) ?? []; + } + + /** + * Get error data. + * + * @since 1.9.1 + * + * @return array + */ + public function get_error_data(): array { + + $code = $this->get_response_code(); + + return [ + 'error' => $this->get_response_message(), + 'code' => empty( $code ) ? 'wp_error' : $code, + ]; + } + + /** + * Retrieve only the response message from the raw response. + * + * @since 1.9.1 + * + * @return string The response error. + */ + public function get_response_message(): string { + + if ( is_wp_error( $this->response ) ) { + if ( $this->response->get_error_code() === 'http_request_failed' ) { + return __( 'There appears to be a network error.', 'wpforms-lite' ); + } + + return $this->response->get_error_message(); + } + + $body = $this->get_body(); + + return $body['error_message'] ?? wp_remote_retrieve_response_message( $this->response ); + } + + /** + * Get the error log message. + * + * @since 1.9.2 + * + * @param array $error_data Error data. + * + * @return string The error log message. + */ + public function get_log_message( array $error_data ): string { + + return sprintf( /* translators: %1$s - error code, %2$s - error message. */ + __( 'API response: %1$s %2$s', 'wpforms-lite' ), + $error_data['code'], + $error_data['error'] + ); + } + + /** + * Retrieve only the response code from the raw response. + * + * @since 1.9.1 + * + * @return int The response code as an integer. + */ + private function get_response_code(): int { + + return absint( wp_remote_retrieve_response_code( $this->response ) ); + } + + /** + * Whether we received errors in the response. + * + * @since 1.9.1 + * + * @return bool True if response has errors. + */ + public function has_errors(): bool { + + $code = $this->get_response_code(); + + return $code < 200 || $code > 299; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Base.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Base.php new file mode 100755 index 00000000..39c947ca --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Base.php @@ -0,0 +1,135 @@ +api = new API(); + + $this->api->init(); + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.1 + */ + private function hooks() { + + add_action( 'wp_ajax_wpforms_rate_ai_response', [ $this, 'rate_response' ] ); + } + + /** + * Rate choices response. + * + * @since 1.9.1 + */ + public function rate_response() { + + if ( ! $this->validate_nonce() ) { + wp_send_json_error(); + } + + $helpful = $this->get_post_data( 'helpful', 'bool' ); + $response_id = $this->get_post_data( 'response_id' ); + + $response = $this->api->rate( $helpful, $response_id ); + + wp_send_json_success( $response ); + } + + /** + * Validate nonce. + * + * @since 1.9.1 + * + * @return bool|int + */ + protected function validate_nonce() { + + return check_ajax_referer( 'wpforms-ai-nonce', 'nonce', false ); + } + + /** + * Get post data by key. + * + * @since 1.9.1 + * + * @param string $key Key to get data for. + * @param string $type Type of data to get. + * + * @return mixed + */ + protected function get_post_data( string $key, string $type = 'text' ) { + + switch ( $type ) { + case 'int': + $value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_NUMBER_INT ) ?? 0; + break; + + case 'array': + $value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY ) ?? []; + break; + + case 'bool': + $value = filter_input( INPUT_POST, $key, FILTER_VALIDATE_BOOLEAN ) ?? false; + break; + + case 'json': + $value = json_decode( filter_input( INPUT_POST, $key ), true ); + break; + + default: + // We should use this alternative to FILTER_SANITIZE_FULL_SPECIAL_CHARS filter, + // because htmlspecialchars() function does double encoding of special characters, + // which is necessary to properly handle the encoded HTML in chat questions. + $value = htmlspecialchars( filter_input( INPUT_POST, $key ) ?? '' ); + break; + } + + return $value; + } + + /** + * Determine whether a given prompt is empty. + * + * It must contain a minimum of one character. + * + * @since 1.9.1 + * + * @param string $prompt The prompt to check. + * + * @return bool True if the prompt is empty. + */ + protected function is_empty_prompt( string $prompt ): bool { + + $special_chars = [ '@', '!', '#', '$', '%', '^', '&', '*', '(', ')', '-', '+', '=', '{', '}', '[', ']', '|', '\\', ':', ';', '"', "'", '<', '>', ',', '.', '?', '/' ]; + $prompt = str_replace( $special_chars, '', $prompt ); + + return empty( $prompt ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Choices.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Choices.php new file mode 100755 index 00000000..273912eb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Choices.php @@ -0,0 +1,73 @@ +api_choices = new ChoicesAPI(); + + $this->api_choices->init(); + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.1 + */ + private function hooks() { + + add_action( 'wp_ajax_wpforms_get_ai_choices', [ $this, 'get_choices' ] ); + } + + /** + * Get choices. + * + * @since 1.9.1 + */ + public function get_choices() { + + if ( ! $this->validate_nonce() ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Your session expired. Please reload the builder.', 'wpforms-lite' ) ] + ); + } + + $prompt = $this->get_post_data( 'prompt' ); + + if ( $this->is_empty_prompt( $prompt ) ) { + wp_send_json_success( [ 'choices' => [] ] ); + } + + $session_id = $this->get_post_data( 'session_id' ); + + $choices = $this->api_choices->choices( $prompt, $session_id ); + + wp_send_json_success( $choices ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Forms.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Forms.php new file mode 100755 index 00000000..7eb44656 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Ajax/Forms.php @@ -0,0 +1,442 @@ + 'surveys-polls', + 'net_promoter_score' => 'surveys-polls', + 'signature' => 'signatures', + 'payment-coupon' => 'coupons', + ]; + + /** + * Forms API instance. + * + * @since 1.9.2 + * + * @var FormsAPI + */ + private $forms_api; + + /** + * Initialize. + * + * @since 1.9.2 + */ + public function init() { + + parent::init(); + + $this->forms_api = new FormsAPI(); + + $this->forms_api->init(); + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.2 + */ + private function hooks(): void { + + add_action( 'wp_ajax_wpforms_get_ai_form', [ $this, 'get_form' ] ); + add_action( 'wp_ajax_wpforms_get_ai_form_field_preview', [ $this, 'get_field_preview' ] ); + add_action( 'wp_ajax_wpforms_use_ai_form', [ $this, 'use_form' ] ); + add_action( 'wp_ajax_wpforms_dismiss_ai_form', [ $this, 'dismiss' ] ); + } + + /** + * "Get form" AJAX callback. + * + * @since 1.9.2 + */ + public function get_form(): void { + + if ( ! $this->validate_nonce() ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Your session expired. Please reload the builder.', 'wpforms-lite' ) ] + ); + } + + $prompt = $this->get_post_data( 'prompt' ); + + if ( empty( $prompt ) && $prompt !== '0' ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Empty prompt.', 'wpforms-lite' ) ] + ); + } + + $session_id = $this->get_post_data( 'session_id' ); + $form = $this->forms_api->form( $prompt, $session_id ); + + $form['fieldsOrder'] = array_keys( $form['fields'] ?? [] ); + + /** + * Filters the form data before outputting it. + * + * @since 1.9.7 + * + * @param array $form Form data. + * @param string $session_id Session ID. + */ + $form = apply_filters( 'wpforms_integrations_ai_admin_ajax_forms_get_form_before_send', $form, $session_id ); + + wp_send_json_success( $form ); + } + + /** + * Get form field preview. + * + * @since 1.9.2 + */ + public function get_field_preview(): void { + + if ( ! $this->validate_nonce() ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Your session expired. Please reload the builder.', 'wpforms-lite' ) ] + ); + } + + $field = $this->prepare_field_data( + $this->get_post_data( 'field', 'array' ) + ); + + if ( empty( $field ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Empty field data.', 'wpforms-lite' ) ] + ); + } + + $field_type = $field['type'] ?? ''; + + // Check if the field type is available. + if ( has_action( "wpforms_display_field_{$field_type}" ) ) { + + ob_start(); + + // Generate field preview. + /** This action is documented in includes/admin/builder/panels/class-fields.php. */ + do_action( "wpforms_builder_fields_previews_{$field_type}", $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $preview = ob_get_clean(); + } + + wp_send_json_success( $preview ?? '' ); + } + + /** + * Prepare the form fields data. + * + * @since 1.9.2 + * + * @param array $form_data Form data. + * + * @return array + */ + private function prepare_fields_data( array $form_data ): array { + + $fields_data = $form_data['fields'] ?? []; + $fields_order = $form_data['fieldsOrder'] ?? []; + $fields = []; + + foreach ( $fields_order as $id ) { + $fields[ $id ] = $this->prepare_field_data( $fields_data[ $id ] ); + } + + return $fields; + } + + /** + * Prepare the field data. + * + * @since 1.9.2 + * + * @param array $field_data Field data. + * + * @return array + */ + private function prepare_field_data( array $field_data ): array { + + $field_type = $field_data['type'] ?? ''; + + if ( $field_type === 'content' ) { + $field_data['content'] = htmlspecialchars_decode( $field_data['content'] ?? '' ); + } + + if ( $field_type === 'html' ) { + $field_data['code'] = htmlspecialchars_decode( $field_data['code'] ?? '' ); + } + + $field_data['description'] = htmlspecialchars_decode( $field_data['description'] ?? '' ); + + if ( ! empty( $field_data['conditionals'] ) ) { + $field_data['conditionals'] = $this->prepare_field_cl( $field_data ); + } + + return $field_data; + } + + /** + * Prepare the form settings. + * + * @since 1.9.2 + * + * @param array $form_data Form data. + * + * @return array + */ + private function prepare_form_settings( array $form_data ): array { + + if ( isset( $form_data['settings']['notifications']['1'] ) ) { + $form_data['settings']['notifications']['1']['subject'] = sprintf( /* translators: %s - form name. */ + esc_html__( 'New Entry: %s', 'wpforms-lite' ), + esc_html( $form_data['form_title'] ) + ); + } + + return $form_data['settings']; + } + + /** + * Prepare the field conditional logic. + * + * @since 1.9.2 + * + * @param array $field Field data. + * + * @return array + */ + private function prepare_field_cl( array $field ): array { + + if ( empty( $field['conditionals'] ) ) { + return []; + } + + // Loop groups. + foreach ( $field['conditionals'] as $group_key => $group ) { + + // Loop rules. + foreach ( $group as $rule_key => $rule ) { + // Fix `operator` value for choice-based fields. + $rule['operator'] = htmlspecialchars_decode( $rule['operator'] ); + $rule['value'] = htmlspecialchars_decode( $rule['value'] ); + + $field['conditionals'][ $group_key ][ $rule_key ] = $rule; + } + } + + return $field['conditionals']; + } + + /** + * Use form checks and prepare data. + * + * @since 1.9.2 + * + * @return array Form ID and the generated form data. + */ + private function use_form_check_data(): array { + + if ( ! $this->validate_nonce() ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Your session expired. Please reload the builder.', 'wpforms-lite' ) ] + ); + } + + $form_id = $this->get_post_data( 'formId', 'int' ); + $form_data = $this->get_post_data( 'formData', 'array' ); + + if ( empty( $form_data ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Empty form data.', 'wpforms-lite' ) ] + ); + } + + if ( ! wpforms_current_user_can( 'edit_form_single', $form_id ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Sorry, you are not allowed to edit this form.', 'wpforms-lite' ) ] + ); + } + + $form_obj = wpforms()->obj( 'form' ); + + if ( ! $form_obj ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Form database object not found.', 'wpforms-lite' ) ] + ); + } + + $form_post = ! empty( $form_id ) ? $form_obj->get( $form_id ) : null; + + if ( + ( empty( $form_post ) && ! empty( $form_id ) ) || + ( ! empty( $form_post->post_status ) && $form_post->post_status === 'trash' ) + ) { + wp_send_json_error( + [ 'error' => esc_html__( 'It looks like the form you are trying to access is no longer available.', 'wpforms-lite' ) ] + ); + } + + $session_id = $this->get_post_data( 'sessionId' ); + $response_history = $this->get_post_data( 'responseHistory', 'array' ); + $chat_html = $this->get_post_data( 'chatHtml', 'string' ); + + return [ $form_id, $form_data, $session_id, $response_history, $chat_html, $form_obj ]; + } + + /** + * Use form. + * + * @since 1.9.2 + */ + public function use_form(): void { + + [ $form_id, $form_data, $session_id, $response_history, $chat_html, $form_obj ] = $this->use_form_check_data(); + + // Save the chat history in the user mata data. + $user_meta = [ + 'chatHtml' => $chat_html, + 'responseHistory' => $response_history, + ]; + + update_user_meta( get_current_user_id(), 'wpforms_builder_ai_form_chat_' . $session_id, $user_meta ); + + // Prepare the new form data. + $form_data['fields'] = $this->prepare_fields_data( $form_data ); + $form_data['settings'] = $this->prepare_form_settings( $form_data ); + $form_data['field_id'] = count( $form_data['fields'] ) + 1; + + $meta = []; + $meta['template'] = 'generate'; + $meta['sessionId'] = $form_data['sessionId']; + $meta['responseId'] = $form_data['responseId']; + + // Unset unrelated data. + unset( + $form_data['fieldsOrder'], + $form_data['explanation'], + $form_data['sessionId'], + $form_data['responseId'], + $form_data['processingData'] + ); + + // Add a new form if it is a new form. + if ( empty( $form_id ) ) { + $form_id = $form_obj->add( $form_data['form_title'] ); + } + + // Check if the form was created. + if ( empty( $form_id ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Form could not be created.', 'wpforms-lite' ) ] + ); + } + + // Get the blank template form data. + $blank_form_data = WPForms_Template_Blank::get_data(); + + // Merge the blank form data with the new form data. + // In this way, we can keep the default settings of the blank form. + $form_data = array_replace_recursive( $blank_form_data, $form_data ); + + // Update the form ID. + $form_data['id'] = $form_id; + + // Update the form. + $form_obj->update( $form_id, $form_data, [ 'skip_revision' => 1 ] ); + $form_obj->update_meta( $form_id, 'template', $meta['template'], [ 'skip_revision' => 1 ] ); + $form_obj->update_meta( $form_id, 'sessionId', $meta['sessionId'], [ 'skip_revision' => 1 ] ); + $form_obj->update_meta( $form_id, 'responseId', $meta['responseId'], [ 'skip_revision' => 1 ] ); + + // Result. + wp_send_json_success( + [ + 'id' => $form_id, + 'redirect' => add_query_arg( + [ + 'view' => 'fields', + 'form_id' => $form_id, + 'session' => $session_id, + ], + admin_url( 'admin.php?page=wpforms-builder' ) + ), + ] + ); + } + + /** + * Ajax handler for dismissing. + * + * @since 1.9.2 + */ + public function dismiss(): void { + + if ( ! $this->validate_nonce() ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Your session expired. Please reload the builder.', 'wpforms-lite' ) ] + ); + } + + // Identifier of the dismissible element. + $element = $this->get_post_data( 'element', 'string' ); + + // Dismiss or de-dismiss. + $dismiss = $this->get_post_data( 'dismiss', 'bool' ); + + if ( empty( $element ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Please specify an element.', 'wpforms-lite' ) ] + ); + } + + // Check for permissions. + if ( ! wpforms_current_user_can( 'edit_forms' ) ) { + wp_send_json_error( + [ 'error' => esc_html__( 'Sorry, you are not allowed to dismiss.', 'wpforms-lite' ) ] + ); + } + + $user_id = get_current_user_id(); + $dismissed = get_user_meta( $user_id, 'wpforms_dismissed', true ); + + if ( empty( $dismissed ) ) { + $dismissed = []; + } + + if ( $dismiss ) { + $dismissed[ 'ai-forms-' . $element ] = time(); + } else { + unset( $dismissed[ 'ai-forms-' . $element ] ); + } + + update_user_meta( $user_id, 'wpforms_dismissed', $dismissed ); + wp_send_json_success(); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Enqueues.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Enqueues.php new file mode 100755 index 00000000..e42559aa --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Enqueues.php @@ -0,0 +1,276 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.1 + */ + private function hooks() { + + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues' ] ); + } + + /** + * Enqueue styles and scripts. + * + * @since 1.9.1 + * + * @param string|null $view Current view (panel). + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function enqueues( $view ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + $this->enqueue_styles(); + $this->enqueue_scripts(); + } + + /** + * Enqueue styles. + * + * @since 1.9.1 + */ + private function enqueue_styles() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-ai-modal', + WPFORMS_PLUGIN_URL . "assets/css/integrations/ai/modal{$min}.css", + [], + WPFORMS_VERSION + ); + + wp_enqueue_style( + 'wpforms-ai-chat-element', + WPFORMS_PLUGIN_URL . "assets/css/integrations/ai/chat-element{$min}.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Enqueue scripts. + * + * @since 1.9.1 + */ + private function enqueue_scripts() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-ai-dock', + WPFORMS_PLUGIN_URL . "assets/js/integrations/ai/chat-element/wpforms-ai-dock{$min}.js", + [], + WPFORMS_VERSION, + false + ); + + wp_enqueue_script( + 'wpforms-ai-modal', + WPFORMS_PLUGIN_URL . "assets/js/integrations/ai/choices/wpforms-ai-modal{$min}.js", + [ 'wpforms-ai-dock' ], + WPFORMS_VERSION, + false + ); + + wp_enqueue_script( + 'wpforms-ai-chat-element', + WPFORMS_PLUGIN_URL . "assets/js/integrations/ai/chat-element/wpforms-ai-chat-element{$min}.js", + [], + WPFORMS_VERSION, + false + ); + + wp_localize_script( + 'wpforms-ai-chat-element', + 'wpforms_ai_chat_element', + $this->get_localize_chat_data() + ); + } + + /** + * Get chat localize data. + * + * @since 1.9.1 + * + * @return array + */ + private function get_localize_chat_data(): array { + + $min = wpforms_get_min_suffix(); + + $strings = [ + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpforms-ai-nonce' ), + 'min' => wpforms_get_min_suffix(), + 'dislike' => esc_html__( 'Bad response', 'wpforms-lite' ), + 'refresh' => esc_html__( 'Clear chat history', 'wpforms-lite' ), + 'btnYes' => esc_html__( 'Yes, Continue', 'wpforms-lite' ), + 'btnCancel' => esc_html__( 'Cancel', 'wpforms-lite' ), + 'confirm' => [ + 'refreshTitle' => esc_html__( 'Clear Chat History', 'wpforms-lite' ), + 'refreshMessage' => esc_html__( 'Are you sure you want to clear the AI chat history and start over?', 'wpforms-lite' ), + ], + 'errors' => [ + 'default' => esc_html__( 'An error occurred.', 'wpforms-lite' ), + 'network' => esc_html__( 'There appears to be a network error.', 'wpforms-lite' ), + 'empty' => esc_html__( 'I\'m not sure what to do with that.', 'wpforms-lite' ), + ], + 'warnings' => [ + 'prohibited_code' => esc_html__( 'Prohibited code has been removed.', 'wpforms-lite' ), + ], + 'reasons' => [ + 'default' => esc_html__( 'Please try again.', 'wpforms-lite' ), + 'empty' => esc_html__( 'Please try a different prompt. You might need to be more descriptive.', 'wpforms-lite' ), + 'prohibited_code' => esc_html__( 'Only basic styling tags are permitted. All other code deemed unsafe has been removed.', 'wpforms-lite' ), + ], + 'choices' => $this->get_choices_chat_data(), + 'actions' => [], // Additional actions for js/integrations/ai/modules/api.js. + 'pinChat' => is_rtl() ? esc_html__( 'Dock to the Left', 'wpforms-lite' ) : esc_html__( 'Dock to the Right', 'wpforms-lite' ), + 'unpinChat' => esc_html__( 'Open in Popup', 'wpforms-lite' ), + 'close' => esc_html__( 'Close', 'wpforms-lite' ), + ]; + + /** + * Allows loading additional modules from other addons. + * See wpforms-calculations/src/Admin/Builder.php as example. + * Used in js/integrations/ai/wpforms-ai-chat-element.js. + */ + $strings['modules'] = [ + [ + 'name' => 'api', + 'path' => "./modules/api{$min}.js", + ], + [ + 'name' => 'text', + 'path' => "./modules/helpers-text{$min}.js", + ], + [ + 'name' => 'choices', + 'path' => "./modules/helpers-choices{$min}.js", + ], + [ + 'name' => 'forms', + 'path' => "./modules/helpers-forms{$min}.js", + ], + ]; + + /** + * Filters the AI chat localize strings. + * + * @since 1.9.2 + * + * @param array $strings Localize strings. + */ + return apply_filters( 'wpforms_integrations_ai_admin_builder_enqueues_localize_chat_strings', $strings ); + } + + /** + * Get choices chat data. + * + * @since 1.9.1 + * + * @return array + * @noinspection HtmlUnknownTarget + * @noinspection PackedHashtableOptimizationInspection + */ + private function get_choices_chat_data(): array { + + return [ + 'title' => esc_html__( 'Generate Choices', 'wpforms-lite' ), + 'description' => esc_html__( 'Describe the choices you would like to create or use one of the examples below to get started.', 'wpforms-lite' ), + 'descrEndDot' => '.', + 'footer' => wp_kses( + __( 'What do you think of these choices? If you’re happy with them, you can insert these choices, or make changes by entering additional prompts.', 'wpforms-lite' ), // phpcs:ignore WordPress.WP.I18n.NoHtmlWrappedStrings + [ + 'strong' => [], + ] + ), + 'learnMore' => esc_html__( 'Learn More About WPForms AI', 'wpforms-lite' ), + 'warning' => esc_html__( 'It looks like you have some existing choices in this field. If you generate new choices, your existing choices will be overwritten. You can simply close this window if you’d like to keep your existing choices.', 'wpforms-lite' ), + 'placeholder' => esc_html__( 'What would you like to create?', 'wpforms-lite' ), + 'waiting' => esc_html__( 'Just a minute...', 'wpforms-lite' ), + 'insert' => esc_html__( 'Insert Choices', 'wpforms-lite' ), + 'learnMoreUrl' => wpforms_utm_link( 'https://wpforms.com/features/wpforms-ai/', 'Builder - Settings', 'Learn more - AI Choices modal' ), + 'errors' => [ + 'default' => esc_html__( 'An error occurred while generating choices.', 'wpforms-lite' ), + 'rate_limit' => esc_html__( 'Sorry, you\'ve reached your daily limit for generating choices.', 'wpforms-lite' ), + ], + 'reasons' => [ + 'rate_limit' => sprintf( + wp_kses( /* translators: %s - WPForms contact support link. */ + __( 'You may only generate choices 50 times per day. If you believe this is an error, please contact WPForms support.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + wpforms_utm_link( 'https://wpforms.com/account/support/', 'AI Feature' ) + ), + ], + 'warnings' => [ + 'prohibited_code' => esc_html__( 'Prohibited code has been removed from your choices.', 'wpforms-lite' ), + ], + 'samplePrompts' => [ + [ + 'icon' => 'wpforms-ai-chat-flag', + 'title' => esc_html__( 'american public holidays with dates in brackets', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-clover', + 'title' => esc_html__( 'provinces of canada ordered by population', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-thumbs-up', + 'title' => esc_html__( 'top 5 social networks in europe', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-globe', + 'title' => esc_html__( 'top 10 most spoken languages in the world', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-palm', + 'title' => esc_html__( 'top 20 most popular tropical travel destinations', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-shop', + 'title' => esc_html__( '30 household item categories for a marketplace', 'wpforms-lite' ), + ], + ], + 'defaults' => [ + '1' => esc_html__( 'First Choice', 'wpforms-lite' ), + '2' => esc_html__( 'Second Choice', 'wpforms-lite' ), + '3' => esc_html__( 'Third Choice', 'wpforms-lite' ), + ], + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/FieldOption.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/FieldOption.php new file mode 100755 index 00000000..23fc5d05 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/FieldOption.php @@ -0,0 +1,149 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.1 + */ + private function hooks() { + + add_action( 'wpforms_field_option_ai_modal_button', [ $this, 'add_option' ], 10, 4 ); + } + + /** + * Add AI Modal button to the field options. + * + * @since 1.9.1 + * + * @param string|mixed $output HTML output. + * @param array $field Field settings. + * @param array $args Additional arguments. + * @param object $wpforms_field WPForms_Field object. + * + * @return string + * @noinspection PhpUnusedParameterInspection + */ + public function add_option( $output, array $field, array $args, $wpforms_field ): string { + + $type = $args['type'] ?? 'default'; + $data = [ + 'field-id' => $field['id'], + ]; + $classes = [ + 'wpforms-btn-purple', + 'wpforms-ai-modal-button', + 'wpforms-ai-' . $type . '-button', + empty( $field['dynamic_choices'] ) ? '' : 'wpforms-hidden', + ]; + $attrs = []; + + [ $classes, $data, $attrs ] = $this->maybe_disable_button( $classes, $data, $attrs ); + + $button = $wpforms_field->field_element( + 'button', + $field, + [ + 'slug' => 'ai_modal_button', + 'value' => $args['value'] ?? esc_html__( 'Open AI Modal', 'wpforms-lite' ), + 'class' => wpforms_sanitize_classes( $classes ), + 'data' => $data, + 'attrs' => $attrs, + ], + false + ); + + return (string) $wpforms_field->field_element( + 'row', + $field, + [ + 'slug' => 'ai_modal_button', + 'content' => $button, + ], + false + ); + } + + /** + * Maybe disable the button and show modal. + * + * @since 1.9.1 + * + * @param array $classes Classes list. + * @param array $data Data arguments list. + * @param array $attrs Attributes list. + * + * @return array + */ + private function maybe_disable_button( array $classes, array $data, array $attrs ): array { + + $is_pro = wpforms()->is_pro(); + + // Pro, license is not active. + if ( $is_pro && ! $this->is_license_active() ) { + $classes[] = 'education-modal'; + $classes[] = 'wpforms-prevent-default'; + $data['action'] = 'license'; + $data['field-name'] = 'AI Choices'; + $data['utm-content'] = 'AI Choices'; + + return [ $classes, $data, $attrs ]; + } + + // Lite, LC is not enabled. + if ( ! $is_pro && ! LiteConnect::is_enabled() && LiteConnect::is_allowed() ) { + $classes[] = 'enable-lite-connect-modal'; + $classes[] = 'wpforms-prevent-default'; + } + + // Lite, LC is not configured or not allowed. + if ( ! $is_pro && ! LiteConnect::is_allowed() ) { + $classes[] = 'wpforms-prevent-default'; + $classes[] = 'wpforms-inactive'; + $classes[] = 'wpforms-help-tooltip'; + + $attrs['title'] = esc_html__( 'WPForms AI is not available on local sites.', 'wpforms-lite' ); + + $data['tooltip-position'] = 'top'; + } + + return [ $classes, $data, $attrs ]; + } + + /** + * Determine whether a license key is active. + * + * @since 1.9.1 + * + * @return bool + */ + private function is_license_active(): bool { + + $license = (array) get_option( 'wpforms_license', [] ); + + return ! empty( wpforms_get_license_key() ) && + empty( $license['is_expired'] ) && + empty( $license['is_disabled'] ) && + empty( $license['is_invalid'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Forms.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Forms.php new file mode 100755 index 00000000..e3a693e0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Builder/Forms.php @@ -0,0 +1,440 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.2 + */ + private function hooks() { + + add_action( 'wpforms_builder_enqueues', [ $this, 'enqueues' ] ); + add_filter( 'wpforms_integrations_ai_admin_builder_enqueues_localize_chat_strings', [ $this, 'add_localize_chat_data' ] ); + add_filter( 'wpforms_builder_template_active', [ $this, 'template_active' ], 10, 2 ); + } + + /** + * Enqueue styles and scripts. + * + * @since 1.9.2 + * + * @param string|null $view Current view (panel). + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function enqueues( $view ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + $this->enqueue_styles(); + $this->enqueue_scripts(); + } + + /** + * Enqueue styles. + * + * @since 1.9.2 + */ + private function enqueue_styles() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-ai-forms', + WPFORMS_PLUGIN_URL . "assets/css/integrations/ai/ai-forms{$min}.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Enqueue scripts. + * + * @since 1.9.2 + */ + private function enqueue_scripts() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-ai-form-generator', + WPFORMS_PLUGIN_URL . "assets/js/integrations/ai/form-generator/form-generator{$min}.js", + [], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-ai-form-generator', + 'wpforms_ai_form_generator', + $this->get_localize_form_generator_data() + ); + } + + /** + * Set active form template. + * + * @since 1.9.2 + * + * @param array|mixed $details Details. + * @param object $form Form data. + * + * @return array|void + */ + public function template_active( $details, $form ) { + + $details = (array) $details; + + if ( empty( $form ) ) { + return; + } + + $form_data = wpforms_decode( $form->post_content ); + + if ( empty( $form_data['meta']['template'] ) || $form_data['meta']['template'] !== 'generate' ) { + return $details; + } + + return [ + 'name' => esc_html__( 'Generate With AI', 'wpforms-lite' ), + 'slug' => 'generate', + 'description' => '', + 'includes' => '', + 'icon' => '', + 'modal' => '', + 'modal_display' => false, + ]; + } + + /** + * Get form generator localize data. + * + * @since 1.9.2 + * + * @return array + */ + private function get_localize_form_generator_data(): array { + + $min = wpforms_get_min_suffix(); + $addons_data = $this->get_required_addons_data(); + $modules_path = './modules/'; + + return [ + 'nonce' => wp_create_nonce( 'wpforms-ai-nonce' ), + 'adminNonce' => wp_create_nonce( 'wpforms-admin' ), + 'ajaxUrl' => admin_url( 'admin-ajax.php' ), + 'addonsData' => $addons_data, + 'addonsAction' => $this->get_required_addons_action( $addons_data ), + 'addonFields' => FormsAjax::FORM_GENERATOR_ADDON_FIELDS, + 'dismissed' => $this->get_dismissed_elements(), + 'isPro' => wpforms()->is_pro(), + 'isLicenseActive' => Helpers::is_license_active(), + 'licenseType' => Helpers::get_license_type(), + 'liteConnectEnabled' => LiteConnect::is_enabled(), + 'liteConnectAllowed' => LiteConnect::is_allowed(), + 'modules' => [ + 'main' => $modules_path . "main{$min}.js?ver=" . WPFORMS_VERSION, + 'preview' => $modules_path . "preview{$min}.js?ver=" . WPFORMS_VERSION, + 'modals' => $modules_path . "modals{$min}.js?ver=" . WPFORMS_VERSION, + ], + 'templateCard' => [ + 'imageSrc' => WPFORMS_PLUGIN_URL . 'assets/images/integrations/ai/ai-feature-icon.svg', + 'name' => esc_html__( 'Generate With AI', 'wpforms-lite' ), + 'desc' => esc_html__( 'Write simple prompts to create complex forms catered to your specific needs.', 'wpforms-lite' ), + 'buttonTextInit' => esc_html__( 'Generate Form', 'wpforms-lite' ), + 'buttonTextContinue' => esc_html__( 'Continue Generating', 'wpforms-lite' ), + 'new' => esc_html__( 'NEW!', 'wpforms-lite' ), + 'liteConnectNotAllowed' => esc_html__( 'WPForms AI is not available on local sites.', 'wpforms-lite' ), + ], + 'panel' => [ + 'backToTemplates' => esc_html__( 'Back to Templates', 'wpforms-lite' ), + 'emptyStateTitle' => esc_html__( 'Build Your Form Fast With the Help of AI', 'wpforms-lite' ), + 'emptyStateDesc' => esc_html__( 'Not sure where to begin? Use our Generative AI tool to get started or take your pick from our wide variety of fields and start building out your form!', 'wpforms-lite' ), + 'submitButton' => esc_html__( 'Submit', 'wpforms-lite' ), + 'tooltipTitle' => esc_html__( 'This is just a preview of your form.', 'wpforms-lite' ), + 'tooltipText' => esc_html__( 'Click "Use This Form" to start editing.', 'wpforms-lite' ), + ], + 'addons' => [ + 'installTitle' => esc_html__( 'Before We Proceed', 'wpforms-lite' ), + 'installContent' => esc_html__( 'In order to build the best forms possible, we need to install some addons. Would you like to install the recommended addons?', 'wpforms-lite' ), + 'activateContent' => esc_html__( 'In order to build the best forms possible, we need to activate some addons. Would you like to activate the recommended addons?', 'wpforms-lite' ), + 'installConfirmButton' => esc_html__( 'Yes, Install', 'wpforms-lite' ), + 'activateConfirmButton' => esc_html__( 'Yes, Activate', 'wpforms-lite' ), + 'cancelButton' => esc_html__( 'No, Thanks', 'wpforms-lite' ), + 'dontShow' => esc_html__( 'Don\'t show this again', 'wpforms-lite' ), + 'okay' => esc_html__( 'Okay', 'wpforms-lite' ), + 'installing' => esc_html__( 'Installing...', 'wpforms-lite' ), + 'activating' => esc_html__( 'Activating...', 'wpforms-lite' ), + 'addonsInstalledTitle' => esc_html__( 'Addons Installed', 'wpforms-lite' ), + 'addonsActivatedTitle' => esc_html__( 'Addons Activated', 'wpforms-lite' ), + 'addonsInstalledContent' => esc_html__( 'You’re all set. We’re going to reload the builder and you can start building your form.', 'wpforms-lite' ), + 'addonsInstallErrorTitle' => esc_html__( 'Addons Installation Error', 'wpforms-lite' ), + 'addonsActivateErrorTitle' => esc_html__( 'Addons Activation Error', 'wpforms-lite' ), + 'addonsInstallError' => esc_html__( 'Can\'t install or activate the required addons.', 'wpforms-lite' ), + 'addonsInstallErrorNetwork' => esc_html__( 'There appears to be a network error.', 'wpforms-lite' ), + 'dismissErrorTitle' => esc_html__( 'Error', 'wpforms-lite' ), + 'dismissError' => esc_html__( 'Can\'t dismiss the modal window.', 'wpforms-lite' ), + 'addon' => esc_html__( 'Addon', 'wpforms-lite' ), + 'and' => esc_html__( 'and', 'wpforms-lite' ), + ], + 'previewNotice' => [ + 'title' => esc_html__( 'This Form Would Be Even Better With Fields From', 'wpforms-lite' ), + 'msgUpgrade' => wp_kses( /* translators: %1$s - Upgrade to Pro link attributes. */ + __( 'Upgrade to Pro and gain access to all fields and create the best possible forms.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + ], + ] + ), + 'btnUpgrade' => esc_html__( 'Upgrade to Pro', 'wpforms-lite' ), + 'addons' => esc_html__( 'Addons', 'wpforms-lite' ), + 'dismiss' => esc_html__( 'Dismiss this notice', 'wpforms-lite' ), + ], + 'misc' => [ + 'warningExistingForm' => esc_html__( 'You’re about to overwrite your existing form. This will delete all fields and reset external connections. Are you sure you want to continue?', 'wpforms-lite' ), + 'frozenChallengeTooltip' => esc_html__( 'The challenge will continue once AI form generation is complete', 'wpforms-lite' ), + ], + ]; + } + + /** + * Add chat element localize data. + * + * @since 1.9.2 + * + * @param array $strings Strings. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection HtmlUnknownTarget + */ + public function add_localize_chat_data( $strings ): array { + + $for_lite = wpforms()->is_pro() ? '' : ' for Lite'; + + $strings['forms'] = [ + 'title' => esc_html__( 'Generate a Form', 'wpforms-lite' ), + 'description' => esc_html__( 'Describe the form you would like to create or use one of the example prompts below to get started.', 'wpforms-lite' ), + 'descrEndDot' => '', + 'learnMore' => esc_html__( 'Learn More About WPForms AI', 'wpforms-lite' ), + 'learnMoreUrl' => wpforms_utm_link( 'https://wpforms.com/features/wpforms-ai/', 'Builder - Settings', 'Learn more - AI Forms' . $for_lite ), + 'inactiveAnswerTitle' => esc_html__( 'Go back to this version of the form', 'wpforms-lite' ), + 'useForm' => esc_html__( 'Use This Form', 'wpforms-lite' ), + 'placeholder' => esc_html__( 'What would you like to create?', 'wpforms-lite' ), + 'waiting' => esc_html__( 'Just a minute...', 'wpforms-lite' ), + 'errors' => [ + 'default' => esc_html__( 'An error occurred while generating form.', 'wpforms-lite' ), + 'rate_limit' => esc_html__( 'Sorry, you\'ve reached your daily limit for generating forms.', 'wpforms-lite' ), + ], + 'footer' => [ + esc_html__( 'What do you think of the form I created for you? If you’re happy with it, you can use this form. Otherwise, make changes by entering additional prompts.', 'wpforms-lite' ), + esc_html__( 'How’s that? Are you ready to use this form?', 'wpforms-lite' ), + esc_html__( 'Does this look good? Are you ready to implement this form?', 'wpforms-lite' ), + esc_html__( 'Is this what you had in mind? Are you satisfied with the results?', 'wpforms-lite' ), + esc_html__( 'Happy with the form? Ready to move forward?', 'wpforms-lite' ), + esc_html__( 'Is this form a good fit for your needs? Can we proceed?', 'wpforms-lite' ), + esc_html__( 'Are you pleased with the outcome? Ready to use this form?', 'wpforms-lite' ), + esc_html__( 'Does this form meet your expectations? Can we move on to the next step?', 'wpforms-lite' ), + esc_html__( 'Is this form what you were envisioning? Are you ready to use it?', 'wpforms-lite' ), + esc_html__( 'Satisfied with the form? Let\'s use it!', 'wpforms-lite' ), + esc_html__( 'Does this form align with your goals? Are you ready to implement it?', 'wpforms-lite' ), + esc_html__( 'Happy with the results? Let\'s put this form to work!', 'wpforms-lite' ), + ], + 'reasons' => [ + 'default' => sprintf( + wp_kses( /* translators: %1$s - Reload link class. */ + __( 'Reload this window and try again.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'class' => [], + ], + ] + ), + 'wpforms-ai-chat-reload-link' + ), + 'rate_limit' => sprintf( + wp_kses( /* translators: %s - WPForms contact support link. */ + __( 'You may only generate forms 50 times per day. If you believe this is an error, please contact WPForms support.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + wpforms_utm_link( 'https://wpforms.com/account/support/', 'AI Feature' ) + ), + ], + 'samplePrompts' => [ + [ + 'icon' => 'wpforms-ai-chat-sample-restaurant', + 'title' => esc_html__( 'restaurant customer satisfaction survey', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-sample-ticket', + 'title' => esc_html__( 'online event registration', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-sample-design', + 'title' => esc_html__( 'job application for a web designer', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-sample-stop', + 'title' => esc_html__( 'cancelation survey for a subscription', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-sample-pizza', + 'title' => esc_html__( 'takeout order for a pizza store', 'wpforms-lite' ), + ], + [ + 'icon' => 'wpforms-ai-chat-sample-market', + 'title' => esc_html__( 'market vendor application', 'wpforms-lite' ), + ], + ], + ]; + + $user_id = get_current_user_id(); + + // Get the chat session stored in user meta. + // phpcs:disable WordPress.Security.NonceVerification.Recommended + if ( ! empty( $_GET['session'] ) ) { + $session_id = sanitize_text_field( wp_unslash( $_GET['session'] ) ); + $meta = get_user_meta( $user_id, 'wpforms_builder_ai_form_chat_' . $session_id, true ); + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + // If we have the meta-data, add it to the strings. + if ( ! empty( $meta ) ) { + // Remove user meta after using it. + delete_user_meta( $user_id, 'wpforms_builder_ai_form_chat_' . ( $session_id ?? '' ) ); + + $strings['forms']['chatHtml'] = $meta['chatHtml']; + $strings['forms']['responseHistory'] = $meta['responseHistory']; + } + + return $strings; + } + + /** + * Get required addons' data. + * + * @since 1.9.2 + * + * @return array + */ + private function get_required_addons_data(): array { + + // The addon installation procedure has floating issues in PHP < 7.4. + // It's better to skip the installation in this case to avoid addon installation errors. + if ( PHP_VERSION_ID < 70400 ) { + return []; + } + + $addons_obj = wpforms()->obj( 'addons' ); + + if ( ! $addons_obj ) { + return []; + } + + $data = []; + + // Get the URLs for the required addons. + foreach ( FormsAjax::FORM_GENERATOR_REQUIRED_ADDONS as $slug ) { + $addon = $addons_obj->get_addon( $slug ); + + if ( + empty( $addon ) || // Exceptional case when `addons.json` is not loaded. + + // This means that addon is already installed and active. + ( isset( $addon['status'] ) && $addon['status'] === 'active' ) || + + // This means that addon is not available in the current license. + // We should skip in this case as it is impossible to install or activate the addon. + ( isset( $addon['action'] ) && $addon['action'] === 'upgrade' ) + ) { + continue; + } + + $data[ $slug ] = [ + 'url' => $addon['url'] ?? '', + 'path' => $addon['path'] ?? '', + ]; + } + + return $data; + } + + /** + * Get required addons action. + * + * @since 1.9.2 + * + * @param array $addons_data Addons data. + * + * @return string + */ + private function get_required_addons_action( array $addons_data ): string { + + if ( empty( $addons_data ) ) { + return ''; + } + + foreach ( $addons_data as $data ) { + if ( ! empty( $data['url'] ) ) { + return 'install'; + } + } + + return 'activate'; + } + + /** + * Get dismissed elements data. + * + * @since 1.9.2 + * + * @return array + */ + private function get_dismissed_elements(): array { + + $user_id = get_current_user_id(); + + // Dismissed elements. + $dismissed = get_user_meta( $user_id, 'wpforms_dismissed', true ); + + return [ + 'installAddons' => ! empty( $dismissed['edu-ai-forms-install-addons-modal'] ), + 'previewNotice' => ! empty( $dismissed['edu-ai-forms-preview-addons-notice'] ), + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Pages/Templates.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Pages/Templates.php new file mode 100755 index 00000000..a8dfb110 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Pages/Templates.php @@ -0,0 +1,105 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.2 + */ + private function hooks(): void { + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); + add_action( 'wpforms_admin_form_templates_list_before', [ $this, 'output_card' ] ); + } + + /** + * Enqueue styles and scripts. + * + * @since 1.9.2 + */ + public function enqueues(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-ai-forms-admin', + WPFORMS_PLUGIN_URL . "assets/css/integrations/ai/form-templates-page$min.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Output Generate with AI card. + * + * @since 1.9.3 + * + * @noinspection HtmlUnknownTarget + * @noinspection HtmlUnknownAttribute + */ + public function output_card(): void { + + $button_class = 'wpforms-template-generate'; + $button_attr = ''; + + // In Lite, we should disable the button in the case Lite Connect is not allowed. + if ( ! LiteConnect::is_allowed() && ! wpforms()->is_pro() ) { + $button_class .= ' wpforms-inactive wpforms-help-tooltip'; + $button_attr = sprintf( + 'data-tooltip-position="top" title="%1$s"', + esc_html__( 'WPForms AI is not available on local sites.', 'wpforms-lite' ) + ); + } + + printf( + '
              +
              +
              + %2$s +
              +
              +
              +

              + %2$s +

              + %3$s +
              +

              + %4$s +

              + +
              ', + esc_url( WPFORMS_PLUGIN_URL ) . 'assets/images/integrations/ai/ai-feature-icon.svg', + esc_html__( 'Generate With AI', 'wpforms-lite' ), + esc_html__( 'NEW!', 'wpforms-lite' ), + esc_html__( 'Write simple prompts to create complex forms catered to your specific needs.', 'wpforms-lite' ), + esc_attr( $button_class ), + $button_attr, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + esc_html__( 'Generate Form', 'wpforms-lite' ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Settings.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Settings.php new file mode 100755 index 00000000..3c3ec9bd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Admin/Settings.php @@ -0,0 +1,71 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.1 + */ + private function hooks() { + + add_filter( 'wpforms_settings_defaults', [ $this, 'register_settings' ] ); + } + + /** + * Add toggle to the Settings > Misc admin page. + * + * @since 1.9.1 + * + * @param array|mixed $settings WPForms settings. + * + * @return array + */ + public function register_settings( $settings ): array { + + $settings = (array) $settings; + + $ai_settings = [ + 'id' => Helpers::DISABLE_KEY, + 'name' => esc_html__( 'Hide AI Features', 'wpforms-lite' ), + 'desc' => esc_html__( 'Hide everything related to AI in WPForms.', 'wpforms-lite' ), + 'type' => 'toggle', + 'status' => true, + 'value' => Helpers::is_disabled(), + 'disabled' => Helpers::is_disabled_by_rule(), + ]; + + if ( $ai_settings['disabled'] ) { + $ai_settings['disabled_desc'] = wp_kses( + __( 'AI features were hidden by filter or constant.', 'wpforms-lite' ), // phpcs:ignore WordPress.WP.I18n.NoHtmlWrappedStrings + [ + 'strong' => [], + ] + ); + } + + // Add after the "Hide Admin Bar Menu" toggle. + $settings['misc'] = wpforms_array_insert( $settings['misc'], [ Helpers::DISABLE_KEY => $ai_settings ], 'hide-admin-bar' ); + + return $settings; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/AI/Helpers.php b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Helpers.php new file mode 100755 index 00000000..8c63da3f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/AI/Helpers.php @@ -0,0 +1,145 @@ + Misc admin page. + * + * @since 1.9.1 + */ + public const DISABLE_KEY = 'ai-feature-disabled'; + + /** + * Key for a state whether integration is used (or has been used). + * There is no UI/UX for it, and it's used for internal purposes. + * + * @since 1.9.1 + */ + private const USE_KEY = 'ai-feature-used'; + + /** + * Determine whether integration is disabled. + * + * @since 1.9.1 + * + * @return bool + */ + public static function is_disabled(): bool { + + return self::is_disabled_by_rule() || wpforms_setting( self::DISABLE_KEY ); + } + + /** + * Determine whether integration is used. + * + * @since 1.9.1 + * + * @return bool + */ + public static function is_used(): bool { + + return (bool) wpforms_setting( self::USE_KEY ); + } + + /** + * Mark integration as used. + * + * @since 1.9.1 + */ + public static function set_ai_used() { + + if ( self::is_used() ) { + return; + } + + $settings = (array) get_option( 'wpforms_settings', [] ); + + $settings[ self::USE_KEY ] = true; + + update_option( 'wpforms_settings', $settings ); + } + + /** + * Determine whether integration is disabled through constant or filter. + * + * @since 1.9.1 + * + * @return bool + * @noinspection PhpUndefinedConstantInspection + */ + public static function is_disabled_by_rule(): bool { + + $is_disabled = defined( 'WPFORMS_DISABLE_AI_FEATURES' ) && WPFORMS_DISABLE_AI_FEATURES; + + /** + * Allow modifying whether AI integration is disabled in WPForms. + * + * @since 1.9.1 + * + * @param bool $is_disabled True if AI integration is disabled. Default is false. + */ + return (bool) apply_filters( 'wpforms_disable_ai_features', $is_disabled ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Log an error record. + * + * @since 1.9.1 + * + * @param string $message Error message. + * @param string $endpoint Endpoint. + * @param array $args Arguments. + */ + public static function log_error( string $message, string $endpoint, array $args ) { + + wpforms_log( + 'AI Integration Error', + [ + 'error' => $message, + 'endpoint' => $endpoint, + 'args' => $args, + ], + [ + 'type' => [ 'ai', 'error' ], + ] + ); + } + + /** + * Get the license type. + * + * @since 1.9.4 + * + * @return string + */ + public static function get_license_type(): string { + + $license = (array) get_option( 'wpforms_license', [] ); + + return $license['type'] ?? ''; + } + + /** + * Determine whether a license key is active. + * + * @since 1.9.4 + * + * @return bool + */ + public static function is_license_active(): bool { + + $license = (array) get_option( 'wpforms_license', [] ); + + return ! empty( wpforms_get_license_key() ) && + empty( $license['is_expired'] ) && + empty( $license['is_disabled'] ) && + empty( $license['is_invalid'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Api.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Api.php new file mode 100755 index 00000000..75c1d366 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Api.php @@ -0,0 +1,445 @@ +account = $account; + + $this->refresh_access_token(); + + $this->request = new Request( $this->account['access_token'] ); + } + + /** + * Get custom fields in a specific format based on provided arguments. + * + * @since 1.9.3 + * + * @param string|null $field The field to extract from each custom field. If null, returns all custom fields. + * @param string|null $index_key The key to index the returned array by. If null, returns a numerically indexed array. + * + * @return array + */ + public function get_custom_fields( ?string $field = null, ?string $index_key = null ): array { + + $custom_fields = $this->request->get( 'v3/contact_custom_fields', [ 'limit' => 100 ] ); + $custom_fields = $custom_fields->get_body(); + + if ( empty( $custom_fields['custom_fields'] ) || ! is_array( $custom_fields['custom_fields'] ) ) { + return []; + } + + $custom_fields = $custom_fields['custom_fields']; + + if ( is_null( $field ) ) { + return $custom_fields; + } + + // Return plucked fields based on provided arguments. + + return wp_list_pluck( $custom_fields, $field, $index_key ); + } + + /** + * Register a custom field. + * + * @since 1.9.3 + * + * @param string $name Name of the custom field. + * + * @return string + */ + public function register_custom_field( string $name ): string { + + $body = [ + 'label' => $name, + 'type' => 'string', + ]; + + $response = $this->request->post( 'v3/contact_custom_fields', $body ); + + return $response->get_body()['custom_field_id'] ?? ''; + } + + /** + * Get account summary. + * + * @since 1.9.3 + * + * @return array + * + * @throws RuntimeException A request was failed. + */ + public function get_account_summary(): array { + + $response = $this->request->get( 'v3/account/summary' ); + + if ( $response->has_errors() ) { + throw new RuntimeException( esc_html( $response::get_error_message() ) ); + } + + return $response->get_body(); + } + + /** + * Search contact. + * + * @since 1.9.3 + * + * @param array $contact_data Contact data. + * + * @return array Contact data array. + * + * @throws RuntimeException A request was failed. + */ + private function search_contact( array $contact_data ): array { + + $this->validate_contact_email( $contact_data ); + + $args = [ + 'limit' => 1, + 'email' => $contact_data['email_address'], + ]; + + $response = $this->request->get( 'v3/contacts', $args ); + + $body = $response->get_body(); + + if ( empty( $body['contacts'][0] ) || ! is_array( $body['contacts'][0] ) ) { + throw new RuntimeException( 'Contact not found.' ); + } + + return $body['contacts'][0]; + } + + /** + * Create or update contact. + * + * @since 1.9.3 + * + * @param array $contact_data Contact data. + * + * @return array + * + * @throws RuntimeException A request was failed. + */ + public function subscribe_contact( array $contact_data ): array { + + $this->validate_subscribe_contact( $contact_data ); + + $response = $this->request->post( 'v3/contacts/sign_up_form', $contact_data ); + + $body = $response->get_body(); + + if ( $response->has_errors() ) { + throw new RuntimeException( esc_html( $response::get_error_message() ) ); + } + + if ( empty( $body['contact_id'] ) || empty( $body['action'] ) ) { + throw new RuntimeException( 'Account was not created.' ); + } + + return $body; + } + + /** + * Validate fields for subscribing action. + * + * @since 1.9.3 + * + * @param array $contact_data Contact data. + * + * @throws InvalidArgumentException If the email address is empty. + */ + private function validate_subscribe_contact( array $contact_data ) { + + $this->validate_contact_email( $contact_data ); + + foreach ( [ 'first_name', 'last_name', 'job_title', 'company_name', 'phone_number' ] as $key ) { + if ( isset( $contact_data[ $key ] ) && ! is_string( $contact_data[ $key ] ) ) { + throw new InvalidArgumentException( sprintf( 'The "%s" argument should be a string.', esc_html( $key ) ) ); + } + } + + if ( isset( $contact_data['street_address'] ) ) { + foreach ( (array) $contact_data['street_address'] as $key => $value ) { + if ( ! is_string( $value ) ) { + throw new InvalidArgumentException( sprintf( 'The "%s" argument should be a string.', esc_html( $key ) ) ); + } + } + } + } + + /** + * Validate contact email. + * + * @since 1.9.3 + * + * @param array $contact_data Contact data. + * + * @throws InvalidArgumentException If the email address is empty. + */ + private function validate_contact_email( array $contact_data ) { + + if ( empty( $contact_data['email_address'] ) || ! is_email( $contact_data['email_address'] ) ) { + throw new InvalidArgumentException( 'Email address is required.' ); + } + } + + /** + * Delete contact. + * + * @since 1.9.3 + * + * @param array $contact_data Contact data. + * + * @return array Array with contact ID and action, empty array if no contact was found. + * + * @throws RuntimeException A request was failed. + */ + public function delete_contact( array $contact_data ): array { + + $contact = $this->search_contact( $contact_data ); + + if ( empty( $contact['contact_id'] ) ) { + throw new RuntimeException( 'Contact not found.' ); + } + + $endpoint = 'v3/contacts/' . $contact['contact_id']; + $response = $this->request->delete( $endpoint ); + + if ( $response->has_errors() ) { + throw new RuntimeException( esc_html( $response::get_error_message() ) ); + } + + return [ + 'contact_id' => $contact['contact_id'], + 'action' => 'delete', + 'response' => $response->get_body(), + ]; + } + + /** + * Unsubscribe contact. + * + * @since 1.9.3 + * + * @param array $contact_data Contact data. + * + * @return array + * + * @throws InvalidArgumentException If some arguments are used wrong. + * @throws RuntimeException A request was failed. + */ + public function unsubscribe_contact( array $contact_data ): array { + + if ( isset( $contact_data['opt_out_reason'] ) && ! is_string( $contact_data['opt_out_reason'] ) ) { + throw new InvalidArgumentException( sprintf( 'The "%s" argument should be a string.', 'opt_out_reason' ) ); + } + + $contact = $this->search_contact( $contact_data ); + + if ( empty( $contact['contact_id'] ) ) { + throw new RuntimeException( 'Contact not found.' ); + } + + $request_data = wp_parse_args( + $contact, + [ + 'first_name' => '', + 'last_name' => '', + 'company_name' => '', + 'job_title' => '', + 'street_address' => '', + ] + ); + + $request_data['email_address'] = [ + 'address' => $contact['email_address']['address'] ?? '', + 'permission_to_send' => 'unsubscribed', + 'opt_out_reason' => $contact_data['opt_out_reason'] ?? '', + ]; + + $request_data['update_source'] = 'Contact'; + + $response = $this->request->put( "v3/contacts/{$contact['contact_id']}", $request_data ); + + if ( $response->has_errors() ) { + throw new RuntimeException( esc_html( $response::get_error_message() ) ); + } + + return [ + 'contact_id' => $contact['contact_id'], + 'action' => 'unsubscribe', + 'response' => $response->get_body(), + ]; + } + + /** + * Check if the access token is expired. + * + * @since 1.9.3 + * + * @return bool + */ + private function is_expired_token(): bool { + + $expires_in = $this->account['expires_in'] ?? 0; + + /** + * Adding one minute to cover a very rare case when a few seconds are left, + * and the site runs multiple API requests. + * The last one could be outdated. + */ + return ( time() + MINUTE_IN_SECONDS ) > $expires_in; + } + + /** + * Refresh access token. + * + * @since 1.9.3 + * + * @throws InvalidArgumentException If the token cannot be refreshed. + */ + private function refresh_access_token() { + + if ( ! $this->is_expired_token() ) { + return; + } + + $response = wp_safe_remote_get( + add_query_arg( + [ + 'api-version' => 'v3', + 'refresh_token' => $this->account['refresh_token'], + ], + ConstantContact::get_middleware_url() + ) + ); + + $response_body = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( empty( $response_body['access_token'] ) ) { + throw new InvalidArgumentException( esc_html__( 'Cannot refresh the token.', 'wpforms-lite' ) ); + } + + $this->account = array_merge( + $this->account, + [ + 'access_token' => $response_body['access_token'], + 'refresh_token' => $response_body['refresh_token'] ?? '', + 'expires_in' => time() + (int) ( $response_body['expires_in'] ?? 0 ), + ] + ); + + wpforms_update_providers_options( Core::SLUG, $this->account, $this->account['id'] ); + } + + /** + * Get a contact list. + * + * @since 1.9.3 + * + * @return array + */ + public function get_contact_list(): array { + + $response = $this->request->get( 'v3/contact_lists', [ 'limit' => 1000 ] ); + + $body = $response->get_body(); + + $lists = $body['lists'] ?? []; + + // Replace in lists key list_id with id. + return array_map( + static function ( $contact_list ) { + + return [ + 'id' => $contact_list['list_id'] ?? '', + 'label' => $contact_list['name'] ?? '', + ]; + }, + $lists + ); + } + + /** + * Get list ids in v2 to v3 format. + * + * @since 1.9.3 + * + * @param array $lists List received from Constant Contact v2. + * + * @return array + */ + public function get_contact_list_xrefs( array $lists ): array { + + $ids = implode( ',', wp_list_pluck( $lists, 'id' ) ); + $response = $this->request->get( + 'v3/contact_lists/list_id_xrefs', + [ + 'sequence_ids' => $ids, + 'limit' => 1000, + ] + ); + + $body = $response->get_body(); + + $lists = $body['xrefs'] ?? []; + + return wp_list_pluck( $lists, 'list_id', 'sequence_id' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Request.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Request.php new file mode 100755 index 00000000..db65eb78 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Request.php @@ -0,0 +1,157 @@ +access_token = $access_token; + $this->base_url = ConstantContact::get_api_url(); + } + + /** + * Perform a request. + * + * @since 1.9.3 + * + * @param string $method Method. + * @param string $endpoint Endpoint to attach to the base URL. + * @param array $args Submitted arguments. + * + * @return Response + */ + private function request( string $method, string $endpoint, array $args = [] ): Response { + + $request_args = [ + 'method' => $method, + 'timeout' => 5, + 'headers' => $this->get_headers(), + ]; + + if ( $args ) { + $request_args['body'] = wp_json_encode( $args ); + } + + /** + * Allow modifying the HTTP request arguments. + * + * @since 1.9.3 + * + * @param array $args List of request arguments. + */ + $request_args = (array) apply_filters( 'wpforms_integrations_constant_contact_v3_api_http_request_args', $request_args ); + + $response = wp_remote_request( $this->base_url . $endpoint, $request_args ); + + return new Response( $response ); + } + + /** + * GET request. + * + * @since 1.9.3 + * + * @param string $endpoint Endpoint to attach to the base URL. + * @param array $args Query arguments. + * + * @return Response + */ + public function get( string $endpoint, array $args = [] ): Response { + + $endpoint = add_query_arg( $args, $endpoint ); + + return $this->request( 'GET', $endpoint ); + } + + /** + * POST request. + * + * @since 1.9.3 + * + * @param string $endpoint Endpoint to attach to the base URL. + * @param array $args Submitted arguments. + * + * @return Response + */ + public function post( string $endpoint, array $args = [] ): Response { + + return $this->request( 'POST', $endpoint, $args ); + } + + /** + * Send DELETE request. + * + * @since 1.9.3 + * + * @param string $endpoint Endpoint. + * + * @return Response + */ + public function delete( string $endpoint ): Response { + + return $this->request( 'DELETE', $endpoint ); + } + + /** + * PUT request. + * + * @since 1.9.3 + * + * @param string $endpoint Endpoint. + * @param array $args Submitted arguments. + * + * @return Response + */ + public function put( string $endpoint, array $args = [] ): Response { + + return $this->request( 'PUT', $endpoint, $args ); + } + + /** + * Get headers. + * + * @since 1.9.3 + * + * @return array + */ + private function get_headers(): array { + + return [ + 'Authorization' => 'Bearer ' . $this->access_token, + 'Content-Type' => 'application/json', + ]; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Response.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Response.php new file mode 100755 index 00000000..a9f6f56d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Api/Http/Response.php @@ -0,0 +1,158 @@ +input = $input; + self::$error = $this->has_errors() ? $this->get_error_from_body() : ''; + } + + /** + * Get an error message. + * + * @since 1.9.3 + * + * @return string + */ + public static function get_error_message(): string { + + return self::$error; + } + + /** + * Retrieve only the response code from the raw response. + * + * @since 1.9.3 + * + * @return int The response code as an integer. + */ + public function get_response_code(): int { + + return absint( wp_remote_retrieve_response_code( $this->input ) ); + } + + /** + * Retrieve only the response message from the raw response. + * + * @since 1.9.3 + * + * @return string The response message. + */ + public function get_response_message(): string { + + if ( $this->has_errors() ) { + return 'Response error'; + } + + $body = $this->get_body(); + + if ( ! empty( $body['message'] ) ) { + return $body['message']; + } + + return wp_remote_retrieve_response_message( $this->input ); + } + + /** + * Retrieve only the body from the raw response. + * + * @since 1.9.3 + * + * @throws RuntimeException If the response has errors. + * + * @return array The body of the response. + */ + public function get_body(): array { + + if ( $this->has_errors() ) { + $error = $this->get_error_from_body(); + + throw new RuntimeException( esc_html( $error ) ); + } + + return (array) json_decode( wp_remote_retrieve_body( $this->input ), true ); + } + + /** + * Whether we received errors in the response. + * + * @since 1.9.3 + * + * @return bool True if response has errors. + */ + public function has_errors(): bool { + + $code = $this->get_response_code(); + + return $code < 200 || $code > 299; + } + + /** + * Get an error message from the body. + * + * @since 1.9.3 + * + * @return string + */ + private function get_error_from_body(): string { + + if ( ! $this->has_errors() ) { + return ''; + } + + $body = json_decode( wp_remote_retrieve_body( $this->input ), true ); + + if ( isset( $body['error_message'] ) ) { + return $body['error_message']; + } + + $messages = []; + + foreach ( $body as $id => $value ) { + $messages[] = $value['error_message'] ?? ''; + + if ( $id === 'message' ) { + $messages[] = $value; + } + } + + return implode( ', ', $messages ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Auth.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Auth.php new file mode 100755 index 00000000..5420d4c2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Auth.php @@ -0,0 +1,259 @@ + self::get_auth_url(), + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'page_url' => $this->get_page_url(), + 'nonce' => wp_create_nonce( self::NONCE ), + 'strings' => [ + 'wait' => esc_html__( 'Please wait a moment...', 'wpforms-lite' ), + 'error' => esc_html__( 'There was an error while processing your request. Please try again.', 'wpforms-lite' ), + ], + ] + ); + } + + /** + * Handle Auth popup. + * + * @since 1.9.3 + */ + public function ajax_handle_auth() { + + try { + if ( ! wpforms_current_user_can() ) { + wp_send_json_error( esc_html__( 'You do not have permission to perform this action.', 'wpforms-lite' ) ); + } + + $account = $this->create_account(); + + $this->validate_account( $account ); + + wpforms_update_providers_options( Core::SLUG, $account, $account['id'] ); + + wp_send_json_success( $account['id'] ); + } catch ( Exception $e ) { + wp_send_json_error( $e->getMessage() ); + } + } + + /** + * Receive and validate access and refresh tokens. + * + * @since 1.9.3 + * + * @return array + * + * @throws RuntimeException Invalid code. + */ + private function get_code(): array { + + check_ajax_referer( self::NONCE, 'nonce' ); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $response = json_decode( wp_unslash( $_POST['data'] ?? '' ), true ); + $invalid_code_message = __( 'Invalid code.', 'wpforms-lite' ); + + if ( empty( $response ) || empty( $response['code'] ) ) { + throw new RuntimeException( esc_html( $invalid_code_message ) ); + } + + $code = json_decode( $response['code'], true ); + + if ( empty( $code['access_token'] ) ) { + throw new RuntimeException( esc_html( $invalid_code_message ) ); + } + + return $code; + } + + /** + * Validate account. + * + * @since 1.9.3 + * + * @param array $account Account data. + * + * @throws RuntimeException Invalid account. + */ + private function validate_account( array $account ) { + + if ( empty( $account['email'] ) ) { + throw new RuntimeException( esc_html__( 'Invalid account.', 'wpforms-lite' ) ); + } + + $accounts = wpforms_get_providers_options( Core::SLUG ); + + if ( empty( $accounts ) ) { + return; + } + + $emails = wp_list_pluck( $accounts, 'id', 'email' ); + + if ( + isset( $emails[ $account['email'] ] ) + && $emails[ $account['email'] ] !== $account['id'] + ) { + throw new RuntimeException( esc_html__( 'This email is already connected.', 'wpforms-lite' ) ); + } + } + + /** + * Build an option array. + * + * @since 1.9.3 + * + * @return array + * @noinspection NonSecureUniqidUsageInspection + */ + private function create_account(): array { + + $code = $this->get_code(); + $time = time(); + + $account = [ + 'id' => uniqid(), + 'date' => $time, + 'access_token' => $code['access_token'], + 'refresh_token' => $code['refresh_token'] ?? '', + 'expires_in' => $time + (int) ( $code['expires_in'] ?? 0 ), + ]; + + $account_summary = ( new Api( $account ) )->get_account_summary(); + + $account['email'] = $account_summary['contact_email'] ?? ''; + $account['label'] = $this->get_label( $account_summary ); + + /** + * Filters the account data after it was created. + * + * @since 1.9.3 + * + * @param array $account Account data. + */ + return (array) apply_filters( 'wpforms_integrations_constant_contact_v3_auth_create_account_data', $account ); + } + + /** + * Get APP data needed for auth in the sing-up popup. + * + * @since 1.9.3 + * + * @return string + */ + public static function get_auth_url(): string { + + return add_query_arg( + [ + 'client_id' => ConstantContact::get_api_key(), + 'scope' => 'offline_access account_read contact_data', + 'redirect_uri' => add_query_arg( 'api-version', 'v3', ConstantContact::get_middleware_url() ), + 'state' => 'WPForms-' . wp_rand( 1000, 9999 ), + 'response_type' => 'code', + 'prompt' => 'login', + ], + ConstantContact::SIGN_UP + ); + } + + /** + * Get label. + * + * @since 1.9.3 + * + * @param array $account_summary Account summary. + * + * @return string + */ + private function get_label( array $account_summary ): string { + + $email_part = $account_summary['contact_email'] ?? ''; + $org_part = $account_summary['organization_name'] ?? ''; + + if ( empty( $email_part ) && empty( $org_part ) ) { + return ''; + } + + if ( empty( $email_part ) ) { + return $org_part; + } + + if ( empty( $org_part ) ) { + return $email_part; + } + + return "$email_part / $org_part"; + } + + /** + * Get the URL to the providers' page with the focus on the CC v3 integration. + * + * @since 1.9.3 + * + * @return string + */ + private function get_page_url(): string { + + return add_query_arg( + [ + 'page' => 'wpforms-settings', + 'view' => 'integrations', + 'wpforms-integration' => Core::SLUG, + ], + admin_url( 'admin.php' ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/ConstantContact.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/ConstantContact.php new file mode 100755 index 00000000..fb10f4a7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/ConstantContact.php @@ -0,0 +1,169 @@ +init(); + ( new Auth() )->hooks(); + + if ( + self::get_current_version() !== 3 && + empty( wpforms_get_providers_options( Core::SLUG ) ) + ) { + return; + } + + Providers::get_instance()->register( + Core::get_instance() + ); + } + + /** + * Return an actual working constant contact version. + * By default, it is 2. + * + * @since 1.9.3 + * + * @return int + */ + public static function get_current_version(): int { + + $current_version = get_option( self::VERSION_OPTION, false ); + + if ( $current_version !== false ) { + return (int) $current_version; + } + + $current_version = empty( wpforms_get_providers_options( 'constant-contact' ) ) ? 3 : 2; + + update_option( self::VERSION_OPTION, $current_version ); + + return $current_version; + } + + /** + * Get the API key. + * + * @since 1.9.3 + * + * @return string + */ + public static function get_api_key(): string { + + return defined( 'WPFORMS_CONSTANT_CONTACT_API_KEY' ) + ? (string) WPFORMS_CONSTANT_CONTACT_API_KEY + : self::API_KEY; + } + + /** + * Get the API URL. + * + * @since 1.9.3 + * + * @return string + */ + public static function get_api_url(): string { + + return self::API_URL; + } + + /** + * Get the redirect URI. + * + * @since 1.9.3 + * + * @return string + */ + public static function get_middleware_url(): string { + + return defined( 'WPFORMS_CONSTANT_CONTACT_MIDDLEWARE_URL' ) && WPFORMS_CONSTANT_CONTACT_MIDDLEWARE_URL + ? WPFORMS_CONSTANT_CONTACT_MIDDLEWARE_URL + : 'https://wpforms.com/oauth/constant-contact/'; + } + + /** + * Get the list of predefined custom fields. + * + * @since 1.9.3 + * + * @return array + */ + public static function get_predefined_custom_fields(): array { + + $fields = [ + 'first_name' => __( 'First Name', 'wpforms-lite' ), + 'last_name' => __( 'Last Name', 'wpforms-lite' ), + 'phone' => __( 'Phone', 'wpforms-lite' ), + 'job_title' => __( 'Job Title', 'wpforms-lite' ), + 'company_name' => __( 'Company Name', 'wpforms-lite' ), + ]; + + if ( wpforms()->is_pro() ) { + $fields['address'] = __( 'Address', 'wpforms-lite' ); + } + + return $fields; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Core.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Core.php new file mode 100755 index 00000000..98c2489b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Core.php @@ -0,0 +1,126 @@ + self::SLUG, + 'name' => $this->get_name(), + 'icon' => WPFORMS_PLUGIN_URL . 'assets/images/icon-provider-constant-contact.png', + ] + ); + } + + /** + * Provide an instance of the object, that should process the submitted entry. + * It will use data from an already saved entry to pass it further to a Provider. + * + * @since 1.9.3 + * + * @return Process + */ + public function get_process(): Process { + + static $process; + + if ( ! $process ) { + $process = new Process( $this ); + } + + return $process; + } + + /** + * Provide an instance of the object, that should display provider settings + * on Settings > Integrations page in the admin area. + * + * @since 1.9.3 + * + * @return PageIntegrations + */ + public function get_page_integrations(): PageIntegrations { + + static $integration; + + if ( ! $integration ) { + $integration = new PageIntegrations( static::get_instance() ); + } + + return $integration; + } + + /** + * Provide an instance of the object, that should display provider settings in the Form Builder. + * + * @since 1.9.3 + * + * @return FormBuilder + */ + public function get_form_builder(): FormBuilder { + + static $builder; + + if ( ! $builder ) { + $builder = new FormBuilder( $this ); + } + + return $builder; + } + + /** + * Provider account name. + * + * Adds "(V3)" to the name if WPFORMS_DEBUG is defined. + * + * @since 1.9.3 + * + * @return string + */ + private function get_name(): string { + + $base = 'Constant Contact'; + + if ( ! defined( 'WPFORMS_DEBUG' ) || ! WPFORMS_DEBUG ) { + return $base; + } + + return $base . ' (V3)'; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Migration/Migration.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Migration/Migration.php new file mode 100755 index 00000000..ff994ee0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Migration/Migration.php @@ -0,0 +1,773 @@ + v3 format. + * + * @since 1.9.3 + * + * @var array + */ + private $lists = []; + + /** + * New account data. + * + * @since 1.9.3 + * + * @var array + */ + private $new_account; + + /** + * Form data and settings. + * + * @since 1.9.3 + * + * @var array + */ + private $form_data; + + /** + * Index of the first name custom field in the new account. + * + * @since 1.9.3 + * + * @var int|null + */ + private $first_name_index; + + /** + * Index of the last name custom field in the new account. + * + * @since 1.9.3 + * + * @var int|null + */ + private $last_name_index; + + /** + * Init. + * + * @since 1.9.3 + */ + public function init() { + + $this->force_migration(); + + if ( ConstantContact::get_current_version() >= 3 ) { + return; + } + + $this->display_prompt(); + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.9.3 + */ + private function hooks() { + + // Add ajax action. + add_action( 'wp_ajax_wpforms_constant_contact_migration_prompt', [ $this, 'ajax_start_migration' ] ); + add_action( 'update_option_wpforms_providers', [ $this, 'update_providers_options_after' ], 10, 2 ); + + add_filter( 'wpforms_integrations_constant_contact_v3_auth_create_account_data', [ $this, 'migrate_account_finish' ] ); + } + + /** + * Force migration. + * + * @since 1.9.3 + */ + private function force_migration() { + + if ( ! wpforms_is_admin_page( 'settings', 'integrations' ) ) { + return; + } + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $key = 'constant_contact-force-migration'; + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( ! isset( $_GET[ $key ] ) ) { + return; + } + + if ( isset( $_SERVER['REQUEST_URI'] ) ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $_SERVER['REQUEST_URI'] = remove_query_arg( $key, wp_unslash( $_SERVER['REQUEST_URI'] ) ); + } + + delete_option( ConstantContact::VERSION_OPTION ); + } + + /** + * Display migration prompt. + * + * @since 1.9.3 + */ + private function display_prompt() { + + if ( ! wpforms_is_admin_page( 'settings', 'integrations' ) ) { + return; + } + + if ( $this->migrated_accounts_exist() ) { + return; + } + + $notice_obj = wpforms()->obj( 'notice' ); + + if ( ! $notice_obj ) { + return; + } + + $notice_obj::error( + wp_kses( + sprintf( + /* translators: %1$s - link to the migration page, %2$s - closing HTML tag. */ + __( 'You need to migrate your existing forms to the new version of the Constant Contact addon. Please %1$s click here%2$s to start the migration.', 'wpforms-lite' ), + '', + '' + ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'id' => [], + ], + ] + ) + ); + } + + /** + * Replace account ID if it was migrated. + * + * @since 1.9.3 + * + * @param array $new_account New account data. + * + * @return array + */ + public function migrate_account_finish( array $new_account ): array { + + $accounts = wpforms_get_providers_options( Core::SLUG ); + + foreach ( $accounts as $account_id => $account ) { + if ( + $account['email'] === $new_account['email'] + && ! empty( $account['accounts'] ) + ) { + $new_account['id'] = $account_id; + $this->new_account = $new_account; + + $this->migrate_forms( $account ); + + break; + } + } + + return $new_account; + } + + /** + * Finish migration by setting the version to 3. + * + * @since 1.9.3 + */ + public static function finish_migration() { + + update_option( ConstantContact::VERSION_OPTION, 3 ); + } + + /** + * Update providers options after migration. + * + * @since 1.9.3 + * + * @param mixed $old_value Old providers options. + * @param mixed $new_value New providers options. + * + * @noinspection PhpUnusedParameterInspection + */ + public function update_providers_options_after( $old_value, $new_value ) { + + if ( empty( wpforms_get_providers_options( 'constant-contact' ) ) ) { + self::finish_migration(); + + return; + } + + if ( ! is_array( $new_value ) || empty( $new_value[ Core::SLUG ] ) ) { + return; + } + + if ( $this->migrated_accounts_exist() ) { + return; + } + + self::finish_migration(); + } + + /** + * Check if some migrated accounts have been already created. + * + * @since 1.9.3 + * + * @return bool + */ + private function migrated_accounts_exist(): bool { + + $accounts = wpforms_get_providers_options( Core::SLUG ); + + foreach ( $accounts as $account ) { + if ( ! empty( $account['accounts'] ) ) { + return true; + } + } + + return false; + } + + /** + * Migrate all accounts. + * + * @since 1.9.3 + */ + public function ajax_start_migration() { + + check_ajax_referer( Auth::NONCE, 'nonce' ); + + if ( ! wpforms_current_user_can() ) { + wp_send_json_error( esc_html__( 'You do not have permission to perform this action.', 'wpforms-lite' ) ); + } + + $accounts = wpforms_get_providers_options(); + + // No accounts to migrate. + if ( empty( $accounts['constant-contact'] ) ) { + self::finish_migration(); + + wp_send_json_success(); + } + + foreach ( $accounts['constant-contact'] as $account_id => $account ) { + $this->migrate_account_start( $account_id, $account, $accounts ); + } + + // If no accounts were migrated because v2 accounts were invalid, we switch to the new version. + if ( empty( $accounts[ Core::SLUG ] ) ) { + self::finish_migration(); + + wp_send_json_success(); + } + + update_option( 'wpforms_providers', $accounts ); + + wp_send_json_success(); + } + + /** + * Migrate a specific v2 account to v3. + * + * @since 1.9.3 + * + * @param string $account_id Account ID. + * @param array $account Current account data. + * @param array $accounts List of all providers' accounts. + */ + private function migrate_account_start( string $account_id, array $account, array &$accounts ) { + + static $migrated_access_tokens = []; + + // It was possible to create an account without an access token. + if ( empty( $account['access_token'] ) ) { + return; + } + + // It was possible to create a few accounts with the same access token. + // We merge them into one in the new version. + if ( isset( $migrated_access_tokens[ $account['access_token'] ] ) ) { + $created_account_id = $migrated_access_tokens[ $account['access_token'] ]; + + $accounts['constant-contact-v3'][ $created_account_id ]['accounts'][] = $account_id; + + return; + } + + $email = $this->get_account_email( $account ); + + // We skip an account if we can't receive email, in the case the access_token isn't valid. + if ( empty( $email ) ) { + return; + } + + $migrated_access_tokens[ $account['access_token'] ] = $account_id; + + $accounts['constant-contact-v3'][ $account_id ] = [ + 'id' => $account_id, + 'accounts' => [ $account_id ], + 'access_token' => $account['access_token'], + 'date' => 0, + 'label' => $account['label'] ?? $email, + 'email' => $email, + ]; + } + + /** + * Get email from an account. + * + * @since 1.9.3 + * + * @param array $account Account data. + * + * @return string + */ + private function get_account_email( array $account ): string { + + $old_provider = new WPForms_Constant_Contact(); + + $old_provider->access_token = $account['access_token']; + + $account_info = $old_provider->get_account_information(); + + if ( is_wp_error( $account_info ) ) { + return ''; + } + + return $account_info['email'] ?? ''; + } + + /** + * Migrate forms. + * + * @since 1.9.3 + * + * @param array $old_account Old account. + * + * @return void + */ + private function migrate_forms( array $old_account ) { + + if ( ! isset( $old_account['accounts'], $old_account['access_token'] ) ) { + return; + } + + $forms = $this->get_forms( (array) $old_account['accounts'] ); + + if ( empty( $forms ) ) { + return; + } + + $this->lists = $this->get_lists_xhref( $this->new_account, $old_account['access_token'] ); + + foreach ( $forms as $form ) { + $this->migrate_form( $form ); + } + } + + /** + * Get migrated forms. + * + * @since 1.9.3 + * + * @param array $old_account_ids Old v2 account ids. + * + * @return array + * @noinspection SqlResolve + */ + private function get_forms( array $old_account_ids ): array { + + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $forms = $wpdb->get_col( + $wpdb->prepare( + 'SELECT ID FROM ' . $wpdb->posts . ' WHERE post_type = "wpforms" AND post_content REGEXP %s', + implode( '|', $old_account_ids ) + ) + ); + + if ( empty( $forms ) ) { + return []; + } + + $form_ids = array_map( 'absint', $forms ); + $form_obj = wpforms()->obj( 'form' ); + + if ( ! $form_obj ) { + return []; + } + + return (array) $form_obj->get( + '', + [ + 'numberposts' => -1, + 'orderby' => 'post__in', + 'post__in' => $form_ids, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'no_found_rows' => true, + ] + ); + } + + /** + * Copy connections from v2 to v3 in proper format. + * + * @since 1.9.3 + * + * @param WP_Post $form Form object. + */ + private function migrate_form( WP_Post $form ) { + + $this->form_data = wpforms_decode( $form->post_content ); + + // Nothing to migrate. + if ( empty( $this->form_data['providers']['constant-contact'] ) ) { + return; + } + + $migrated_connections = $this->form_data['providers'][ Core::SLUG ] ?? []; + + // All connections were migrated but account migration was interrupted by timeout or an error. + if ( count( $this->form_data['providers']['constant-contact'] ) === count( $migrated_connections ) ) { + return; + } + + $this->form_data['providers'][ Core::SLUG ] = array_merge( $migrated_connections, $this->get_new_connections() ); + + $form_obj = wpforms()->obj( 'form' ); + + if ( ! $form_obj ) { + return; + } + + $form_obj->update( $this->form_data['id'], $this->form_data ); + } + + /** + * Modify v2 connections to v3. + * + * @since 1.9.3 + * + * @return array + */ + private function get_new_connections(): array { + + $old_connections = $this->form_data['providers']['constant-contact'] ?? []; + $new_connections = []; + + foreach ( $old_connections as $connection_id => $connection ) { + $new_connection_id = str_replace( 'connection_', '', $connection_id ); + $connection = wp_parse_args( + $connection, + [ + 'connection_name' => '', + 'account_id' => '', + 'list_id' => '', + 'fields' => [], + 'conditional_logic' => '', + 'conditional_type' => '', + 'conditionals' => [], + ] + ); + + // The connection is related to another account, skip it. + if ( $this->new_account['id'] !== $connection['account_id'] ) { + continue; + } + + reset( $this->lists ); + + $new_connections[ $new_connection_id ] = [ + 'id' => $new_connection_id, + 'name' => $connection['connection_name'], + 'account_id' => $connection['account_id'], + 'action' => 'subscribe', + 'list' => $this->lists[ $connection['list_id'] ] ?? key( $this->lists ), + 'email' => explode( '.', $connection['fields']['email'] ?? '' )[0], + 'fields_meta' => $this->get_connection_custom_fields( $connection['fields'] ), + 'conditional_logic' => $connection['conditional_logic'], + 'conditional_type' => $connection['conditional_type'], + 'conditionals' => $connection['conditionals'], + ]; + } + + return $new_connections; + } + + /** + * Get custom fields. + * + * @since 1.9.3 + * + * @param array $custom_fields Custom fields v2. + * + * @return array + */ + private function get_connection_custom_fields( array $custom_fields ): array { + + $fields_meta = []; + $custom_fields = $this->sort_custom_fields( $custom_fields ); + + foreach ( $custom_fields as $key => $value ) { + if ( $key === 'email' ) { + continue; + } + + $value_parts = explode( '.', $value ); + $field_id = $value_parts[0]; + + if ( wpforms_is_empty_string( $field_id ) ) { + continue; + } + + $fields_meta = $this->update_fields_meta( $fields_meta, $field_id, $key, $value_parts ); + } + + return $fields_meta; + } + + /** + * Move $custom_fields['full_name'] at the beginning of the array. + * + * Thanks to this, if first name and last name are defined, next iterations + * of this array will replace full_name - backward compatibility sustained. + * + * @since 1.9.3 + * + * @param array $custom_fields Custom fields. + * + * @return array + */ + private function sort_custom_fields( array $custom_fields ): array { + + if ( ! isset( $custom_fields['full_name'] ) || wpforms_is_empty_string( $custom_fields['full_name'] ) ) { + return $custom_fields; + } + + $full_name = $custom_fields['full_name']; + + unset( $custom_fields['full_name'] ); + + return [ 'full_name' => $full_name ] + $custom_fields; + } + + /** + * Update fields meta. + * + * @since 1.9.3 + * + * @param array $fields_meta Fields meta. + * @param string $field_id Field ID. + * @param string $key Key. + * @param array $value_parts Value parts. + * + * @return array + */ + private function update_fields_meta( array $fields_meta, string $field_id, string $key, array $value_parts ): array { + + if ( $this->form_data['fields'][ $field_id ]['type'] === 'name' ) { + $name_field = $this->handle_name_field( $fields_meta, $field_id, $key, $value_parts ); + + if ( is_array( $name_field ) ) { + return $name_field; + } + + $field_id = $name_field; + } + + $keys_to_rename = [ + 'work_phone' => 'phone', + 'url' => $this->get_url_field_id(), + ]; + + $new_key = $keys_to_rename[ $key ] ?? $key; + + $fields_meta[ $this->get_meta_next_index( $fields_meta, $new_key ) ] = [ + 'name' => $new_key, + 'field_id' => $field_id, + ]; + + return $fields_meta; + } + + /** + * Handle name field. + * + * @since 1.9.3 + * + * @param array $fields_meta Fields meta. + * @param string $field_id Field ID. + * @param string $key Key. + * @param array $value_parts Value parts. + * + * @return string|array + */ + private function handle_name_field( array $fields_meta, string $field_id, string $key, array $value_parts ) { + + if ( $value_parts[1] === 'value' ) { + $value_parts[1] = 'full'; + } + + if ( $key === 'full_name' ) { + return $this->update_full_name( $fields_meta, $field_id, $value_parts ); + } + + $field_id .= '.' . $value_parts[1]; + + return $field_id; + } + + /** + * Update full name meta. + * + * @since 1.9.3 + * + * @param array $fields_meta Fields meta. + * @param string $field_id Field ID. + * @param array $value_parts Value parts. + * + * @return array + */ + private function update_full_name( array $fields_meta, string $field_id, array $value_parts ): array { + + $field = $this->form_data['fields'][ $field_id ] ?? []; + + $is_simple = ! isset( $field['format'] ) || $field['format'] === 'simple'; + + $first_name_field_id = $is_simple ? $field_id . '.' . $value_parts[1] : $field_id . '.first'; + + $fields_meta[] = [ + 'name' => 'first_name', + 'field_id' => $first_name_field_id, + ]; + + $this->first_name_index = count( $fields_meta ) - 1; + + if ( $is_simple ) { + return $fields_meta; + } + + $last_name_field_id = $field_id . '.last'; + + $fields_meta[] = [ + 'name' => 'last_name', + 'field_id' => $last_name_field_id, + ]; + + $this->last_name_index = count( $fields_meta ) - 1; + + return $fields_meta; + } + + /** + * Get next index for a custom field. + * + * @since 1.9.3 + * + * @param array $fields_meta Fields meta. + * @param string $key Key. + */ + private function get_meta_next_index( array $fields_meta, string $key ): int { + + if ( $key === 'first_name' ) { + return $this->first_name_index ?? count( $fields_meta ); + } + + if ( $key === 'last_name' ) { + return $this->last_name_index ?? count( $fields_meta ); + } + + return count( $fields_meta ); + } + + /** + * Get URL custom field ID from the new account. + * + * Returns the id in the new format. + * + * @since 1.9.3 + * + * @return string + */ + private function get_url_field_id(): string { + + static $field_id; + + if ( $field_id ) { + return $field_id; + } + + $custom_fields = ( new Api( $this->new_account ) )->get_custom_fields( 'custom_field_id', 'name' ); + + $field_id = $custom_fields['custom_field_1'] ?? $this->register_url_field(); + + return $field_id; + } + + /** + * Get an array of list v2 ids to v3 ids. + * + * @since 1.9.3 + * + * @param array $new_account New account data. + * @param string $access_token_v2 Access token for v2. + * + * @return array + * + * @throws RuntimeException Can't receive v2 lists and finish migration. + */ + private function get_lists_xhref( array $new_account, string $access_token_v2 ): array { + + $old_provider = new WPForms_Constant_Contact(); + $old_provider->access_token = $access_token_v2; + + $old_lists = $old_provider->api_lists(); + + if ( is_wp_error( $old_lists ) ) { + throw new RuntimeException( esc_html__( 'Can\'t receive v2 lists and finish migration.', 'wpforms-lite' ) ); + } + + return ( new Api( $new_account ) )->get_contact_list_xrefs( (array) $old_lists ); + } + + /** + * Register URL custom field. + * + * @since 1.9.3 + * + * @return string + */ + private function register_url_field(): string { + + return ( new Api( $this->new_account ) )->register_custom_field( 'Website / URL' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Process.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Process.php new file mode 100755 index 00000000..18a19832 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Process.php @@ -0,0 +1,303 @@ +hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.3 + */ + public function hooks() { + + add_action( self::TASK_NAME, [ $this, 'task_async_action_trigger' ] ); + } + + /** + * Process the form. + * + * @since 1.9.3 + * + * @param array $fields Submitted fields. + * @param array $entry Saved entry data. + * @param array $form_data Form data and settings. + * @param int $entry_id Saved entry ID. + */ + public function process( $fields, $entry, $form_data, $entry_id ) { + + if ( empty( $form_data['providers'][ $this->core->slug ] ) ) { + return; + } + + $this->fields = $fields; + $this->entry = $entry; + $this->form_data = $form_data; + $this->entry_id = $entry_id; + + foreach ( $this->form_data['providers'][ $this->core->slug ] as $connection ) { + $this->connection = $connection; + + if ( ! $this->process_conditionals( $this->fields, $this->form_data, $connection ) ) { + $this->log_errors( + sprintf( + 'The Constant Contact connection %s was not processed due to conditional logic.', + $connection['name'] ?? '' + ) + ); + + continue; + } + + if ( empty( $this->connection['action'] ) ) { + continue; + } + + $this->create_connection_async_task(); + } + } + + /** + * Create an async task for a specific connection. + * + * @since 1.9.3 + */ + private function create_connection_async_task() { + + $tasks = wpforms()->obj( 'tasks' ); + + if ( ! $tasks ) { + return; + } + + $tasks + ->create( self::TASK_NAME )->async() + ->params( $this->connection, $this->fields, $this->form_data, $this->entry_id ) + ->register(); + } + + /** + * Process the addon async tasks. + * + * @since 1.9.3 + * + * @param int|mixed $meta_id Task meta ID. + */ + public function task_async_action_trigger( $meta_id ) { + + $meta = $this->get_task_meta( (int) $meta_id ); + + // We expect a certain type and number of params. + if ( count( $meta ) !== 4 ) { + return; + } + + // We expect a certain metadata structure for this task. + list( $this->connection, $this->fields, $this->form_data, $this->entry_id ) = $meta; + + try { + $this->process_action(); + } catch ( Exception $e ) { + $this->log_errors( $e->getMessage() ); + } + } + + /** + * Processes single action. + * + * @since 1.9.3 + * + * @throws Exception If something went wrong. + * + * @uses Api::unsubscribe_contact() + * @uses Api::delete_contact() + * @uses Api::subscribe_contact() + */ + private function process_action() { + + $this->api = $this->get_api_client(); + $contact_data = $this->prepare_contact_data(); + $api_method = $this->connection['action'] . '_contact'; + + if ( ! method_exists( $this->api, $api_method ) ) { + return; + } + + $response = $this->api->$api_method( $contact_data ); + + /** + * Fire when request was sent successfully or not. + * + * @since 1.9.3 + * + * @param array $response Response data. + * @param array $connection Connection data. + * @param array $args Additional arguments. + */ + do_action( + 'wpforms_integrations_constant_contact_v3_process_completed', + $response, + $this->connection, + [ + 'form_data' => $this->form_data, + 'fields' => $this->fields, + 'entry' => $this->entry, + ] + ); + } + + /** + * Prepare contact data. + * + * @since 1.9.3 + * + * @return array + */ + private function prepare_contact_data(): array { + + $field_mapping = new FieldMapping( $this->connection, $this->fields ); + + if ( $this->connection['action'] === 'subscribe' ) { + return array_filter( + [ + 'email_address' => $field_mapping->get_field( 'email' ), + 'first_name' => $field_mapping->get_meta_field( 'first_name' ), + 'last_name' => $field_mapping->get_meta_field( 'last_name' ), + 'job_title' => $field_mapping->get_meta_field( 'job_title' ), + 'company_name' => $field_mapping->get_meta_field( 'company_name' ), + 'phone_number' => $field_mapping->get_meta_field( 'phone' ), + 'street_address' => $field_mapping->get_street_address(), + 'list_memberships' => [ $field_mapping->get_list_id() ], + 'custom_fields' => $field_mapping->get_custom_fields( $this->api->get_custom_fields( 'type', 'custom_field_id' ) ), + ] + ); + } + + if ( $this->connection['action'] === 'unsubscribe' ) { + return [ + 'email_address' => $field_mapping->get_field( 'email' ), + 'opt_out_reason' => $field_mapping->get_field( 'opt_out_reason' ), + ]; + } + + return [ + 'email_address' => $field_mapping->get_field( 'email' ), + ]; + } + + /** + * Get task meta data. + * + * @since 1.9.3 + * + * @param int $meta_id Task meta ID. + * + * @return array + */ + private function get_task_meta( int $meta_id ): array { + + $task_meta = new Meta(); + $meta = $task_meta->get( $meta_id ); + + // We should actually receive something. + if ( empty( $meta ) || empty( $meta->data ) ) { + return []; + } + + return (array) $meta->data; + } + + /** + * Get the API client based on connection and provider options. + * + * @since 1.9.3 + * + * @return Api + * + * @throws RuntimeException If account ID is missing or account doesn't exist. + */ + private function get_api_client(): Api { + + if ( empty( $this->connection['account_id'] ) ) { + throw new RuntimeException( 'Account ID is missing in connection.' ); + } + + $provider_settings = wpforms_get_providers_options( $this->core->slug ); + + return new Api( $provider_settings[ $this->connection['account_id'] ] ?? [] ); + } + + /** + * Log an API-related error with all the data. + * + * @since 1.9.3 + * + * @param string $error_message Error message. + */ + private function log_errors( string $error_message ) { + + wpforms_log( + 'Submission Constant Contact failed (#' . $this->entry_id . ')', + [ + 'message' => $error_message, + 'connection' => $this->connection, + ], + [ + 'type' => [ 'provider', 'error' ], + 'parent' => $this->entry_id, + 'form_id' => $this->form_data['id'], + ] + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FieldMapping.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FieldMapping.php new file mode 100755 index 00000000..43148ca1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FieldMapping.php @@ -0,0 +1,346 @@ +connection = $connection; + $this->fields = $fields; + } + + /** + * Get a list ID. + * + * @since 1.9.3 + * + * @return string + */ + public function get_list_id(): string { + + return $this->connection['list'] ?? ''; + } + + /** + * Get field value. + * + * @since 1.9.3 + * + * @param string $connection_key Connection key. + */ + public function get_field( string $connection_key ): string { + + if ( ! isset( $this->connection[ $connection_key ], $this->fields[ $this->connection[ $connection_key ] ]['value'] ) ) { + return ''; + } + + $limit = $connection_key === 'opt_out_reason' ? 255 : 50; + + return $this->trim_value( (string) $this->fields[ $this->connection[ $connection_key ] ]['value'], $limit ); + } + + /** + * Get field value from connection custom fields. + * + * @since 1.9.3 + * + * @param string $connection_key Connection key. + * + * @return string + */ + public function get_meta_field( string $connection_key ): string { + + $field_id_full = $this->get_field_meta_id( $connection_key ); + $limit = $connection_key === 'phone' ? 25 : 50; + + return $this->trim_value( $this->get_field_value( $field_id_full ), $limit ); + } + + /** + * Get field value by ID. + * + * @since 1.9.3 + * + * @param string $field_id Field ID. Can be integer or string in the {field_id}.{subfield} format. + * + * @return string + */ + private function get_field_value( string $field_id ): string { + + $field_parts = explode( '.', $field_id ); + $field_id = $field_parts[0]; + $field_key = $field_parts[1] ?? 'value'; + + if ( $field_key === 'full' ) { + $field_key = 'value'; + } + + return $this->fields[ $field_id ][ $field_key ] ?? ''; + } + + /** + * Get connection custom fields. + * + * @since 1.9.3 + * + * @return array + */ + private function get_connection_custom_fields(): array { + + if ( empty( $this->connection['fields_meta'] ) ) { + return []; + } + + $predefined_custom_fields = ConstantContact::get_predefined_custom_fields(); + + $fields_meta = []; + + foreach ( $this->connection['fields_meta'] as $field ) { + if ( ! isset( $field['name'], $field['field_id'] ) ) { + continue; + } + + if ( in_array( $field['name'], $predefined_custom_fields, true ) ) { + continue; + } + + $fields_meta[ $field['name'] ] = $field['field_id']; + } + + return $fields_meta; + } + + /** + * Get a list of CC custom fields. + * + * @since 1.9.3 + * + * @param array $custom_fields_formats Constant Contact custom fields formats. + * + * @return array + */ + public function get_custom_fields( array $custom_fields_formats ): array { + + $fields_meta = $this->get_connection_custom_fields(); + $custom_fields = []; + + foreach ( $fields_meta as $custom_field_id => $field_id ) { + $field_format = $custom_fields_formats[ $custom_field_id ] ?? 'string'; + $value = $this->get_custom_field_value( (string) $field_id, $field_format ); + + if ( wpforms_is_empty_string( $value ) ) { + continue; + } + + $custom_fields[] = [ + 'custom_field_id' => $custom_field_id, + 'value' => $this->trim_value( $value, 255 ), + ]; + } + + return $custom_fields; + } + + /** + * Get a custom field value. + * + * @since 1.9.3 + * + * @param string $field_id Field ID. + * @param string $field_format Constant Contact custom field format. + * + * @return string + */ + private function get_custom_field_value( string $field_id, string $field_format ): string { + + if ( $field_format !== 'date' ) { + return $this->trim_value( $this->get_field_value( $field_id ), 255 ); + } + + $field = $this->fields[ $field_id ] ?? []; + + // Only Date / Time field is allowed to be sent as a date custom field format. + if ( empty( $field['unix'] ) ) { + return ''; + } + + return (string) gmdate( 'm/d/Y', $field['unix'] ); + } + + /** + * Get street address from connection data. + * + * @since 1.9.3 + * + * @return array + */ + public function get_street_address(): array { + + $field_id = $this->get_field_meta_id( 'address' ); + + if ( empty( $field_id ) || empty( $this->fields[ $field_id ] ) ) { + return []; + } + + $address_fields = $this->build_address_fields( $this->fields[ $field_id ] ); + + return $this->is_valid_address( $address_fields ) ? $address_fields : []; + } + + /** + * Get meta field ID. + * + * @since 1.9.3 + * + * @param string $connection_key Connection key. + * + * @return string + */ + private function get_field_meta_id( string $connection_key ): string { + + $fields = wp_list_pluck( $this->connection['fields_meta'], 'field_id', 'name' ); + + return $fields[ $connection_key ] ?? ''; + } + + /** + * Get address kind. + * + * @since 1.9.3 + * + * @param array $address Address data. + * + * @return string + */ + private function get_address_kind( array $address ): string { + + $default_kind = 'other'; + + /** + * Kind of address to be saved in the Constant Contact account. + * + * Possible values are 'other', 'home', 'work'. + * + * @since 1.9.3 + * + * @param array $default_kind Default kind of address, possible values are 'other', 'home', 'work'. + * @param array $address Address data. + * @param FieldMapping $field_mapping Instance of the FieldMapping class. + * + * @return string Default value is 'other'. + */ + $kind = apply_filters( 'wpforms_integrations_constant_contact_v3_settings_field_mapping_get_address_kind', $default_kind, $address, $this ); + + if ( in_array( $kind, [ $default_kind, 'home', 'work' ], true ) ) { + return $kind; + } + + return $default_kind; + } + + /** + * Get address street. + * + * @since 1.9.3 + * + * @param array $address Address data. + * + * @return string + */ + private function get_address_street( array $address ): string { + + $street = $address['address1'] ?? ''; + + return ! empty( $address['address2'] ) + ? $street . ' ' . $address['address2'] + : $street; + } + + /** + * Build address fields. + * + * @since 1.9.3 + * + * @param array $address Address data. + * + * @return array + */ + private function build_address_fields( array $address ): array { + + return [ + 'kind' => $this->get_address_kind( $address ), + 'street' => $this->trim_value( $this->get_address_street( $address ), 255 ), + 'city' => $this->trim_value( $address['city'] ?? '' ), + 'state' => $this->trim_value( $address['state'] ?? '' ), + 'postal_code' => $this->trim_value( $address['postal'] ?? '' ), + 'country' => $this->trim_value( $address['country'] ?? '' ), + ]; + } + + /** + * Check if the address is valid. + * + * @since 1.9.3 + * + * @param array $address_fields Address fields. + * + * @return bool + */ + private function is_valid_address( array $address_fields ): bool { + + $filtered = array_filter( $address_fields ); + + return count( $filtered ) > 1; + } + + /** + * Trim value to the specified length. + * + * @see https://v3.developer.constantcontact.com/api_reference/index.html#!/Contacts/createOrUpdateContact + * + * @since 1.9.3 + * + * @param string $value Value to trim. + * @param int $length Length to trim to. + * + * @return string + */ + private function trim_value( string $value, int $length = 50 ): string { + + return wp_html_excerpt( $value, $length ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FormBuilder.php b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FormBuilder.php new file mode 100755 index 00000000..365d0d80 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/ConstantContact/V3/Settings/FormBuilder.php @@ -0,0 +1,391 @@ +core->slug, + [ $this, 'ajax_connections_get' ] + ); + + if ( is_admin() ) { + add_filter( + "wpforms_providers_provider_settings_formbuilder_display_content_default_screen_{$this->core->slug}", + [ $this, 'builder_settings_default_content' ] + ); + } + + add_filter( 'wpforms_save_form_args', [ $this, 'save_form' ], 11, 3 ); + } + + /** + * Display content inside the panel sidebar area. + * + * @since 1.9.3 + */ + public function display_sidebar() { + + if ( ConstantContact::get_current_version() !== 3 ) { + return; + } + + parent::display_sidebar(); + } + + /** + * Enqueue JavaScript and CSS files if needed. + * When extending - include the `parent::enqueue_assets();` not to break things! + * + * @since 1.9.3 + */ + public function enqueue_assets() { + + parent::enqueue_assets(); + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-constant-contact-v3-builder', + WPFORMS_PLUGIN_URL . "assets/js/integrations/constant-contact-v3/builder{$min}.js", + [ 'underscore', 'wpforms-admin-builder-providers', 'wpforms-constant-contact-v3-auth' ], + WPFORMS_VERSION, + true + ); + } + + + /** + * Pre-process provider data before saving it in form_data when editing a form. + * + * @since 1.9.3 + * + * @param array|mixed $form Form array which is usable with `wp_update_post()`. + * @param array $data Data retrieved from $_POST and processed. + * @param array $args Empty by default. May have custom data not intended to be saved, but used for processing. + * + * @return array + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function save_form( $form, $data, $args ): array { + + $form = (array) $form; + + // Get a filtered (or modified by another addon) form content. + $form_data = json_decode( stripslashes( $form['post_content'] ), true ); + + // Provider exists. + if ( ! empty( $form_data['providers'][ $this->core->slug ] ) ) { + $modified_post_content = $this->modify_form_data( $form_data ); + + if ( ! empty( $modified_post_content ) ) { + $form['post_content'] = wpforms_encode( $modified_post_content ); + + return $form; + } + } + + /* + * This part works when modification is locked or current filter was called on NOT a Providers panel. + * Then we need to restore provider connections from the previous form content. + */ + + // Get a "previous" form content (current content is still not saved). + $prev_form = ! empty( $data['id'] ) + ? wpforms()->obj( 'form' )->get( $data['id'], [ 'content_only' => true ] ) + : []; + + if ( ! empty( $prev_form['providers'][ $this->core->slug ] ) ) { + $provider = $prev_form['providers'][ $this->core->slug ]; + + if ( ! isset( $form_data['providers'] ) ) { + $form_data = array_merge( $form_data, [ 'providers' => [] ] ); + } + + $form_data['providers'] = array_merge( (array) $form_data['providers'], [ $this->core->slug => $provider ] ); + $form['post_content'] = wpforms_encode( $form_data ); + } + + return $form; + } + + /** + * Prepare modifications for form content if it's not locked. + * + * @since 1.9.3 + * + * @param array $form_data Form content. + * + * @return array|null + */ + protected function modify_form_data( array $form_data ) { + + /** + * The connection is locked. + * Why? User clicked the "Save" button when one of the AJAX requests + * for data retrieval from API was in progress or failed. + */ + if ( + isset( $form_data['providers'][ $this->core->slug ]['__lock__'] ) && + absint( $form_data['providers'][ $this->core->slug ]['__lock__'] ) === 1 + ) { + return null; + } + + // Modify content as we need, done by reference. + foreach ( $form_data['providers'][ $this->core->slug ] as $connection_id => $connection ) { + if ( $connection_id === '__lock__' ) { + unset( $form_data['providers'][ $this->core->slug ]['__lock__'] ); + } + } + + return $form_data; + } + + /** + * Rewrite the Add New Account button to trigger Auth popup instead of default authorization flow. + * + * @since 1.9.3 + */ + protected function display_content_header() { + + if ( ! empty( wpforms_get_providers_options( $this->core->slug ) ) ) { + parent::display_content_header(); + + return; + } + + ?> + +
              + core->name ); ?> + + +
              + [ + 'subscribe' => __( 'Subscribe', 'wpforms-lite' ), + 'unsubscribe' => __( 'Unsubscribe', 'wpforms-lite' ), + 'delete' => __( 'Delete subscriber', 'wpforms-lite' ), + ], + 'actions_fields' => [ + 'subscribe' => [ + 'email' => [ + 'label' => __( 'Email', 'wpforms-lite' ), + 'type' => 'select', + 'map' => 'email', + 'required' => true, + ], + 'list' => [ + 'label' => __( 'Select List', 'wpforms-lite' ), + 'type' => 'select', + 'required' => true, + 'placeholder' => __( '--- Select Mailing List ---', 'wpforms-lite' ), + ], + 'custom_fields' => [ + 'label' => __( 'Custom Fields', 'wpforms-lite' ), + 'type' => 'custom-fields', + 'required' => false, + ], + ], + 'unsubscribe' => [ + 'email' => [ + 'label' => __( 'Email', 'wpforms-lite' ), + 'type' => 'select', + 'map' => 'email', + 'required' => true, + 'placeholder' => __( '--- Select Form Field ---', 'wpforms-lite' ), + ], + 'opt_out_reason' => [ + 'label' => __( 'Reason', 'wpforms-lite' ), + 'type' => 'select', + 'required' => false, + 'placeholder' => __( '--- Select Form Field ---', 'wpforms-lite' ), + ], + ], + 'delete' => [ + 'email' => [ + 'label' => __( 'Email', 'wpforms-lite' ), + 'type' => 'select', + 'map' => 'email', + 'required' => true, + ], + ], + ], + 'connections' => isset( $this->form_data['providers'][ $this->core->slug ] ) + ? array_reverse( $this->form_data['providers'][ $this->core->slug ], true ) + : [], + 'conditionals' => [], + ]; + + foreach ( $data['connections'] as $connection ) { + + if ( empty( $connection['id'] ) ) { + continue; + } + + // This will either return an empty placeholder or complete set of rules, as a DOM. + $data['conditionals'][ $connection['id'] ] = wpforms()->is_pro() + ? wpforms_conditional_logic()->builder_block( + [ + 'form' => $this->form_data, + 'type' => 'panel', + 'parent' => 'providers', + 'panel' => $this->core->slug, + 'subsection' => $connection['id'], + ], + false + ) + : ''; + } + + return array_merge( $data, $this->get_accounts_data() ); + } + + /** + * Get accounts data. + * + * @since 1.9.3 + * + * @return array + */ + private function get_accounts_data(): array { + + $accounts = wpforms_get_providers_options( $this->core->slug ); + + $data = [ + 'accounts' => $accounts, + 'custom_fields' => [], + 'lists' => [], + ]; + + if ( empty( $accounts ) ) { + return $data; + } + + $predefined_custom_fields = ConstantContact::get_predefined_custom_fields(); + + foreach ( $accounts as $account_id => $account ) { + try { + $api = new Api( $account ); + + $data['lists'][ $account_id ] = $api->get_contact_list(); + $data['custom_fields'][ $account_id ] = array_merge( $predefined_custom_fields, $api->get_custom_fields( 'label', 'custom_field_id' ) ); + } catch ( Exception $e ) { + continue; + } + } + + return $data; + } + + /** + * Builder custom templates. + * + * @since 1.9.3 + */ + public function builder_custom_templates() { + + $templates = [ + 'connection', + 'error', + 'select-field', + ]; + + foreach ( $templates as $template ) { + $template_name = ucwords( str_replace( '-', ' ', $template ) ); + $script_id = 'tmpl-wpforms-' . esc_attr( $this->core->slug ) . '-builder-content-connection'; + + if ( $template !== 'connection' ) { + $script_id .= '-' . $template; + } + ?> + + + +

              + +

              +

              + %2$s', + esc_url( admin_url( 'admin.php?page=wpforms-page&view=constant-contact' ) ), + esc_html__( 'Learn more about the power of email marketing.', 'wpforms-lite' ) + ); + ?> +

              + hooks(); + } + + /** + * Hooks. + * + * @since 1.9.3 + */ + private function hooks() { + + add_action( 'wpforms_providers_provider_settings_page_integrations_display_connected_account_item_before', [ $this, 'display_re_auth' ], 10, 2 ); + } + + /** + * Display reauthorization notice. + * + * @since 1.9.3 + * + * @param string $account_id Account ID. + * @param array $account Account data. + * + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function display_re_auth( $account_id, $account ) { + + if ( empty( $account['accounts'] ) || empty( $account['email'] ) ) { + return; + } + + ?> +
              +
              +

              + +

              +
              + +
              + + + +
              +
              + +

              + + + +

              +

              + %2$s', + // @todo: confirm the link. + // @see: https://github.com/awesomemotive/wpforms-plugin/issues/12504 + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-connect-constant-contact-with-wpforms/', 'Settings - Integration', 'ConstantContact V3 Documentation' ) ), + esc_html__( 'Click here for documentation on connecting WPForms with Constant Contact.', 'wpforms-lite' ) + ); + ?> +

              + \n

              %s

              \n", + wp_kses( + sprintf( /* translators: %s - forms overview page URL. */ + _x( 'Create your contact form with WPForms in minutes.', 'Theme starter content', 'wpforms-lite' ), + esc_url( admin_url( 'admin.php?page=wpforms-overview' ) ) + ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ) + ); + + return $content; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Integrations/DefaultThemes/DefaultThemes.php b/wp-content/plugins/wpforms-lite/src/Integrations/DefaultThemes/DefaultThemes.php new file mode 100755 index 00000000..7557c704 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Integrations/DefaultThemes/DefaultThemes.php @@ -0,0 +1,311 @@ +current_theme = $this->get_current_default_theme(); + + return ! empty( $this->current_theme ); + } + + /** + * Load an integration. + * + * @since 1.6.6 + */ + public function load() { + + if ( $this->current_theme === self::TT ) { + $this->tt_hooks(); + + return; + } + + if ( $this->current_theme === self::TT1 ) { + $this->tt1_hooks(); + + return; + } + + if ( $this->current_theme === self::OCEANWP ) { + $this->ocean_hooks(); + } + } + + /** + * Hooks for the Twenty Twenty theme. + * + * @since 1.6.6 + */ + private function tt_hooks() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + add_action( 'wp_enqueue_scripts', [ $this, 'tt_iframe_fix' ], 11 ); + + add_action( 'wpforms_frontend_css', [ $this, 'tt_dropdown_fix' ] ); + } + + /** + * Hooks for the Twenty Twenty-One theme. + * + * @since 1.6.6 + */ + private function tt1_hooks() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( wpforms_get_render_engine() === 'modern' ) { + return; + } + + $form_styling = wpforms_setting( 'disable-css', '1' ); + + if ( $form_styling === '1' ) { + add_action( 'wp_enqueue_scripts', [ $this, 'tt1_multiple_fields_fix' ], 11 ); + add_action( 'wp_enqueue_scripts', [ $this, 'tt1_dropdown_fix' ], 11 ); + } + + if ( $form_styling === '2' ) { + add_action( 'wp_enqueue_scripts', [ $this, 'tt1_base_style_fix' ], 11 ); + } + } + + /** + * Hooks for the OceanWP theme. + * + * @since 1.9.1 + */ + private function ocean_hooks() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + add_action( 'wp_enqueue_scripts', [ $this, 'ocean_button_hover' ], 100 ); + } + + /** + * Apply button hover fix for OceanWP theme. + * + * @since 1.9.1 + */ + public function ocean_button_hover() { + + // Only full styles are supported. + if ( (int) wpforms_setting( 'disable-css', 1 ) !== 1 ) { + return; + } + + $styles = wpforms_get_render_engine() === 'modern' ? + /** @lang CSS */ + 'body div.wpforms-container-full .wpforms-form input[type=submit]:hover, + body div.wpforms-container-full .wpforms-form input[type=submit]:active, + body div.wpforms-container-full .wpforms-form button[type=submit]:hover, + body div.wpforms-container-full .wpforms-form button[type=submit]:active, + body div.wpforms-container-full .wpforms-form .wpforms-page-button:hover, + body div.wpforms-container-full .wpforms-form .wpforms-page-button:active, + body .wp-core-ui div.wpforms-container-full .wpforms-form input[type=submit]:hover, + body .wp-core-ui div.wpforms-container-full .wpforms-form input[type=submit]:active, + body .wp-core-ui div.wpforms-container-full .wpforms-form button[type=submit]:hover, + body .wp-core-ui div.wpforms-container-full .wpforms-form button[type=submit]:active, + body .wp-core-ui div.wpforms-container-full .wpforms-form .wpforms-page-button:hover, + body .wp-core-ui div.wpforms-container-full .wpforms-form .wpforms-page-button:active { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), var(--wpforms-button-background-color-alt, var(--wpforms-button-background-color)) !important; + }' : + /** @lang CSS */ + 'div.wpforms-container-full .wpforms-form input[type=submit]:hover, + div.wpforms-container-full .wpforms-form input[type=submit]:focus, + div.wpforms-container-full .wpforms-form input[type=submit]:active, + div.wpforms-container-full .wpforms-form button[type=submit]:hover, + div.wpforms-container-full .wpforms-form button[type=submit]:focus, + div.wpforms-container-full .wpforms-form button[type=submit]:active, + div.wpforms-container-full .wpforms-form .wpforms-page-button:hover, + div.wpforms-container-full .wpforms-form .wpforms-page-button:active, + div.wpforms-container-full .wpforms-form .wpforms-page-button:focus { + border: none; + }'; + + wp_add_inline_style( 'oceanwp-style', $styles ); + } + + /** + * Apply fix for Checkboxes and Radio fields in the Twenty Twenty-One theme. + * + * @since 1.6.6 + */ + public function tt1_multiple_fields_fix() { + + wp_add_inline_style( + 'twenty-twenty-one-style', + /** @lang CSS */ + '@supports (-webkit-appearance: none) or (-moz-appearance: none) { + div.wpforms-container-full .wpforms-form input[type=checkbox] { + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + } + div.wpforms-container-full .wpforms-form input[type=radio] { + -webkit-appearance: radio; + -moz-appearance: radio; + } + div.wpforms-container-full .wpforms-form input[type=checkbox]:after, + div.wpforms-container-full .wpforms-form input[type=radio]:after { + content: none; + } + }' + ); + } + + /** + * Apply fix for Dropdown field arrow, when it disappeared from select in the Twenty Twenty-One theme. + * + * @since 1.6.8 + */ + public function tt1_dropdown_fix() { + + wp_add_inline_style( + 'twenty-twenty-one-style', + /** @lang CSS */ + 'div.wpforms-container-full form.wpforms-form select { + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: right var(--form--spacing-unit) top 60%; + padding-right: calc(var(--form--spacing-unit) * 2.5); + }' + ); + } + + /** + * Apply fix for Checkboxes and Radio fields width in the Twenty Twenty-One theme, when the user uses only base styles. + * + * @since 1.6.8 + */ + public function tt1_base_style_fix() { + + wp_add_inline_style( + 'twenty-twenty-one-style', + /** @lang CSS */ + '.wpforms-container .wpforms-field input[type=checkbox], + .wpforms-container .wpforms-field input[type=radio] { + width: 25px; + height: 25px; + } + .wpforms-container .wpforms-field input[type=checkbox] + label, + .wpforms-container .wpforms-field input[type=radio] + label { + vertical-align: top; + }' + ); + } + + /** + * Apply resize fix for iframe HTML element, when the next page was clicked in the Twenty Twenty theme. + * + * @since 1.6.6 + */ + public function tt_iframe_fix() { + + wp_add_inline_script( + 'twentytwenty-js', + /** @lang JavaScript */ + 'window.addEventListener( "load", function() { + + if ( typeof jQuery === "undefined" ) { + return; + } + + jQuery( document ).on( "wpformsPageChange wpformsShowConditionalsField", function() { + + if ( typeof twentytwenty === "undefined" || typeof twentytwenty.intrinsicRatioVideos === "undefined" || typeof twentytwenty.intrinsicRatioVideos.makeFit === "undefined" ) { + return; + } + + twentytwenty.intrinsicRatioVideos.makeFit(); + } ); + + jQuery( document ).on( "wpformsRichTextEditorInit", function( e, editor ) { + + jQuery( editor.container ).find( "iframe" ).addClass( "intrinsic-ignore" ); + } ); + } );' + ); + } + + /** + * Apply fix for the dropdown list in Twenty Twenty theme. + * + * @since 1.7.3 + */ + public function tt_dropdown_fix() { + + static $fixed = false; + + if ( $fixed ) { + return; + } + + ?> + + hooks(); + } + + /** + * Hooks. + * + * @since 1.6.3 + */ + public function hooks(): void { + + add_action( 'et_builder_ready', [ $this, 'register_module' ] ); + add_action( 'wp_enqueue_scripts', [ $this, 'frontend_styles' ], 12 ); + + if ( wp_doing_ajax() ) { + add_action( 'wp_ajax_wpforms_divi_preview', [ $this, 'preview' ] ); + } + + if ( $this->is_divi_builder() ) { + add_action( 'wp_enqueue_scripts', [ $this, 'builder_styles' ], 12 ); + add_action( 'wp_enqueue_scripts', [ $this, 'builder_scripts' ] ); + + add_filter( 'wpforms_global_assets', '__return_true' ); + add_filter( 'wpforms_frontend_missing_assets_error_js_disable', '__return_true', PHP_INT_MAX ); + + // Hide CAPTCHA badge in Divi Builder. + add_filter( 'wpforms_frontend_recaptcha_disable', '__return_true' ); + } + } + + /** + * Determine if a current page is opened in the Divi Builder. + * + * @since 1.6.3 + * + * @return bool + */ + private function is_divi_builder(): bool { + + return ! empty( $_GET['et_fb'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended + } + + + /** + * Get the current style name. + * + * Overwrite styles for the Divi Builder. + * + * @since 1.6.3 + * + * @return string + */ + public function get_current_styles_name(): string { + + $disable_css = absint( wpforms_setting( 'disable-css', 1 ) ); + + if ( $disable_css === 3 ) { + return ''; + } + + $styles_name = wpforms_get_render_engine() . '-'; + $styles_name .= $disable_css === 1 ? 'full' : 'base'; + + return $styles_name; + } + + /** + * Determine if the Divi Builder plugin is loaded. + * + * @since 1.6.3 + * + * @return bool + */ + protected function is_divi_plugin_loaded(): bool { + + return self::is_divi_loaded(); + } + + /** + * Helper method to check if Divi plugin is loaded. + * + * @since 1.8.5 + * + * @return bool + */ + public static function is_divi_loaded(): bool { + + if ( ! is_singular() ) { + return false; + } + + return defined( 'ET_BUILDER_PLUGIN_ACTIVE' ) || defined( 'ET_BUILDER_THEME' ); + } + + /** + * WPForms frontend styles special for Divi. + * + * @since 1.8.1 + */ + protected function divi_frontend_styles() { + + $min = wpforms_get_min_suffix(); + + $styles_name = $this->get_current_styles_name(); + + wp_enqueue_style( + 'wpforms-choicesjs', + WPFORMS_PLUGIN_URL . "assets/css/integrations/divi/choices{$min}.css", + [], + WPForms_Field_Select::CHOICES_VERSION + ); + + if ( empty( $styles_name ) ) { + return; + } + + // Load CSS per global setting. + wp_register_style( + "wpforms-divi-{$styles_name}", + WPFORMS_PLUGIN_URL . "assets/css/integrations/divi/wpforms-{$styles_name}{$min}.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Register frontend styles. + * Required for the plugin version of builder only. + * + * @since 1.6.3 + */ + public function frontend_styles() { + + if ( ! $this->is_divi_plugin_loaded() ) { + return; + } + + if ( $this->allow_frontend_styles() ) { + $this->divi_frontend_styles(); + } + } + + /** + * Load styles. + * + * @since 1.6.3 + */ + public function builder_styles() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-integrations', + WPFORMS_PLUGIN_URL . "assets/css/admin-integrations{$min}.css", + null, + WPFORMS_VERSION + ); + + $this->divi_frontend_styles(); + } + + /** + * Load scripts. + * + * @since 1.6.3 + */ + public function builder_scripts(): void { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-divi', + WPFORMS_PLUGIN_URL . "assets/js/integrations/divi/formselector.es5{$min}.js", + [ 'react', 'react-dom' ], + WPFORMS_VERSION, + true + ); + + wp_localize_script( + 'wpforms-divi', + 'wpforms_divi_builder', + [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpforms_divi_builder' ), + 'placeholder' => WPFORMS_PLUGIN_URL . 'assets/images/wpforms-logo.svg', + 'block_empty_url' => WPFORMS_PLUGIN_URL . 'assets/images/empty-states/no-forms.svg', + 'block_empty_text' => wp_kses( + __( 'You can use WPForms to build contact forms, surveys, payment forms, and more with just a few clicks.', 'wpforms-lite' ), + [ + 'b' => [], + ] + ), + 'get_started_url' => esc_url( admin_url( 'admin.php?page=wpforms-builder' ) ), + 'get_started_text' => esc_html__( 'Get Started', 'wpforms-lite' ), + 'guide_url' => esc_url( wpforms_utm_link( 'https://wpforms.com/docs/creating-first-form/', 'Divi', 'Create Your First Form Documentation' ) ), + 'guide_text' => esc_html__( 'comprehensive guide', 'wpforms-lite' ), + 'help_text' => esc_html__( 'Need some help? Check out our', 'wpforms-lite' ), + ] + ); + } + + /** + * Register module. + * + * @since 1.6.3 + * + * @noinspection PhpExpressionResultUnusedInspection + */ + public function register_module(): void { + + if ( ! class_exists( 'ET_Builder_Module' ) ) { + return; + } + + new WPFormsSelector(); + } + + /** + * Ajax handler for the form preview. + * + * @since 1.6.3 + */ + public function preview(): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + check_ajax_referer( 'wpforms_divi_builder', 'nonce' ); + + $form_id = absint( filter_input( INPUT_POST, 'form_id', FILTER_SANITIZE_NUMBER_INT ) ); + + if ( $form_id ) { + $form_obj = wpforms()->obj( 'form' ); + $form = $form_obj ? $form_obj->get( $form_id ) : null; + $author = $form ? (int) $form->post_author : 0; + $cap = $author === get_current_user_id() ? 'wpforms_view_own_forms' : 'wpforms_view_others_forms'; + + $has_permission = wpforms_current_user_can( $cap, $form_id ); + } else { + $has_permission = wpforms_current_user_can( [ 'wpforms_view_own_forms', 'wpforms_view_others_forms' ] ); + } + + if ( ! $has_permission ) { + wp_send_json_error( + esc_html__( 'You do not have permission to preview form.', 'wpforms-lite' ) + ); + } + + // Disable Anti Spam v3 honeypot. + add_filter( 'wpforms_forms_anti_spam_v3_is_honeypot_enabled', '__return_false' ); + + add_filter( + 'wpforms_frontend_container_class', + static function ( $classes ) { + + $classes[] = 'wpforms-gutenberg-form-selector'; + $classes[] = 'wpforms-container-full'; + + return $classes; + } + ); + + add_action( + 'wpforms_frontend_output', + static function () { + + echo '
              '; + }, + 3 + ); + + add_action( + 'wpforms_frontend_output', + static function () { + + echo '
              '; + + // This empty image is needed to execute JS code that triggers the custom event. + // Unfortunately, + prepare_column_headers(); + $this->prepare_items(); + + $slug = $this->_args['plural']; + + echo '
              '; + echo '
              '; + wp_nonce_field( 'wpforms-table-' . $slug ); + $this->header(); + $this->display(); + echo '
              '; + echo '
              '; + } + + /** + * Get total logs. + * + * @since 1.6.3 + * + * @return int + */ + public function get_total() { + + return $this->repository->get_total(); + } + + /** + * Gets the screen per_page option name. + * + * @since 1.7.5 + * + * @return string + */ + private function get_per_page_option_name() { + + return str_replace( '-', '_', $this->screen->id ) . '_per_page'; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Logger/Log.php b/wp-content/plugins/wpforms-lite/src/Logger/Log.php new file mode 100755 index 00000000..e2424e71 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Logger/Log.php @@ -0,0 +1,231 @@ +repository = new Repository(); + + add_action( 'shutdown', [ $this->repository, 'save' ] ); + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + add_action( 'wp_ajax_wpforms_get_log_record', [ $this, 'get_record' ] ); + } + + /** + * Enqueue styles. + * + * @since 1.6.3 + */ + public function enqueue_styles() { + + if ( ! $this->is_logger_page() ) { + return; + } + + $min = wpforms_get_min_suffix(); + + wp_enqueue_style( + 'wpforms-tools-logger', + WPFORMS_PLUGIN_URL . "assets/css/logger{$min}.css", + [], + WPFORMS_VERSION + ); + } + + /** + * Enqueue styles. + * + * @since 1.6.3 + */ + public function enqueue_scripts() { + + if ( ! $this->is_logger_page() ) { + return; + } + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-tools-logger', + WPFORMS_PLUGIN_URL . "assets/js/admin/logger/logger{$min}.js", + [ 'jquery', 'jquery-confirm', 'wp-util' ], + WPFORMS_VERSION, + true + ); + } + + /** + * Get log types. + * + * @since 1.6.3 + * + * @return array + */ + public static function get_log_types() { + + return [ + 'conditional_logic' => esc_html__( 'Conditional Logic', 'wpforms-lite' ), + 'entry' => esc_html__( 'Entries', 'wpforms-lite' ), + 'error' => esc_html__( 'Errors', 'wpforms-lite' ), + 'log' => esc_html__( 'Log', 'wpforms-lite' ), + 'payment' => esc_html__( 'Payment', 'wpforms-lite' ), + 'provider' => esc_html__( 'Providers', 'wpforms-lite' ), + 'security' => esc_html__( 'Security', 'wpforms-lite' ), + 'spam' => esc_html__( 'Spam', 'wpforms-lite' ), + 'translation' => esc_html__( 'Translation', 'wpforms-lite' ), + ]; + } + + /** + * Determine if it is a Logs page. + * + * @since 1.6.3 + * + * @return bool + */ + private function is_logger_page() { + + return wpforms_is_admin_page( 'tools', 'logs' ); + } + + /** + * Create new record. + * + * @since 1.6.3 + * + * @param string $title Record title. + * @param string $message Record message. + * @param array|string $types Array, string, or string separated by comma types. + * @param int $form_id Record form ID. + * @param int $entry_id Record entry ID. + * @param int $user_id Record user ID. + */ + public function add( $title, $message, $types, $form_id = 0, $entry_id = 0, $user_id = 0 ) { + + $this->repository->add( $title, $message, $types, $form_id, $entry_id, $user_id ); + } + + /** + * Check if the database table exists. + * Used in \WPForms_Install::maybe_create_tables() during plugin installation. + * + * @since 1.8.7 + * + * @return bool + */ + public function table_exists(): bool { + + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + return $this->repository->table_exists(); + } + + /** + * Create table for logs. + * + * @since 1.6.3 + */ + public function create_table() { + + if ( $this->table_exists() ) { + return; + } + + $this->repository->create_table(); + } + + /** + * Get ListView. + * + * @since 1.6.3 + * + * @return ListTable + */ + public function get_list_table() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( ! $this->list_table ) { + $this->list_table = new ListTable( $this->repository ); + + add_action( 'admin_print_scripts', [ $this->list_table, 'popup_template' ] ); + } + + return $this->list_table; + } + + /** + * Json config for detail information about log record. + * + * @since 1.6.3 + */ + public function get_record() { + + if ( + ! check_ajax_referer( 'wpforms-admin', 'nonce', false ) || + ! wpforms_current_user_can() + ) { + wp_send_json_error( esc_html__( 'You do not have permission.', 'wpforms-lite' ) ); + } + + $id = filter_input( INPUT_GET, 'recordId', FILTER_VALIDATE_INT ); + + if ( ! $id ) { + wp_send_json_error( esc_html__( 'Record ID not found', 'wpforms-lite' ), 404 ); + } + + $item = $this->repository->record( $id ); + + if ( $item === null ) { + wp_send_json_error( esc_html__( 'No such record.', 'wpforms-lite' ), 404 ); + } + + wp_send_json_success( + [ + 'ID' => absint( $item->get_id() ), + 'title' => esc_html( $item->get_title() ), + 'message' => wp_kses( $item->get_message(), [ 'pre' => [] ] ), + 'types' => esc_html( implode( ', ', $item->get_types( 'label' ) ) ), + 'create_at' => esc_html( $item->get_date( 'full' ) ), + 'form_id' => absint( $item->get_form_id() ), + 'entry_id' => absint( $item->get_entry_id() ), + 'user_id' => absint( $item->get_user_id() ), + 'form_url' => admin_url( sprintf( 'admin.php?page=wpforms-builder&view=fields&form_id=%d', absint( $item->get_form_id() ) ) ), + 'entry_url' => admin_url( sprintf( 'admin.php?page=wpforms-entries&view=details&entry_id=%d', absint( $item->get_entry_id() ) ) ), + 'user_url' => esc_url( get_edit_user_link( $item->get_user_id() ) ), + ] + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Logger/Record.php b/wp-content/plugins/wpforms-lite/src/Logger/Record.php new file mode 100755 index 00000000..4968edfa --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Logger/Record.php @@ -0,0 +1,268 @@ +id = $id; + $this->title = $title; + $this->message = $message; + $this->types = $types; + $this->create_at = strtotime( $create_at ); + $this->form_id = $form_id; + $this->entry_id = $entry_id; + $this->user_id = $user_id; + } + + /** + * Get record ID. + * + * @since 1.6.3 + * + * @return int + */ + public function get_id() { + + return $this->id; + } + + /** + * Get record title. + * + * @since 1.6.3 + * + * @return string + */ + public function get_title() { + + return $this->title; + } + + /** + * Get record message. + * + * @since 1.6.3 + * + * @return string + */ + public function get_message() { + + return $this->message; + } + + /** + * Get record types. + * + * @since 1.6.3 + * + * @param string $view Keys or labels. + * + * @return array + */ + public function get_types( $view = 'key' ) { + + $this->types = is_array( $this->types ) ? $this->types : explode( ',', $this->types ); + + if ( $view === 'label' ) { + return array_intersect_key( + Log::get_log_types(), + array_flip( $this->types ) + ); + } + + return $this->types; + } + + /** + * Get date of creating record. + * + * @since 1.6.3 + * + * @param string $format Date format full|short|default sql format. + * + * @return string + */ + public function get_date( $format = 'short' ) { + + switch ( $format ) { + case 'short': + $date = wpforms_date_format( $this->create_at, '', true ); + break; + + case 'full': + $date = wpforms_datetime_format( $this->create_at, '', true ); + break; + + case 'sql': + $date = wpforms_datetime_format( $this->create_at, 'Y-m-d H:i:s' ); + break; + + case 'sql-local': + $date = wpforms_datetime_format( $this->create_at, 'Y-m-d H:i:s', true ); + break; + + default: + $date = ''; + break; + } + + return $date; + } + + /** + * Get form ID. + * + * @since 1.6.3 + * + * @return int + */ + public function get_form_id() { + + return $this->form_id; + } + + /** + * Get entry ID. + * + * @since 1.6.3 + * + * @return int + */ + public function get_entry_id() { + + return $this->entry_id; + } + + /** + * Get user ID. + * + * @since 1.6.3 + * + * @return int + */ + public function get_user_id() { + + return $this->user_id; + } + + /** + * Create new record. + * + * @since 1.6.3 + * + * @param string $title Record title. + * @param string $message Record message. + * @param array|string $types Array, string, or string separated by commas types. + * @param int $form_id Record form ID. + * @param int $entry_id Record entry ID. + * @param int $user_id Record user ID. + * + * @return Record + */ + public static function create( $title, $message, $types, $form_id = 0, $entry_id = 0, $user_id = 0 ) { + + return new Record( + 0, + sanitize_text_field( $title ), + wp_kses( $message, [ 'pre' => [] ] ), + $types, + gmdate( 'Y-m-d H:i:s' ), + absint( $form_id ), + absint( $entry_id ), + absint( $user_id ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Logger/RecordQuery.php b/wp-content/plugins/wpforms-lite/src/Logger/RecordQuery.php new file mode 100755 index 00000000..47e5903a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Logger/RecordQuery.php @@ -0,0 +1,80 @@ +get_results( + $this->build_query( $limit, $offset, $search, $type ) + ); + //phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + } + + /** + * Build query. + * + * @since 1.6.3 + * + * @param int $limit Query limit of records. + * @param int $offset Offset of records. + * @param string $search Search. + * @param string $type Type of records. + * + * @return string + */ + private function build_query( $limit, $offset = 0, $search = '', $type = '' ) { + + global $wpdb; + + $sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM ' . Repository::get_table_name(); + $where = []; + + if ( ! empty( $search ) ) { + $where[] = $wpdb->prepare( + '`title` REGEXP %s OR `message` REGEXP %s', + $search, + $search + ); + } + + if ( ! empty( $type ) ) { + $where[] = $wpdb->prepare( + '`types` REGEXP %s', + $type + ); + } + + if ( $where ) { + $sql .= ' WHERE ' . implode( ' AND ', $where ); + } + + $sql .= ' ORDER BY `create_at` DESC, `id` DESC'; + $sql .= $wpdb->prepare( ' LIMIT %d, %d', absint( $offset ), absint( $limit ) ); + + return $sql; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Logger/Records.php b/wp-content/plugins/wpforms-lite/src/Logger/Records.php new file mode 100755 index 00000000..7f3b2295 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Logger/Records.php @@ -0,0 +1,134 @@ +valid() ? $this->list[ $this->iterator_position ] : null; + } + + /** + * Move forward to next element. + * + * @since 1.6.3 + */ + #[\ReturnTypeWillChange] + public function next() { + + ++ $this->iterator_position; + } + + /** + * Return the key of the current element. + * + * @since 1.6.3 + * + * @return int + */ + #[\ReturnTypeWillChange] + public function key() { + + return $this->iterator_position; + } + + /** + * Checks if current position is valid. + * + * @since 1.6.3 + * + * @return bool + */ + #[\ReturnTypeWillChange] + public function valid() { + + return isset( $this->list[ $this->iterator_position ] ); + } + + /** + * Rewind the Iterator to the first element. + * + * @since 1.6.3 + */ + #[\ReturnTypeWillChange] + public function rewind() { + + $this->iterator_position = 0; + } + + /** + * Count number of Record in a Queue. + * + * @since 1.6.3 + * + * @return int + */ + #[\ReturnTypeWillChange] + public function count() { + + return count( $this->list ); + } + + /** + * Push record to list. + * + * @since 1.6.3 + * + * @param \WPForms\Logger\Record $record Record. + */ + #[\ReturnTypeWillChange] + public function push( $record ) { + + if ( ! is_a( $record, '\WPForms\Logger\Record' ) ) { + return; + } + $this->list[] = $record; + } + + /** + * Clear collection. + * + * @since 1.6.3 + */ + #[\ReturnTypeWillChange] + public function clear() { + + $this->list = []; + $this->iterator_position = 0; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Logger/Repository.php b/wp-content/plugins/wpforms-lite/src/Logger/Repository.php new file mode 100755 index 00000000..f907066f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Logger/Repository.php @@ -0,0 +1,289 @@ +full_total = false; + $this->records_query = new RecordQuery(); + $this->records = new Records(); + } + + /** + * Get log table name. + * + * @since 1.6.3 + * + * @return string + */ + public static function get_table_name(): string { + + global $wpdb; + + return $wpdb->prefix . 'wpforms_logs'; + } + + /** + * Create table in the database. + * + * @since 1.6.3 + */ + public function create_table() { + + global $wpdb; + + $table = self::get_table_name(); + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE $table ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + title VARCHAR(255) NOT NULL, + message LONGTEXT NOT NULL, + types VARCHAR(255) NOT NULL, + create_at DATETIME NOT NULL, + form_id BIGINT(20), + entry_id BIGINT(20), + user_id BIGINT(20), + PRIMARY KEY (id) + ) $charset_collate;"; + + dbDelta( $sql ); + } + + /** + * Create new record. + * + * @since 1.6.3 + * + * @param string $title Record title. + * @param string $message Record message. + * @param array|string $types Array, string, or string separated by comma types. + * @param int $form_id Record form ID. + * @param int $entry_id Record entry ID. + * @param int $user_id Record user ID. + */ + public function add( $title, $message, $types, $form_id, $entry_id, $user_id ) { + + $this->records->push( + Record::create( $title, $message, $types, $form_id, $entry_id, $user_id ) + ); + } + + /** + * Get records. + * + * @since 1.6.3 + * + * @param int $limit Query limit of records. + * @param int $offset Offset of records. + * @param string $search Search. + * @param string $type Type of records. + * + * @return Records + */ + public function records( $limit, $offset = 0, $search = '', $type = '' ) { + + $data = $this->records_query->get( $limit, $offset, $search, $type ); + $this->full_total = true; + $records = new Records(); + + // As we got raw data, we need to convert to Record. + foreach ( $data as $row ) { + $records->push( + $this->prepare_record( $row ) + ); + } + + return $records; + } + + /** + * Get record. + * + * @since 1.6.3 + * + * @param int $id Record ID. + * + * @return Record|null + */ + public function record( $id ) { + + global $wpdb; + //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $item = $wpdb->get_row( + $wpdb->prepare( + 'SELECT * FROM ' . self::get_table_name() . ' WHERE id = %d', //phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + absint( $id ) + ) + ); + + if ( $item ) { + $item = $this->prepare_record( $item ); + } + + return $item; + } + + /** + * Create record from DB row. + * + * @since 1.6.3 + * + * @param object $row Row from DB. + * + * @return Record + */ + private function prepare_record( $row ) { + + return new Record( + absint( $row->id ), + $row->title, + $row->message, + $row->types, + $row->create_at, + absint( $row->form_id ), + absint( $row->entry_id ), + absint( $row->user_id ) + ); + } + + /** + * Save records to the database. + * + * @since 1.6.3 + */ + public function save() { + + global $wpdb; + + // We can't use the empty function because it doesn't work with a Countable object. + if ( ! count( $this->records ) ) { + return; + } + + $sql = 'INSERT INTO ' . self::get_table_name() . ' ( `id`, `title`, `message`, `types`, `create_at`, `form_id`, `entry_id`, `user_id` ) VALUES '; + + foreach ( $this->records as $record ) { + $sql .= $wpdb->prepare( + '( NULL, %s, %s, %s, %s, %d, %d, %d ),', + $record->get_title(), + $record->get_message(), + implode( ',', $record->get_types() ), + $record->get_date( 'sql' ), + $record->get_form_id(), + $record->get_entry_id(), + $record->get_user_id() + ); + } + + $sql = rtrim( $sql, ',' ); + + //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( $sql ); + //phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + wp_cache_delete( self::CACHE_TOTAL_KEY ); + } + + /** + * Check if the database table exists. + * + * @since 1.6.4 + * + * @return bool + */ + public function table_exists() { + + return DB::table_exists( self::get_table_name() ); + } + + /** + * Get total count of logs. + * + * @since 1.6.3 + * + * @return int + */ + public function get_total() { + + global $wpdb; + + $total = wp_cache_get( self::CACHE_TOTAL_KEY ); + + if ( ! $total ) { + //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared + $total = $this->full_total ? $wpdb->get_var( 'SELECT FOUND_ROWS()' ) : $wpdb->get_var( 'SELECT COUNT( ID ) FROM ' . self::get_table_name() ); + //phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared + wp_cache_set( self::CACHE_TOTAL_KEY, $total, 'wpforms', DAY_IN_SECONDS ); + } + + return absint( $total ); + } + + /** + * Clear all records in the Database. + * + * @since 1.6.3 + */ + public function clear_all() { + + global $wpdb; + + //phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( 'TRUNCATE TABLE ' . self::get_table_name() ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Base.php b/wp-content/plugins/wpforms-lite/src/Migrations/Base.php new file mode 100755 index 00000000..1ecea41a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Base.php @@ -0,0 +1,512 @@ +reflector = new ReflectionClass( $this ); + } + + /** + * Class init. + * + * @since 1.7.5 + */ + public function init(): void { + + if ( ! $this->is_allowed() ) { + return; + } + + $this->maybe_convert_migration_option(); + $this->hooks(); + } + + /** + * General hooks. + * + * @since 1.7.5 + */ + protected function hooks(): void { + + $priority = $this->is_core_plugin() ? - 9999 : 100; + + add_action( 'wpforms_loaded', [ $this, 'migrate' ], $priority ); + add_action( 'wpforms_loaded', [ $this, 'update_versions' ], $priority + 1 ); + } + + /** + * Run the migrations of the core plugin for a specific version. + * + * @since 1.7.5 + * + * @noinspection NotOptimalIfConditionsInspection + */ + public function migrate(): void { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh + + $classes = $this->get_upgrade_classes(); + $namespace = $this->reflector->getNamespaceName() . '\\'; + + foreach ( $classes as $class ) { + $upgrade_version = $this->get_upgrade_version( $class ); + $plugin_name = $this->get_plugin_name( $class ); + $class = $namespace . $class; + + if ( + ( isset( $this->migrated[ $upgrade_version ] ) && $this->migrated[ $upgrade_version ] >= 0 ) || + version_compare( $upgrade_version, self::CURRENT_VERSION, '>' ) || + ! class_exists( $class ) + ) { + continue; + } + + $this->maybe_create_tables(); + + if ( ! isset( $this->migrated[ $upgrade_version ] ) ) { + $this->migrated[ $upgrade_version ] = self::STARTED; + + $this->log( sprintf( 'Migration of %1$s to %2$s started.', $plugin_name, $upgrade_version ) ); + } + + // Run upgrade. + $migrated = ( new $class( $this ) )->run(); + + // Some migration methods can be called several times to support AS action, + // so do not log their completion here. + if ( $migrated === null ) { + continue; + } + + $this->migrated[ $upgrade_version ] = $migrated ? time() : self::FAILED; + + $this->log_migration_message( $migrated, $plugin_name, $upgrade_version ); + } + } + + /** + * If an upgrade has occurred, update a version option in the database. + * + * @since 1.7.5 + */ + public function update_versions(): void { + + $this->update_previous_core_version(); + + // Retrieve the last migrated versions. + $last_migrated = get_option( static::MIGRATED_OPTION_NAME, [] ); + $migrated = array_merge( $last_migrated, $this->migrated ); + + /** + * Store the current version upgrade timestamp even if there were no migrations to it. + * We need it in wpforms_get_upgraded_timestamp() for further usage in Event Driven Plugin Notifications. + */ + $migrated[ self::CURRENT_VERSION ] = $migrated[ self::CURRENT_VERSION ] ?? time(); + + uksort( $last_migrated, 'version_compare' ); + uksort( $migrated, 'version_compare' ); + + if ( $migrated === $last_migrated ) { + return; + } + + update_option( static::MIGRATED_OPTION_NAME, $migrated ); + + $fully_completed = array_reduce( + $migrated, + static function ( $carry, $status ) { + + return $carry && ( $status >= 0 ); + }, + true + ); + + if ( ! $fully_completed ) { + return; + } + + $this->log( + sprintf( 'Migration of %1$s to %2$s is fully completed.', static::PLUGIN_NAME, self::CURRENT_VERSION ) + ); + } + + /** + * Update previous core version. + * + * @since 1.9.8 + * + * @return void + */ + private function update_previous_core_version(): void { + + if ( ! $this->is_core_plugin() ) { + return; + } + + // Retrieve the last migrated versions. + $last_migrated = get_option( static::MIGRATED_OPTION_NAME, [] ); + $previous_core_version = $this->get_max_version( $last_migrated ); + + if ( + $previous_core_version === self::INITIAL_FAKE_VERSION || + version_compare( $previous_core_version, self::CURRENT_VERSION, '>=' ) + ) { + return; + } + + // Store the previous core version in the option. + update_option( self::PREVIOUS_CORE_VERSION_OPTION_NAME, $previous_core_version ); + + /** + * Fires after the core plugin has been upgraded. + * Please note: some of the migrations that run via Active Scheduler can be not completed yet. + * + * @since 1.8.8 + * + * @param string $previous_core_version The core version from which the plugin was upgraded. + * @param Base $migration_obj The migration class instance. + */ + do_action( 'wpforms_migrations_base_core_upgraded', $previous_core_version, $this ); + } + + /** + * Get upgrade classes. + * + * @since 1.7.5 + * + * @return string[] + */ + protected function get_upgrade_classes(): array { + + $classes = static::UPGRADE_CLASSES; + + sort( $classes ); + + return $classes; + } + + /** + * Get an upgrade version from the class name. + * + * @since 1.7.5 + * + * @param string $class_name Class name. + * + * @return string + */ + public function get_upgrade_version( string $class_name ): string { + + // Find only the digits and underscores to get the version number. + if ( ! preg_match( '/(\d_?)+/', $class_name, $matches ) ) { + return ''; + } + + $raw_version = $matches[0]; + + if ( strpos( $raw_version, '_' ) ) { + // Modern notation: 1_10_0_3 means 1.10.0.3 version. + return str_replace( '_', '.', $raw_version ); + } + + // Legacy notation, with 1-digit subversion numbers: 1751 means 1.7.5.1 version. + return implode( '.', str_split( $raw_version ) ); + } + + /** + * Get a plugin /addon name. + * + * @since 1.7.5 + * + * @param string $class_name Upgrade class name. + * + * @return string + * @noinspection PhpUnusedParameterInspection + */ + protected function get_plugin_name( string $class_name ): string { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found + + return static::PLUGIN_NAME; + } + + /** + * Force log message to WPForms logger. + * + * @since 1.7.5 + * + * @param string $message The error message that should be logged. + */ + protected function log( string $message ): void { + + wpforms_log( + 'Migration', + $message, + [ + 'type' => 'log', + 'force' => true, + ] + ); + } + + /** + * Determine if migration is allowed. + * + * @since 1.7.5 + */ + private function is_allowed(): bool { + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( isset( $_GET['service-worker'] ) ) { + return false; + } + + return wp_doing_cron() || is_admin() || wpforms_doing_wp_cli(); + } + + /** + * Maybe create custom plugin tables. + * + * @since 1.7.6 + */ + public function maybe_create_tables(): void { + + if ( $this->tables_check_done ) { + /** + * We should do table check only once - when the first migration has been started. + * The DB::get_existing_custom_tables() without caching causes performance issue + * on huge multisite with thousands of tables. + */ + return; + } + + DB::create_custom_tables( true ); + + $this->tables_check_done = true; + } + + /** + * Maybe convert the migration option format. + * + * @since 1.7.5 + */ + private function maybe_convert_migration_option(): void { + + /** + * Retrieve the migration option and check its format. + * Old format: a string 'x.y.z' containing the last migrated version. + * New format: [ 'x.y.z' => {status}, 'x1.y1.z1' => {status}... ], + * where {status} is a migration status. + * Negative means some status (-1 for 'started' etc.), + * zero means completed earlier at an unknown time, + * positive means completion timestamp. + */ + $this->migrated = get_option( static::MIGRATED_OPTION_NAME ); + + // If the option is an array, it means that it is already converted to the new format. + if ( is_array( $this->migrated ) ) { + return; + } + + /** + * Convert the option to the new format. + * + * Old option names contained 'version', + * like 'wpforms_version', 'wpforms_version_lite', 'wpforms_stripe_version', etc. + * We preserve old options for downgrade cases. + * New option names should contain 'versions' and be like 'wpforms_versions', etc. + */ + $this->migrated = get_option( + str_replace( 'versions', 'version', static::MIGRATED_OPTION_NAME ) + ); + + $version = $this->migrated === false ? self::INITIAL_FAKE_VERSION : (string) $this->migrated; + $timestamp = $version === self::CURRENT_VERSION ? time() : 0; + $this->migrated = [ $version => $timestamp ]; + $max_version = $this->get_max_version( $this->migrated ); + + foreach ( $this->get_upgrade_classes() as $upgrade_class ) { + $upgrade_version = $this->get_upgrade_version( $upgrade_class ); + + if ( + ! isset( $this->migrated[ $upgrade_version ] ) && + version_compare( $upgrade_version, $max_version, '<' ) + ) { + $this->migrated[ $upgrade_version ] = 0; + } + } + + unset( $this->migrated[ self::INITIAL_FAKE_VERSION ] ); + + ksort( $this->migrated ); + + update_option( static::MIGRATED_OPTION_NAME, $this->migrated ); + } + + /** + * Get the max version. + * + * @since 1.7.5 + * + * @param array $versions Versions. + * + * @return string + */ + private function get_max_version( array $versions ): string { + + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + return array_reduce( + array_keys( $versions ), + static function ( $carry, $version ) { + + return version_compare( $version, $carry, '>' ) ? $version : $carry; + }, + self::INITIAL_FAKE_VERSION + ); + } + + /** + * Determine if it is the core plugin (Lite or Pro). + * + * @since 1.7.5 + * + * @return bool True if it is the core plugin. + */ + protected function is_core_plugin(): bool { + + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + return strpos( static::MIGRATED_OPTION_NAME, 'wpforms_versions' ) === 0; + } + + /** + * Log migration message. + * + * @since 1.8.2.3 + * + * @param bool $migrated Migration status. + * @param string $plugin_name Plugin name. + * @param string $upgrade_version Upgrade version. + * + * @return void + */ + private function log_migration_message( bool $migrated, string $plugin_name, string $upgrade_version ): void { + + $message = $migrated ? + sprintf( 'Migration of %1$s to %2$s completed.', $plugin_name, $upgrade_version ) : + sprintf( 'Migration of %1$s to %2$s failed.', $plugin_name, $upgrade_version ); + + $this->log( $message ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Migrations.php b/wp-content/plugins/wpforms-lite/src/Migrations/Migrations.php new file mode 100755 index 00000000..f97ec3ff --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Migrations.php @@ -0,0 +1,53 @@ +action = 'wpforms_process_migration_' . $short_class_name; + $this->status_option = $this->action . '_status'; + + parent::__construct( $this->action ); + } + + /** + * Get current task status. + * + * @since 1.9.5 + * + * @return string + */ + private function get_status(): string { + + return (string) get_option( $this->status_option ); + } + + /** + * Update task status. + * Use the constants self::START, self::IN_PROGRESS, self::COMPLETED. + * + * @since 1.9.5 + * + * @param string $status New status. + * + * @return void + */ + private function update_status( string $status ): void { + + update_option( $this->status_option, $status ); + } + + /** + * Initialize the task with all the proper checks. + * + * @since 1.9.5 + */ + public function init(): void { + + $status = $this->get_status(); + + if ( ! $status || $status === self::COMPLETED ) { + return; + } + + $this->set_task_properties(); + $this->hooks(); + + if ( $status !== self::START ) { + return; + } + + $this->update_status( self::IN_PROGRESS ); + + $this->init_migration(); + } + + /** + * Create a task. + * + * @param array $args Task arguments. + * + * @since 1.9.5 + * + * @return void + */ + protected function create_task( array $args = [] ): void { + + $tasks = wpforms()->obj( 'tasks' ); + + if ( ! $tasks ) { + wpforms_log( + 'Migration error', + [ + 'error' => "Object is not available: `null` returned by `wpforms()->obj( 'tasks' )`", + 'class' => static::class, + 'method' => __METHOD__, + ], + [ + 'type' => 'error', + 'force' => true, + ] + ); + + return; + } + + $tasks + ->create( $this->action ) + ->async() + ->params( ...$args ) + ->register(); + } + + /** + * Set task properties. + * + * @since 1.9.5 + * + * @return void + */ + abstract protected function set_task_properties(): void; + + /** + * Add hooks. + * + * @since 1.9.5 + */ + protected function hooks(): void { + + add_action( $this->action, [ $this, 'migrate' ] ); + add_action( 'action_scheduler_after_process_queue', [ $this, 'after_process_queue' ] ); + } + + /** + * Migrate an entry. + * + * @since 1.9.5 + * + * @param int $meta_id Action meta id. + * + * @noinspection PhpMissingParamTypeInspection + */ + public function migrate( $meta_id ): void { + + $params = ( new Meta() )->get( $meta_id ); + + if ( ! $params || ! isset( $params->data ) ) { + return; + } + + $this->process_migration( (array) $params->data ); + } + + /** + * Execute an async migration task. + * + * @since 1.9.5 + * + * @param array $data Migration data. + * + * @return void + */ + abstract protected function process_migration( array $data ): void; + + /** + * Set the status as completed after processing all queue action. + * + * @since 1.9.5 + * + * @return void + */ + public function after_process_queue(): void { + + $tasks = wpforms()->obj( 'tasks' ); + + if ( ! $tasks ) { + wpforms_log( + 'Migration error', + [ + 'error' => "Object is not available: `null` returned by `wpforms()->obj( 'tasks' )`", + 'class' => static::class, + 'method' => __METHOD__, + ], + [ + 'type' => 'error', + 'force' => true, + ] + ); + + return; + } + + if ( $tasks->is_scheduled( $this->action ) ) { + return; + } + + $this->finish_migration(); + } + + /** + * Finish migration. + * + * @since 1.9.5 + * + * @return void + */ + protected function finish_migration(): void { + + $this->update_status( self::COMPLETED ); + } + + /** + * Create migration tasks using the `create_task` method + * or `finish_migration` method to complete it. + * + * @since 1.9.5 + * + * @return void + */ + abstract protected function init_migration(): void; + + /** + * Determine if the task is completed. + * Remove the status option to allow running the task again. + * + * @since 1.9.5 + * + * @return bool True if a task is completed. + */ + public function is_completed(): bool { + + $status = $this->get_status(); + $is_completed = $status === self::COMPLETED; + + if ( $is_completed ) { + delete_option( $this->status_option ); + } + + return $is_completed; + } + + /** + * Maybe start the task. + * + * @since 1.9.5 + */ + public function maybe_start(): void { + + $status = $this->get_status(); + + if ( ! $status ) { + $this->update_status( self::START ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade159.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade159.php new file mode 100755 index 00000000..3b833545 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade159.php @@ -0,0 +1,39 @@ +obj( 'tasks_meta' ); + + if ( ! $meta ) { + return false; + } + + // Create the table if it doesn't exist. + if ( ! $meta->table_exists() ) { + $meta->create_table(); + } + + return true; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1672.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1672.php new file mode 100755 index 00000000..5fd189ba --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1672.php @@ -0,0 +1,45 @@ +obj( 'form' ); + + if ( ! $form_handler ) { + return false; + } + + $forms = $form_handler->get( + '', + [ + 'posts_per_page' => 1, + 'nopaging' => false, + 'fields' => 'ids', + 'update_post_meta_cache' => false, + ] + ); + + // At least 1 form exists - set the default value. + if ( ! empty( $forms ) ) { + add_option( 'wpforms_builder_opened_date', 0, '', 'no' ); + } + + return true; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade175.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade175.php new file mode 100755 index 00000000..b0eee106 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade175.php @@ -0,0 +1,93 @@ +as_tables_exist() ) { + return true; + } + + $group = Tasks::GROUP; + $sql = "SELECT DISTINCT a.args FROM {$wpdb->prefix}actionscheduler_actions a + JOIN {$wpdb->prefix}actionscheduler_groups g ON g.group_id = a.group_id + WHERE g.slug = '$group' AND a.status IN ( 'pending', 'in-progress' )"; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $results = $wpdb->get_results( $sql, 'ARRAY_A' ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + + $results = $results ? $results : []; + $meta_ids = []; + + foreach ( $results as $result ) { + $args = isset( $result['args'] ) ? json_decode( $result['args'], true ) : null; + + if ( $args && ! empty( $args['tasks_meta_id'] ) ) { + $meta_ids[] = $args['tasks_meta_id']; + } + } + + $table_name = Meta::get_table_name(); + $not_in = $meta_ids ? wpforms_wpdb_prepare_in( $meta_ids ) : '0'; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( "DELETE FROM $table_name WHERE id NOT IN ( $not_in )" ); + + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + + return true; + } + + /** + * Check whether AS tables exist. + * + * @since 1.7.6 + * + * @return bool + */ + private function as_tables_exist() { + + global $wpdb; + + $required_tables = [ + $wpdb->prefix . 'actionscheduler_actions', + $wpdb->prefix . 'actionscheduler_groups', + ]; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); + $intersect = array_values( array_intersect( $tables, $required_tables ) ); + + sort( $intersect ); + sort( $required_tables ); + + return $intersect === $required_tables; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1751.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1751.php new file mode 100755 index 00000000..75415b6b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1751.php @@ -0,0 +1,28 @@ +migrations ) )->run(); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade177.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade177.php new file mode 100755 index 00000000..80ff1a80 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade177.php @@ -0,0 +1,47 @@ +get_cache_dir(); + $templates_cache_dir = $cache_dir . 'templates/'; + + $this->set_cache_time( $cache_dir, 'addons.json', 'wpforms_admin_addons_cache_ttl' ); + $this->set_cache_time( $cache_dir, 'docs.json', 'wpforms_admin_builder_help_cache_ttl' ); + $this->set_cache_time( $cache_dir, 'templates.json', 'wpforms_admin_builder_templates_cache_ttl' ); + + $files = glob( $templates_cache_dir . '*.json' ); + + foreach ( $files as $filename ) { + $this->set_cache_time( $templates_cache_dir, basename( $filename ), 'wpforms_admin_builder_templates_cache_ttl' ); + } + + return true; + } + + /** + * Set cache time to transient. + * + * @since 1.8.2 + * + * @param string $cache_dir Cache directory. + * @param string $cache_file Cache filename. + * @param string $filter Filter name. + * + * @return void + */ + private function set_cache_time( $cache_dir, $cache_file, $filter ) { + + // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName, WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound + $cache_ttl = (int) apply_filters( $filter, WEEK_IN_SECONDS ); + $cache_file_path = $cache_dir . $cache_file; + $cache_modified_time = 0; + $transient = $cache_file; + $time = time(); + + if ( is_file( $cache_file_path ) && is_readable( $cache_file_path ) ) { + clearstatcache( true, $cache_file_path ); + + // On WPVIP and similar filesystems, filemtime() could return false. + $cache_modified_time = (int) filemtime( $cache_file_path ); + } + + if ( $cache_modified_time === 0 || $cache_modified_time + $cache_ttl <= $time ) { + // Do not set transient for non-existing or expired cache. + return; + } + + $expiration = $cache_modified_time + $cache_ttl - $time; + + Transient::set( $transient, $cache_modified_time, $expiration ); + } + + /** + * Get cache directory path. + * Copy of the CacheBase method. + * + * @since 1.8.2 + */ + private function get_cache_dir() { + + static $cache_dir; + + if ( $cache_dir ) { + /** + * Since wpforms_upload_dir() relies on hooks, and hooks can be added unpredictably, + * we need to cache the result of this method. + * Otherwise, it is the risk to save cache file to one dir and try to get from another. + */ + return $cache_dir; + } + + $upload_dir = wpforms_upload_dir(); + $upload_path = ! empty( $upload_dir['path'] ) + ? trailingslashit( wp_normalize_path( $upload_dir['path'] ) ) + : trailingslashit( WP_CONTENT_DIR ) . 'uploads/wpforms/'; + + $cache_dir = $upload_path . 'cache/'; + + return $cache_dir; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade183.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade183.php new file mode 100755 index 00000000..7a8accf5 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade183.php @@ -0,0 +1,33 @@ +run_async( IconChoicesFontAwesomeUpgradeTask::class ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade184.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade184.php new file mode 100755 index 00000000..0b7836eb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade184.php @@ -0,0 +1,47 @@ +set_webhooks_settings(); + + return $this->run_async( WebhooksAutoConfigurationTask::class ); + } + + /** + * Set Stripe webhooks settings. + * + * @since 1.8.4 + */ + private function set_webhooks_settings() { + + $settings = (array) get_option( 'wpforms_settings', [] ); + + // Enable Stripe webhooks by default if account is connected. + if ( ! isset( $settings['stripe-webhooks-enabled'] ) && Helpers::has_stripe_keys() ) { + $settings['stripe-webhooks-enabled'] = true; + + update_option( 'wpforms_settings', $settings ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade186.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade186.php new file mode 100755 index 00000000..98b872e1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade186.php @@ -0,0 +1,27 @@ +run_async( DomainAutoRegistrationTask::class ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade187.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade187.php new file mode 100755 index 00000000..1ac571fe --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade187.php @@ -0,0 +1,71 @@ +update_templates_cache() && $this->maybe_create_logs_table(); + $async_result = $this->run_async( StripeLinkSubscriptionsTask::class ); + + return $async_result === null ? null : $sync_result && $async_result; + } + + /** + * Update templates' cache. + * + * @since 1.8.7 + * + * @return bool + */ + private function update_templates_cache(): bool { + + $templates_cache = new TemplatesCache(); + + $templates_cache->init(); + $templates_cache->update(); + + return true; + } + + /** + * Maybe create logs' table. + * Previously, logs' table was created dynamically on the first access to the Tools->Logs admin page. + * As from 1.8.7, we create it only once during the activation of the plugin. + * So, the table may not exist, and we must maybe create it during migration to 1.8.7. + * + * @since 1.8.7 + * + * @return bool + */ + private function maybe_create_logs_table(): bool { + + $log = wpforms()->obj( 'log' ); + + if ( ! $log ) { + return false; + } + + $log->create_table(); + + return true; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_1.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_1.php new file mode 100755 index 00000000..ebf08d07 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_1.php @@ -0,0 +1,57 @@ +clean_summaries_cron_event(); + + $notifications_option_key = 'wpforms_notifications'; + $notifications = get_option( $notifications_option_key, [] ); + + if ( empty( $notifications['events'] ) ) { + return true; + } + + $notifications['events'] = []; + + update_option( 'wpforms_notifications', $notifications ); + + return true; + } + + /** + * Clean summaries and entries count cron events, + * Since the 1.9.1 release these cron events recurrences have been changed to single event. + * The events will be recreated on the next page load. + * + * @since 1.9.1 + */ + private function clean_summaries_cron_event() { + + if ( wp_next_scheduled( 'wpforms_weekly_entries_count_cron' ) ) { + wp_clear_scheduled_hook( 'wpforms_weekly_entries_count_cron' ); + } + + if ( wp_next_scheduled( 'wpforms_email_summaries_cron' ) ) { + wp_clear_scheduled_hook( 'wpforms_email_summaries_cron' ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_2.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_2.php new file mode 100755 index 00000000..27015d13 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_2.php @@ -0,0 +1,47 @@ +set_webhooks_settings(); + + return $this->run_async( WebhooksAutoConfigurationTask::class ); + } + + /** + * Set Stripe webhooks settings. + * + * @since 1.9.2 + */ + private function set_webhooks_settings() { + + $settings = (array) get_option( 'wpforms_settings', [] ); + + // Enable Stripe webhooks by default if account is connected. + if ( ! isset( $settings['stripe-webhooks-enabled'] ) && Helpers::has_stripe_keys() ) { + $settings['stripe-webhooks-enabled'] = true; + + update_option( 'wpforms_settings', $settings ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_7.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_7.php new file mode 100755 index 00000000..8e002177 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_7.php @@ -0,0 +1,24 @@ +obj( 'splash_cache' )->update( true ); + + return true; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_8_6.php b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_8_6.php new file mode 100755 index 00000000..4e084102 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/Upgrade1_9_8_6.php @@ -0,0 +1,108 @@ +check_wpconsent_activation( $activated_plugins ); + $this->check_sugar_calendar_activation( $activated_plugins ); + $this->check_duplicator_activation( $activated_plugins ); + $this->check_uncanny_automator_activation( $activated_plugins ); + + add_option( 'wpforms_rotation_activated_plugins', $activated_plugins ); + + return true; + } + + /** + * Check WPConsent plugin activation time. + * + * @since 1.9.8.6 + * + * @param array $activated_plugins Reference to activated plugins array. + */ + private function check_wpconsent_activation( array &$activated_plugins ): void { + + $wpconsent = get_option( 'wpconsent_activated' ); + + $wpconsent_time = $wpconsent['wpconsent'] ?? null; + + if ( empty( $wpconsent_time ) ) { + $wpconsent_time = $wpconsent['wpconsent_pro'] ?? null; + } + + if ( ! empty( $wpconsent_time ) ) { + $activated_plugins['wpconsent'] = $wpconsent_time; + } + } + + /** + * Check Sugar Calendar plugin activation time. + * + * @since 1.9.8.6 + * + * @param array $activated_plugins Reference to activated plugins array. + */ + private function check_sugar_calendar_activation( array &$activated_plugins ): void { + + $sugar_calendar_activated_time = get_option( 'sugar_calendar_activated_time' ); + + if ( ! empty( $sugar_calendar_activated_time ) ) { + $activated_plugins['sugar-calendar'] = (int) $sugar_calendar_activated_time; + } + } + + /** + * Check Duplicator plugin activation time. + * + * @since 1.9.8.6 + * + * @param array $activated_plugins Reference to activated plugins array. + */ + private function check_duplicator_activation( array &$activated_plugins ): void { + + $duplicator_install_info = get_option( 'duplicator_install_info' ); + + $duplicator_time = $duplicator_install_info['time'] ?? null; + + if ( empty( $duplicator_time ) ) { + $duplicator_pro_install_info = get_option( 'duplicator_pro_install_info' ); + + $duplicator_time = $duplicator_pro_install_info['time'] ?? null; + } + + if ( ! empty( $duplicator_time ) ) { + $activated_plugins['duplicator'] = $duplicator_time; + } + } + + /** + * Check Uncanny Automator plugin activation time. + * + * @since 1.9.8.6 + * + * @param array $activated_plugins Reference to activated plugins array. + */ + private function check_uncanny_automator_activation( array &$activated_plugins ): void { + + $uncanny_automator_v6_options_migrated = get_option( 'uncanny_automator_v6_options_migrated' ); + + if ( ! empty( $uncanny_automator_v6_options_migrated ) ) { + $activated_plugins['uncanny-automator'] = (int) $uncanny_automator_v6_options_migrated; + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Migrations/UpgradeBase.php b/wp-content/plugins/wpforms-lite/src/Migrations/UpgradeBase.php new file mode 100755 index 00000000..66f7b980 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Migrations/UpgradeBase.php @@ -0,0 +1,148 @@ +migrations = $migrations; + } + + /** + * Run upgrade. + * + * @since 1.7.5 + * + * @return bool|null Upgrade result: + * true - the upgrade completed successfully, + * false - in the case of failure, + * null - upgrade started but not yet finished (background task). + */ + abstract public function run(); + + /** + * Run the async upgrade via an Action Scheduler (AS) task. + * The AS task has to support STATUS option with START, IN_PROGRESS, and COMPLETED values. + * Also, the AS task must have the init() method. + * + * @since 1.7.5 + * + * @param string $classname Classname of an async AS task. + * + * @return bool|null Upgrade result: + * true - the upgrade completed successfully, + * false - in the case of failure, + * null - upgrade started but not yet finished (background task). + */ + protected function run_async( string $classname ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + $instance = new $classname(); + + if ( $this->is_completed( $instance ) ) { + return true; + } + + $this->maybe_start( $instance ); + + // Class Tasks does not exist at this point, so we have to add an action on init. + add_action( + 'init', + static function () use ( $instance ) { + + $instance->init(); + }, + PHP_INT_MAX + ); + + return null; + } + + /** + * Determine if the async AS task is completed. + * + * @since 1.9.5 + * + * @param object $instance Instance of an async AS task. + * + * @use UpgradeBaseTask::is_completed() + * + * @return bool + */ + private function is_completed( $instance ): bool { + + if ( method_exists( $instance, 'is_completed' ) ) { + return $instance->is_completed(); + } + + // Legacy tasks. + $status = get_option( $instance::STATUS ); + + if ( $status === $instance::COMPLETED ) { + delete_option( $instance::STATUS ); + + return true; + } + + return false; + } + + /** + * Start the async AS task if it wasn't started yet. + * + * @since 1.9.5 + * + * @param object $instance Instance of an async AS task. + * + * @use UpgradeBaseTask::maybe_start() + */ + private function maybe_start( $instance ): void { + + if ( method_exists( $instance, 'maybe_start' ) ) { + $instance->maybe_start(); + + return; + } + + // Legacy tasks. + $status = get_option( $instance::STATUS ); + + if ( ! $status ) { + update_option( $instance::STATUS, $instance::START ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Provider/Core.php b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Core.php new file mode 100755 index 00000000..d96672e2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Core.php @@ -0,0 +1,147 @@ +slug = \sanitize_key( $params['slug'] ); + } else { + throw new \UnexpectedValueException( 'Provider class should define a provider "slug" param in its constructor.' ); + } + if ( ! empty( $params['name'] ) ) { + $this->name = \sanitize_text_field( $params['name'] ); + } else { + throw new \UnexpectedValueException( 'Provider class should define a provider "name" param in its constructor.' ); + } + + $this->icon = WPFORMS_PLUGIN_URL . 'assets/images/sullie.png'; + if ( ! empty( $params['icon'] ) ) { + $this->icon = \esc_url_raw( $params['icon'] ); + } + + } + + /** + * Add to list of registered providers. + * + * @since 1.4.7 + * + * @param array $providers Array of all active providers. + * + * @return array + */ + public function register_provider( array $providers ) { + + $providers[ $this->slug ] = $this->name; + + return $providers; + } + + /** + * Provide an instance of the object, that should process the submitted entry. + * It will use data from an already saved entry to pass it further to a Provider. + * + * @since 1.4.7 + * + * @return null|\WPForms\Providers\Provider\Process + */ + abstract public function get_process(); + + /** + * Provide an instance of the object, that should display provider settings + * on Settings > Integrations page in admin area. + * If you don't want to display it (i.e. you don't need it), you can pass null here in your Core provider class. + * + * @since 1.4.7 + * + * @return null|\WPForms\Providers\Provider\Settings\PageIntegrations + */ + abstract public function get_page_integrations(); + + /** + * Provide an instance of the object, that should display provider settings in the Form Builder. + * If you don't want to display it (i.e. you don't need it), you can pass null here in your Core provider class. + * + * @since 1.4.7 + * + * @return null|\WPForms\Providers\Provider\Settings\FormBuilder + */ + abstract public function get_form_builder(); +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Provider/Process.php b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Process.php new file mode 100755 index 00000000..4d2b93f9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Process.php @@ -0,0 +1,129 @@ +core = $core; + } + + /** + * Receive all wpforms_process_complete params and do the actual processing. + * + * @since 1.4.7 + * + * @param array $fields Array of form fields. + * @param array $entry Submitted form content. + * @param array $form_data Form data and settings. + * @param int $entry_id ID of a saved entry. + */ + abstract public function process( $fields, $entry, $form_data, $entry_id ); + + /** + * Process conditional logic for a connection. + * + * @since 1.4.7 + * + * @param array $fields Array of form fields. + * @param array $form_data Form data and settings. + * @param array $connection All connection data. + * + * @return bool + */ + protected function process_conditionals( $fields, $form_data, $connection ) { + + if ( + empty( $connection['conditional_logic'] ) || + empty( $connection['conditionals'] ) || + ! function_exists( 'wpforms_conditional_logic' ) + ) { + return true; + } + + if ( ! wpforms()->is_pro() ) { + return true; + } + + $process = wpforms_conditional_logic()->process( $fields, $form_data, $connection['conditionals'] ); + + if ( + ! empty( $connection['conditional_type'] ) && + $connection['conditional_type'] === 'stop' + ) { + $process = ! $process; + } + + return $process; + } + + /** + * Get provider options, saved on Settings > Integrations page. + * + * @since 1.4.7 + * + * @return array + */ + protected function get_options() { + + return wpforms_get_providers_options( $this->core->slug ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilder.php b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilder.php new file mode 100755 index 00000000..a239c806 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilder.php @@ -0,0 +1,816 @@ +core = $core; + + $form_obj = wpforms()->obj( 'form' ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $form_id = isset( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : 0; + + if ( $form_obj && $form_id ) { + $this->form_data = $form_obj->get( $form_id, [ 'content_only' => true ] ); + + // Form ID isn't defined for newly created forms. + if ( empty( $this->form_data['id'] ) && is_array( $this->form_data ) ) { + $this->form_data['id'] = $form_id; + } + } + + $this->init_hooks(); + } + + /** + * Register all hooks (actions and filters) here. + * + * @since 1.4.7 + */ + protected function init_hooks() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Register builder HTML template(s). + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'builder_templates' ] ); + add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'builder_custom_templates' ], 11 ); + + // Process builder AJAX requests. + add_action( "wp_ajax_wpforms_builder_provider_ajax_{$this->core->slug}", [ $this, 'process_ajax' ] ); + + /* + * Enqueue assets. + */ + if ( + ( ! empty( $_GET['page'] ) && $_GET['page'] === 'wpforms-builder' ) && // phpcs:ignore + ! empty( $_GET['form_id'] ) && // phpcs:ignore + is_admin() + ) { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + } + + add_filter( 'wpforms_save_form_args', [ $this, 'remove_connection_locks' ], 1, 3 ); + } + + /** + * Used to register generic templates for all providers inside form builder. + * + * @since 1.4.7 + * @since 1.6.2 Added sub-templates for conditional logic based on provider. + */ + public function builder_templates(): void { + + $cl_builder_block = + wpforms()->is_pro() ? + wpforms_conditional_logic()->builder_block( + [ + 'form' => $this->form_data, + 'type' => 'panel', + 'parent' => 'providers', + 'panel' => esc_attr( $this->core->slug ), + 'subsection' => '%connection_id%', + ], + false + ) : + ''; + ?> + + + + + + + + + + builder_error_template(); + } + + /** + * Enqueue the JavaScript and CSS files if needed. + * When extending - include the `parent::enqueue_assets();` not to break things! + * + * @since 1.4.7 + */ + public function enqueue_assets() { + + $min = wpforms_get_min_suffix(); + + wp_enqueue_script( + 'wpforms-admin-builder-templates', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/templates{$min}.js", + [ 'wp-util' ], + WPFORMS_VERSION, + true + ); + + wp_enqueue_script( + 'wpforms-admin-builder-providers', + WPFORMS_PLUGIN_URL . "assets/js/admin/builder/providers{$min}.js", + [ 'wpforms-utils', 'wpforms-builder', 'wpforms-admin-builder-templates' ], + WPFORMS_VERSION, + true + ); + } + + /** + * Process the Builder AJAX requests. + * + * @since 1.4.7 + */ + public function process_ajax(): void { + + // Run a security check. + check_ajax_referer( 'wpforms-builder', 'nonce' ); + + // Check for permissions. + if ( ! wpforms_current_user_can( 'edit_forms' ) ) { + wp_send_json_error( + [ + 'error' => esc_html__( 'You do not have permission to perform this action.', 'wpforms-lite' ), + ] + ); + } + + // Process required values. + $error = [ 'error' => esc_html__( 'Something went wrong while performing an AJAX request.', 'wpforms-lite' ) ]; + + if ( + empty( $_POST['id'] ) || + empty( $_POST['task'] ) + ) { + wp_send_json_error( $error ); + } + + $form_id = (int) $_POST['id']; + $task = sanitize_key( $_POST['task'] ); + + $revisions = wpforms()->obj( 'revisions' ); + $revision = $revisions ? $revisions->get_revision() : null; + + if ( $revision ) { + // Set up form data based on the revision_id that we got from AJAX request. + $this->form_data = wpforms_decode( $revision->post_content ); + } else { + // Set up form data based on the ID that we got from AJAX request. + $form_handler = wpforms()->obj( 'form' ); + $this->form_data = $form_handler ? $form_handler->get( $form_id, [ 'content_only' => true ] ) : []; + } + + // Do not allow proceeding further, as form_id may be incorrect. + if ( empty( $this->form_data ) ) { + wp_send_json_error( $error ); + } + + $data = apply_filters( // phpcs:ignore WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_providers_settings_builder_ajax_' . $task . '_' . $this->core->slug, + null + ); + + if ( ! empty( $data['error_msg'] ) ) { + wp_send_json_error( [ 'error_msg' => $data['error_msg'] ] ); + } + + if ( $data !== null ) { + wp_send_json_success( $data ); + } + + wp_send_json_error( $error ); + } + + /** + * Display content inside the panel sidebar area. + * + * @since 1.4.7 + */ + public function display_sidebar() { + + $configured = ''; + + if ( ! empty( $this->form_data['id'] ) && Status::init( $this->core->slug )->is_ready( $this->form_data['id'] ) ) { + $configured = 'configured'; + } + + $classes = [ + 'wpforms-panel-sidebar-section', + 'icon', + $configured, + 'wpforms-panel-sidebar-section-' . $this->core->slug, + ]; + ?> + + + + icon + + core->name ); ?> + + + + + + + + + + + +
              + + + display_content_header(); + + $form_id = ! empty( $this->form_data['id'] ) ? $this->form_data['id'] : ''; + + self::display_content_default_screen( + Status::init( $this->core->slug )->is_ready( $form_id ), + $this->core->slug, + $this->core->name, + $this->core->icon + ); + + $this->display_lock_field(); + ?> + +
              +
              +
              +
              +
              +
              + + +
              + +
              + ' . esc_html__( 'Get the most out of WPForms — use it with an active %s account.', 'wpforms-lite' ) . '

              ', + esc_html( $name ) + ) + ); + ?> +
              +
              + is_lock_field_required( $this->core->slug ) ) { + return; + } + + ?> + + core->slug ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $form_id = isset( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : 0; + + $is_configured = $provider_status->is_configured(); + $is_connected = $provider_status->is_ready( $form_id ); + ?> + +
              + + core->name ); ?> + + + + + + + + + +
              + + core->slug ] ) ) { + return $form; + } + + $provider = $form_data['providers'][ $this->core->slug ]; + $lock = '__lock__'; + + // Remove the lock field if it's the only one and it's locked. + if ( isset( $provider[ $lock ] ) && count( $provider ) === 1 && absint( $provider[ $lock ] ) === 1 ) { + unset( $form_data['providers'][ $this->core->slug ]['__lock__'] ); + $form['post_content'] = wpforms_encode( $form_data ); + } + + return $form; + } + + /** + * Received field values for fields with multiple choices, e.g., multi-select. + * Connection Data has only the last saved field option. + * So, we should receive data from super global $_POST and receive all submitted options instead. + * WARNING: Sanitization of these values is required. + * + * @since 1.9.7 + * + * @param string $name Field name. + * @param array $connection_data Connection data. + * + * @return array + */ + protected function get_multiple_option_field( string $name, array $connection_data ): array { + + // The nonce checked in the `wpforms_save_form` function. + // phpcs:disable WordPress.Security.NonceVerification + // When we duplicate a form the `$_POST['data']` is empty, + // we shouldn't update the field and use copied data. + if ( empty( $_POST['data'] ) || empty( $connection_data['id'] ) ) { + return isset( $connection_data[ $name ] ) ? (array) $connection_data[ $name ] : []; + } + + $connection_id = $connection_data['id']; + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $form_post = json_decode( wp_unslash( $_POST['data'] ), true ) ?? []; + $full_name = "providers[{$this->core->slug}][$connection_id][$name][]"; + $values = []; + // phpcs:enable WordPress.Security.NonceVerification + + foreach ( $form_post as $post_pair ) { + if ( empty( $post_pair['name'] ) || $post_pair['name'] !== $full_name ) { + continue; + } + + $values[] = $post_pair['value']; + } + + return $values; + } + + /** + * Sanitize custom fields. + * + * @since 1.9.3 + * + * @param array $connection Connection data. + */ + protected function sanitize_connection_fields_meta( array &$connection ): void { + + if ( ! isset( $connection['fields_meta'] ) ) { + return; + } + + if ( ! is_array( $connection['fields_meta'] ) ) { + unset( $connection['fields_meta'] ); + + return; + } + + foreach ( $connection['fields_meta'] as $row_number => $field ) { + if ( ! isset( $field['field_id'], $field['name'] ) ) { + unset( $connection['fields_meta'][ $row_number ] ); + + continue; + } + + // Field ID can contain a subfield, e.g. `1.first`. + $field_id = sanitize_text_field( $field['field_id'] ); + $name = sanitize_text_field( $field['name'] ); + + if ( wpforms_is_empty_string( $field_id ) || wpforms_is_empty_string( $name ) ) { + unset( $connection['fields_meta'][ $row_number ] ); + + continue; + } + + $connection['fields_meta'][ $row_number ] = [ + 'name' => $name, + 'field_id' => $field_id, + ]; + } + + $connection['fields_meta'] = array_values( $connection['fields_meta'] ); + } + + /** + * Sanitize conditional logic connection fields. + * + * @since 1.9.3 + * + * @param array $connection Connection data. + */ + protected function sanitize_connection_conditionals( array &$connection ): void { + + if ( ! isset( $connection['conditionals'] ) ) { + return; + } + + if ( ! is_array( $connection['conditionals'] ) ) { + unset( $connection['conditionals'] ); + + return; + } + + foreach ( $connection['conditionals'] as $group_id => $group ) { + foreach ( $group as $rule ) { + $this->sanitize_connection_conditional_rule( $rule ); + } + + $group = array_filter( $group ); + + if ( empty( $group ) ) { + unset( $connection['conditionals'][ $group_id ] ); + + continue; + } + + $connection['conditionals'][ $group_id ] = $group; + } + } + + /** + * Sanitize conditional logic rule. + * + * @since 1.9.3 + * + * @param array $rule Conditional logic rule. + */ + private function sanitize_connection_conditional_rule( array &$rule ): void { + + if ( ! isset( $rule['field'], $rule['operator'] ) ) { + $rule = []; + + return; + } + + $sanitized_rule = [ + 'field' => sanitize_text_field( $rule['field'] ), + 'operator' => sanitize_text_field( $rule['operator'] ), + ]; + + if ( + wpforms_is_empty_string( $sanitized_rule['field'] ) || + wpforms_is_empty_string( $sanitized_rule['operator'] ) + ) { + $rule = []; + + return; + } + + if ( isset( $rule['value'] ) ) { + $sanitized_rule['value'] = sanitize_text_field( $rule['value'] ); + } + + $rule = $sanitized_rule; + } + + /** + * Builder error template. + * This generates an HTML template for displaying an error message + * when the connection to the provider fails. The message includes + * a link to the connection settings page for troubleshooting. + * + * @since 1.9.5 + * + * @noinspection HtmlUnknownTarget + */ + protected function builder_error_template(): void { + + ?> + + core->slug + ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilderInterface.php b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilderInterface.php new file mode 100755 index 00000000..b7896771 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/FormBuilderInterface.php @@ -0,0 +1,33 @@ +`. + * + * @since 1.4.7 + */ + public function builder_custom_templates(); +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrations.php b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrations.php new file mode 100755 index 00000000..77d4623a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrations.php @@ -0,0 +1,386 @@ + Settings -> Integrations page. + * + * @since 1.4.7 + */ +abstract class PageIntegrations implements PageIntegrationsInterface { + + /** + * Get the Core loader class of a provider. + * + * @since 1.4.7 + * + * @var Core + */ + protected $core; + + /** + * Integrations constructor. + * + * @since 1.4.7 + * + * @param Core $core Core provider object. + */ + public function __construct( Core $core ) { + + $this->core = $core; + + $this->ajax(); + } + + /** + * Process the default ajax functionality. + * + * @since 1.4.7 + */ + protected function ajax() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Remove provider from Settings Integrations tab. + add_action( "wp_ajax_wpforms_settings_provider_disconnect_{$this->core->slug}", [ $this, 'ajax_disconnect' ] ); + + // Add new provider from Settings Integrations tab. + add_action( "wp_ajax_wpforms_settings_provider_add_{$this->core->slug}", [ $this, 'ajax_connect' ] ); + } + + /** + * @inheritdoc + */ + public function display( $active, $settings ) { + + $accounts = ! empty( $settings[ $this->core->slug ] ) ? $settings[ $this->core->slug ] : []; + $classes = $this->get_provider_classes( $active, $settings ); + $arrow = in_array( 'focus-in', $classes, true ) ? 'down' : 'right'; + ?> + +
              + +
              + + + +
              +

              core->name ); ?>

              +

              + core->name ) + ); + ?> +

              + + + + +
              + +
              + +
              + +
              +
                + $account ) { + if ( empty( $account_id ) ) { + continue; + } + + $this->display_connected_account( $account_id, $account ); + } + } + ?> +
              +
              + + display_add_new(); ?> + +
              + +
              + + core->slug ] ); + $accounts = ! empty( $settings[ $this->core->slug ] ) ? $settings[ $this->core->slug ] : []; + $classes = []; + + if ( $connected && $accounts ) { + $classes[] = 'connected'; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( empty( $_GET['wpforms-integration'] ) ) { + return $classes; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $classes[] = $this->core->slug === $_GET['wpforms-integration'] ? 'focus-in' : 'focus-out'; + + return $classes; + } + + /** + * Display a connected account. + * + * @since 1.7.5 + * + * @param string $account_id Account ID. + * @param array $account Account data. + */ + protected function display_connected_account( $account_id, $account ) { + + $account_connected = ! empty( $account['date'] ) + ? wpforms_date_format( $account['date'], '', true ) + : esc_html__( 'N/A', 'wpforms-lite' ); + + echo '
            • '; + + /** + * Allow adding markup before connected account item. + * + * @since 1.7.5 + * + * @param string $account_id Account ID. + * @param array $account Account data. + */ + do_action( 'wpforms_providers_provider_settings_page_integrations_display_connected_account_item_before', $account_id, $account ); + + echo ''; + echo ! empty( $account['label'] ) ? esc_html( $account['label'] ) : '' . esc_html__( 'No Label', 'wpforms-lite' ) . ''; + echo ''; + echo ''; + echo esc_html( + sprintf( /* translators: %1$s - Connection date. */ + __( 'Connected on: %1$s', 'wpforms-lite' ), + $account_connected + ) + ); + + if ( defined( 'WPFORMS_DEBUG' ) && WPFORMS_DEBUG ) { + $this->display_account_id_debug( $account_id ); + $this->display_expires_in_debug( $account ); + } + + echo ''; + echo( + '' . esc_html__( 'Disconnect', 'wpforms-lite' ) . '' + ); + + /** + * Allow adding markup after connected account item. + * + * @since 1.7.5 + * + * @param string $account_id Account ID. + * @param array $account Account data. + */ + do_action( 'wpforms_providers_provider_settings_page_integrations_display_connected_account_item_after', $account_id, $account ); + + echo '
            • '; + } + + /** + * Display the account ID for debugging purposes. + * + * @since 1.9.5 + * + * @param mixed $account_id Account ID to display. If null, it displays 'no_id'. + */ + protected function display_account_id_debug( $account_id ): void { + + echo '
              ID: ' . esc_html( $account_id ?? 'no_id' ); + } + + /** + * Display the expiration information in debug mode. + * + * @since 1.9.5 + * + * @param array $account The account information containing the 'expires_in' timestamp. + */ + protected function display_expires_in_debug( array $account ): void { + + if ( empty( $account['expires_in'] ) ) { + return; + } + + $valid_until_timestamp = $account['expires_in']; + + if ( $valid_until_timestamp > time() ) { + $format = sprintf( '%s \a\t %s', get_option( 'date_format' ), get_option( 'time_format' ) ); + $valid_until = wpforms_datetime_format( $valid_until_timestamp, $format, true ); + + echo '
              Valid until: ' . esc_html( $valid_until ?? 'no_valid_until' ); + } + } + + /** + * Any new connection should be added. + * So display the content of that. + * + * @since 1.4.7 + */ + protected function display_add_new() { + + ?> + +

              + + + +

              + +
              + +
              +

              + +

              + +
              + display_add_new_connection_fields(); ?> +
              + + display_add_new_connection_submit_button(); ?> +
              +
              + + core->name ); + ?> + + esc_html__( 'Your session expired. Please reload the page.', 'wpforms-lite' ), + ] + ); + } + + // Check for permissions. + if ( ! wpforms_current_user_can() ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'You do not have permission.', 'wpforms-lite' ), + ] + ); + } + + if ( empty( $_POST['provider'] ) || empty( $_POST['key'] ) ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'Missing data.', 'wpforms-lite' ), + ] + ); + } + + $providers = wpforms_get_providers_options(); + + if ( ! empty( $providers[ $_POST['provider'] ][ $_POST['key'] ] ) ) { + + unset( $providers[ $_POST['provider'] ][ $_POST['key'] ] ); + update_option( 'wpforms_providers', $providers ); + wp_send_json_success(); + + } else { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'Connection missing.', 'wpforms-lite' ), + ] + ); + } + } + + /** + * AJAX to add a provider from the settings integrations tab. + * + * @since 1.4.7 + */ + public function ajax_connect() { + + // Run a security check. + if ( ! check_ajax_referer( 'wpforms-admin', 'nonce', false ) ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'Your session expired. Please reload the page.', 'wpforms-lite' ), + ] + ); + } + + // Check for permissions. + if ( ! wpforms_current_user_can() ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'You do not have permissions.', 'wpforms-lite' ), + ] + ); + } + + if ( empty( $_POST['data'] ) ) { + wp_send_json_error( + [ + 'error_msg' => esc_html__( 'Missing required data in payload.', 'wpforms-lite' ), + ] + ); + } + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrationsInterface.php b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrationsInterface.php new file mode 100755 index 00000000..cfc5b571 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Provider/Settings/PageIntegrationsInterface.php @@ -0,0 +1,22 @@ +provider = sanitize_key( (string) $provider ); + } + + /** + * Provide an ability to statically init the object. + * Useful for inline-invocations. + * + * @example: Status::init( 'drip' )->is_ready(); + * + * @since 1.4.8 + * @since 1.5.9 Added a check on provider. + * + * @param string $provider Provider slug. + * + * @return Status + */ + public static function init( $provider ) { + + static $instance; + + if ( ! $instance || $provider !== $instance->provider ) { + $instance = new self( $provider ); + } + + return $instance; + } + + /** + * Check whether the defined provider is configured or not. + * "Configured" means has an account that might be checked/updated on Settings > Integrations. + * + * @since 1.4.8 + * + * @return bool + */ + public function is_configured() { + + $options = wpforms_get_providers_options(); + + /** + * Use this filter to change the configuration status of the provider. + * We need the filter for BC reasons. + * + * @since 1.4.8 + * + * @param bool $is_configured Is the provider configured? + */ + $is_configured = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + "wpforms_providers_{$this->provider}_configured", + ! empty( $options[ $this->provider ] ) + ); + + /** + * Use this filter to change the configuration status of the provider. + * + * @since 1.4.8 + * + * @param bool $is_configured Is the provider configured? + * @param string $provider Provider slug. + */ + return apply_filters( 'wpforms_providers_status_is_configured', $is_configured, $this->provider ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Check whether the defined provider is connected to some form. + * "Connected" means it has a Connection in Form Builder > Providers > Provider tab. + * + * @since 1.4.8 + * + * @param int $form_id Form ID to check the status against. + * + * @return bool + */ + public function is_connected( $form_id ) { + + $is_connected = false; + + $revisions = wpforms()->obj( 'revisions' ); + $revision = $revisions ? $revisions->get_revision() : null; + + if ( $revision ) { + $this->form_data = wpforms_decode( $revision->post_content ); + } else { + $this->form_data = wpforms()->obj( 'form' )->get( (int) $form_id, [ 'content_only' => true ] ); + } + + if ( ! empty( $this->form_data['providers'][ $this->provider ] ) ) { + $is_connected = $this->check_valid_connections(); + } + + /** + * Use this filter to change the connection status of the provider. + * + * @since 1.4.8 + * + * @param bool $is_connected Is the provider connected to the form? + * @param string $provider Provider slug. + */ + return (bool) apply_filters( 'wpforms_providers_status_is_connected', $is_connected, $this->provider ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Is the current provider ready to be used? + * It means both configured and connected. + * + * @since 1.4.8 + * + * @param int $form_id Form ID to check the status against. + * + * @return bool + */ + public function is_ready( $form_id ) { + + return $this->is_configured() && $this->is_connected( $form_id ); + } + + /** + * Check if connections belong to an existing account. + * + * @since 1.8.8 + * + * @return bool + */ + private function check_valid_connections(): bool { + + $account_ids = array_keys( wpforms_get_providers_options( $this->provider ) ); + + // BC for the Salesforce addon that uses `resource_owner_id` key instead of `account_id` value. + if ( $this->provider === 'salesforce' ) { + $account_ids = array_column( wpforms_get_providers_options( 'salesforce' ), 'resource_owner_id' ); + } + + // Account id is generated by the `uniqid` function that sometimes returns an integer value. + $account_ids = array_map( 'strval', $account_ids ); + + $connection_accounts_ids = array_column( $this->form_data['providers'][ $this->provider ], 'account_id' ); + + // BC for the Drip addon that uses `option_id` key for storing a connection provider. + if ( $this->provider === 'drip' ) { + $connection_accounts_ids = array_column( $this->form_data['providers'][ $this->provider ], 'option_id' ); + } + + foreach ( $connection_accounts_ids as $account ) { + if ( in_array( (string) $account, $account_ids, true ) ) { + return true; + } + } + + return false; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Providers/Providers.php b/wp-content/plugins/wpforms-lite/src/Providers/Providers.php new file mode 100755 index 00000000..d20d6761 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Providers/Providers.php @@ -0,0 +1,72 @@ + Settings > Integrations page. + $integration = $provider->get_page_integrations(); + + if ( $integration !== null ) { + add_action( 'wpforms_settings_providers', [ $integration, 'display' ], $provider::PRIORITY, 2 ); + } + + // Editing Single Form > Form Builder. + $form_builder = $provider->get_form_builder(); + + if ( $form_builder !== null ) { + add_action( 'wpforms_providers_panel_sidebar', [ $form_builder, 'display_sidebar' ], $provider::PRIORITY ); + add_action( 'wpforms_providers_panel_content', [ $form_builder, 'display_content' ], $provider::PRIORITY ); + } + + // Process entry submission. + $process = $provider->get_process(); + + if ( $process !== null ) { + add_action( 'wpforms_process_complete', [ $process, 'process' ], 5, 4 ); + } + } + +} diff --git a/wp-content/plugins/wpforms-lite/src/Requirements/Requirements.php b/wp-content/plugins/wpforms-lite/src/Requirements/Requirements.php new file mode 100755 index 00000000..23cf148d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Requirements/Requirements.php @@ -0,0 +1,1490 @@ +='; + + /** + * Development version of WPForms. Can be specified in an addon. + * + * @since 1.8.2.2 + */ + private const WPFORMS_DEV_VERSION_IN_ADDON = '{WPFORMS_VERSION}'; + + /** + * Basic, Plus, Pro and Top level licenses. + * + * @since 1.9.8.3 + */ + public const BASIC_PLUS_PRO_AND_TOP = [ 'basic', 'plus', 'pro', 'elite', 'agency', 'ultimate' ]; + + /** + * Plus, Pro and Top level licenses. + * + * @since 1.8.2.2 + */ + private const PLUS_PRO_AND_TOP = [ 'plus', 'pro', 'elite', 'agency', 'ultimate' ]; + + /** + * Pro and Top level licenses. + * + * @since 1.8.2.2 + */ + private const PRO_AND_TOP = [ 'pro', 'elite', 'agency', 'ultimate' ]; + + /** + * Top level licenses. + * + * @since 1.8.2.2 + */ + private const TOP = [ 'elite', 'agency', 'ultimate' ]; + + /** + * Default minimal addon requirements. + * + * @since 1.8.2.2 + * + * @var string[] + */ + private $defaults = [ + self::PHP => '7.2', + self::WP => '5.5', + self::WPFORMS => self::WPFORMS_DEV_VERSION_IN_ADDON, + self::LICENSE => self::PRO_AND_TOP, + self::PRIORITY => 10, + ]; + + /** + * Some things to do. + * + * @todo Add custom message for form-templates-pack. + */ + + // phpcs:disable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned, WordPress.Arrays.MultipleStatementAlignment.LongIndexSpaceBeforeDoubleArrow + /** + * Addon requirements. + * + * Array has the format 'addon basename' => 'addon requirements array'. + * + * The requirement array can have the following keys: + * self::PHP ('php') for the minimal PHP version required, + * self::EXT ('ext') for the PHP extensions required, + * self::WP ('wp') for the minimal WordPress version required, + * self::WPFORMS ('wpforms') for the minimal WPForms version required, + * self::LICENSE ('license') for the license level required, + * self::ADDON ('addon') for the minimal addon version required, + * self::ADDON_VERSION_CONSTANT ('addon_version_constant') for the addon version constant. + * self::PRIORITY ('priority') for the priority of the current requirements. + * + * The requirement array can have the following values: + * The 'php' value can be string like '5.6' or an array like 'php' => [ 'version' => '7.2', 'compare' => '=' ]. + * The 'ext' value can be a string like 'curl' or an array like 'ext' => [ 'curl', 'mbstring' ]. + * The 'wp' value can be string like '5.5' or an array like 'wp' => [ 'version' => '6.4', 'compare' => '=' ]. + * The 'wpforms' value can be string like '1.8.2' + * or an array like 'wpforms' => [ 'version' => '1.7.5', 'compare' => '=' ]. + * When the 'wpforms' value is '{WPFORMS_VERSION}', it is not checked and should be used for development. + * The 'license' value can be string like 'elite, agency, ultimate' + * or an array like 'license' => [ 'elite', 'agency', 'ultimate' ]. + * When the 'license' value is empty like null, false, [], it is not checked. + * The 'addon' value can be a string like '2.0.1' + * or an array like 'addon' => [ 'version' => '2.0.1', 'compare' => '<=' ]. + * The 'addon_version_constant' must be a string like 'WPFORMS_ACTIVECAMPAIGN_VERSION'. + * The 'priority' must be an integer like 20. By default, it is 10. + * + * By default, 'compare' is '>='. + * + * The default addon version constant is formed from the addon directory name like this: + * wpforms-activecampaign -> WPFORMS_ACTIVECAMPAIGN_VERSION. + * + * Requirements can be specified here or in the addon as a parameter of wpforms_requirements(). + * The priorities from lower to higher (if PRIORITY is not set or equal): + * 1. Default parameters from $this->defaults. + * 2. Current array $this->requirements. + * 3. Parameter of wpforms_requirements() call in the addon. + * Settings with a higher priority overwrite lower priority settings. + * + * The minimal-required version of WPForms should be specified in the addons. + * The minimal-required version of addons should be specified here, in the `$this->requirements` array. + * + * We do not plan to restrict the lower addon version so far. + * However, if in the future we may need to do so, + * we should add to the addon-related requirement array the line like + * self::ADDON => '1.x.x' or + * self::ADDON => '{WPFORMS_ACTIVECAMPAIGN_VERSION}'. + * Here 1.x.x is the specific addon version, and + * WPFORMS_ACTIVECAMPAIGN_VERSION is the addon version constant name. + * The script will replace the addon version constant name during the addon release. + * + * @since 1.8.2.2 + * + * @var array + */ + private $requirements = [ + 'wpforms/wpforms.php' => [ + self::EXT => 'curl, dom, json, libxml', + self::LICENSE => [], + ], + 'wpforms-lite/wpforms.php' => [ + self::EXT => 'curl, dom, json, libxml', + self::LICENSE => [], + ], + 'wpforms-activecampaign/wpforms-activecampaign.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-authorize-net/wpforms-authorize-net.php' => [ + self::EXT => 'curl', + self::LICENSE => self::TOP, + ], + 'wpforms-airtable/wpforms-airtable.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-aweber/wpforms-aweber.php' => [ + self::EXT => 'curl', + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-calculations/wpforms-calculations.php' => [ + self::ADDON => '1.5.0', + ], + 'wpforms-campaign-monitor/wpforms-campaign-monitor.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-captcha/wpforms-captcha.php' => [ + // Deprecated. + self::LICENSE => self::BASIC_PLUS_PRO_AND_TOP, + self::WPFORMS => [ + self::VERSION => [ '1.8.3', '1.8.7' ], + self::COMPARE => [ '>=', '<' ], + ], + self::PRIORITY => 20, + ], + 'wpforms-conversational-forms/wpforms-conversational-forms.php' => [], + 'wpforms-convertkit/wpforms-convertkit.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + self::PHP => '7.4', + ], + 'wpforms-coupons/wpforms-coupons.php' => [ + self::ADDON => '1.6.0', + ], + 'wpforms-drip/wpforms-drip.php' => [ + self::EXT => 'curl', + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-dropbox/wpforms-dropbox.php' => [ + self::ADDON => '1.1.0', + ], + 'wpforms-entry-automation/wpforms-entry-automation.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-form-abandonment/wpforms-form-abandonment.php' => [], + 'wpforms-form-locker/wpforms-form-locker.php' => [ + self::ADDON => '2.8.0', + ], + 'wpforms-form-pages/wpforms-form-pages.php' => [], + 'wpforms-form-templates-pack/wpforms-form-templates-pack.php' => [ + // Deprecated. + self::WPFORMS => [ + self::VERSION => '1.6.8', + self::COMPARE => '<', + ], + ], + 'wpforms-geolocation/wpforms-geolocation.php' => [], + 'wpforms-getresponse/wpforms-getresponse.php' => [ + self::EXT => 'curl', + self::LICENSE => self::PLUS_PRO_AND_TOP, + self::PHP => '7.3', + ], + 'wpforms-google-calendar/wpforms-calendar.php' => [], + 'wpforms-google-drive/wpforms-google-drive.php' => [ + self::EXT => 'fileinfo', + ], + 'wpforms-google-sheets/wpforms-google-sheets.php' => [ + self::ADDON => '2.2.0', + ], + 'wpforms-hubspot/wpforms-hubspot.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-lead-forms/wpforms-lead-forms.php' => [], + 'wpforms-mailchimp/wpforms-mailchimp.php' => [ + self::EXT => 'curl', + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-mailerlite/wpforms-mailerlite.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-mailpoet/wpforms-mailpoet.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-make/wpforms-make.php' => [], + 'wpforms-n8n/wpforms-n8n.php' => [ + self::LICENSE => self::PRO_AND_TOP, + ], + 'wpforms-notion/wpforms-notion.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-offline-forms/wpforms-offline-forms.php' => [], + 'wpforms-paypal-commerce/wpforms-paypal-commerce.php' => [], + 'wpforms-paypal-standard/wpforms-paypal-standard.php' => [], + 'wpforms-pdf/wpforms-pdf.php' => [], + 'wpforms-pipedrive/wpforms-pipedrive.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-post-submissions/wpforms-post-submissions.php' => [], + 'wpforms-salesforce/wpforms-salesforce.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-save-resume/wpforms-save-resume.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-sendinblue/wpforms-sendinblue.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-signatures/wpforms-signatures.php' => [ + self::ADDON => '1.12.0', + self::EXT => 'gd', + ], + 'wpforms-slack/wpforms-slack.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-square/wpforms-square.php' => [], + 'wpforms-stripe/wpforms-stripe.php' => [], + 'wpforms-surveys-polls/wpforms-surveys-polls.php' => [ + self::ADDON => '1.15.0', + ], + 'wpforms-twilio/wpforms-twilio.php' => [ + self::LICENSE => self::PLUS_PRO_AND_TOP, + ], + 'wpforms-user-journey/wpforms-user-journey.php' => [], + 'wpforms-user-registration/wpforms-user-registration.php' => [], + 'wpforms-webhooks/wpforms-webhooks.php' => [ + self::LICENSE => self::TOP, + ], + 'wpforms-zapier/wpforms-zapier.php' => [], + 'wpforms-zoho-crm/wpforms-zoho-crm.php' => [ + self::LICENSE => self::TOP, + ], + ]; + // phpcs:enable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned, WordPress.Arrays.MultipleStatementAlignment.LongIndexSpaceBeforeDoubleArrow + + /** + * Addon requirements. + * + * @since 1.8.2.2 + * + * @var array + */ + private $addon_requirements = []; + + /** + * Addon basename. + * + * @since 1.8.2.2 + * + * @var string + */ + private $basename = ''; + + /** + * Validated addons. + * + * @since 1.8.2.2 + * + * @var array + */ + private $validated = []; + + /** + * Not validated addons. + * + * @since 1.8.2.2 + * + * @var array + */ + private $not_validated = []; + + /** + * Get a single instance of the addon. + * + * @since 1.8.2.2 + * + * @return Requirements + */ + public static function get_instance(): Requirements { + + static $instance; + + if ( ! $instance ) { + $instance = new self(); + + $instance->init(); + } + + return $instance; + } + + /** + * Init class. + * + * @since 1.8.2.2 + */ + private function init(): void { + + foreach ( $this->requirements as $basename => $requirement ) { + $this->init_addon_requirements( $basename ); + } + + $this->hooks(); + } + + /** + * Add hooks. + * + * @since 1.8.2.2 + */ + private function hooks(): void { + + add_action( 'admin_init', [ $this, 'deactivate' ] ); + add_action( 'admin_notices', [ $this, 'show_notices' ] ); + add_action( 'network_admin_notices', [ $this, 'show_notices' ] ); + } + + /** + * Validate an addon. + * + * @since 1.8.2.2 + * + * @param array $addon_requirements Addon requirements. + * + * @return bool + */ + public function validate( array $addon_requirements ): bool { + + $this->addon_requirements = $addon_requirements; + $file = $this->addon_requirements['file']; + + // Requirements' array must contain the addon main filename. + if ( ! isset( $file ) ) { + return false; + } + + $this->basename = plugin_basename( $file ); + + // Respect WPF activity. + if ( $this->basename === 'wpforms/wpforms.php' && ! wpforms_is_pro() ) { + $this->basename = 'wpforms-lite/wpforms.php'; + } + + $this->init_addon_requirements( $this->basename ); + + $this->addon_requirements = $this->merge_requirements( + $this->defaults, + $this->requirements[ $this->basename ], + $this->addon_requirements + ); + + $php_valid = $this->validate_php(); + $ext_valid = $this->validate_ext(); + $wp_valid = $this->validate_wp(); + $wpforms_valid = $this->validate_wpforms(); + $license_valid = $this->validate_license(); + $addon_valid = $this->validate_addon(); + + if ( $php_valid && $ext_valid && $wp_valid && $wpforms_valid && $license_valid && $addon_valid ) { + $this->validated[] = $this->basename; + } + + $this->requirements[ $this->basename ] = $this->addon_requirements; + + return empty( $this->not_validated[ $this->basename ] ); + } + + /** + * Determine if addon is validated. + * + * @since 1.9.2 + * + * @param string $basename Addon basename. + * + * @return bool + */ + public function is_validated( string $basename ): bool { + + if ( ! file_exists( WP_PLUGIN_DIR . '/' . $basename ) ) { + // No more actions if the plugin file does not exist. + return false; + } + + if ( ! $this->is_wpforms_addon( $basename ) ) { + // No more actions if it is not a wpforms addon. + return true; + } + + // We didn't check the addon before. + if ( ! isset( $this->not_validated[ $basename ] ) && ! in_array( $basename, $this->validated, true ) ) { + $addon_load_function = $this->get_addon_load_function( $basename ); + + if ( ! is_callable( $addon_load_function ) ) { + return false; + } + + // Invoke the addon loading function, which checks requirements. + $addon_load_function(); + } + + return in_array( $basename, $this->validated, true ); + } + + /** + * Merge requirements by priority. + * + * @since 1.8.7 + * + * @param array $defaults Default requirements. + * @param array $requirements Requirements. + * @param array $addon_requirements Addon requirements. + * + * @return array + */ + private function merge_requirements( array $defaults, array $requirements, array $addon_requirements ): array { + + $chunks = [ $defaults, $requirements, $addon_requirements ]; + + usort( + $chunks, + static function ( $chunk1, $chunk2 ) { + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.AddEmptyLineBeforeReturnStatement + return ( $chunk1[ self::PRIORITY ] ?? 10 ) <=> ( $chunk2[ self::PRIORITY ] ?? 10 ); + } + ); + + return array_merge( ...$chunks ); + } + + /** + * Try to deactivate not valid addon. + * + * @since 1.8.2.2 + * + * @param string $plugin Path to the plugin file relative to the plugins' directory. + * + * @return bool True if addon was deactivated. + */ + public function deactivate_not_valid_addon( string $plugin ): bool { + + if ( ! self::DEACTIVATE_IF_NOT_MET ) { + // No more actions if we not demand deactivation. + return false; + } + + if ( ! $this->is_wpforms_addon( $plugin ) ) { + // No more actions if it is not a wpforms addon. + return false; + } + + // Finalise activation of wpforms addon. + $addon_load_function = $this->get_addon_load_function( $plugin ); + + if ( ! is_callable( $addon_load_function ) ) { + return false; + } + + // Invoke the addon loading function, which checks requirements. + $addon_load_function(); + + // Addon may get deactivated after this statement. + $this->deactivate(); + + return ! is_plugin_active( $plugin ); + } + + /** + * Check whether a plugin is a wpforms addon. + * + * @since 1.8.2.2 + * + * @param string $plugin Path to the plugin file relative to the plugins' directory. + * + * @return bool + */ + private function is_wpforms_addon( string $plugin ): bool { + + if ( strpos( $plugin, 'wpforms-' ) !== 0 ) { + // No more actions for the general plugin. + return false; + } + + /** + * There are some forks of our plugins having the 'wpforms-' prefix. + * We have to check the Author name in the plugin header. + */ + $plugin_data = $this->get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + $plugin_author = isset( $plugin_data['Author'] ) ? strtolower( $plugin_data['AuthorName'] ) : ''; + + // No more actions on forks. + return $plugin_author === 'wpforms'; + } + + /** + * Wrapper for get_plugin_data. + * Check the plugin file for existence to avoid warnings. + * + * @since 1.9.6 + * + * @param string $plugin_file Absolute path to the main plugin file. + * @param bool $markup Optional. If the returned data should have HTML markup applied. + * @param bool $translate Optional. If the returned data should be translated. Default true. + * + * We set markup and translate to false by default because we need raw values to compare. + * + * @return array + * @noinspection PhpSameParameterValueInspection + */ + private function get_plugin_data( string $plugin_file, bool $markup = false, bool $translate = false ): array { + + if ( ! file_exists( $plugin_file ) ) { + return []; + } + + if ( ! function_exists( 'get_plugin_data' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + return get_plugin_data( $plugin_file, $markup, $translate ); + } + + /** + * Get the addon function hooked on wpforms_load. + * + * @since 1.8.2.2 + * + * @param string $plugin Path to the plugin file relative to the plugins' directory. + * + * @return string + */ + private function get_addon_load_function( string $plugin ): string { + + global $wp_filter; + + $callbacks = $wp_filter['wpforms_loaded']->callbacks; + $prefix = explode( '/', $plugin, 2 )[0]; + $prefix = str_replace( '-', '_', $prefix ); + $addon_load_function = ''; + + // Find addon load function. + foreach ( $callbacks as $callbacks_at_priority ) { + foreach ( $callbacks_at_priority as $key => $callback ) { + if ( strpos( $key, $prefix ) === 0 ) { + $addon_load_function = $key; + + break 2; + } + } + } + + return $addon_load_function; + } + + /** + * Normalize version-based requirement. + * + * @since 1.8.2.2 + * + * @param string $key Requirements key. + * + * @return array[] + */ + private function normalize_version_requirement( string $key ): array { + + if ( ! isset( $this->addon_requirements[ $key ] ) ) { + $this->addon_requirements[ $key ] = []; + + return []; + } + + $requirement = (array) $this->addon_requirements[ $key ]; + + $version = isset( $requirement[0] ) ? + array_map( 'trim', (array) $requirement[0] ) : + [ '' ]; + $version = isset( $requirement[ self::VERSION ] ) ? + array_map( 'trim', (array) $requirement[ self::VERSION ] ) : + $version; + $compare = isset( $requirement[ self::COMPARE ] ) ? + array_map( 'trim', (array) $requirement[ self::COMPARE ] ) : + [ self::COMPARE_DEFAULT ]; + $compare = array_pad( $compare, count( $version ), self::COMPARE_DEFAULT ); + + $requirement = [ + self::VERSION => $version, + self::COMPARE => $compare, + ]; + + $this->addon_requirements[ $key ] = $requirement; + + return $requirement; + } + + /** + * Normalize array-based requirement. + * + * @since 1.8.2.2 + * + * @param string $key Requirements key. + * + * @return string[] + */ + private function normalize_array_requirement( string $key ): array { + + if ( ! isset( $this->addon_requirements[ $key ] ) ) { + $this->addon_requirements[ $key ] = []; + + return []; + } + + $requirement = $this->addon_requirements[ $key ]; + + if ( is_string( $requirement ) ) { + $requirement = explode( ',', $requirement ); + } + + if ( ! is_array( $requirement ) ) { + $requirement = []; + } + + $requirement = array_filter( array_map( 'trim', $requirement ) ); + $this->addon_requirements[ $key ] = $requirement; + + return $requirement; + } + + /** + * Validate php. + * + * @since 1.8.2.2 + * + * @return bool + */ + private function validate_php(): bool { + + $php = $this->normalize_version_requirement( self::PHP ); + + if ( empty( $php ) ) { + return true; + } + + if ( + $php[ self::VERSION ] && + ! $this->version_compare( PHP_VERSION, $php ) + ) { + $this->not_validated[ $this->basename ][] = self::PHP; + + return false; + } + + return true; + } + + /** + * Validate php extensions. + * + * @since 1.8.2.2 + * + * @return bool + */ + private function validate_ext(): bool { + + foreach ( $this->normalize_array_requirement( self::EXT ) as $extension ) { + if ( ! extension_loaded( $extension ) ) { + $this->not_validated[ $this->basename ][] = self::EXT; + + return false; + } + } + + return true; + } + + /** + * Validate WP. + * + * @since 1.8.2.2 + * + * @return bool + */ + private function validate_wp(): bool { + + global $wp_version; + + $wp = $this->normalize_version_requirement( self::WP ); + + if ( empty( $wp ) ) { + return true; + } + + if ( + $wp[ self::VERSION ] && + ! $this->version_compare( $wp_version, $wp ) + ) { + $this->not_validated[ $this->basename ][] = self::WP; + + return false; + } + + return true; + } + + /** + * Validate wpforms. + * + * @since 1.8.2.2 + * + * @return bool + */ + private function validate_wpforms(): bool { + + $wpforms = $this->normalize_version_requirement( self::WPFORMS ); + + if ( empty( $wpforms ) ) { + return true; + } + + if ( in_array( self::WPFORMS_DEV_VERSION_IN_ADDON, $wpforms[ self::VERSION ], true ) ) { + return true; + } + + if ( + $wpforms[ self::VERSION ] && + ! $this->version_compare( wpforms()->version, $wpforms ) + ) { + $this->not_validated[ $this->basename ][] = self::WPFORMS; + + return false; + } + + return true; + } + + /** + * Version compare. + * + * @since 1.8.7 + * + * @param string $version Version to compare. + * @param array $requirement Requirement. + * + * @return bool + */ + private function version_compare( string $version, array $requirement ): bool { + + $compare_arr = $this->get_compare_array( $requirement ); + + foreach ( $compare_arr as $version2 => $compare ) { + $result = version_compare( $version, $version2, $compare ); + + if ( ! $result ) { + return false; + } + } + + return true; + } + + /** + * Validate license. + * + * @since 1.8.2.2 + * + * @return bool + */ + private function validate_license(): bool { + + $license = $this->normalize_array_requirement( self::LICENSE ); + + if ( empty( $license ) ) { + return true; + } + + if ( ! in_array( wpforms_get_license_type(), $license, true ) ) { + $this->not_validated[ $this->basename ][] = self::LICENSE; + + return false; + } + + return true; + } + + /** + * Validate addon. + * + * @since 1.8.2.2 + * + * @return bool + */ + private function validate_addon(): bool { + + $addon = $this->normalize_version_requirement( self::ADDON ); + $addon_version_constant = trim( $this->addon_requirements[ self::ADDON_VERSION_CONSTANT ] ); + + if ( empty( $addon ) || empty( $addon_version_constant ) ) { + return true; + } + + if ( preg_grep( '/{.+_VERSION}/', $addon[ self::VERSION ] ) ) { + return true; + } + + if ( + $addon[ self::VERSION ] && + ( ! defined( $addon_version_constant ) || ! $this->version_compare( constant( $addon_version_constant ), $addon ) ) + ) { + $this->not_validated[ $this->basename ][] = self::ADDON; + + return false; + } + + return true; + } + + /** + * Deactivate not validated addons. + * + * @since 1.8.2.2 + */ + public function deactivate(): void { + + if ( ! self::DEACTIVATE_IF_NOT_MET ) { + return; + } + + if ( empty( $this->not_validated ) ) { + return; + } + + // phpcs:disable WordPress.Security.NonceVerification.Recommended + unset( $_GET['activate'] ); + + if ( empty( $this->validated ) ) { + unset( $_GET['activate-multi'] ); + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + foreach ( $this->not_validated as $basename => $errors ) { + if ( $errors === [ 'license' ] ) { + continue; + } + + deactivate_plugins( $basename ); + } + } + + /** + * Show admin notices. + * + * @since 1.8.2.2 + */ + public function show_notices(): void { + + $notices = $this->get_notices(); + + if ( ! $notices ) { + return; + } + + $this->show_notice( '

              ' . implode( '

              ', $notices ) . '

              ' ); + } + + /** + * Get admin notices. + * + * @since 1.8.2.2 + * + * @return string[] + */ + public function get_notices(): array { + + $notices = []; + + if ( empty( $this->not_validated ) ) { + return $notices; + } + + foreach ( $this->not_validated as $basename => $errors ) { + $notice = $this->get_notice( $basename ); + + if ( ! $notice ) { + continue; + } + + $notices[] = $notice; + } + + return $notices; + } + + /** + * Get an addon compatible message. + * + * @since 1.9.3 + * + * @param string $basename Plugin basename. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + public function get_addon_compatible_message( string $basename ): string { + + if ( empty( $this->not_validated[ $basename ] ) ) { + return ''; + } + + $errors = $this->not_validated[ $basename ]; + $message = $this->get_validation_message( $errors, $basename ); + + if ( ! $message ) { + return ''; + } + + $notice = sprintf( + /* translators: %1$s - requirements message. */ + __( 'It requires %1$s.', 'wpforms-lite' ), + $message + ); + + $notice .= $this->get_read_more( $errors ); + + return $notice; + } + + /** + * Get notice. + * + * @since 1.9.2 + * + * @param string $basename Plugin basename. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + public function get_notice( string $basename ): string { + + if ( empty( $this->not_validated[ $basename ] ) ) { + return ''; + } + + $errors = $this->not_validated[ $basename ]; + $message = $this->get_validation_message( $errors, $basename ); + + if ( ! $message ) { + return ''; + } + + $is_wpforms_plugin = false !== strpos( $basename, 'wpforms.php' ); + + if ( $is_wpforms_plugin || in_array( self::ADDON, $errors, true ) ) { + $source = __( 'WPForms plugin', 'wpforms-lite' ); + } else { + $plugin_headers = $this->get_plugin_data( $this->requirements[ $basename ]['file'] ); + $source = sprintf( /* translators: %1$s - WPForms addon name. */ + __( '%1$s addon', 'wpforms-lite' ), + $plugin_headers['Name'] + ); + } + + $notice = sprintf( + /* translators: %1$s - WPForms plugin or addon name, %2$d - requirements message. */ + __( 'The %1$s requires %2$s.', 'wpforms-lite' ), + $source, + $message + ); + + $notice .= $this->get_read_more( $errors ); + + /** + * Filter the requirements' notice. + * + * @since 1.8.7 + * + * @param string $notice Notice. + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * @param array $requirements Addon requirements. + */ + return (string) apply_filters( 'wpforms_requirements_notice', $notice, $errors, $basename, $this->requirements[ $basename ] ); + } + + /** + * Get read more link. + * + * @since 1.9.6 + * + * @param array $errors Errors. + * + * @return string + * @noinspection HtmlUnknownTarget + */ + private function get_read_more( array $errors ): string { + + $data = [ + self::PHP => [ + 'flag' => self::SHOW_PHP_NOTICE, + /* translators: %1$s - Read More link. */ + 'text' => __( '%1$s for additional information on PHP version.', 'wpforms-lite' ), + 'link' => 'https://wpforms.com/docs/supported-php-version/', + ], + self::EXT => [ + 'flag' => self::SHOW_EXT_NOTICE, + /* translators: %1$s - Read More link. */ + 'text' => __( '%1$s for additional information on PHP extensions.', 'wpforms-lite' ), + 'link' => 'https://wpforms.com/docs/required-php-extensions-for-wpforms', + ], + ]; + + $read_more = ''; + + foreach ( $data as $key => $datum ) { + if ( ! isset( $datum['flag'], $datum['text'], $datum['link'] ) ) { + continue; + } + + if ( ! in_array( $key, $errors, true ) ) { + continue; + } + + if ( ! $datum['flag'] ) { + continue; + } + + $read_more .= + ' ' . + sprintf( + $datum['text'], + sprintf( + '%2$s', + wpforms_utm_link( $datum['link'], 'all-plugins', 'Addon PHP Notice' ), + __( 'Read more', 'wpforms-lite' ) + ) + ); + } + + return $read_more; + } + + /** + * Get a validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_validation_message( array $errors, string $basename ): string { + + $addon_validation_message = $this->get_addon_validation_message( $errors, $basename ); + + if ( $addon_validation_message ) { + // Do not proceed further if addon is required in a higher version. + return wpforms_list_array( [ $addon_validation_message ] ); + } + + $messages = []; + + $messages[] = $this->get_php_validation_message( $errors, $basename ); + $messages[] = $this->get_ext_validation_message( $errors, $basename ); + $messages[] = $this->get_wp_validation_message( $errors, $basename ); + $messages[] = $this->get_wpforms_validation_message( $errors, $basename ); + $messages[] = $this->get_license_validation_message( $errors, $basename ); + + return wpforms_list_array( array_filter( $messages ) ); + } + + /** + * Get a PHP validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_php_validation_message( array $errors, string $basename ): string { + + if ( self::SHOW_PHP_NOTICE && in_array( self::PHP, $errors, true ) ) { + return $this->list_version_detailed( $this->requirements[ $basename ][ self::PHP ], 'PHP' ); + } + + return ''; + } + + /** + * Get an EXT validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_ext_validation_message( array $errors, string $basename ): string { + + if ( self::SHOW_EXT_NOTICE && in_array( self::EXT, $errors, true ) ) { + $extensions = array_diff( $this->requirements[ $basename ][ self::EXT ], get_loaded_extensions() ); + + return sprintf( + /* translators: %s - PHP extension name(s). */ + _n( + '%s PHP extension', + '%s PHP extensions', + count( $extensions ), + 'wpforms-lite' + ), + wpforms_list_array( $extensions ) + ); + } + + return ''; + } + + /** + * Get WP validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_wp_validation_message( array $errors, string $basename ): string { + + if ( self::SHOW_WP_NOTICE && in_array( self::WP, $errors, true ) ) { + return $this->list_version_detailed( $this->requirements[ $basename ][ self::WP ], 'WordPress' ); + } + + return ''; + } + + /** + * Get WPFORMS validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_wpforms_validation_message( array $errors, string $basename ): string { + + if ( self::SHOW_WPFORMS_NOTICE && in_array( self::WPFORMS, $errors, true ) ) { + return $this->list_version_detailed( $this->requirements[ $basename ][ self::WPFORMS ], 'WPForms' ); + } + + return ''; + } + + /** + * Get LICENSE validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_license_validation_message( array $errors, string $basename ): string { + + if ( self::SHOW_LICENSE_NOTICE && in_array( self::LICENSE, $errors, true ) ) { + $license = wpforms_list_array( + array_map( 'ucfirst', $this->requirements[ $basename ][ self::LICENSE ] ), + false + ); + + return sprintf( + /* translators: %s - license name(s). */ + __( '%s license', 'wpforms-lite' ), + $license + ); + } + + return ''; + } + + /** + * Get an ADDON validation message. + * + * @since 1.8.2.2 + * + * @param array $errors Validation errors. + * @param string $basename Plugin basename. + * + * @return string + */ + private function get_addon_validation_message( array $errors, string $basename ): string { + + if ( self::SHOW_ADDON_NOTICE && in_array( self::ADDON, $errors, true ) ) { + return $this->list_version_detailed( + $this->requirements[ $basename ][ self::ADDON ], + $this->get_plugin_data( $this->requirements[ $basename ]['file'] )['Name'] + ); + } + + return ''; + } + + /** + * Show admin notice. + * + * @since 1.8.2.2 + * + * @param string $notice Message. + */ + private function show_notice( string $notice ): void { + + echo '
              '; + echo wp_kses_post( $notice ); + echo '
              '; + } + + /** + * Init addon requirements. + * + * @since 1.8.2.2 + * + * @param string $basename Addon basename. + */ + private function init_addon_requirements( string $basename ): void { + + if ( ! array_key_exists( $basename, $this->requirements ) ) { + $this->requirements[ $basename ] = []; + } + + // Set default addon version constant. + if ( array_key_exists( self::ADDON_VERSION_CONSTANT, $this->requirements[ $basename ] ) ) { + return; + } + + $const = str_replace( + '-', + '_', + strtoupper( explode( '/', $basename, 2 )[0] ) . '_VERSION' + ); + + $this->requirements[ $basename ][ self::ADDON_VERSION_CONSTANT ] = $const; + } + + /** + * Get version from requirements array. + * + * @since 1.8.2.2 + * + * @param array $requirement Array containing a requirement. + * + * @return string + */ + public function list_version( array $requirement ): string { + + $compare_arr = $this->get_compare_array( $requirement ); + $list = []; + + foreach ( $compare_arr as $version2 => $compare ) { + $list[] = $compare . $version2; + } + + return implode( ', ', $list ); + } + + /** + * Get a version from requirements' array in human-readable format. + * + * @since 1.9.0 + * + * @param array $requirement Array containing a requirement. + * @param string $what What is being checked. + * + * @return string + */ + private function list_version_detailed( array $requirement, string $what = '' ): string { + + $compare_arr = $this->get_compare_array( $requirement ); + $list = []; + + $compare_to_string = [ + /* translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". */ + '>=' => __( '%1$s %2$s or above', 'wpforms-lite' ), + /* translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". */ + '<=' => __( '%1$s %2$s or below', 'wpforms-lite' ), + '=' => '%1$s %2$s', + /* translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". */ + '>' => __( 'a newer version of %1$s than %2$s', 'wpforms-lite' ), + /* translators: %1$s - What is being checked (PHP, WPForms, etc.), %2$s - required version. This is used as the completion of the sentence "The {addon name} addon requires {here goes this string}". */ + '<' => __( 'an older version of %1$s than %2$s', 'wpforms-lite' ), + ]; + + foreach ( $compare_arr as $version2 => $compare ) { + if ( isset( $compare_to_string[ $compare ] ) ) { + $list[] = sprintf( $compare_to_string[ $compare ], $what, $version2 ); + } else { + $list[] = $what . ' ' . $compare . ' ' . $version2; + } + } + + return implode( ', ', $list ); + } + + /** + * Get a compare array in the following format: [ 'version' => 'compare', ... ]. + * + * @since 1.8.7 + * + * @param array $requirement Requirement. + * + * @return array + */ + public function get_compare_array( array $requirement ): array { + + $versions = $requirement[ self::VERSION ]; + $compares = $requirement[ self::COMPARE ]; + + return array_combine( $versions, $compares ); + } + + /** + * Get requirements. + * + * @since 1.8.8 + * + * @return array + */ + public function get_requirements(): array { + + return $this->requirements; + } + + /** + * Get not validated addons. + * + * @since 1.9.4 + * + * @return array + */ + public function get_not_validated_addons(): array { + + $all_addons = array_keys( $this->requirements ); + + return array_values( array_diff( $all_addons, $this->validated ) ); + } + + /** + * Get addons by license. + * + * @since 1.9.8.3 + * + * @param string|array $license License. + * + * @return array + */ + public function get_addons_by_license( $license ): array { + + if ( is_string( $license ) ) { + $license_arr = array_map( 'trim', (array) explode( ',', $license ) ); + } else { + $license_arr = (array) $license; + } + + $addons_by_license = []; + + foreach ( $this->requirements as $basename => $this->addon_requirements ) { + $this->addon_requirements = $this->merge_requirements( + $this->defaults, + $this->requirements[ $basename ], + $this->addon_requirements + ); + + if ( ! array_intersect( $license_arr, $this->addon_requirements[ self::LICENSE ] ) ) { + continue; + } + + $addons_by_license[ $basename ] = $this->addon_requirements; + } + + return $addons_by_license; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AdminEmail.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AdminEmail.php new file mode 100755 index 00000000..bcf33ce9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AdminEmail.php @@ -0,0 +1,27 @@ +get_author_meta( $entry_id, 'display_name' ); + + if ( ! empty( $author_display_name ) ) { + return esc_html( wp_strip_all_tags( $author_display_name ) ); + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + if ( ! empty( $_POST['page_id'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $author_id = get_post_field( 'post_author', absint( $_POST['page_id'] ) ); + + if ( ! $author_id ) { + return ''; + } + + $author_display_name = get_the_author_meta( 'display_name', $author_id ); + + return esc_html( wp_strip_all_tags( $author_display_name ) ); + } + + return esc_html( wp_strip_all_tags( get_the_author_meta( 'display_name' ) ) ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorEmail.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorEmail.php new file mode 100755 index 00000000..2f7508e7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorEmail.php @@ -0,0 +1,47 @@ +get_author_meta( $entry_id, 'user_email' ); + + if ( ! empty( $author_email ) ) { + return sanitize_email( $author_email ); + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + if ( ! empty( $_POST['page_id'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $author_id = get_post_field( 'post_author', absint( $_POST['page_id'] ) ); + + if ( ! $author_id ) { + return ''; + } + + $author_email = get_the_author_meta( 'user_email', $author_id ); + + return sanitize_email( $author_email ); + } + + return sanitize_email( get_the_author_meta( 'user_email' ) ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorId.php new file mode 100755 index 00000000..a6884f31 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/AuthorId.php @@ -0,0 +1,43 @@ +get_author_meta( $entry_id, 'ID' ); + + if ( ! empty( $author_id ) ) { + return absint( $author_id ); + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing + if ( ! empty( $_POST['page_id'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $author_id = get_post_field( 'post_author', absint( $_POST['page_id'] ) ); + + return $author_id ? absint( $author_id ) : ''; + } + + $author_id = get_the_author_meta( 'ID' ); + + return $author_id ? absint( $author_id ) : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/Date.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/Date.php new file mode 100755 index 00000000..36fd5d41 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/Date.php @@ -0,0 +1,35 @@ +get_attributes(); + + if ( empty( $attributes['format'] ) ) { + return wpforms_date_format( time(), '', true ); + } + + $format = strtolower( $attributes['format'] ) === 'timestamp' ? 'U' : $attributes['format']; + + return wpforms_datetime_format( time(), $format, true ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldHtmlId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldHtmlId.php new file mode 100755 index 00000000..63c34d67 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldHtmlId.php @@ -0,0 +1,56 @@ +get_attributes(); + + if ( ! isset( $attributes['field_html_id'] ) || ! is_numeric( $attributes['field_html_id'] ) || $attributes['field_html_id'] < 0 ) { + return ''; + } + + $field_id = absint( $attributes['field_html_id'] ); + + if ( empty( $fields[ $field_id ] ) ) { + return ''; + } + + if ( ! isset( $fields[ $field_id ]['value'] ) || (string) $fields[ $field_id ]['value'] === '' ) { + return '' . esc_html__( '(empty)', 'wpforms-lite' ) . ''; + } + + $value = $this->get_formatted_field_value( (int) $field_id, (array) $fields, 'value' ); + $value = wp_kses_post( wp_unslash( $value ) ); + + /** + * Modify value for the {field_html_id="123"} tag. + * + * @since 1.4.0 + * + * @param string $value Smart tag value. + * @param array $field The field. + * @param array $form_data Processed form settings/data, prepared to be used later. + * @param string $context Context usage. + */ + return (string) apply_filters( 'wpforms_html_field_value', $value, $fields[ $field_id ], $form_data, 'smart-tag' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldId.php new file mode 100755 index 00000000..2bc7bc5d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldId.php @@ -0,0 +1,59 @@ +get_attributes(); + + if ( ! isset( $attributes['field_id'] ) || $attributes['field_id'] === '' ) { + return ''; + } + + $field_parts = explode( '|', $attributes['field_id'] ); + $field_id = $field_parts[0]; + + if ( ! isset( $fields[ $field_id ] ) || $fields[ $field_id ] === '' ) { + return ''; + } + + $field_key = ! empty( $field_parts[1] ) ? sanitize_key( $field_parts[1] ) : 'value'; + $value = $this->get_formatted_field_value( (int) $field_id, (array) $fields, $field_key, $form_data ); + $value = wp_kses_post( wp_unslash( $value ) ); + + /** + * Modify value for the `field_id` smart tag. + * + * @since 1.5.3 + * @deprecated 1.6.7 + * + * @see This filter is documented in wp-includes/plugin.php + * + * @param string $value Smart tag value. + */ + return (string) apply_filters_deprecated( + 'wpforms_field_smart_tag_value', + [ $value ], + '1.6.7', + 'wpforms_smarttags_process_field_id_value' + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldValueId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldValueId.php new file mode 100755 index 00000000..64b1121d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FieldValueId.php @@ -0,0 +1,45 @@ +get_attributes(); + + if ( ! isset( $attributes['field_value_id'] ) || $attributes['field_value_id'] === '' ) { + return ''; + } + + $field_id = $attributes['field_value_id']; + + if ( ! isset( $fields[ $field_id ] ) || $fields[ $field_id ] === '' ) { + return ''; + } + + $field_key = isset( $fields[ $field_id ]['value_raw'] ) && ! is_array( $fields[ $field_id ]['value_raw'] ) && (string) $fields[ $field_id ]['value_raw'] !== '' + ? 'value_raw' + : 'value'; + + $value = $this->get_formatted_field_value( (int) $field_id, (array) $fields, $field_key, $form_data ); + + return wp_kses_post( wp_unslash( $value ) ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FormId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FormId.php new file mode 100755 index 00000000..81055fbf --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/FormId.php @@ -0,0 +1,27 @@ +obj( 'entry' )->get( $entry_id ); + $fields = isset( $entry->fields ) ? (array) wpforms_decode( $entry->fields ) : []; + } + + $fields = $this->prepare_fields( $fields, $form_data ); + + [ $items, $foot, $total_width ] = $this->prepare_payment_fields_data( $fields ); + + $preview = wpforms_render( + 'fields/total/summary-preview', + [ + 'items' => $this->filter_items( $items ), + 'foot' => $foot, + 'total_width' => $total_width, + 'context' => 'smart_tag', + ], + true + ); + + if ( $this->context === 'email' ) { + // Remove new lines for the legacy Notification template to prevent HTML markup breaks. + // We remove only new lines before closing HTML tag symbol to keep new lines inside the table content. + return preg_replace( '/(>$\n)/m', '>', $preview ); + } + + return $preview; + } + + /** + * Filter items. + * + * @since 1.9.3 + * + * @param array $items Items data. + * + * @return array + */ + private function filter_items( array $items ): array { + + // Bail early if not in notification context. + if ( $this->context !== 'notification' ) { + return $items; + } + + return array_filter( + $items, + function ( $item ) { + // Return items that are not hidden. + return empty( $item['is_hidden'] ); + } + ); + } + + /** + * Prepare fields data for summary preview. + * Add label_hide property to fields if needed. + * + * @since 1.9.2 + * + * @param array $fields Fields data. + * @param array $form_data Form data and settings. + * + * @return array + */ + private function prepare_fields( array $fields, array $form_data ): array { + + return array_map( + function ( $field ) use ( $form_data ) { + return $this->prepare_field( $field, $form_data ); + }, + $fields + ); + } + + /** + * Prepare field data for summary preview. + * + * @since 1.9.3 + * + * @param array $field Field data. + * @param array $form_data Form data and settings. + * + * @return array + */ + private function prepare_field( array $field, array $form_data ): array { + + $form_data_fields = $form_data['fields'] ?? []; + $field_data = $form_data_fields[ $field['id'] ] ?? []; + + if ( isset( $field_data['label_hide'] ) ) { + $field['label_hide'] = true; + } + + if ( isset( $field_data['format'] ) && $field_data['format'] === 'hidden' ) { + $field['is_hidden'] = true; + } + + return $field; + } + + /** + * Prepare payment fields data for summary preview. + * + * @since 1.8.7 + * + * @param array $fields Fields data. + * + * @return array + */ + private function prepare_payment_fields_data( array $fields ): array { + + $payment_fields = wpforms_payment_fields(); + $items = []; + $coupon = []; + $foot = []; + $total = 0; + $total_width = 0; + + foreach ( $fields as $field ) { + + if ( + empty( $field['value'] ) || + ! in_array( $field['type'], $payment_fields, true ) + ) { + continue; + } + + if ( $field['type'] === 'payment-coupon' ) { + $coupon = $field; + + continue; + } + + $this->prepare_single_item( $field, $items, $total ); + $this->prepare_multiple_item( $field, $items, $total ); + } + + $this->prepare_coupon_item( $coupon, $foot, $total, $total_width ); + + $total = wpforms_format_amount( $total, true ); + + $foot[] = [ + 'label' => __( 'Total', 'wpforms-lite' ), + 'quantity' => '', + 'amount' => $total, + 'class' => 'wpforms-order-summary-preview-total', + ]; + + // Add two extra characters units to accommodate symbols that can be wider than one character (e.g. “€â€), + // and to normalize the ch-unit width discrepancy between Windows and Unix-based operating systems. + $total_width = max( $total_width, mb_strlen( html_entity_decode( $total, ENT_COMPAT, 'UTF-8' ) ) + 2 ); + + return [ $items, $foot, $total_width ]; + } + + /** + * Prepare single item for summary preview. + * + * @since 1.8.7 + * + * @param array $field Field data. + * @param array $items Summary items. + * @param string $total Form total. + */ + private function prepare_single_item( array $field, array &$items, string &$total ) { + + // Single value. + if ( ! in_array( $field['type'], [ 'payment-single', 'payment-multiple', 'payment-select' ], true ) ) { + return; + } + + $quantity = $this->get_payment_field_quantity( $field ); + + if ( ! $quantity ) { + return; + } + + $value_raw = $field['value_raw'] ?? ''; + /* translators: %s - item number. */ + $value_choice = ! empty( $field['value_choice'] ) ? $field['value_choice'] : sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $value_raw ); + + $label = ! empty( $value_raw ) ? $field['name'] . ' - ' . $value_choice : $field['name']; + $amount = $field['amount_raw'] * $quantity; + + $items[] = [ + 'label' => ! empty( $field['label_hide'] ) ? $value_choice : $label, + 'quantity' => $quantity, + 'amount' => wpforms_format_amount( $amount, true ), + 'is_hidden' => ! empty( $field['is_hidden'] ), + ]; + + $total += $amount; + } + + /** + * Prepare multiple item for summary preview. + * + * @since 1.8.7 + * + * @param array $field Field data. + * @param array $items Summary items. + * @param string $total Form total. + */ + private function prepare_multiple_item( array $field, array &$items, string &$total ) { + + if ( $field['type'] !== 'payment-checkbox' ) { + return; + } + + $quantity = $this->get_payment_field_quantity( $field ); + + if ( ! $quantity ) { + return; + } + + // Multiple values. + $value_choices = explode( "\n", $field['value'] ); + + foreach ( $value_choices as $key => $value_choice ) { + + $choice_data = explode( ' - ', $value_choice ); + $labels = $this->get_multiple_item_labels( $choice_data, $field, $key ); + + $items[] = [ + 'label' => ! empty( $field['label_hide'] ) ? implode( ' - ', $labels ) : $field['name'] . ' - ' . implode( ' - ', $labels ), + 'quantity' => $quantity, + 'amount' => end( $choice_data ), + ]; + } + + $total += $field['amount_raw']; + } + + /** + * Get multiple item labels. + * + * @since 1.9.3 + * + * @param array $choice_data Choice data. + * @param array $field Field data. + * @param int $key Choice key. + * + * @return array + */ + private function get_multiple_item_labels( array $choice_data, array $field, int $key ): array { + + $labels = array_slice( $choice_data, 0, -1 ); + + if ( ! empty( $labels ) ) { + return $labels; + } + + $raw_values = explode( ',', $field['value_raw'] ); + /* translators: %s - item number. */ + return [ sprintf( esc_html__( 'Item %s', 'wpforms-lite' ), $raw_values[ $key ] ?? '' ) ]; + } + + /** + * Prepare coupon item for summary preview. + * + * @since 1.8.7 + * + * @param array $coupon Coupon data. + * @param array $foot Summary footer. + * @param string $total Form total. + * @param string $total_width Total width. + */ + private function prepare_coupon_item( array $coupon, array &$foot, string &$total, string &$total_width ) { + + if ( empty( $coupon ) ) { + return; + } + + $foot[] = [ + 'label' => __( 'Subtotal', 'wpforms-lite' ), + 'quantity' => '', + 'amount' => wpforms_format_amount( $total, true ), + 'class' => 'wpforms-order-summary-preview-subtotal', + ]; + + $coupon_label = sprintf( /* translators: %s - Coupon value. */ + __( 'Coupon (%s)', 'wpforms-lite' ), + $coupon['value'] + ); + + $coupon_amount = $this->get_coupon_amount( $coupon ); + + $foot[] = [ + 'label' => $coupon_label, + 'quantity' => '', + 'amount' => $coupon_amount, + 'class' => 'wpforms-order-summary-preview-coupon-total', + ]; + + // Coupon value saved as negative. + $total += $coupon['amount_raw']; + + $total_width = strlen( html_entity_decode( $coupon_amount, ENT_COMPAT, 'UTF-8' ) ); + } + + /** + * Get coupon amount. + * + * @since 1.8.7 + * + * @param array $coupon Coupon data. + * + * @return string Formatted coupon amount. + */ + private function get_coupon_amount( array $coupon ): string { + // Coupon amount saved as negative, so we need to format it nicely. + $coupon_amount = '- ' . wpforms_format_amount( abs( $coupon['amount_raw'] ), true ); + + /** + * Allow to filter order summary coupon amount. + * + * @since 1.8.7 + * + * @param string $coupon_amount Coupon amount. + * @param array $coupon Coupon data. + */ + return apply_filters( 'wpforms_smart_tags_smart_tag_order_summary_coupon_amount', $coupon_amount, $coupon ); + } + + /** + * Get payment field quantity. + * + * @since 1.8.7 + * + * @param array $field Field data. + * + * @return int + */ + private function get_payment_field_quantity( array $field ): int { + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + return isset( $field['quantity'] ) ? (int) $field['quantity'] : 1; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageId.php new file mode 100755 index 00000000..b8634b32 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageId.php @@ -0,0 +1,40 @@ +get_meta( $entry_id, 'page_id' ); + + if ( ! empty( $page_id ) ) { + return absint( $page_id ); + } + + // phpcs:disable WordPress.Security.NonceVerification.Missing + if ( ! empty( $_POST['page_id'] ) ) { + return absint( $_POST['page_id'] ); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing + + // We should not return any value on pages that don't belong to the page type. + return is_singular() || ( is_front_page() && is_page() ) ? get_the_ID() : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageTitle.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageTitle.php new file mode 100755 index 00000000..947538a9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageTitle.php @@ -0,0 +1,83 @@ +get_meta( $entry_id, 'page_title' ); + + if ( ! empty( $page_title ) ) { + return wp_kses_post( $page_title ); + } + + // phpcs:disable WordPress.Security.NonceVerification.Missing + if ( ! empty( $_POST['page_title'] ) && ! is_array( $_POST['page_title'] ) ) { + return wp_kses_post( wp_unslash( $_POST['page_title'] ) ); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing + + if ( is_front_page() ) { + return wp_kses_post( is_page() ? get_the_title( get_the_ID() ) : get_bloginfo( 'name' ) ); + } + + return wp_kses_post( $this->get_wp_title() ); + } + + /** + * Retrieve a page title based on `wp_title()`. + * + * @since 1.7.9 + * + * @return string + */ + private function get_wp_title() { + + global $wp_filter; + + // Back up all callbacks. + $callbacks = isset( $wp_filter['wp_title']->callbacks ) ? $wp_filter['wp_title']->callbacks : []; + + if ( ! empty( $callbacks ) ) { + // Unset all callbacks. + $wp_filter['wp_title']->callbacks = []; + } + + /* + * In most cases `wp_title()` returns the value we're going to use, except: + * - on static front page (we can use page title as a fallback), + * - on standard front page with the latest post (we can use the site name as a fallback). + */ + $title = trim( wp_title( '', false ) ); + + // Run through the default transformations WordPress does on this hook. + $title = wptexturize( $title ); + $title = convert_chars( $title ); + $title = esc_html( $title ); + $title = capital_P_dangit( $title ); + + if ( ! empty( $callbacks ) ) { + // Restore all callbacks. + $wp_filter['wp_title']->callbacks = $callbacks; + } + + return $title; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageUrl.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageUrl.php new file mode 100755 index 00000000..548df9a6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/PageUrl.php @@ -0,0 +1,40 @@ +get_meta( $entry_id, 'page_url' ); + + if ( ! empty( $page_url ) ) { + return esc_url( urldecode( $page_url ) ); + } + + // phpcs:disable WordPress.Security.NonceVerification + $page_url = ! empty( $_POST['page_url'] ) + ? esc_url_raw( wp_unslash( $_POST['page_url'] ) ) + : wpforms_current_url(); + $page_url = urldecode( $page_url ); + // phpcs:enable WordPress.Security.NonceVerification + + return esc_url( $page_url ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/QueryVar.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/QueryVar.php new file mode 100755 index 00000000..c1ec7d52 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/QueryVar.php @@ -0,0 +1,76 @@ +get_attributes(); + + if ( empty( $attributes['key'] ) ) { + return ''; + } + + // phpcs:disable WordPress.Security.NonceVerification.Recommended + if ( ! empty( $_GET[ $attributes['key'] ] ) ) { + return esc_html( sanitize_text_field( wp_unslash( $_GET[ $attributes['key'] ] ) ) ); + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + $page_url = $this->get_page_url( $entry_id ); + + if ( empty( $page_url ) ) { + return ''; + } + + $query = wp_parse_url( esc_url_raw( wp_unslash( $page_url ) ), PHP_URL_QUERY ); + // phpcs:enable WordPress.Security.NonceVerification.Missing + + if ( ! $query ) { + return ''; + } + + parse_str( $query, $results ); + + return ! empty( $results[ $attributes['key'] ] ) ? esc_html( sanitize_text_field( wp_unslash( $results[ $attributes['key'] ] ) ) ) : ''; + } + + /** + * Get page URL. + * + * @since 1.9.4 + * + * @param string $entry_id Entry ID. + * + * @return string + */ + private function get_page_url( $entry_id ): string { + + // phpcs:disable WordPress.Security.NonceVerification.Missing + if ( ! empty( $_POST['page_url'] ) ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + return (string) $_POST['page_url']; // It sanitized in the get_value method. + } + // phpcs:enable WordPress.Security.NonceVerification.Missing + + return $this->get_meta( $entry_id, 'page_url' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/SiteName.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/SiteName.php new file mode 100755 index 00000000..75d46c7e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/SiteName.php @@ -0,0 +1,27 @@ +smart_tag = $smart_tag; + $this->context = $context; + } + + /** + * Get smart tag value. + * + * @since 1.6.7 + * + * @param array $form_data Form data. + * @param array $fields List of fields. + * @param string $entry_id Entry ID. + * + * @return string + */ + abstract public function get_value( $form_data, $fields = [], $entry_id = '' ); + + /** + * Get list of smart tag attributes. + * + * @since 1.6.7 + * + * @return array + */ + public function get_attributes() { + + if ( ! empty( $this->attributes ) ) { + return $this->attributes; + } + + /** + * (\w+) an attribute name and also the first capturing group. Lowercase or uppercase letters, digits, underscore. + * = the equal sign. + * (["\']) single or double quote, the second capturing group. + * (.+?) an attribute value within the quotes, and also the third capturing group. Any number of any characters except new line. Lazy mode - match as few characters as possible to allow multiple attributes on one line. + * \2 - repeat the second capturing group. + */ + preg_match_all( '/(\w+)=(["\'])(.+?)\2/', $this->smart_tag, $attributes ); + $this->attributes = array_combine( $attributes[1], $attributes[3] ); + + return $this->attributes; + } + + /** + * Get current user. + * + * @since 1.8.7 + * + * @param string|int $entry_id Entry ID. + * + * @return WP_User|string + */ + public function get_user( $entry_id ) { + + $user = $this->get_entry_user( $entry_id ); + + if ( ! empty( $user ) ) { + return $user; + } + + return ! wpforms_doing_scheduled_action() && is_user_logged_in() ? wp_get_current_user() : ''; + } + + /** + * Get user from the entry. + * + * @since 1.8.8 + * + * @param string|int $entry_id Entry ID. + * + * @return WP_User|string + */ + private function get_entry_user( $entry_id ) { + + $entry_user_id = $this->get_entry_user_id( $entry_id ); + + if ( empty( $entry_user_id ) ) { + return ''; + } + + $user = get_user_by( 'id', $entry_user_id ); + + return $user instanceof WP_User ? $user : ''; + } + + /** + * Retrieve user ID from entry meta or AS task. + * + * @since 1.9.4 + * + * @param int|string $entry_id Entry ID. + * + * @return int + */ + private function get_entry_user_id( $entry_id ): int { + + if ( empty( $entry_id ) ) { + return (int) $this->get_meta( 0, 'user_id' ); + } + + $entry = wpforms()->obj( 'entry' ); + + if ( empty( $entry ) ) { + return 0; + } + + $entry_data = $entry->get( $entry_id ); + + return $entry_data && isset( $entry_data->user_id ) ? (int) $entry_data->user_id : 0; + } + + /** + * Get author. + * + * @since 1.8.7 + * + * @param int $post_id Submitted post ID. + * + * @return WP_User|false WP_User object on success, false on failure. + */ + public function get_author( $post_id ) { + + $author_id = get_post_field( 'post_author', $post_id ); + + return get_user_by( 'id', $author_id ); + } + + /** + * Get author property. + * + * @since 1.8.8 + * + * @param int|string $entry_id Entry ID. + * @param string $meta_key User property. + * + * @return string + */ + protected function get_author_meta( $entry_id, string $meta_key ): string { + + $page_id = $this->get_meta( $entry_id, 'page_id' ); + + if ( empty( $page_id ) ) { + return ''; + } + + $author = $this->get_author( $page_id ); + + if ( ! $author ) { + return ''; + } + + return $author->{$meta_key} ?? ''; + } + + /** + * Get entry meta. + * + * @since 1.8.7 + * + * @param string|int $entry_id Entry ID. + * @param string $meta_key Meta key. + * + * @return string Meta value. + */ + public function get_meta( $entry_id, string $meta_key ): string { + + $meta_data = ''; + + if ( ! empty( $entry_id ) ) { + $entry_meta = wpforms()->obj( 'entry_meta' ); + + if ( $entry_meta ) { + $meta = $entry_meta->get_meta( + [ + 'entry_id' => $entry_id, + 'type' => $meta_key, + 'number' => 1, + ] + ); + + $meta_data = isset( $meta[0]->data ) ? (string) $meta[0]->data : ''; + } + } + + /** + * Allow modifying the entry meta-value. + * + * @since 1.9.4 + * + * @param string $meta_data Meta value. + * @param string $meta_key Meta key. + * @param string|int $entry_id Entry ID. + * @param SmartTag $smart_tag Smart tag object. + * + * @return string + */ + return (string) apply_filters( 'wpforms_smart_tags_smart_tag_get_meta_value', $meta_data, $meta_key, $entry_id, $this ); //phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + } + + /** + * Get formatted field value. + * + * @since 1.8.9 + * + * @param int $field_id Field ID. + * @param array $fields List of fields. + * @param string $field_key Field key to get value from. + * @param array $form_data Form data. + * + * @return string + */ + protected function get_formatted_field_value( int $field_id, array $fields, string $field_key, array $form_data = [] ): string { + + $value = $fields[ $field_id ][ $field_key ] ?? ''; + + /** + * Allow modifying the formatted field value. + * + * @since 1.9.0 + * + * @param string $value Field value. + * @param int $field_id Field ID. + * @param array $fields List of fields. + * @param string $field_key Field key to get value from. + * @param array $form_data Form data. + * + * @return string + */ + $value = (string) apply_filters( 'wpforms_smart_tags_formatted_field_value', $value, $field_id, $fields, $field_key, $form_data ); //phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + if ( ! wpforms_is_repeated_field( $field_id, $fields ) ) { + return $value; + } + + return $this->get_repeated_field_value( $value, $field_id, $fields, $field_key ); + } + + /** + * Get repeated fields value. + * + * @since 1.8.9 + * + * @param string $value Field value. + * @param int $field_id Field ID. + * @param array $fields List of fields. + * @param string $field_key Field key to get value from. + * + * @return string + */ + private function get_repeated_field_value( string $value, int $field_id, array $fields, string $field_key ): string { + + $comma_separated_contexts = [ 'notification-send-to-email', 'notification-carboncopy' ]; + $prefix = $field_id . '_'; + $separator = in_array( $this->context, $comma_separated_contexts, true ) ? ',' : "\n"; + + foreach ( $fields as $key => $field ) { + if ( strpos( $key, $prefix ) !== 0 ) { + continue; + } + + if ( ! isset( $field[ $field_key ] ) ) { + continue; + } + + $value .= $separator . $field[ $field_key ]; + } + + return $value; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UniqueValue.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UniqueValue.php new file mode 100755 index 00000000..4dc8293d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UniqueValue.php @@ -0,0 +1,91 @@ +get_attributes(); + + if ( array_key_exists( 'length', $attributes ) ) { + $length = max( $length, absint( $attributes['length'] ) ); + } + + if ( array_key_exists( 'format', $attributes ) && ! empty( $attributes['format'] ) ) { + $format = $attributes['format']; + } + + return $this->generate_string( $length, $format ); + } + + /** + * Generates a random string in defined format. + * + * @since 1.7.5 + * + * @param int $length Optional. The length of string to generate. + * @param string $format The format of string to generate. Accepts 'alphanumeric', + * 'numeric', and 'alpha'. Default 'alphanumeric'. + * + * @return string + */ + private function generate_string( $length = 16, $format = 'alphanumeric' ) { + + $alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $numbers = '0123456789'; + + switch ( strtolower( $format ) ) { + case 'numeric': + $chars = $numbers; + break; + + case 'alpha': + $chars = $alpha; + break; + + default: + $chars = $alpha . $numbers; + break; + } + + $chars = str_pad( $chars, $length, $chars ); + + return substr( str_shuffle( $chars ), 0, $length ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlLogin.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlLogin.php new file mode 100755 index 00000000..82dbcc07 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlLogin.php @@ -0,0 +1,27 @@ +get_meta( $entry_id, 'url_referer' ); + + if ( ! empty( $referer ) ) { + return $this->context === 'confirmation_redirect' + ? urldecode( $referer ) + : esc_url( urldecode( $referer ) ); + } + + $process = wpforms()->obj( 'process' ); + + if ( $process && ! empty( $process->form_data['entry_meta']['url_referer'] ) ) { + return esc_url( urldecode( $process->form_data['entry_meta']['url_referer'] ) ); + } + + if ( wp_doing_ajax() ) { + return ''; + } + + $referer = urldecode( (string) wp_get_raw_referer() ); + + return esc_url( $referer ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlRegister.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlRegister.php new file mode 100755 index 00000000..9a80de18 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UrlRegister.php @@ -0,0 +1,27 @@ +get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return $current_user->exists() ? esc_html( wp_strip_all_tags( $current_user->display_name ) ) : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserEmail.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserEmail.php new file mode 100755 index 00000000..2ba21621 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserEmail.php @@ -0,0 +1,35 @@ +get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return $current_user->exists() ? sanitize_email( $current_user->user_email ) : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFirstName.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFirstName.php new file mode 100755 index 00000000..b3e76354 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFirstName.php @@ -0,0 +1,35 @@ +get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return $current_user->exists() ? esc_html( wp_strip_all_tags( $current_user->user_firstname ) ) : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFullName.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFullName.php new file mode 100755 index 00000000..cff9ec59 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserFullName.php @@ -0,0 +1,35 @@ +get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return $current_user->exists() ? esc_html( wp_strip_all_tags( $current_user->user_firstname . ' ' . $current_user->user_lastname ) ) : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserId.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserId.php new file mode 100755 index 00000000..b501e26b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserId.php @@ -0,0 +1,35 @@ +get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return $current_user->exists() ? $current_user->ID : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserIp.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserIp.php new file mode 100755 index 00000000..afe0fd17 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserIp.php @@ -0,0 +1,39 @@ +obj( 'entry' ); + $entry = $entry_obj ? $entry_obj->get( $entry_id ) : null; + + return $entry->ip_address ?? ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserLastName.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserLastName.php new file mode 100755 index 00000000..2a8f0bcf --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserLastName.php @@ -0,0 +1,35 @@ +get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return $current_user->exists() ? esc_html( wp_strip_all_tags( $current_user->user_lastname ) ) : ''; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserMeta.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserMeta.php new file mode 100755 index 00000000..45a4a812 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTag/UserMeta.php @@ -0,0 +1,47 @@ +get_attributes(); + + if ( empty( $attributes['key'] ) ) { + return ''; + } + + $current_user = $this->get_user( $entry_id ); + + if ( ! $current_user instanceof WP_User ) { + return ''; + } + + return wp_kses_post( + get_user_meta( + $current_user->ID, + sanitize_text_field( $attributes['key'] ), + true + ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTags.php b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTags.php new file mode 100755 index 00000000..af5d5843 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/SmartTags/SmartTags.php @@ -0,0 +1,569 @@ +smart_tags ) ) { + return $this->smart_tags; + } + + /** + * Modify the smart tags' list. + * + * @since 1.4.0 + * + * @param array $tags The list of smart tags. + */ + $this->smart_tags = (array) apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_smart_tags', + $this->smart_tags_list() + ); + + return $this->smart_tags; + } + + /** + * Get the list of registered smart tags. + * + * @since 1.6.7 + * + * @return array + */ + protected function smart_tags_list() { + + return [ + 'admin_email' => esc_html__( 'Site Administrator Email', 'wpforms-lite' ), + 'field_id' => esc_html__( 'Field ID', 'wpforms-lite' ), + 'field_html_id' => esc_html__( 'Field HTML ID', 'wpforms-lite' ), + 'field_value_id' => esc_html__( 'Field Value', 'wpforms-lite' ), + 'form_id' => esc_html__( 'Form ID', 'wpforms-lite' ), + 'form_name' => esc_html__( 'Form Name', 'wpforms-lite' ), + 'page_title' => esc_html__( 'Embedded Post/Page Title', 'wpforms-lite' ), + 'page_url' => esc_html__( 'Embedded Post/Page URL', 'wpforms-lite' ), + 'page_id' => esc_html__( 'Embedded Post/Page ID', 'wpforms-lite' ), + 'date' => esc_html__( 'Date', 'wpforms-lite' ), + 'query_var' => esc_html__( 'Query String Variable', 'wpforms-lite' ), + 'user_ip' => esc_html__( 'User IP Address', 'wpforms-lite' ), + 'user_id' => esc_html__( 'User ID', 'wpforms-lite' ), + 'user_display' => esc_html__( 'User Display Name', 'wpforms-lite' ), + 'user_full_name' => esc_html__( 'User Full Name', 'wpforms-lite' ), + 'user_first_name' => esc_html__( 'User First Name', 'wpforms-lite' ), + 'user_last_name' => esc_html__( 'User Last Name', 'wpforms-lite' ), + 'user_email' => esc_html__( 'Logged-in User\'s Email', 'wpforms-lite' ), + 'user_meta' => esc_html__( 'User Meta', 'wpforms-lite' ), + 'author_id' => esc_html__( 'Author ID', 'wpforms-lite' ), + 'author_display' => esc_html__( 'Author Name', 'wpforms-lite' ), + 'author_email' => esc_html__( 'Author Email', 'wpforms-lite' ), + 'url_referer' => esc_html__( 'Referrer URL', 'wpforms-lite' ), + 'url_login' => esc_html__( 'Login URL', 'wpforms-lite' ), + 'url_logout' => esc_html__( 'Logout URL', 'wpforms-lite' ), + 'url_register' => esc_html__( 'Register URL', 'wpforms-lite' ), + 'url_lost_password' => esc_html__( 'Lost Password URL', 'wpforms-lite' ), + 'unique_value' => esc_html__( 'Unique Value', 'wpforms-lite' ), + 'site_name' => esc_html__( 'Site Name', 'wpforms-lite' ), + 'order_summary' => esc_html__( 'Order Summary', 'wpforms-lite' ), + ]; + } + + /** + * Add the Form Builder strings. + * + * @since 1.9.5 + * + * @param array $strings Localized strings. + * @param WP_Post $form Form object. + * + * @return array + * @noinspection HtmlUnknownTarget + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUnusedParameterInspection + */ + public function add_builder_strings( $strings, $form ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed + + $strings = (array) $strings; + + /** + * Smart Tags. + * + * @since 1.6.7 + * + * @param array $smart_tags Array of smart tags. + */ + $smart_tags = (array) apply_filters( 'wpforms_builder_enqueues_smart_tags', $this->get_smart_tags() ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + $st_strings = [ + 'smart_tags_dropdown_mce_icon' => WPFORMS_PLUGIN_URL . 'assets/images/icon-tags.svg', + 'smart_tags' => $smart_tags, + 'smart_tags_disabled_for_fields' => [ 'entry_id' ], + 'smart_tags_edit_ok_button' => esc_html__( 'Apply changes', 'wpforms-lite' ), + 'smart_tags_delete_button' => esc_html__( 'Delete smart tag', 'wpforms-lite' ), + 'smart_tags_edit' => esc_html__( 'edit', 'wpforms-lite' ), + 'smart_tags_arg' => esc_html__( 'argument', 'wpforms-lite' ), + 'smart_tags_unknown_field' => esc_html__( 'Unknown Field', 'wpforms-lite' ), + 'smart_tags_templates' => [ + /* translators: %1$s - field ID, %2$s - field label. */ + 'field_id' => esc_html__( 'Field %1$s', 'wpforms-lite' ), + /* translators: %1$s - field ID, %2$s - field label. */ + 'field_value_id' => esc_html__( 'Field value %1$s', 'wpforms-lite' ), + /* translators: %1$s - field ID, %2$s - field label. */ + 'field_html_id' => esc_html__( 'Field HTML %1$s', 'wpforms-lite' ), + /* translators: %1$s - Query String Variable. */ + 'query_var' => esc_html__( 'Query String Variable: %1$s', 'wpforms-lite' ), + /* translators: %1$s - User meta key. */ + 'user_meta' => esc_html__( 'User Meta: %1$s', 'wpforms-lite' ), + /* translators: %1$s - Date format. */ + 'date' => esc_html__( 'Date: %1$s', 'wpforms-lite' ), + /* translators: %1$s - Date format. */ + 'entry_date' => esc_html__( 'Entry Date: %1$s', 'wpforms-lite' ), + ], + /** + * Filters the list of Smart Tags that are disabled for confirmations. + * + * @since 1.9.3 + * + * @param array $disabled List of disabled Smart Tags. + */ + 'smart_tags_disabled_for_confirmations' => apply_filters( 'wpforms_builder_smart_tags_disabled_for_confirmations', [] ), // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + ]; + + $st_strings['smart_tags_button_tooltip'] = sprintf( + wp_kses( /* translators: %1$s - link to the WPForms.com doc article. */ + __( 'Easily add dynamic information from various sources with Smart Tags.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_url( + wpforms_utm_link( + 'https://wpforms.com/docs/how-to-use-smart-tags-in-wpforms/', + 'Builder Settings', + 'Smart Tags Documentation' + ) + ) + ); + + return array_merge( $strings, $st_strings ); + } + + /** + * Get all smart tags in the content. + * + * @since 1.6.7 + * + * @param string $content Content. + * + * @return array + */ + private function get_all_smart_tags( $content ) { + + /** + * A smart tag should start and end with a curly brace. + * ([a-z0-9_]+) a smart tag name and also the first capturing group. + * Lowercase letters, digits, and an underscore. + * (|[ =][^\n}]*) - second capturing group: + * | no characters at all or the following: + * [ =][^\n}]* space or equal sign and any number of any characters except new line and closing curly brace. + */ + preg_match_all( '~{([a-z0-9_]+)(|[ =][^\n}]*)}~', $content, $smart_tags ); + + return array_combine( $smart_tags[0], $smart_tags[1] ); + } + + /** + * Process smart tags. + * + * @since 1.6.7 + * @since 1.8.7 Added `$context` parameter. + * + * @param string $content Content. + * @param array $form_data Form data. + * @param array $fields List of fields. + * @param string $entry_id Entry ID. + * @param string $context Context. + * + * @return string + */ + public function process( $content, $form_data, $fields = [], $entry_id = '', $context = '' ) { + + // We shouldn't process smart tags in different WordPress editors + // since it produce unexpected results. + if ( wpforms_is_editor_page() ) { + return $content; + } + + $smart_tags = $this->get_all_smart_tags( $content ); + + if ( empty( $smart_tags ) ) { + return $content; + } + + foreach ( $smart_tags as $smart_tag => $tag_name ) { + $class_name = $this->get_smart_tag_class_name( $tag_name ); + $smart_tag_object = new $class_name( $smart_tag, $context ); + $value = $smart_tag_object->get_value( $form_data, $fields, $entry_id ); + $field_id = $smart_tag_object->get_attributes()['field_id'] ?? 0; + $field_id = (int) explode( '|', $field_id )[0]; + + if ( + $context === 'confirmation_redirect' && + $field_id > 0 && + in_array( + $fields[ $field_id ]['type'], + wpforms_get_multi_fields(), + true + ) + ) { + // Protect from the case where the user already placed a pipe in the value. + $value = str_replace( + [ "\r\n", "\r", "\n", '|' ], + [ rawurlencode( '|' ), '|', '|', '|' ], + $value + ); + } + + /** + * Modify the smart tag value. + * + * @since 1.6.7 + * @since 1.6.7.1 Added the 5th argument. + * @since 1.9.0 Added the 6th argument. + * + * @param scalar|null $value Smart Tag value. + * @param array $form_data Form data. + * @param array $fields List of fields. + * @param int $entry_id Entry ID. + * @param SmartTag $smart_tag_object The smart tag object or the Generic object for those cases when class unregistered. + * @param string $context Context. + */ + $value = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + "wpforms_smarttags_process_{$tag_name}_value", + $value, + $form_data, + $fields, + $entry_id, + $smart_tag_object, + $context + ); + + /** + * Modify a smart tag value. + * + * @since 1.6.7.1 + * @since 1.9.7.3 Added the 7th argument. + * + * @param scalar|null $value Smart Tag value. + * @param string $tag_name Smart tag name. + * @param array $form_data Form data. + * @param array $fields List of fields. + * @param int $entry_id Entry ID. + * @param SmartTag $smart_tag_object The smart tag object or the Generic object for those cases when class unregistered. + * @param string $context Context. + */ + $value = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_smarttags_process_value', + $value, + $tag_name, + $form_data, + $fields, + $entry_id, + $smart_tag_object, + $context + ); + + if ( $value !== null ) { + $content = $this->replace( $smart_tag, $value, $content ); + } + + /** + * Modify content with smart tags. + * + * @since 1.4.0 + * @since 1.6.7.1 Added 3rd, 4th, 5th, 6th arguments. + * + * @param string $content Content of the Smart Tag. + * @param string $tag_name Tag name of the Smart Tag. + * @param array $form_data Form data. + * @param string $fields List of fields. + * @param int $entry_id Entry ID. + * @param SmartTag $smart_tag_object The smart tag object or the Generic object for those cases when class unregistered. + */ + $content = (string) apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + 'wpforms_smart_tag_process', + $content, + $tag_name, + $form_data, + $fields, + $entry_id, + $smart_tag_object + ); + } + + return $content; + } + + /** + * Determine if the smart tag is registered. + * + * @since 1.6.7 + * + * @param string $smart_tag_name Smart tag name. + * + * @return bool + */ + protected function has_smart_tag( $smart_tag_name ) { + + return array_key_exists( $smart_tag_name, $this->get_smart_tags() ); + } + + /** + * Get a smart tag class name. + * + * @since 1.6.7 + * + * @param string $smart_tag_name Smart tag name. + * + * @return string + */ + protected function get_smart_tag_class_name( $smart_tag_name ) { + + if ( ! $this->has_smart_tag( $smart_tag_name ) ) { + return Generic::class; + } + + $class_name = str_replace( ' ', '', ucwords( str_replace( '_', ' ', $smart_tag_name ) ) ); + + $full_class_name = '\\WPForms\\SmartTags\\SmartTag\\' . $class_name; + + if ( class_exists( $full_class_name ) ) { + return $full_class_name; + } + + /** + * Modify a smart tag class name that describes the smart tag logic. + * + * @since 1.6.7 + * + * @param string $class_name The value. + * @param string $smart_tag_name Smart tag name. + */ + $full_class_name = apply_filters( 'wpforms_smarttags_get_smart_tag_class_name', '', $smart_tag_name ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName + + return class_exists( $full_class_name ) ? $full_class_name : Generic::class; + } + + /** + * Retrieve the builder's special tags. + * + * @since 1.6.7 + * + * @return array + */ + protected function get_replacement_builder_tags() { + + return [ + 'date' => 'date format="m/d/Y"', + 'query_var' => 'query_var key=""', + 'user_meta' => 'user_meta key=""', + ]; + } + + /** + * Hide smart tags in the builder. + * + * @since 1.6.7 + * + * @return array + */ + protected function get_hidden_builder_tags() { + + return [ + 'field_id', + 'field_html_id', + 'field_value_id', + ]; + } + + /** + * Builder tags. + * + * @since 1.6.7 + * + * @return array + */ + public function builder() { + + $smart_tags = $this->get_smart_tags(); + $replacement_tags = $this->get_replacement_builder_tags(); + $hidden_tags = $this->get_hidden_builder_tags(); + + foreach ( $replacement_tags as $tag => $replacement_tag ) { + $smart_tags = wpforms_array_insert( $smart_tags, [ $replacement_tag => $smart_tags[ $tag ] ], $tag ); + + unset( $smart_tags[ $tag ] ); + } + + foreach ( $hidden_tags as $hidden_tag ) { + unset( $smart_tags[ $hidden_tag ] ); + } + + return $smart_tags; + } + + /** + * Replace a found smart tag with the final value. + * + * @since 1.6.7 + * + * @param string $tag The tag. + * @param string $value The value. + * @param string $content Content. + * + * @return string + */ + private function replace( $tag, $value, $content ) { + + return str_replace( $tag, strip_shortcodes( $value ), $content ); + } + + /** + * Filter arguments passed to the async task. + * + * @since 1.9.4 + * + * @param array|mixed $args Arguments passed to the async task. + */ + public function save_smart_tags_tasks_meta( $args ): array { + + $args = (array) $args; + $process = wpforms()->obj( 'process' ); + + if ( ! $process || empty( $process->form_data['entry_meta'] ) ) { + return $args; + } + + $args['entry_meta'] = $process->form_data['entry_meta']; + + return $args; + } + + /** + * Maybe add a fallback for entry meta for WPForms Action Scheduler tasks meta. + * + * @since 1.9.4 + * + * @param int|mixed $action_id Action ID. + * @param ActionScheduler_Action $action Action Scheduler action object. + * + * @noinspection PhpUnusedParameterInspection + * @noinspection PhpMissingParamTypeInspection + */ + public function maybe_add_entry_meta_fallback_value( $action_id, $action ): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + $this->action_args = $action->get_args(); + $this->fallback = function ( $value, $var_name ) { + + if ( ! wpforms_is_empty_string( $value ) ) { + return $value; + } + + return $this->action_args['entry_meta'][ $var_name ] ?? $value; + }; + + add_filter( 'wpforms_smart_tags_smart_tag_get_meta_value', $this->fallback, 10, 2 ); + } + + /** + * Maybe remove a fallback for entry meta for WPForms Action Scheduler tasks meta. + * + * @since 1.9.4 + */ + public function maybe_remove_entry_meta_fallback_value(): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( ! $this->fallback ) { + return; + } + + remove_filter( 'wpforms_smart_tags_smart_tag_get_meta_value', $this->fallback ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/AsyncRequestTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/AsyncRequestTask.php new file mode 100755 index 00000000..bcdcf61a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/AsyncRequestTask.php @@ -0,0 +1,70 @@ +hooks(); + } + + /** + * Add hooks. + * + * @since 1.7.5 + */ + private function hooks() { + + // Register the migrate action. + add_action( self::ACTION, [ $this, 'process' ] ); + } + + + /** + * Send usage tracking to the server. + * + * @since 1.7.5 + * + * @param int $meta_id Action meta id. + */ + public static function process( $meta_id ) { + + $params = ( new Meta() )->get( $meta_id ); + + if ( ! $params ) { + return; + } + + list( $url, $args ) = $params->data; + + wp_safe_remote_get( $url, $args ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/DomainAutoRegistrationTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/DomainAutoRegistrationTask.php new file mode 100755 index 00000000..d1b0b8d1 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/DomainAutoRegistrationTask.php @@ -0,0 +1,139 @@ +domain_manager = new DomainManager(); + } + + /** + * Process the task. + * + * @since 1.8.6 + */ + public function init() { + + // Get a task status. + $status = get_option( self::STATUS ); + + // This task is run in \WPForms\Migrations\Upgrade186::run(), + // and started in \WPForms\Migrations\UpgradeBase::run_async(). + // Bail out if a task is not started or completed. + if ( ! $status || $status === self::COMPLETED ) { + return; + } + + // Mark that the task is in progress. + update_option( self::STATUS, self::IN_PROGRESS ); + + // Register hooks. + $this->hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + return; + } + + $tasks->create( self::ACTION )->async()->register(); + } + + /** + * Register hooks. + * + * @since 1.8.6 + */ + private function hooks() { + + add_action( self::ACTION, [ $this, 'process' ] ); + } + + /** + * Process the task. + * + * @since 1.8.6 + */ + public function process() { + + // If the Stripe account is connected, then try to register domain. + if ( Helpers::has_stripe_keys() && $this->domain_manager->validate() ) { + $this->log( 'Stripe Payments: Stripe domain auto registration during migration to WPForms 1.8.6.' ); + } + + // Mark that the task is completed. + update_option( self::STATUS, self::COMPLETED ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsMetaCleanupTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsMetaCleanupTask.php new file mode 100755 index 00000000..5cbbcef6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsMetaCleanupTask.php @@ -0,0 +1,110 @@ +init(); + } + + /** + * Initialize the task with all the proper checks. + * + * @since 1.5.9 + */ + public function init() { + + // Register the action handler. + $this->hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + $email_async = wpforms_setting( 'email-async' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + // Cancel scheduled action if email async option is not set. + if ( ! $email_async ) { + $this->cancel(); + } + + return; + } + + // Do not schedule action if email async option is not set. + if ( ! $email_async ) { + return; + } + + // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName + /** + * Filters the email cleanup task interval. + * + * @since 1.5.9 + * + * @param int $interval Interval in seconds. + */ + $interval = (int) apply_filters( 'wpforms_tasks_entry_emails_meta_cleanup_interval', DAY_IN_SECONDS ); + // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName + + $this->recurring( strtotime( 'tomorrow' ), $interval ) + ->params( $interval ) + ->register(); + } + + /** + * Add hooks. + * + * @since 1.7.3 + */ + private function hooks() { + + add_action( self::ACTION, [ $this, 'process' ] ); + } + + /** + * Perform the cleanup action: remove outdated meta for entry emails task. + * + * @since 1.5.9 + * + * @param int $meta_id ID for meta information for a task. + */ + public function process( $meta_id ) { + + $task_meta = new Meta(); + $meta = $task_meta->get( (int) $meta_id ); + + // We should actually receive something. + if ( empty( $meta ) || empty( $meta->data ) ) { + return; + } + + list( $interval ) = $meta->data; + + $task_meta->clean_by( EntryEmailsTask::ACTION, (int) $interval ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsTask.php new file mode 100755 index 00000000..5669cbc0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/EntryEmailsTask.php @@ -0,0 +1,65 @@ +async(); + } + + /** + * Get the data from Tasks meta table, check/unpack it and + * send the email straight away. + * + * @since 1.5.9 + * @since 1.5.9.3 Send immediately instead of calling \WPForms_Process::entry_email() method. + * + * @param int $meta_id ID for meta information for a task. + */ + public static function process( $meta_id ) { + + $task_meta = new Meta(); + $meta = $task_meta->get( (int) $meta_id ); + + // We should actually receive something. + if ( empty( $meta ) || empty( $meta->data ) ) { + return; + } + + // We expect a certain number of params. + if ( count( $meta->data ) !== 5 ) { + return; + } + + // We expect a certain meta data structure for this task. + list( $to, $subject, $message, $headers, $attachments ) = $meta->data; + + // Let's do this NOW, finally. + wp_mail( $to, $subject, $message, $headers, $attachments ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/FormsLocatorScanTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/FormsLocatorScanTask.php new file mode 100755 index 00000000..537dda8d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/FormsLocatorScanTask.php @@ -0,0 +1,575 @@ +init(); + } + + /** + * Initialize the task with all the proper checks. + * + * @since 1.7.4 + */ + public function init() { + + $this->locator = wpforms()->obj( 'locator' ); + + /** + * Allow developers to modify the task interval. + * + * @since 1.7.4 + * + * @param int $interval The task recurring interval in seconds. If <= 0, the task will be cancelled. + */ + $this->interval = (int) apply_filters( 'wpforms_tasks_actions_forms_locator_scan_task_interval', DAY_IN_SECONDS ); + + $this->hooks(); + + $this->tasks = wpforms()->obj( 'tasks' ); + + // Do not add a new one if scheduled. + if ( $this->tasks->is_scheduled( self::SCAN_ACTION ) !== false ) { + + if ( $this->interval <= 0 ) { + $this->cancel(); + } + + return; + } + + $this->add_scan_task(); + } + + /** + * Add scan task. + * + * @since 1.7.4 + */ + private function add_scan_task() { + + if ( $this->interval <= 0 ) { + return; + } + + // Add a new task if none exists. + $this->recurring( time(), $this->interval ) + ->params() + ->register(); + } + + /** + * Add hooks. + * + * @since 1.7.4 + */ + private function hooks() { + + // Register hidden action for testing and support. + add_action( 'current_screen', [ $this, 'maybe_run_actions_in_admin' ] ); + + // Register Action Scheduler actions. + add_action( self::SCAN_ACTION, [ $this, 'scan' ] ); + add_action( self::RESCAN_ACTION, [ $this, 'rescan' ] ); + add_action( self::SAVE_ACTION, [ $this, 'save' ] ); + add_action( self::DELETE_ACTION, [ $this, 'delete' ] ); + add_action( 'action_scheduler_after_process_queue', [ $this, 'after_process_queue' ] ); + } + + /** + * Maybe rescan or delete locations. + * Hidden undocumented actions for tests and support. + * + * @since 1.7.4 + * + * @param WP_Screen $current_screen Current WP_Screen object. + */ + public function maybe_run_actions_in_admin( $current_screen ) { + + // phpcs:disable WordPress.Security.NonceVerification.Recommended + if ( + ! $current_screen || + $current_screen->id !== 'toplevel_page_wpforms-overview' || + ! isset( $_GET[ self::LOCATIONS_QUERY_ARG ] ) || + ! wpforms_debug() + ) { + return; + } + + if ( $_GET[ self::LOCATIONS_QUERY_ARG ] === 'delete' ) { + $this->delete(); + } + + if ( $_GET[ self::LOCATIONS_QUERY_ARG ] === 'scan' ) { + $this->rescan(); + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + wp_safe_redirect( remove_query_arg( [ self::LOCATIONS_QUERY_ARG ] ) ); + exit; + } + + /** + * Run scan task. + * + * @since 1.7.4 + */ + public function scan() { + + if ( ! $this->tasks ) { + return; + } + + // Bail out if the scan is already in progress. + if ( self::SCAN_STATUS_IN_PROGRESS === (string) get_option( self::SCAN_STATUS ) ) { + return; + } + + // Mark that scan is in progress. + update_option( self::SCAN_STATUS, self::SCAN_STATUS_IN_PROGRESS ); + + $this->log( 'Forms Locator scan action started.' ); + + // This part of the scan shouldn't take more than 1 second even on big sites. + $post_ids = $this->search_in_posts(); + $post_locations = $this->get_form_locations( $post_ids ); + $widget_locations = $this->locator->search_in_widgets(); + $standalone_locations = $this->search_in_standalone_forms(); + $locations = array_merge( $post_locations, $widget_locations, $standalone_locations ); + $form_location_metas = $this->get_form_location_metas( $locations ); + + /** + * This part of the scan can take a while. + * Saving hundreds of metas with a potentially very high number of locations could be time and memory consuming. + * That is why we perform save via Action Scheduler. + */ + $meta_chunks = array_chunk( $form_location_metas, self::CHUNK_SIZE, true ); + $count = count( $meta_chunks ); + + foreach ( $meta_chunks as $index => $meta_chunk ) { + $this->tasks->create( self::SAVE_ACTION )->async()->params( $meta_chunk, $index, $count )->register(); + } + + $this->log( 'Save tasks created.' ); + } + + /** + * Run immediate scan. + * + * @since 1.7.4 + */ + public function rescan() { + + $this->cancel(); + $this->add_scan_task(); + } + + /** + * Save form locations. + * + * @since 1.7.4 + * + * @param int $meta_id Action meta id. + */ + public function save( $meta_id ) { + + $params = ( new Meta() )->get( $meta_id ); + + if ( ! $params ) { + return; + } + + list( $meta_chunk, $index, $count ) = $params->data; + + foreach ( $meta_chunk as $form_id => $meta ) { + update_post_meta( $form_id, Locator::LOCATIONS_META, $meta ); + } + + $this->log( + sprintf( + 'Forms Locator save action %1$d/%2$d completed.', + $index + 1, + $count + ) + ); + } + + /** + * Delete form locations. + * + * @since 1.7.4 + */ + public function delete() { + + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( + $wpdb->prepare( + "DELETE FROM $wpdb->postmeta WHERE meta_key = %s", + Locator::LOCATIONS_META + ) + ); + + delete_option( self::SCAN_STATUS ); + + wp_cache_flush(); + } + + /** + * After process queue action. + * Delete transient to indicate that scanning is completed. + * + * @since 1.7.4 + */ + public function after_process_queue() { + + if ( $this->tasks->is_scheduled( self::SAVE_ACTION ) ) { + return; + } + + // Mark that scan is finished. + if ( (string) get_option( self::SCAN_STATUS ) === self::SCAN_STATUS_IN_PROGRESS ) { + update_option( self::SCAN_STATUS, self::SCAN_STATUS_COMPLETED ); + $this->log( 'Forms Locator scan action completed.' ); + } + } + + /** + * Search form in posts. + * + * @since 1.7.4 + * + * @return int[] + */ + private function search_in_posts() { + + global $wpdb; + + $post_statuses = wpforms_wpdb_prepare_in( $this->locator->get_post_statuses() ); + $post_types = wpforms_wpdb_prepare_in( $this->locator->get_post_types() ); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $ids = $wpdb->get_col( + "SELECT p.ID + FROM (SELECT ID + FROM $wpdb->posts + WHERE post_status IN ( $post_statuses ) AND post_type IN ( $post_types ) ) AS ids + INNER JOIN $wpdb->posts as p ON ids.ID = p.ID + WHERE p.post_content REGEXP '\\\[wpforms|wpforms/form-selector'" + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + + return array_map( 'intval', $ids ); + } + + /** + * Filters the SELECT clause of the query. + * Get a minimal set of fields from the post record. + * + * @since 1.7.4 + * + * @param string $fields The SELECT clause of the query. + * @param WP_Query $query The WP_Query instance (passed by reference). + * + * @return string + * + * @noinspection PhpUnusedParameterInspection + */ + public function posts_fields_filter( $fields, $query ) { + + global $wpdb; + + $fields_arr = [ 'ID', 'post_title', 'post_status', 'post_type', 'post_content', 'post_name' ]; + $fields_arr = array_map( + static function ( $field ) use ( $wpdb ) { + + return "$wpdb->posts." . $field; + }, + $fields_arr + ); + + return implode( ', ', $fields_arr ); + } + + /** + * Get form locations. + * + * @since 1.7.4 + * + * @param int[] $post_ids Post IDs. + * + * @return array + */ + private function get_form_locations( $post_ids ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + /** + * Block caching here, as caching produces unneeded db requests in + * update_object_term_cache() and update_postmeta_cache(). + */ + $query_args = [ + 'post_type' => $this->locator->get_post_types(), + 'post_status' => $this->locator->get_post_statuses(), + 'post__in' => $post_ids, + 'no_found_rows' => true, + 'posts_per_page' => - 1, + 'cache_results' => false, + ]; + + // Get form locations by chunks to prevent out of memory issue. + $post_id_chunks = array_chunk( $post_ids, self::CHUNK_SIZE ); + $locations = []; + + add_filter( 'posts_fields', [ $this, 'posts_fields_filter' ], 10, 2 ); + + foreach ( $post_id_chunks as $post_id_chunk ) { + $query_args['post__in'] = $post_id_chunk; + $query = new WP_Query( $query_args ); + $locations = $this->get_form_locations_from_posts( $query->posts, $locations ); + } + + remove_filter( 'posts_fields', [ $this, 'posts_fields_filter' ] ); + + return $locations; + } + + /** + * Get locations from posts. + * + * @since 1.7.4 + * + * @param WP_Post[] $posts Posts. + * @param array $locations Locations. + * + * @return array + */ + private function get_form_locations_from_posts( $posts, $locations = [] ) { + + $home_url = home_url(); + + foreach ( $posts as $post ) { + + $form_ids = $this->locator->get_form_ids( $post->post_content ); + + if ( ! $form_ids ) { + continue; + } + + $url = get_permalink( $post ); + $url = ( $url === false || is_wp_error( $url ) ) ? '' : $url; + $url = str_replace( $home_url, '', $url ); + + foreach ( $form_ids as $form_id ) { + $locations[] = [ + 'type' => $post->post_type, + 'title' => $post->post_title, + 'form_id' => $form_id, + 'id' => $post->ID, + 'status' => $post->post_status, + 'url' => $url, + ]; + } + } + + return $locations; + } + + /** + * Search in standalone forms. + * + * @since 1.8.7 + * + * @return array + */ + private function search_in_standalone_forms(): array { + + global $wpdb; + + $location_types = []; + + foreach ( Locator::STANDALONE_LOCATION_TYPES as $location_type ) { + $location_types[] = '"' . $location_type . '_enable":"1"'; + } + + $regexp = implode( '|', $location_types ); + + $post_statuses = wpforms_wpdb_prepare_in( $this->locator->get_post_statuses() ); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $standalone_forms = $wpdb->get_results( + "SELECT ID, post_content, post_status + FROM $wpdb->posts + WHERE post_status IN ( $post_statuses ) AND + post_type = 'wpforms' AND + post_content REGEXP '$regexp';" + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + + $locations = []; + + foreach ( $standalone_forms as $standalone_form ) { + $form_data = json_decode( $standalone_form->post_content, true ); + + $locations[] = $this->locator->build_standalone_location( + (int) $standalone_form->ID, + $form_data, + $standalone_form->post_status + ); + } + + return $locations; + } + + /** + * Get form location metas. + * + * @param array $locations Locations. + * + * @since 1.7.4 + * + * @return array + */ + private function get_form_location_metas( $locations ) { + + $metas = []; + + foreach ( $locations as $location ) { + + if ( empty( $location['form_id'] ) ) { + continue; + } + + $metas[ $location['form_id'] ][] = $location; + } + + return $metas; + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/IconChoicesFontAwesomeUpgradeTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/IconChoicesFontAwesomeUpgradeTask.php new file mode 100755 index 00000000..0086a9cd --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/IconChoicesFontAwesomeUpgradeTask.php @@ -0,0 +1,156 @@ +hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + return; + } + + $tasks->create( self::ACTION )->async()->register(); + } + + /** + * Hooks. + * + * @since 1.8.3 + */ + private function hooks() { + + add_action( self::ACTION, [ $this, 'upgrade' ] ); + } + + /** + * Upgrade. + * + * @since 1.8.3 + */ + public function upgrade() { + + $upload_dir = wpforms_upload_dir(); + $tmp_base_path = $upload_dir['path'] . '/icon-choices-tmp'; + $cache_base_path = $upload_dir['path'] . '/icon-choices'; + $icons_data_file = $cache_base_path . '/icons.json'; + + if ( ! file_exists( $icons_data_file ) ) { + $this->log( 'Font Awesome Upgrade: Font Awesome Upgrade: Library is not present, nothing to upgrade.' ); + update_option( self::STATUS, self::COMPLETED ); + + return; + } + + require_once ABSPATH . 'wp-admin/includes/file.php'; + + WP_Filesystem(); + + global $wp_filesystem; + + $wp_filesystem->rmdir( $tmp_base_path, true ); + wpforms()->obj( 'icon_choices' )->run_install( $tmp_base_path ); + + if ( is_dir( $tmp_base_path ) ) { + // Remove old cache. + $this->log( 'Font Awesome Upgrade: Removing existing instance of the library.' ); + $wp_filesystem->rmdir( $cache_base_path, true ); + + // Rename temporary directory. + $this->log( 'Font Awesome Upgrade: Renaming temporary directory.' ); + $wp_filesystem->move( $tmp_base_path, $cache_base_path ); + + // Mark that migration is finished. + $this->log( 'Font Awesome Upgrade: Finished upgrading.' ); + update_option( self::STATUS, self::COMPLETED ); + + return; + } + + $this->log( 'Font Awesome Upgrade: Something went wrong, library was not upgraded.' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration173Task.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration173Task.php new file mode 100755 index 00000000..14a6bd0c --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration173Task.php @@ -0,0 +1,268 @@ +entry_handler = wpforms()->obj( 'entry' ); + $this->entry_fields_handler = wpforms()->obj( 'entry_fields' ); + + if ( ! $this->entry_handler || ! $this->entry_fields_handler ) { + return; + } + + // Bail out if migration is not started or completed. + $status = get_option( self::STATUS ); + + if ( ! $status || $status === self::COMPLETED ) { + return; + } + + // Mark that migration is in progress. + update_option( self::STATUS, self::IN_PROGRESS ); + + $this->hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + return; + } + + // Init migration. + $this->init_migration( $tasks ); + } + + /** + * Add hooks. + * + * @since 1.7.3 + */ + private function hooks() { + + // Register the migrate action. + add_action( self::ACTION, [ $this, 'migrate' ] ); + + // Register after process queue action. + add_action( 'action_scheduler_after_process_queue', [ $this, 'after_process_queue' ] ); + } + + /** + * Migrate an entry. + * + * @since 1.7.3 + * + * @param int $meta_id Action meta id. + */ + public function migrate( $meta_id ) { + + $params = ( new Meta() )->get( $meta_id ); + + if ( ! $params ) { + return; + } + + list( $entry_id_chunk ) = $params->data; + + foreach ( $entry_id_chunk as $entry_id ) { + $this->save_entry( $entry_id ); + } + } + + /** + * After process queue action. + * Set status as completed. + * + * @since 1.7.3 + */ + public function after_process_queue() { + + if ( as_has_scheduled_action( self::ACTION ) ) { + return; + } + + // Mark that migration is finished. + update_option( self::STATUS, self::COMPLETED ); + } + + /** + * Init migration. + * + * @since 1.7.3 + * + * @param Tasks $tasks Tasks class instance. + */ + private function init_migration( $tasks ) { + + // This part of the migration shouldn't take more than 1 second even on big sites. + $entry_ids = $this->get_legacy_entry_ids(); + + if ( ! $entry_ids ) { + // Mark that migration is completed. + update_option( self::STATUS, self::COMPLETED ); + + return; + } + + /** + * This part of the migration can take a while. + * Saving hundreds of entries with a potentially very high number of entry fields could be time and memory consuming. + * That is why we perform save via Action Scheduler. + */ + $entry_id_chunks = array_chunk( $entry_ids, self::CHUNK_SIZE, true ); + + foreach ( $entry_id_chunks as $entry_id_chunk ) { + $tasks->create( self::ACTION )->async()->params( $entry_id_chunk )->register(); + } + } + + /** + * Get entry ids which do not have relevant entry field records. + * + * @since 1.7.3 + * + * @return int[] + */ + private function get_legacy_entry_ids() { + + global $wpdb; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + $entries = $wpdb->get_results( + " + SELECT e.entry_id FROM {$this->entry_handler->table_name} e + LEFT JOIN {$this->entry_fields_handler->table_name} ef + ON e.entry_id=ef.entry_id + WHERE + e.status IN( 'partial', 'abandoned' ) AND + ef.entry_id IS NULL" + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + + if ( ! $entries || ! is_array( $entries ) ) { + return []; + } + + return array_map( 'intval', wp_list_pluck( $entries, 'entry_id' ) ); + } + + /** + * Save entry properly. + * + * @since 1.7.3 + * + * @param int $entry_id Entry id. + */ + private function save_entry( $entry_id ) { + + $entry = $this->entry_handler->get( $entry_id ); + + if ( ! $entry || ! isset( $entry->form_id, $entry->fields, $entry->date_modified ) ) { + return; + } + + $fields = json_decode( $entry->fields, true ); + + if ( ! is_array( $fields ) ) { + return; + } + + $form_data = [ + 'id' => (int) $entry->form_id, + 'date' => $entry->date_modified, + ]; + + $this->entry_fields_handler->save( $fields, $form_data, $entry_id, true ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration175Task.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration175Task.php new file mode 100755 index 00000000..0f788c96 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/Migration175Task.php @@ -0,0 +1,454 @@ +entry_handler = wpforms()->obj( 'entry' ); + $this->entry_meta_handler = wpforms()->obj( 'entry_meta' ); + $this->temp_table_name = "{$wpdb->prefix}wpforms_temp_entry_ids"; + + if ( ! $this->entry_handler || ! $this->entry_meta_handler ) { + return; + } + + // Bail out if migration is not started or completed. + $status = get_option( self::STATUS ); + + if ( ! $status || $status === self::COMPLETED ) { + return; + } + + $this->hooks(); + + if ( $status === self::START ) { + // Mark that migration is in progress. + update_option( self::STATUS, self::IN_PROGRESS ); + + // Alter entry meta table. + $this->alter_entry_meta_table(); + + // Init migration. + $this->init_migration(); + } + } + + /** + * Modify field in the entry meta table. + * + * @since 1.7.5 + */ + private function alter_entry_meta_table() { + + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $wpdb->query( "ALTER TABLE {$this->entry_meta_handler->table_name} MODIFY type VARCHAR(255)" ); + } + + /** + * Add index to a table. + * + * @since 1.7.5 + * + * @param string $table_name Table. + * @param string $index_name Index name. + * @param string $key_part Key part. + * + * @return void + */ + private function add_index( $table_name, $index_name, $key_part ) { + + global $wpdb; + + // Check id index already exists. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + $result = $wpdb->get_var( + "SELECT COUNT(1) IndexIsThere + FROM INFORMATION_SCHEMA.STATISTICS + WHERE table_schema = DATABASE() + AND table_name = '$table_name' + AND index_name = '$index_name'" + ); + + if ( $result === '1' ) { + return; + } + + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + + // Change the column length for the wp_wpforms_entry_meta.type column to 255 and add an index. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( "CREATE INDEX $index_name ON $table_name ( $key_part )" ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + } + + /** + * Add hooks. + * + * @since 1.7.5 + */ + private function hooks() { + + // Register the migrate action. + add_action( self::ACTION, [ $this, 'migrate' ] ); + + // Register after process queue action. + add_action( 'action_scheduler_after_process_queue', [ $this, 'after_process_queue' ] ); + } + + /** + * Migrate an entry. + * + * @param int $action_index Action index. + * + * @since 1.7.5 + */ + public function migrate( $action_index ) { + + global $wpdb; + + $db_indexes = [ + - 3 => [ + 'table_name' => $this->entry_meta_handler->table_name, + 'index_name' => 'form_id', + 'key_part' => 'form_id', + ], + - 2 => [ + 'table_name' => $this->entry_meta_handler->table_name, + 'index_name' => 'type', + 'key_part' => 'type', + ], + - 1 => [ + 'table_name' => $this->entry_meta_handler->table_name, + 'index_name' => 'data', + 'key_part' => 'data(32)', + ], + ]; + + // We create indexes in the background as it could take significant time on a big database. + if ( array_key_exists( $action_index, $db_indexes ) ) { + $this->add_index( + $db_indexes[ $action_index ]['table_name'], + $db_indexes[ $action_index ]['index_name'], + $db_indexes[ $action_index ]['key_part'] + ); + + return; + } + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + + // The query length in migrate_payment_data() is about 500 chars for 1 entry (7 metas). + // The length of the query is defined by MAX_ALLOWED_PACKET variable, which defaults to 4 MB on MySQL 5.7. + // We increase MAX_ALLOWED_PACKET variable to fit the number of entries specified in self::CHUNK_SIZE. + $new_max_allowed_packet = 500 * self::CHUNK_SIZE; + $max_allowed_packet = (int) $wpdb->get_var( "SHOW VARIABLES LIKE 'MAX_ALLOWED_PACKET'", 1 ); + + if ( $new_max_allowed_packet > $max_allowed_packet ) { + $wpdb->query( "SET MAX_ALLOWED_PACKET = $new_max_allowed_packet" ); + } + + // Using OFFSET makes a way longer request, as MySQL has to access all rows before OFFSET. + // We follow very fast way with indexed column (id > $action_index). + $entry_ids = $wpdb->get_col( + $wpdb->prepare( + "SELECT entry_id FROM $this->temp_table_name + WHERE id > %d LIMIT %d", + $action_index, + self::TASK_CHUNK_SIZE + ) + ); + + $i = 0; + $entry_ids_count = count( $entry_ids ); + + // This cycle is twice less memory consuming than array_chunk( $entry_ids ). + while ( $i < $entry_ids_count ) { + $entry_ids_chunk = array_slice( $entry_ids, $i, self::CHUNK_SIZE ); + + $this->migrate_payment_data( implode( ',', $entry_ids_chunk ) ); + + $i += self::CHUNK_SIZE; + } + + if ( $new_max_allowed_packet > $max_allowed_packet ) { + $wpdb->query( "SET MAX_ALLOWED_PACKET = $max_allowed_packet" ); + } + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + } + + /** + * After process queue action. + * Set status as completed. + * + * @since 1.7.5 + */ + public function after_process_queue() { + + $tasks = wpforms()->obj( 'tasks' ); + + if ( ! $tasks || $tasks->is_scheduled( self::ACTION ) ) { + return; + } + + $this->drop_temp_table(); + + // Mark that migration is finished. + update_option( self::STATUS, self::COMPLETED ); + } + + /** + * Init migration. + * + * @since 1.7.5 + * @noinspection PhpUndefinedFunctionInspection + */ + private function init_migration() { + + // Get all payment entries. + $count = $this->get_unprocessed_payment_entry_ids(); + + if ( ! $count ) { + $this->drop_temp_table(); + } + + // We need 3 preliminary steps to create indexes. + $index = - 3; + + while ( $index < $count ) { + // We do not use Task class here as we do not need meta. So, we reduce the number of DB requests. + as_enqueue_async_action( + self::ACTION, + [ $index ], + Tasks::GROUP + ); + + $index = $index < 0 ? $index + 1 : $index + self::CHUNK_SIZE; + } + } + + /** + * Migrate payment data to the correct table. + * + * @param string $entry_ids_list List of entry ids. + * + * @since 1.7.5 + */ + private function migrate_payment_data( $entry_ids_list ) { + + global $wpdb; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( + "SELECT entry_id, form_id, user_id, status, meta, date + FROM {$this->entry_handler->table_name} + WHERE entry_id IN ( $entry_ids_list )" + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + + $values = []; + + foreach ( $wpdb->last_result as $entry ) { + $meta = json_decode( $entry->meta, true ); + + if ( ! is_array( $meta ) ) { + continue; + } + + foreach ( $meta as $meta_key => $meta_value ) { + // If meta_key doesn't begin with `payment_`, prefix it. + $meta_key = strpos( $meta_key, 'payment_' ) === 0 ? $meta_key : "payment_$meta_key"; + + // We do not use $wpdb->prepare here, as it is 5 times slower. + // Prepare takes 1.3 sec to prepare 1000 entries (6000 meta records). + // It is incomparable with the two queries here. + // With sprintf, the total processing time of this method is 0.15 sec for 1000 entries. + $values[] = sprintf( + "( %d, %d, %d, '%s', '%s', '%s', '%s' )", + $entry->entry_id, + $entry->form_id, + $entry->user_id, + $entry->status, + $meta_key, + $meta_value, + $entry->date + ); + } + } + + // Bail out if there is no found payment meta. + if ( empty( $values ) ) { + return; + } + + $values = implode( ', ', $values ); + + // The following query length is about 500 chars for 1 entry (7 metas). + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( + "INSERT INTO {$this->entry_meta_handler->table_name} + ( entry_id, form_id, user_id, status, type, data, date ) + VALUES $values" + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching + } + + /** + * Get entry ids which do not have relevant entry field records. + * Store them in a temporary table. + * + * @since 1.7.5 + * + * @return int + */ + private function get_unprocessed_payment_entry_ids() { + + global $wpdb; + + $this->drop_temp_table(); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $wpdb->query( + "CREATE TABLE $this->temp_table_name + ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + entry_id BIGINT NOT NULL + )" + ); + + $wpdb->query( + "INSERT INTO $this->temp_table_name (entry_id) + SELECT entry_id + FROM {$this->entry_handler->table_name} + WHERE type = 'payment' + AND entry_id NOT IN + (SELECT entry_id FROM {$this->entry_meta_handler->table_name} WHERE type LIKE 'payment_%')" + ); + + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + + return $wpdb->rows_affected; + } + + /** + * Drop a temporary table. + * + * @since 1.7.5 + */ + private function drop_temp_table() { + + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange + $wpdb->query( "DROP TABLE IF EXISTS $this->temp_table_name" ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/PurgeSpamTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/PurgeSpamTask.php new file mode 100755 index 00000000..67336de3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/PurgeSpamTask.php @@ -0,0 +1,137 @@ +init(); + $this->hooks(); + } + + /** + * Init. + * + * @since 1.9.1 + */ + public function init() { + + /** + * Filter the interval for the purge spam task, in seconds. + * + * @since 1.9.1 + * + * @param int $interval Interval in seconds. + * + * @return int + */ + $this->interval = (int) apply_filters( 'wpforms_tasks_actions_purge_spam_task_interval', DAY_IN_SECONDS ); + + $this->tasks = wpforms()->obj( 'tasks' ); + + // Do not add a new one if scheduled. + if ( $this->tasks->is_scheduled( self::ACTION ) !== false ) { + + if ( $this->interval <= 0 ) { + $this->cancel(); + } + + return; + } + + $this->add_scan_task(); + } + + /** + * Add hooks. + * + * @since 1.9.1 + */ + public function hooks() { + + add_action( self::ACTION, [ $this, 'process' ] ); + } + + /** + * Add a new task. + * + * @since 1.9.1 + */ + private function add_scan_task() { + + if ( $this->interval <= 0 ) { + return; + } + + $this->tasks->create( self::ACTION ) + ->recurring( time(), $this->interval ) + ->params() + ->register(); + } + + /** + * Purge spam action. + * + * @since 1.9.1 + */ + public function process() { + + $entry_obj = wpforms()->obj( 'entry' ); + + if ( ! $entry_obj ) { + return; + } + + $entry_obj->purge_spam(); + $this->log( 'Purge spam completed.' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/SquareSubscriptionTransactionIDTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/SquareSubscriptionTransactionIDTask.php new file mode 100755 index 00000000..25bc47e5 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/SquareSubscriptionTransactionIDTask.php @@ -0,0 +1,161 @@ +init(); + } + + /** + * Initialize. + * + * @since 1.9.5 + */ + private function init() { + + $this->hooks(); + } + + /** + * Register hooks. + * + * @since 1.9.5 + */ + private function hooks() { + + add_action( 'wpforms_process_payment_saved', [ $this, 'add_task' ], 999, 3 ); + add_action( self::ACTION, [ $this, 'process' ] ); + } + + /** + * Add task to the queue. + * + * @since 1.9.5 + * + * @param string $payment_id Payment ID. + * @param array $fields Final/sanitized submitted field data. + * @param array $form_data Form data and settings. + */ + public function add_task( $payment_id, array $fields, array $form_data ) { + + $payment_obj = wpforms()->obj( 'payment' ); + + if ( ! $payment_obj ) { + return; + } + + $payment = $payment_obj->get( (int) $payment_id ); + + if ( ! $payment ) { + return; + } + + // Bail early if not Square subscription. + if ( $payment->gateway !== 'square' || $payment->type !== 'subscription' ) { + return; + } + + // Bail early if transaction_id is already set via webhooks. + if ( ! empty( $payment->transaction_id ) ) { + return; + } + + // Add task to the queue. + wpforms()->obj( 'tasks' ) + ->create( self::ACTION ) + ->once( time() + MINUTE_IN_SECONDS ) + ->params( (int) $payment_id ) + ->register(); + } + + /** + * Process the task. + * + * @since 1.9.5 + * + * @param int $meta_id Meta ID. + */ + public function process( $meta_id ) { + + $task_meta = new Meta(); + $meta = $task_meta->get( (int) $meta_id ); + + if ( empty( $meta ) || empty( $meta->data ) ) { + return; + } + + [ $payment_id ] = $meta->data; + + $payment = wpforms()->obj( 'payment' )->get( (int) $payment_id ); + + // Bail early if transaction_id is already set via webhooks. + if ( ! empty( $payment->transaction_id ) ) { + return; + } + + if ( ! Connection::get() ) { + return; + } + + $api = new Api( Connection::get() ); + + $subscription = $api->retrieve_subscription( $payment->subscription_id ); + + if ( $subscription === null ) { + return; + } + + $invoice = $api->get_latest_subscription_invoice( $subscription ); + + if ( $invoice === null ) { + return; + } + + $transaction_id = $api->get_latest_invoice_transaction_id( $invoice ); + + // Set transaction_id for the subscription in case it not received earlier. + wpforms()->obj( 'payment' )->update( + $payment_id, + [ 'transaction_id' => $transaction_id ], + '', + '', + [ 'cap' => false ] + ); + + // Log. + wpforms()->obj( 'payment_meta' )->add_log( + $payment_id, + sprintf( + 'Square subscription was created. (Invoice ID: %s)', + $invoice->getId() + ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/StripeLinkSubscriptionsTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/StripeLinkSubscriptionsTask.php new file mode 100755 index 00000000..5d1a65b0 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/StripeLinkSubscriptionsTask.php @@ -0,0 +1,310 @@ +hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + return; + } + + // Add a new task if none exists. + $tasks->create( self::ACTION ) + ->async() + ->register(); + } + + /** + * Register hooks. + * + * @since 1.8.7 + */ + private function hooks() { + + // Register the migrate action. + add_action( self::ACTION, [ $this, 'run' ] ); + } + + /** + * Run a process task. + * + * @since 1.8.7 + */ + public function run() { + + // Bail if no Stripe account is connected. + if ( ! Helpers::has_stripe_keys() ) { + $this->complete(); + + return; + } + + $link_subscriptions = $this->get_link_subscriptions(); + + // Bail if all subscription were processed. + if ( empty( $link_subscriptions ) ) { + $this->complete(); + + return; + } + + $this->api = new PaymentIntents(); + + $this->process( $link_subscriptions ); + } + + /** + * Process subscriptions. + * + * @since 1.8.7 + * + * @param array $subscriptions Array of subscriptions. + */ + private function process( array $subscriptions ) { + + foreach ( $subscriptions as $subscription ) { + + $this->update_latest_processed( $subscription->id ); + + // Use subscription mode to cover all cases (e.g. mode might be switched to test while upgrading). + $payment = $this->api->retrieve_payment_intent( $subscription->transaction_id, [ 'mode' => $subscription->mode ] ); + + // Bail if original payment was unsuccessful. + if ( is_null( $payment ) || empty( $payment->status ) || $payment->status !== 'succeeded' ) { + continue; + } + + $setup_intent_data = $this->prepare_setup_intent_data( $payment, $subscription ); + + // Bail if subscription has already had correct mandate. + if ( ! $setup_intent_data ) { + continue; + } + + $intent = $this->api->create_setup_intent( $setup_intent_data, [ 'mode' => $subscription->mode ] ); + + // Log failed subscription payment id. + if ( empty( $intent ) ) { + $this->log( 'Stripe Link Subscriptions: Failed ' . $subscription->id ); + } + } + } + + /** + * Update latest processed id. + * + * @since 1.8.7 + * + * @param int $id Subscription ID. + */ + private function update_latest_processed( int $id ) { + + update_option( self::LATEST_PROCESSED_OPTION, $id ); + } + + /** + * Get all Stripe subscriptions charged through Link. + * + * @since 1.8.7 + * + * @return array + */ + private function get_link_subscriptions(): array { + + global $wpdb; + + $latest_payment = (int) get_option( self::LATEST_PROCESSED_OPTION, 0 ); + $payments_table = wpforms()->obj( 'payment' )->table_name; + $paymentmeta_table = wpforms()->obj( 'payment_meta' )->table_name; + + $query[] = "SELECT p.* FROM {$payments_table} as p"; + $query[] = "INNER JOIN {$paymentmeta_table} as pm ON p.id = pm.payment_id"; + $query[] = "WHERE p.id > %d AND p.gateway = 'stripe' AND p.type = 'subscription' AND pm.meta_key = 'method_type' AND pm.meta_value = 'link'"; + + // Stripe API allows up to 100 read operations per second and 100 write operations per second in live mode, + // and 25 operations per second for each in test mode. + $query[] = 'ORDER BY p.id LIMIT 20'; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + return $wpdb->get_results( $wpdb->prepare( implode( ' ', $query ), $latest_payment ), OBJECT_K ); + } + + /** + * Prepare Setup Intent data. + * + * @since 1.8.7 + * + * @param object $payment Stripe payment object. + * @param object $subscription Subscription object. + * + * @return array + */ + private function prepare_setup_intent_data( $payment, $subscription ): array { + + if ( ! empty( $payment->mandate ) ) { + $mandate = $this->api->retrieve_mandate( $payment->mandate, [ 'mode' => $subscription->mode ] ); + } + + $data = [ + 'payment_method_types' => [ 'link' ], + 'customer' => $payment->customer, + 'payment_method' => $payment->payment_method, + 'usage' => 'off_session', + 'confirm' => true, + ]; + + // Prepare default data in case mandate is not available. + if ( empty( $mandate ) ) { + + $subscription_meta = wpforms()->obj( 'payment_meta' )->get_all( $subscription->id ); + + $data['mandate_data'] = [ + 'customer_acceptance' => [ + 'type' => 'online', + 'online' => [ + 'ip_address' => $subscription_meta['ip_address']->value, + 'user_agent' => $subscription_meta['user_agent']->value, + ], + ], + ]; + + return $data; + } + + // Mandate is correct so no actions needed. + if ( $mandate->type !== 'single_use' ) { + return []; + } + + $data['mandate_data'] = [ + 'customer_acceptance' => [ + 'type' => 'online', + 'online' => [ + 'ip_address' => $mandate->customer_acceptance->online->ip_address, + 'user_agent' => $mandate->customer_acceptance->online->user_agent, + ], + ], + ]; + + return $data; + } + + /** + * Mark that the task is completed. + * + * @since 1.8.7 + */ + public function complete() { + + $this->log( 'Stripe Link Subscriptions: Completed' ); + + update_option( self::STATUS, self::COMPLETED ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Actions/WebhooksAutoConfigurationTask.php b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/WebhooksAutoConfigurationTask.php new file mode 100755 index 00000000..606d2e66 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Actions/WebhooksAutoConfigurationTask.php @@ -0,0 +1,139 @@ +webhooks_manager = new WebhooksManager(); + } + + /** + * Process the task. + * + * @since 1.8.4 + */ + public function init() { + + // Get a task status. + $status = get_option( self::STATUS ); + + // This task is run in \WPForms\Migrations\Upgrade184::run(), + // and started in \WPForms\Migrations\UpgradeBase::run_async(). + // Bail out if a task is not started or completed. + if ( ! $status || $status === self::COMPLETED ) { + return; + } + + // Mark that the task is in progress. + update_option( self::STATUS, self::IN_PROGRESS ); + + // Register hooks. + $this->hooks(); + + $tasks = wpforms()->obj( 'tasks' ); + + // Add new if none exists. + if ( $tasks->is_scheduled( self::ACTION ) !== false ) { + return; + } + + $tasks->create( self::ACTION )->async()->register(); + } + + /** + * Register hooks. + * + * @since 1.8.4 + */ + private function hooks() { + + add_action( self::ACTION, [ $this, 'process' ] ); + } + + /** + * Process the task. + * + * @since 1.8.4 + */ + public function process() { + + // If the Stripe account is connected, then try to configure webhooks. + if ( Helpers::has_stripe_keys() && $this->webhooks_manager->connect() ) { + $this->log( 'Stripe Payments: Webhooks configured during migration to WPForms 1.8.4.' ); + } + + // Mark that the task is completed. + update_option( self::STATUS, self::COMPLETED ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Meta.php b/wp-content/plugins/wpforms-lite/src/Tasks/Meta.php new file mode 100755 index 00000000..18f2439e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Meta.php @@ -0,0 +1,267 @@ +191 chars in JSON to AS, + * so we need to store them somewhere (and clean from time to time). + * + * @since 1.5.9 + */ +class Meta extends WPForms_DB { + + /** + * Primary key (unique field) for the database table. + * + * @since 1.5.9 + * + * @var string + */ + public $primary_key = 'id'; + + /** + * Database type identifier. + * + * @since 1.5.9 + * + * @var string + */ + public $type = 'tasks_meta'; + + /** + * Primary class constructor. + * + * @since 1.5.9 + */ + public function __construct() { + + parent::__construct(); + + $this->table_name = self::get_table_name(); + } + + /** + * Get the DB table name. + * + * @since 1.5.9 + * + * @return string + */ + public static function get_table_name() { + + global $wpdb; + + return $wpdb->prefix . 'wpforms_tasks_meta'; + } + + /** + * Get table columns. + * + * @since 1.5.9 + */ + public function get_columns() { + + return [ + 'id' => '%d', + 'action' => '%s', + 'data' => '%s', + 'date' => '%s', + ]; + } + + /** + * Default column values. + * + * @since 1.5.9 + * + * @return array + */ + public function get_column_defaults() { + + return [ + 'action' => '', + 'data' => '', + 'date' => gmdate( 'Y-m-d H:i:s' ), + ]; + } + + /** + * Create custom entry meta database table. + * Used in migration and on plugin activation. + * + * @since 1.5.9 + * + * @noinspection UnusedFunctionResultInspection + */ + public function create_table() { + + global $wpdb; + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE $this->table_name ( + id bigint(20) NOT NULL AUTO_INCREMENT, + action varchar(255) NOT NULL, + data longtext NOT NULL, + date datetime NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + + dbDelta( $sql ); + } + + /** + * Remove queue records for a defined period of time in the past. + * Calling this method will remove queue records that are older than $period seconds. + * + * @since 1.5.9 + * + * @param string $action Action that should be cleaned up. + * @param int $interval Number of seconds from now. + * + * @return int Number of removed tasks meta records. + */ + public function clean_by( $action, $interval ) { + + global $wpdb; + + if ( empty( $action ) || empty( $interval ) ) { + return 0; + } + + $table = self::get_table_name(); + $action = sanitize_key( $action ); + $date = gmdate( 'Y-m-d H:i:s', time() - (int) $interval ); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + return (int) $wpdb->query( + $wpdb->prepare( + "DELETE FROM $table WHERE action = %s AND date < %s", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $action, + $date + ) + ); + } + + /** + * Inserts a new record into the database. + * + * @since 1.5.9 + * + * @param array $data Column data. + * @param string $type Optional. Data type context. + * + * @return int ID for the newly inserted record. Zero otherwise. + */ + public function add( $data, $type = '' ) { + + if ( empty( $data['action'] ) || ! is_string( $data['action'] ) ) { + return 0; + } + + $data['action'] = sanitize_key( $data['action'] ); + + if ( isset( $data['data'] ) ) { + $data['data'] = $this->prepare_data( $data['data'] ); + } + + if ( empty( $type ) ) { + $type = $this->type; + } + + return parent::add( $data, $type ); + } + + /** + * Prepare data. + * + * @since 1.7.0 + * + * @param array $data Meta data. + * + * @return string + */ + private function prepare_data( $data ) { + + $string = wp_json_encode( $data ); + + if ( $string === false ) { + $string = ''; + } + + /* + * We are encoding the string representation of all the data to make sure that nothing can harm the database. + * This is not an encryption, and we need this data later "as is", + * so we are using one of the fastest ways to do that. + * This data is removed from DB daily. + */ + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + return base64_encode( $string ); + } + + /** + * Retrieve a row from the database based on a given row ID. + * + * @since 1.5.9 + * + * @param int $meta_id Meta ID. + * + * @return null|object + * @noinspection PhpParameterNameChangedDuringInheritanceInspection + */ + public function get( $meta_id ) { + + $meta = parent::get( $meta_id ); + + if ( empty( $meta ) || empty( $meta->data ) ) { + return $meta; + } + + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode + $decoded = base64_decode( $meta->data ); + + if ( $decoded === false || ! is_string( $decoded ) ) { + $meta->data = ''; + } else { + $meta->data = json_decode( $decoded, true ); + } + + return $meta; + } + + /** + * Get meta ID by action name and params. + * + * @since 1.7.0 + * + * @param string $action Action name. + * @param array $params Action params. + * + * @return int + */ + public function get_meta_id( $action, $params ) { + + global $wpdb; + + $table = self::get_table_name(); + $action = sanitize_key( $action ); + $data = $this->prepare_data( array_values( $params ) ); + + return absint( + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->get_var( + $wpdb->prepare( + "SELECT id FROM $table WHERE action = %s AND data = %s LIMIT 1", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $action, + $data + ) + ) + ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Task.php b/wp-content/plugins/wpforms-lite/src/Tasks/Task.php new file mode 100755 index 00000000..daa5b0fb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Task.php @@ -0,0 +1,377 @@ +action = sanitize_key( $action ); + $this->meta = new Meta(); + + if ( empty( $this->action ) ) { + throw new UnexpectedValueException( 'Task action cannot be empty.' ); + } + } + + /** + * Define the type of the task as async. + * + * @since 1.5.9 + * + * @return Task + */ + public function async() { + + $this->type = self::TYPE_ASYNC; + + return $this; + } + + /** + * Define the type of the task as recurring. + * + * @since 1.5.9 + * + * @param int $timestamp When the first instance of the job will run. + * @param int $interval How long to wait between runs. + * + * @return Task + */ + public function recurring( $timestamp, $interval ) { + + $this->type = self::TYPE_RECURRING; + $this->timestamp = (int) $timestamp; + $this->interval = (int) $interval; + + return $this; + } + + /** + * Define the type of the task as one-time. + * + * @since 1.5.9 + * + * @param int $timestamp When the first instance of the job will run. + * + * @return Task + */ + public function once( $timestamp ) { + + $this->type = self::TYPE_ONCE; + $this->timestamp = (int) $timestamp; + + return $this; + } + + /** + * Pass any number of params that should be saved to Meta table. + * + * @since 1.5.9 + * + * @return Task + */ + public function params() { + + $this->params = func_get_args(); + + return $this; + } + + /** + * Register the action. + * Should be the final call in a chain. + * + * @since 1.5.9 + * + * @return null|string Action ID. + */ + public function register() { + + $action_id = null; + + // No processing if ActionScheduler is not usable. + if ( ! wpforms()->obj( 'tasks' )->is_usable() ) { + return $action_id; + } + + // Save data to tasks meta table. + if ( $this->params !== null ) { + $this->meta_id = $this->meta->add( + [ + 'action' => $this->action, + 'data' => $this->params, + ] + ); + + if ( empty( $this->meta_id ) ) { + return $action_id; + } + } + + // Prevent 500 errors when Action Scheduler tables don't exist. + try { + + switch ( $this->type ) { + case self::TYPE_ASYNC: + $action_id = $this->register_async(); + break; + + case self::TYPE_RECURRING: + $action_id = $this->register_recurring(); + break; + + case self::TYPE_ONCE: + $action_id = $this->register_once(); + break; + } + } catch ( \RuntimeException $exception ) { + $action_id = null; + } + + return $action_id; + } + + /** + * Register the async task. + * + * @since 1.5.9 + * + * @return null|string Action ID. + * @noinspection PhpUndefinedFunctionInspection + */ + protected function register_async() { + + if ( ! function_exists( 'as_enqueue_async_action' ) ) { + return null; + } + + return as_enqueue_async_action( + $this->action, + /** + * Filter arguments passed to the async task. + * + * @since 1.9.4 + * + * @param array $args Arguments passed to the async task. + * + * @return array + */ + (array) apply_filters( + 'wpforms_tasks_task_register_async_args', + [ + 'tasks_meta_id' => $this->meta_id, + ] + ), + Tasks::GROUP + ); + } + + /** + * Register the recurring task. + * + * @since 1.5.9 + * + * @return null|string Action ID. + * @noinspection PhpUndefinedFunctionInspection + */ + protected function register_recurring() { + + if ( ! function_exists( 'as_schedule_recurring_action' ) ) { + return null; + } + + return as_schedule_recurring_action( + $this->timestamp, + $this->interval, + $this->action, + [ 'tasks_meta_id' => $this->meta_id ], + Tasks::GROUP + ); + } + + /** + * Register the one-time task. + * + * @since 1.5.9 + * + * @return null|string Action ID. + * @noinspection PhpUndefinedFunctionInspection + */ + protected function register_once() { + + if ( ! function_exists( 'as_schedule_single_action' ) ) { + return null; + } + + return as_schedule_single_action( + $this->timestamp, + $this->action, + [ 'tasks_meta_id' => $this->meta_id ], + Tasks::GROUP + ); + } + + /** + * Cancel all occurrences of this task. + * + * @since 1.6.1 + * + * @return null|bool|string Null if no matching action found, + * false if AS library is missing, + * true if scheduled task has no params, + * string of the scheduled action ID if a scheduled action was found and unscheduled. + * @noinspection PhpUndefinedFunctionInspection + */ + public function cancel() { + + if ( ! function_exists( 'as_unschedule_all_actions' ) ) { + return false; + } + + if ( $this->params === null ) { + as_unschedule_all_actions( $this->action ); + + return true; + } + + $this->meta_id = $this->meta->get_meta_id( $this->action, $this->params ); + + if ( $this->meta_id === null ) { + return null; + } + + return as_unschedule_action( $this->action, [ 'tasks_meta_id' => $this->meta_id ], Tasks::GROUP ); + } + + + + /** + * Log message to WPForms logger and standard debug.log file. + * + * @since 1.9.1 + * + * @param string $message The error message that should be logged. + */ + protected function log( $message ) { + + wpforms_log( $this->log_title, $message, [ 'type' => 'log' ] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/Tasks/Tasks.php b/wp-content/plugins/wpforms-lite/src/Tasks/Tasks.php new file mode 100755 index 00000000..661502c8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/Tasks/Tasks.php @@ -0,0 +1,447 @@ +active_actions = $this->get_active_actions(); + + // Register WPForms tasks. + foreach ( $this->get_tasks() as $task ) { + + if ( ! is_subclass_of( $task, Task::class ) ) { + continue; + } + + new $task(); + } + + $this->hooks(); + } + + /** + * Hooks. + * + * @since 1.7.5 + */ + public function hooks() { + + add_action( 'delete_expired_transients', [ Transient::class, 'delete_all_expired' ], 11 ); + add_action( 'admin_menu', [ $this, 'admin_hide_as_menu' ], PHP_INT_MAX ); + + /* + * By default we send emails in the same process as the form submission is done. + * That means that when many emails are set in form Notifications - + * the form submission can take a while because of all those emails that are sending in the background. + * Since WPForms 1.6.0 users can enable a new option in Settings > Emails, + * called "Optimize Email Sending", to send email in async way. + * This feature was enabled for WPForms 1.5.9, but some users were not happy. + */ + if ( ! (bool) wpforms_setting( 'email-async', false ) ) { + add_filter( 'wpforms_tasks_entry_emails_trigger_send_same_process', '__return_true' ); + } + + add_action( EntryEmailsTask::ACTION, [ EntryEmailsTask::class, 'process' ] ); + add_action( 'action_scheduler_after_execute', [ $this, 'clear_action_meta' ], PHP_INT_MAX, 2 ); + + add_action( 'action_scheduler_begin_execute', [ $this, 'start_executing' ], 1 ); + add_action( 'action_scheduler_after_execute', [ $this, 'stop_executing' ], 1, 2 ); + } + + /** + * Public interface to check if WPForms task is executing. + * + * @since 1.9.4 + * + * @return bool + */ + public static function is_executing(): bool { + + return self::$task_executing; + } + + /** + * Set a flag to indicate that WPForms task is executing. + * + * @since 1.9.4 + * + * @param int $action_id The action ID to process. + */ + public function start_executing( $action_id ) { + + $action_id = (int) $action_id; + + if ( ! class_exists( 'ActionScheduler' ) ) { + return; + } + + $store = ActionScheduler::store(); + + if ( ! $store ) { + return; + } + + $action = $store->fetch_action( $action_id ); + + if ( ! $action || $action->get_group() !== self::GROUP ) { + return; + } + + self::$task_executing = true; + + /** + * Fires before WPForms task is executing. + * + * @since 1.9.4 + * + * @param int $action_id The action ID to process. + * @param ActionScheduler_Action $action Action Scheduler action object. + */ + do_action( 'wpforms_tasks_start_executing', $action_id, $action ); + } + + /** + * Set a flag to indicate that WPForms task is executing. + * + * @since 1.9.4 + * + * @param int $action_id The action ID to process. + * @param ActionScheduler_Action $action Action Scheduler action object. + */ + public function stop_executing( $action_id, $action ) { + + if ( ! $action || ! method_exists( $action, 'get_group' ) || $action->get_group() !== self::GROUP ) { + return; + } + + self::$task_executing = false; + + /** + * Fires after WPForms task is executed. + * + * @since 1.9.4 + * + * @param int $action_id The action ID to process. + * @param ActionScheduler_Action $action Action Scheduler action object. + */ + do_action( 'wpforms_tasks_stop_executing', $action_id, $action ); + } + + /** + * Get the list of WPForms default scheduled tasks. + * Tasks, that are fired under certain specific circumstances + * (like sending form submission email notifications) + * are not listed here. + * + * @since 1.5.9 + * + * @return Task[] List of tasks classes. + */ + public function get_tasks() { + + if ( ! $this->is_usable() ) { + return []; + } + + $tasks = [ + EntryEmailsMetaCleanupTask::class, + FormsLocatorScanTask::class, + AsyncRequestTask::class, + PurgeSpamTask::class, + ]; + + /** + * Filters the task class list to initialize. + * + * @since 1.5.9 + * + * @param array $tasks Task class list. + */ + return apply_filters( 'wpforms_tasks_get_tasks', $tasks ); + } + + /** + * Hide Action Scheduler admin area when not in debug mode. + * + * @since 1.5.9 + * @since 1.9.4 Does not hide the menu when some popular plugins are active. + */ + public function admin_hide_as_menu(): void { + + $plugin_exceptions = [ + 'action-scheduler/action-scheduler.php', + 'woocommerce/woocommerce.php', + 'wp-rocket/wp-rocket.php', + ]; + + /** + * Filters the list of plugins for which + * the Action Scheduler Tools -> Scheduled Actions menu item + * should remain visible. + * + * @since 1.9.4 + * + * @param array $plugin_exceptions List of plugin exceptions. + */ + $plugin_exceptions = apply_filters( 'wpforms_tasks_action_scheduler_tools_plugin_exceptions', $plugin_exceptions ); + $show_as_menu = + ( defined( 'WPFORMS_SHOW_ACTION_SCHEDULER_MENU' ) && constant( 'WPFORMS_SHOW_ACTION_SCHEDULER_MENU' ) ) || + wpforms_debug() || + ! empty( array_filter( $plugin_exceptions, 'is_plugin_active' ) ); + $hide_as_menu = ! $show_as_menu; + + /** + * Filter to redefine that WPForms hides Tools > Action Scheduler menu item. + * + * @since 1.5.9 + * + * @param bool $hide_as_menu Hide Tools > Action Scheduler menu item. + */ + if ( apply_filters( 'wpforms_tasks_admin_hide_as_menu', $hide_as_menu ) ) { + remove_submenu_page( 'tools.php', 'action-scheduler' ); + } + } + + /** + * Create a new task. + * Used for "inline" tasks, that require additional information + * from the plugin runtime before they can be scheduled. + * + * Example: + * wpforms()->obj( 'tasks' ) + * ->create( 'i_am_the_dude' ) + * ->async() + * ->params( 'The Big Lebowski', 1998 ) + * ->register(); + * + * This `i_am_the_dude` action will be later processed as: + * add_action( 'i_am_the_dude', 'thats_what_you_call_me' ); + * + * Function `thats_what_you_call_me()` will receive `$meta_id` param, + * and you will be able to receive all params from the action like this: + * $params = ( new Meta() )->get( (int) $meta_id ); + * list( $name, $year ) = $params->data; + * + * @since 1.5.9 + * + * @param string $action Action that will be used as a hook. + * + * @return Task + */ + public function create( $action ) { + + return new Task( $action ); + } + + /** + * Cancel all the AS actions for a group. + * + * @since 1.5.9 + * + * @param string $group Group to cancel all actions for. + */ + public function cancel_all( $group = '' ) { + + if ( empty( $group ) ) { + $group = self::GROUP; + } else { + $group = sanitize_key( $group ); + } + + if ( class_exists( 'ActionScheduler_DBStore' ) ) { + ActionScheduler_DBStore::instance()->cancel_actions_by_group( $group ); + $this->active_actions = $this->get_active_actions(); + } + } + + /** + * Whether ActionScheduler thinks that it has migrated or not. + * + * @since 1.5.9.3 + * + * @return bool + */ + public function is_usable() { + + // No tasks if ActionScheduler wasn't loaded. + if ( ! class_exists( 'ActionScheduler_DataController' ) ) { + return false; + } + + return ActionScheduler_DataController::is_migration_complete(); + } + + /** + * Whether task has been scheduled and is pending or in-progress. + * + * @since 1.6.0 + * + * @param string $hook Hook to check for. + * + * @return bool|null + * @noinspection PhpUndefinedFunctionInspection + */ + public function is_scheduled( $hook ) { + + if ( ! function_exists( 'as_has_scheduled_action' ) ) { + return null; + } + + if ( in_array( $hook, $this->active_actions, true ) ) { + return true; + } + + // Action is not in the array, so it is not scheduled or belongs to another group. + return as_has_scheduled_action( $hook ); + } + + /** + * Get all WPForms pending or in-progress actions. + * + * @since 1.7.3 + */ + private function get_active_actions() { + + global $wpdb; + + $group = self::GROUP; + $sql = "SELECT a.hook FROM {$wpdb->prefix}actionscheduler_actions a + JOIN {$wpdb->prefix}actionscheduler_groups g ON g.group_id = a.group_id + WHERE g.slug = '$group' AND a.status IN ( 'in-progress', 'pending' )"; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $results = $wpdb->get_results( $sql, 'ARRAY_N' ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + + return $results ? array_merge( ...$results ) : []; + } + + /** + * Delete a task by its ID. + * + * @since 1.9.6.1 + * + * @param int $action_id Action ID. + */ + public function delete_action( $action_id ): void { + + global $wpdb; + + $sql = "DELETE FROM {$wpdb->prefix}actionscheduler_actions WHERE action_id = %d"; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( $wpdb->prepare( $sql, (int) $action_id ) ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared + } + + /** + * Fetch action by ID. + * + * @since 1.9.6.1 + * + * @param int $action_id Action ID. + * + * @return null|ActionScheduler_Action + */ + public function fetch_action( $action_id ): ?ActionScheduler_Action { + + if ( ! class_exists( 'ActionScheduler' ) ) { + return null; + } + + return ActionScheduler::store()->fetch_action( $action_id ); + } + + /** + * Clear the meta after action complete. + * Fired before an action is marked as completed. + * + * @since 1.7.5 + * + * @param integer $action_id Action ID. + * @param ActionScheduler_Action $action Action name. + */ + public function clear_action_meta( $action_id, $action ) { + + $action_schedule = $action->get_schedule(); + + if ( $action_schedule === null || $action_schedule->is_recurring() ) { + return; + } + + $hook_name = $action->get_hook(); + + if ( ! $this->is_scheduled( $hook_name ) ) { + return; + } + + $hook_args = $action->get_args(); + + if ( ! isset( $hook_args['tasks_meta_id'] ) ) { + return; + } + + $meta = new Meta(); + + $meta->delete( $hook_args['tasks_meta_id'] ); + } +} diff --git a/wp-content/plugins/wpforms-lite/src/WPForms.php b/wp-content/plugins/wpforms-lite/src/WPForms.php new file mode 100755 index 00000000..de82f9e7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/src/WPForms.php @@ -0,0 +1,623 @@ +form' or 'wpforms()->entry'. + * + * @since 1.5.7 + * + * @param string $name Name of the object to get. + * + * @return mixed|null + * @noinspection MagicMethodsValidityInspection + * @noinspection PhpDeprecationInspection + */ + public function __get( $name ) { + + if ( $name === 'smart_tags' ) { + _deprecated_argument( + 'wpforms()->smart_tags', + '1.6.7 of the WPForms plugin', + "Please use `wpforms()->obj( 'smart_tags' )` instead." + ); + } + + if ( $name === 'pro' ) { + _deprecated_argument( + 'wpforms()->pro', + '1.8.2.2 of the WPForms plugin', + 'Please use `wpforms()->is_pro()` instead.' + ); + + return wpforms()->is_pro(); + } + + return $this->get( $name ); + } + + /** + * Main WPForms Instance. + * + * Only one instance of WPForms exists in memory at any one time. + * Also, prevent the need to define globals all over the place. + * + * @since 1.0.0 + * + * @return WPForms + */ + public static function instance(): WPForms { + + if ( self::$instance === null || ! self::$instance instanceof self ) { + self::$instance = new self(); + + self::$instance->init(); + } + + return self::$instance; + } + + /** + * Initialize the plugin. + * + * @since 1.9.3 + * + * @noinspection UsingInclusionOnceReturnValueInspection + */ + private function init(): void { + + if ( self::is_restricted_heartbeat() ) { + return; + } + + $this->constants(); + $this->includes(); + + // Load Pro or Lite specific files. + if ( $this->is_pro() ) { + $this->registry['pro'] = require_once WPFORMS_PLUGIN_DIR . 'pro/wpforms-pro.php'; + } else { + require_once WPFORMS_PLUGIN_DIR . 'lite/wpforms-lite.php'; + } + + $this->hooks(); + } + + /** + * Setup plugin constants. + * All the path/URL-related constants are defined in the main plugin file. + * + * @since 1.0.0 + */ + private function constants(): void { + + $this->version = WPFORMS_VERSION; + + // Plugin Slug - Determine a plugin type and set slug accordingly. + // This filter is documented in \WPForms\WPForms::is_pro. + if ( apply_filters( 'wpforms_allow_pro_version', file_exists( WPFORMS_PLUGIN_DIR . 'pro/wpforms-pro.php' ) ) ) { + $this->pro = true; + + /** + * Pro plugin slug. + * + * @since 1.5.0 + */ + define( 'WPFORMS_PLUGIN_SLUG', 'wpforms' ); + } else { + /** + * Lite plugin slug. + * + * @since 1.5.0 + */ + define( 'WPFORMS_PLUGIN_SLUG', 'wpforms-lite' ); + } + } + + /** + * Include files. + * + * @since 1.0.0 + */ + private function includes(): void { + + $this->error_handler(); + + // Action Scheduler requires a special loading procedure. + require_once WPFORMS_PLUGIN_DIR . 'vendor/woocommerce/action-scheduler/action-scheduler.php'; + + // Autoload Composer packages. + require_once WPFORMS_PLUGIN_DIR . 'vendor/autoload.php'; + + // Base class and functions. + require_once WPFORMS_PLUGIN_DIR . 'includes/class-db.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/functions.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/fields/class-base.php'; + + $this->includes_magic(); + + // Global includes. + require_once WPFORMS_PLUGIN_DIR . 'includes/class-install.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/class-form.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/class-fields.php'; + // TODO: class-templates.php should be loaded in admin area only. + require_once WPFORMS_PLUGIN_DIR . 'includes/class-templates.php'; + // TODO: class-providers.php should be loaded in admin area only. + require_once WPFORMS_PLUGIN_DIR . 'includes/class-providers.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/class-process.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/class-widget.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/emails/class-emails.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/integrations.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/deprecated.php'; + + // Admin/Dashboard only includes, also in ajax. + if ( is_admin() ) { + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/admin.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-notices.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-menu.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/builder/class-builder.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/builder/functions.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-settings.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-welcome.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-editor.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-review.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/class-about.php'; + require_once WPFORMS_PLUGIN_DIR . 'includes/admin/ajax-actions.php'; + } + } + + /** + * Hooks. + * + * @since 1.9.0 + * @since 1.9.3 No longer static. + * + * @return void + */ + private function hooks(): void { + + add_action( 'plugins_loaded', [ self::$instance, 'objects' ] ); + add_action( 'wpforms_settings_init', [ self::$instance, 'reinstall_custom_tables' ] ); + } + + /** + * Include the error handler to suppress deprecated messages from vendor folders. + * + * @since 1.8.5 + */ + private function error_handler(): void { + + require_once WPFORMS_PLUGIN_DIR . 'src/ErrorHandler.php'; + + ( new ErrorHandler() )->init(); + } + + /** + * Including the new files with PHP 5.3 style. + * + * @since 1.4.7 + */ + private function includes_magic(): void { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + // Load the class loader. + $this->register( + [ + 'name' => 'Loader', + 'hook' => false, + ] + ); + + $this->register( + [ + 'name' => 'Integrations\SolidCentral\SolidCentral', + 'hook' => 'plugins_loaded', + 'priority' => 0, + 'condition' => ! empty( $_GET['ithemes-sync-request'] ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended + ] + ); + + /* + * Load admin components. Exclude from the frontend. + */ + if ( is_admin() ) { + add_action( 'wpforms_loaded', [ '\WPForms\Admin\Loader', 'get_instance' ] ); + } + + /* + * Properly init the providers' loader that will handle all the related logic and further loading. + */ + add_action( 'wpforms_loaded', [ '\WPForms\Providers\Providers', 'get_instance' ] ); + + /* + * Properly init the integration loader that will handle all the related logic and further loading. + */ + add_action( 'wpforms_loaded', [ '\WPForms\Integrations\Loader', 'get_instance' ] ); + } + + /** + * Setup objects. + * + * @since 1.0.0 + */ + public function objects(): void { + + // Global objects. + $this->registry['form'] = new WPForms_Form_Handler(); + $this->registry['process'] = new WPForms_Process(); + + /** + * Executes when all the WPForms stuff was loaded. + * + * @since 1.4.0 + */ + do_action( 'wpforms_loaded' ); + } + + /** + * Re-create plugin custom tables if they don't exist. + * + * @since 1.9.0 + * + * @param WPForms_Settings $wpforms_settings WPForms settings object. + */ + public function reinstall_custom_tables( WPForms_Settings $wpforms_settings ): void { + + if ( empty( $wpforms_settings->view ) ) { + return; + } + + // Proceed on the Settings plugin admin area page only. + if ( $wpforms_settings->view !== 'general' ) { + return; + } + + // Install on the current site only. + if ( ! DB::custom_tables_exist() ) { + DB::create_custom_tables(); + } + } + + /** + * Register a class. + * + * @since 1.5.7 + * + * @param array $class_data Class registration info. + * + * $class_data array accepts these params: name, id, hook, run, condition. + * - name: required -- class name to register. + * - id: optional -- class ID to register. + * - hook: optional -- hook to register the class on -- default wpforms_loaded. + * - run: optional -- method to run on class instantiation -- default init. + * - condition: optional -- condition to check before registering the class. + * + * @noinspection OnlyWritesOnParameterInspection + */ + public function register( $class_data ): void { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh, WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks + + if ( empty( $class_data['name'] ) || ! is_string( $class_data['name'] ) ) { + return; + } + + if ( isset( $class_data['condition'] ) && empty( $class_data['condition'] ) ) { + return; + } + + $full_name = $this->is_pro() ? '\WPForms\Pro\\' . $class_data['name'] : '\WPForms\Lite\\' . $class_data['name']; + $full_name = class_exists( $full_name ) ? $full_name : '\WPForms\\' . $class_data['name']; + + // Register an addon class. + if ( ! empty( $class_data['addon_class'] ) && ! empty( $class_data['addon_slug'] ) ) { + $is_initialized = wpforms_is_addon_initialized( $class_data['addon_slug'] ) && $this->is_pro(); + $full_name = $is_initialized ? $class_data['addon_class'] : $full_name; + $full_name = strpos( $full_name, '\\' ) !== 0 ? '\\' . $full_name : $full_name; + + // The core plugin classes have priority 10. + // Addon classes should be initialized after the core. + $class_data['priority'] = 100; + } + + // Bail if the class doesn't exist AND it is not an addon class. + if ( ! class_exists( $full_name ) && empty( $class_data['addon_class'] ) ) { + return; + } + + $id = $class_data['id'] ?? ''; + $id = $id ? preg_replace( '/[^a-z_]/', '', (string) $id ) : $id; + $hook = isset( $class_data['hook'] ) ? (string) $class_data['hook'] : 'wpforms_loaded'; + $run = $class_data['run'] ?? 'init'; + $priority = isset( $class_data['priority'] ) && is_int( $class_data['priority'] ) ? $class_data['priority'] : 10; + + $callback = function () use ( $full_name, $id, $run, $hook ) { + if ( ! class_exists( $full_name ) ) { + return; + } + + // Instantiate class. + $instance = new $full_name(); + + $this->register_instance( $id, $instance ); + + if ( $run && method_exists( $instance, $run ) ) { + $instance->{$run}(); + } + }; + + if ( $hook ) { + add_action( $hook, $callback, $priority ); + } else { + $callback(); + } + } + + /** + * Register any class instance. + * + * @since 1.8.6 + * + * @param string $id Class ID. + * @param object $instance Any class instance (object). + */ + public function register_instance( $id, $instance ): void { + + if ( $id && is_object( $instance ) && ! array_key_exists( $id, $this->registry ) ) { + $this->registry[ $id ] = $instance; + } + } + + /** + * Register classes in bulk. + * + * @since 1.5.7 + * + * @param array $classes Classes to register. + */ + public function register_bulk( $classes ): void { + + if ( ! is_array( $classes ) ) { + return; + } + + foreach ( $classes as $class ) { + $this->register( $class ); + } + } + + /** + * Get a class instance from a registry. + * Use \WPForms\WPForms::obj() instead. + * + * @since 1.5.7 + * @deprecated 1.9.1 + * + * @param string $name Class name or an alias. + * + * @return mixed|stdClass|null + */ + public function get( $name ) { + + if ( ! empty( $this->registry[ $name ] ) ) { + return $this->registry[ $name ]; + } + + // Backward compatibility for old public properties. + // Return null to save old condition for these properties. + if ( in_array( $name, $this->legacy_properties, true ) ) { + return $this->{$name} ?? null; + } + + return new stdClass(); + } + + /** + * Get a class instance from a registry. + * + * @since 1.9.1 + * + * @param string $name Class name or an alias. + * + * @return object|null + */ + public function obj( string $name ): ?object { + + return $this->registry[ $name ] ?? null; + } + + /** + * Get the list of all custom tables starting with `wpforms_*`. + * + * @since 1.6.3 + * + * @return array List of table names. + */ + public function get_existing_custom_tables(): array { + + // phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement + return DB::get_existing_custom_tables(); + } + + /** + * Whether the current instance of the plugin is a paid version, or free. + * + * @since 1.7.3 + * + * @return bool + */ + public function is_pro(): bool { + + /** + * Filters whether the current plugin version is pro. + * + * @since 1.7.3 + * + * @param bool $pro Whether the current plugin version is pro. + */ + return (bool) apply_filters( 'wpforms_allow_pro_version', $this->pro ); + } + + /** + * Whether the current request is restricted heartbeat. + * + * @since 1.9.3 + * + * @return bool + */ + public static function is_restricted_heartbeat(): bool { + + // phpcs:disable WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $action = $_POST['action'] ?? ''; + + if ( $action !== 'heartbeat' || ! wp_doing_ajax() ) { + return false; + } + + $screen_id = sanitize_key( $_POST['screen_id'] ?? '' ); + $data = array_map( 'sanitize_text_field', $_POST['data'] ?? [] ); + // phpcs:enable WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + + /** + * Filters the screen ids where the heartbeat is allowed. + * + * @since 1.9.3 + * + * @param array $allowed_screen_ids Screen IDs where the heartbeat is allowed. + */ + $allowed_screen_ids = (array) apply_filters( 'wpforms_heartbeat_allowed_screen_ids', self::HEARTBEAT_ALLOWED_SCREEN_IDS ); + + // Allow heartbeat requests on specific screens. + if ( in_array( $screen_id, $allowed_screen_ids, true ) ) { + return false; + } + + /** + * Filters whether the current request is restricted heartbeat. + * + * @since 1.9.3 + * + * @param bool $is_restricted Whether the current request is restricted heartbeat. + * @param string $screen_id Screen ID. + * @param array $data Heartbeat request data. + */ + return (bool) apply_filters( 'wpforms_is_restricted_heartbeat', true, $screen_id, $data ); + } + } +} + +// phpcs:ignore Universal.Namespaces.DisallowCurlyBraceSyntax.Forbidden, Universal.Namespaces.DisallowDeclarationWithoutName.Forbidden, Universal.Namespaces.OneDeclarationPerFile.MultipleFound +namespace { + + // Define `wpforms()` function only if it's not the restricted heartbeat request. + if ( ! WPForms\WPForms::is_restricted_heartbeat() ) { + + /** + * The function which returns the one WPForms instance. + * + * @since 1.0.0 + * + * @return WPForms\WPForms + */ + function wpforms(): WPForms\WPForms { // phpcs:ignore Universal.Files.SeparateFunctionsFromOO.Mixed + + return WPForms\WPForms::instance(); + } + + /** + * Adding an alias for backward-compatibility with plugins + * that still use class_exists( 'WPForms' ) + * instead of function_exists( 'wpforms' ), which is preferred. + * + * In 1.5.0 we removed support for PHP 5.2 + * and moved the former WPForms class to a namespace: WPForms\WPForms. + * + * @since 1.5.1 + */ + class_alias( 'WPForms\WPForms', 'WPForms' ); + } +} diff --git a/wp-content/plugins/wpforms-lite/templates/admin-bar-menu.php b/wp-content/plugins/wpforms-lite/templates/admin-bar-menu.php new file mode 100755 index 00000000..03632cc9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin-bar-menu.php @@ -0,0 +1,50 @@ + + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/challenge/builder.php b/wp-content/plugins/wpforms-lite/templates/admin/challenge/builder.php new file mode 100755 index 00000000..1ec56198 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/challenge/builder.php @@ -0,0 +1,45 @@ + +
              +
              +

              +

              + +
              + +
              +

              +

              +
              + +
              +

              + +
              + +
              +

              +

              + +
              +
              + +
              +
              +
              +

              +

              + +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/challenge/embed.php b/wp-content/plugins/wpforms-lite/templates/admin/challenge/embed.php new file mode 100755 index 00000000..a637aeb9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/challenge/embed.php @@ -0,0 +1,121 @@ + +
              +
              + +

              +

              + embed it. Learn More', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + 'br' => [], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/creating-first-form/#display-form', 'WPForms Challenge Block', 'Add A Block' ) ) + ); + ?> +

              + + +

              +

              + + +
              +
              + +
              +
              + +
              +

              + + +

              +

              + %1$s %2$s %3$s %4$s. Share your success story with other WPForms users and help us spread the word by giving WPForms a 5-star rating (%5$s) on WordPress.org. Thanks for your support and we look forward to bringing you more awesome features.', 'wpforms-lite' ), + '', + _n( 'minute', 'minutes', absint( $minutes ), 'wpforms-lite' ), + '', + _n( 'second', 'seconds', absint( $minutes ), 'wpforms-lite' ), + '' + ), + [ + 'span' => [ + 'id' => [], + 'class' => [], + ], + 'b' => [], + 'i' => [ + 'class' => [], + ], + ] + ); + ?> +

              + + + + +
              + +
              + +
              +
              + +
              +
              +
              +

              +

              + How can we help you to be successful? Please send us your feedback. Our support team is standing by to help.', 'wpforms-lite' ), + absint( $minutes ), + _n( 'minute', 'minutes', absint( $minutes ), 'wpforms-lite' ) + ), + [ 'br' => [] ] + ); + ?> +

              + + is_pro() ) { ?> + + + +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/challenge/modal.php b/wp-content/plugins/wpforms-lite/templates/admin/challenge/modal.php new file mode 100755 index 00000000..86ce0114 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/challenge/modal.php @@ -0,0 +1,78 @@ + +
              + +
              + + +

              + WPForms Challenge and get up and running within %1$d %2$s.', 'wpforms-lite' ), + absint( $minutes ), + _n( 'minute', 'minutes', absint( $minutes ), 'wpforms-lite' ) + ), + [ 'b' => [] ] + ); + ?> +

              +
                +
              • +
              • +
              • +
              • +
              • +
              • +
              +
              + + + +
              + <?php esc_html_e( 'Sullie the WPForms mascot', 'wpforms-lite' ); ?> +
              +

              +

              + ' . absint( $minutes ) . ':00' + ); + ?> +

              +
              +
              + +
              + + + + + + + + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/challenge/welcome.php b/wp-content/plugins/wpforms-lite/templates/admin/challenge/welcome.php new file mode 100755 index 00000000..3cbc2c81 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/challenge/welcome.php @@ -0,0 +1,23 @@ + +
              +
              +

              +
              +
              + + + +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/components/chart.php b/wp-content/plugins/wpforms-lite/templates/admin/components/chart.php new file mode 100755 index 00000000..5c79b0ce --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/components/chart.php @@ -0,0 +1,37 @@ + +
              +
              +
              +
              +

              +

              +
              +
              + + +

              + : + 0 +

              + + +
              + +
              +
              + + [], + 'label' => [], + 'input' => [ + 'type' => [], + 'name' => [], + 'value' => [], + 'checked' => [], + 'aria-hidden' => [], + ], +]; + +// Hidden fields to be included in the form submission. +// `orderby` and `order` are always included by default. +$default_hidden_fields = [ 'orderby', 'order' ]; +$hidden_fields = array_merge( $default_hidden_fields, $hidden_fields ?? [] ); + +?> +
              + + '; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + ?> + + +
              +
              +
                + ' . implode( '
              • ', (array) $choices ) . '
              • ', $choices_allowed_html ); ?> +
              +
              + +
              +
              + + +
              +
              +
              +
              + + +
              + +
              + + +
              +

              +
              +
              + > + +
              +
              + > + +
              +
              +
              + + + +
              +

              +
              +
              + > + +
              +
              + > + +
              +
              +
              + + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/dashboard/widget/welcome.php b/wp-content/plugins/wpforms-lite/templates/admin/dashboard/widget/welcome.php new file mode 100755 index 00000000..b8fc980d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/dashboard/widget/welcome.php @@ -0,0 +1,13 @@ + +
              + +

              + +

              +

              + + + +
              + + + + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/empty-states/no-user-templates.php b/wp-content/plugins/wpforms-lite/templates/admin/empty-states/no-user-templates.php new file mode 100755 index 00000000..88f5ed7b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/empty-states/no-user-templates.php @@ -0,0 +1,47 @@ + +
              + +

              + +

              + +

              +

              + + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/get-started.php b/wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/get-started.php new file mode 100755 index 00000000..2f65a9e8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/get-started.php @@ -0,0 +1,55 @@ + [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + 'strong' => [], +]; + +?> +
              +

              +

              +

              + " alt=""> + + + + + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/no-payments.php b/wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/no-payments.php new file mode 100755 index 00000000..82c31b24 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/empty-states/payments/no-payments.php @@ -0,0 +1,50 @@ + +
              +

              +

              +

              + + + + + + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/popup.php b/wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/popup.php new file mode 100755 index 00000000..ceeb2d2b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/popup.php @@ -0,0 +1,95 @@ + + +
              +
              +
              +

              +
              +

              + + +

              + +
              + + + + +
              + + +
              + + +
              +

              + [ + 'href' => [], + 'class' => [], + ], + ]; + + if ( ! empty( $args['user_can_edit_pages'] ) ) { + + printf( + wp_kses( /* translators: %1$s - video tutorial toggle CSS classes, %2$s - shortcode toggle CSS classes. */ + __( 'You can also embed your form manually or use a shortcode', 'wpforms-lite' ), + $allowed_tags + ), + 'tutorial-toggle wpforms-admin-popup-toggle', + 'shortcode-toggle wpforms-admin-popup-toggle' + ); + + } else { + + printf( + wp_kses( /* translators: %1$s - video tutorial toggle CSS classes, %2$s - shortcode toggle CSS classes. */ + __( 'You can embed your form using the WPForms block or a shortcode.', 'wpforms-lite' ), + $allowed_tags + ), + 'tutorial-toggle wpforms-admin-popup-toggle', + 'shortcode-toggle wpforms-admin-popup-toggle' + ); + + } + ?> +

              + + +
              + +
              + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/tooltip.php b/wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/tooltip.php new file mode 100755 index 00000000..9fd6167e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/form-embed-wizard/tooltip.php @@ -0,0 +1,43 @@ + +
              +
              + +

              +

              + embed it. Learn More', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + 'br' => [], + ] + ), + 'https://wpforms.com/docs/creating-first-form/#display-form' + ); + ?> +

              + + +

              +

              + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/forms/bulk-edit-tags.php b/wp-content/plugins/wpforms-lite/templates/admin/forms/bulk-edit-tags.php new file mode 100755 index 00000000..2e509ea6 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/forms/bulk-edit-tags.php @@ -0,0 +1,42 @@ + +
              +
              +
              + +
              +
              + +
              +
              +
              + + +
              +
              +
              + + + + + + + + + + id === wp_unslash( $_GET['payment_id'] ); + ?> + + + + + + + + + +
              + + id ); ?> + + + date_created_gmt, 'M j, Y', true ); ?> + + type ] ) ? $renewal->type : $placeholder_na_text ); ?> + + total_amount, $renewal->currency ), true, $renewal->currency ); ?> + + status ] ); ?> +
              + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/payments/tablenav-filters.php b/wp-content/plugins/wpforms-lite/templates/admin/payments/tablenav-filters.php new file mode 100755 index 00000000..cd8c68b9 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/payments/tablenav-filters.php @@ -0,0 +1,38 @@ + [ + 'name' => [], + 'class' => [], + 'multiple' => [], + 'placeholder' => [], + 'data-settings' => [], + ], + 'option' => [ + 'value' => [], + 'selected' => [], + ], +]; + +?> +
              + + +
              + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/settings/email-heading.php b/wp-content/plugins/wpforms-lite/templates/admin/settings/email-heading.php new file mode 100755 index 00000000..53719832 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/settings/email-heading.php @@ -0,0 +1,23 @@ + +

              + +

              +

              + +

              + +obj( 'education_smtp_notice' )->get_template(); + +/* Omit closing PHP tag at the end of PHP files to avoid "headers already sent" issues. */ diff --git a/wp-content/plugins/wpforms-lite/templates/admin/settings/hcaptcha-description.php b/wp-content/plugins/wpforms-lite/templates/admin/settings/hcaptcha-description.php new file mode 100755 index 00000000..d4134701 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/settings/hcaptcha-description.php @@ -0,0 +1,29 @@ + + +

              +

              + documentation.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-hcaptcha-in-wpforms/', 'Settings - Captcha', 'hCaptcha Documentation' ) ) + ); + ?> +

              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/settings/recaptcha-description.php b/wp-content/plugins/wpforms-lite/templates/admin/settings/recaptcha-description.php new file mode 100755 index 00000000..b6205bba --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/settings/recaptcha-description.php @@ -0,0 +1,57 @@ + + +

              +

              +
                +
              • + v2 Checkbox reCAPTCHA: Prompts users to check a box to prove they\'re human.', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +
              • +
              • + v2 Invisible reCAPTCHA: Uses advanced technology to detect real users without requiring any input.', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +
              • +
              • + v3 reCAPTCHA: Uses a behind-the-scenes scoring system to detect abusive traffic, and lets you decide the minimum passing score. Recommended for advanced use only (or if using Google AMP).', 'wpforms-lite' ), + [ 'strong' => [] ] + ); + ?> +
              • +
              +

              +

              + Read our walk through to learn more and for step-by-step directions.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-recaptcha-in-wpforms/', 'Settings - Captcha', 'reCAPTCHA Documentation' ) ) + ); + ?> +

              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/settings/specific-note.php b/wp-content/plugins/wpforms-lite/templates/admin/settings/specific-note.php new file mode 100755 index 00000000..7cd525c2 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/settings/specific-note.php @@ -0,0 +1,25 @@ + + +
              +
              + + + +
              + +
              + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/settings/turnstile-description.php b/wp-content/plugins/wpforms-lite/templates/admin/settings/turnstile-description.php new file mode 100755 index 00000000..6b6f819d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/settings/turnstile-description.php @@ -0,0 +1,29 @@ + + +

              +

              + documentation.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ), + esc_url( wpforms_utm_link( 'https://wpforms.com/docs/setting-up-cloudflare-turnstile/', 'Settings - Captcha', 'Turnstile Documentation' ) ) + ); + ?> +

              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/splash/footer.php b/wp-content/plugins/wpforms-lite/templates/admin/splash/footer.php new file mode 100755 index 00000000..09f50fdc --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/splash/footer.php @@ -0,0 +1,24 @@ + + +
              + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/splash/header.php b/wp-content/plugins/wpforms-lite/templates/admin/splash/header.php new file mode 100755 index 00000000..80b2f5b3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/splash/header.php @@ -0,0 +1,25 @@ + +
              + +
              +

              + +

              +

              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/admin/splash/modal.php b/wp-content/plugins/wpforms-lite/templates/admin/splash/modal.php new file mode 100755 index 00000000..81e022be --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/splash/modal.php @@ -0,0 +1,56 @@ + + + diff --git a/wp-content/plugins/wpforms-lite/templates/admin/splash/section.php b/wp-content/plugins/wpforms-lite/templates/admin/splash/section.php new file mode 100755 index 00000000..d4aee71a --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/admin/splash/section.php @@ -0,0 +1,61 @@ + + +
              +
              + %s', + esc_html__( 'New Feature', 'wpforms-lite' ) + ); + } + ?> +

              +

              + + +
              + $button ) { + $button_class = $button_type === 'main' ? 'wpforms-btn-orange' : 'wpforms-btn-bordered'; + + printf( + '%2$s', + esc_url( $button['url'] ), + esc_html( $button['text'] ), + esc_attr( $button_class ) + ); + } + ?> +
              + +
              + + +
              + +
              + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/antispam/also-available.php b/wp-content/plugins/wpforms-lite/templates/builder/antispam/also-available.php new file mode 100755 index 00000000..f0cb0055 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/antispam/also-available.php @@ -0,0 +1,44 @@ + +
              + $block ) : + + if ( empty( $block['show'] ) ) { + continue; + } + + $slug = strtolower( $key ); + $class = ! empty( $block['class'] ) ? $block['class'] : ''; + ?> + +
              "> + + +
              +

              +

              + + + +
              +
              + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/field-context-menu.php b/wp-content/plugins/wpforms-lite/templates/builder/field-context-menu.php new file mode 100755 index 00000000..cfc35a06 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/field-context-menu.php @@ -0,0 +1,128 @@ + + +
              +
                +
              • + + + + + + + +
              • + +
              • + + + + + + + +
              • + +
              • + + + + + + + +
              • + +
              • + +
              • + + + + + + + +
              • + +
              • + + + + + + + +
              • + +
              • + + + + + + + + +
                  +
                • + + + + + + + +
                • + +
                • + + + + + + + +
                • + +
                • + + + + + + + +
                • +
                +
              • + +
              • + +
              • + + + + + + + + + is_pro() ) : ?> + + +
              • +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/abort-message.php b/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/abort-message.php new file mode 100755 index 00000000..de4a0f07 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/abort-message.php @@ -0,0 +1,32 @@ + + +
              + +

              +

              + + + + +
              + + + +
              + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/ie-notice.php b/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/ie-notice.php new file mode 100755 index 00000000..3b51c69f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/ie-notice.php @@ -0,0 +1,44 @@ + +
              + + Internet Explorer ® +

              + +

              + Our form builder is optimized for modern browsers.
              Please install Microsoft Edge or learn
              how to browse happy.', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + 'br' => [], + ] + ), + 'https://www.microsoft.com/en-us/edge', + 'https://browsehappy.com/' + ); + ?> +

              + +
              + + + +
              + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/mobile-notice.php b/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/mobile-notice.php new file mode 100755 index 00000000..60ad6b50 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/fullscreen/mobile-notice.php @@ -0,0 +1,31 @@ + +
              + + <?php esc_attr_e( 'Sullie the WPForms mascot', 'wpforms-lite' ); ?> + +

              +

              + +
              + + + + +
              + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/help.php b/wp-content/plugins/wpforms-lite/templates/builder/help.php new file mode 100755 index 00000000..3126140e --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/help.php @@ -0,0 +1,145 @@ +'; +$url_parameters = add_query_arg( + [ + 'utm_campaign' => wpforms()->is_pro() ? 'plugin' : 'liteplugin', + 'utm_source' => 'WordPress', + 'utm_medium' => rawurlencode( 'Builder Help Modal' ), + 'utm_content' => '', + ], + '' +); + +$links_utm_medium = 'Builder Help Modal'; + +?> + + + + + + + diff --git a/wp-content/plugins/wpforms-lite/templates/builder/notifications/email-template-link.php b/wp-content/plugins/wpforms-lite/templates/builder/notifications/email-template-link.php new file mode 100755 index 00000000..c6fd4224 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/notifications/email-template-link.php @@ -0,0 +1,28 @@ + + +

              + ', + '' + ); + ?> +

              + + + + + + +
              +
              +
              +
              + + +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/payment/sidebar.php b/wp-content/plugins/wpforms-lite/templates/builder/payment/sidebar.php new file mode 100755 index 00000000..0a6f6077 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/payment/sidebar.php @@ -0,0 +1,38 @@ + + + + + <?php echo esc_attr( $name ); ?> + +
              + + + + +   + + + +
              + +
              + + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/revisions/list.php b/wp-content/plugins/wpforms-lite/templates/builder/revisions/list.php new file mode 100755 index 00000000..86917aaa --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/revisions/list.php @@ -0,0 +1,79 @@ + + + diff --git a/wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-disabled.php b/wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-disabled.php new file mode 100755 index 00000000..f3b17008 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-disabled.php @@ -0,0 +1,26 @@ + + +
              +

              +

              + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-limited.php b/wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-limited.php new file mode 100755 index 00000000..3d611fa3 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/revisions/notice-limited.php @@ -0,0 +1,35 @@ + + +
              +

              +

              + +

              + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/templates-item.php b/wp-content/plugins/wpforms-lite/templates/builder/templates-item.php new file mode 100755 index 00000000..1da5895f --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/templates-item.php @@ -0,0 +1,130 @@ + +
              > + +
              + +
              + + Blank Form Template + + User Form Template + + Customizable Form Template + +
              + + <?php echo esc_attr( $template['name'] ); ?> Template + +
              + + +

              + +

              + + + + + + + + + + + + + + + + +

              + +

              + + +
              + + > + + + + + + + + + + + + + + +
              + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/themes/notices.php b/wp-content/plugins/wpforms-lite/templates/builder/themes/notices.php new file mode 100755 index 00000000..6657ca4d --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/themes/notices.php @@ -0,0 +1,115 @@ + 'wpforms-settings', + 'view' => 'general', + ], + admin_url( 'admin.php' ) +); + +?> + +
              + Want to customize your form styles without editing CSS?

              %1$s

              Go to Settings', 'wpforms-lite' ), + [ + 'h4' => [], + 'p' => [], + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_html( $notice_text ), + esc_url( $plugins_page_url ) + ); + + ?> +
              +
              + Form styles are disabled because Lead Form Mode is turned on.

              To change the styling for this form, edit the options in the Lead Forms settings.

              ', 'wpforms-lite' ), + [ + 'h4' => [], + 'p' => [], + 'a' => [ + 'href' => [], + ], + ] + ); + + ?> +
              +
              + Form styles are disabled because Conversational Forms addon is turned on.

              To change the styling for this form, edit the options in the Conversational Forms settings.

              ', 'wpforms-lite' ), + [ + 'h4' => [], + 'p' => [], + 'a' => [ + 'href' => [], + ], + ] + ); + + ?> +
              + +
              + Update Available

              %1$s

              Update Now', 'wpforms-lite' ), + [ + 'h4' => [], + 'p' => [], + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_html( $notice_text ), + esc_url( admin_url( 'plugins.php' ) ) + ); + + ?> +
              diff --git a/wp-content/plugins/wpforms-lite/templates/builder/themes/preview.php b/wp-content/plugins/wpforms-lite/templates/builder/themes/preview.php new file mode 100755 index 00000000..b2271300 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/builder/themes/preview.php @@ -0,0 +1,90 @@ + + +
              +
              +
              +
              +
              +
              +
              + +
              +
              + + +
              +
              + + +
              +
              +
              +
              +
              + + +
              +
              + + +
              +
              +
              + +
                +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              +
              +
              +
              +
              + +
                +
              • + + +
              • +
              • + + +
              • +
              • + + +
              • +
              +
              +
              +
              + +
              + +
              +
              +
              +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/classic-notice.php b/wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/classic-notice.php new file mode 100755 index 00000000..3266dcc8 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/classic-notice.php @@ -0,0 +1,29 @@ + + +
              + $message, + ], + true + ) + ?> + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/notice.php b/wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/notice.php new file mode 100755 index 00000000..d17d3fdb --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/education/admin/edit-post/notice.php @@ -0,0 +1,33 @@ + + +
              +

              + +

              +

              + [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + ] + ); + ?> +

              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/education/admin/page.php b/wp-content/plugins/wpforms-lite/templates/education/admin/page.php new file mode 100755 index 00000000..5b24160b --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/education/admin/page.php @@ -0,0 +1,107 @@ + + +
              +
              + +

              + + + + +

              + + +
              + +
              +
              + +
              +
              + <?php echo esc_attr( $image['title'] ); ?> + +
              +
              +
              + +
              +
              + +
              + +

              + +
                + +
              • + + +
              • + +
              +
              + +
              + $utm_medium, + 'content' => $utm_content, + ], + $license_level + ); + } else { + printf( + '%s', + esc_url( wpforms_admin_upgrade_link( $utm_medium, $utm_content ) ), + esc_html__( 'Upgrade to WPForms Pro', 'wpforms-lite' ) + ); + } + ?> +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/education/admin/payments/single-page.php b/wp-content/plugins/wpforms-lite/templates/education/admin/payments/single-page.php new file mode 100755 index 00000000..2fccc7ca --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/education/admin/payments/single-page.php @@ -0,0 +1,53 @@ + + +
              +
              + +
              +
              + Upgrade to Pro!', 'wpforms-lite' ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ), + esc_url( + wpforms_admin_upgrade_link( + 'Single Payment Page', + 'Stripe Pro - Remove Fees' + ) + ) + ); + ?> +
              +
              + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/education/admin/settings/smtp-notice.php b/wp-content/plugins/wpforms-lite/templates/education/admin/settings/smtp-notice.php new file mode 100755 index 00000000..a7cb1925 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/education/admin/settings/smtp-notice.php @@ -0,0 +1,40 @@ + + +
              +
              +
              + Get WP Mail SMTP!', 'wpforms-lite' ), + esc_url( add_query_arg( 'page', 'wpforms-smtp', admin_url( 'admin.php' ) ) ), + wpforms_is_admin_page( 'builder' ) ? '_blank' : '_self' + ), + [ + 'a' => [ + 'href' => [], + 'rel' => [], + 'target' => [], + ], + ] + ); + ?> +
              +
              + +
              +
              diff --git a/wp-content/plugins/wpforms-lite/templates/emails/classic-body.php b/wp-content/plugins/wpforms-lite/templates/emails/classic-body.php new file mode 100755 index 00000000..81f5c5d7 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/emails/classic-body.php @@ -0,0 +1,22 @@ + + + + + + +
              diff --git a/wp-content/plugins/wpforms-lite/templates/emails/classic-field.php b/wp-content/plugins/wpforms-lite/templates/emails/classic-field.php new file mode 100755 index 00000000..84e3ae35 --- /dev/null +++ b/wp-content/plugins/wpforms-lite/templates/emails/classic-field.php @@ -0,0 +1,17 @@ + + +
              {field_name}
              {field_value}
              +
              +

              D^jRzuq`!f8V<38FYpYwbuZOpu=m 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 Pr_ff{S1Z43ANKzMEPFN# literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-pushengage.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-pushengage.png new file mode 100755 index 0000000000000000000000000000000000000000..15ce746e22abc0607985f0d29bc317c62e1f2cb0 GIT binary patch literal 1420 zcmXYxc|6m99LHBQckap&GCYV$j5zEg<1R%8m;}l{C+?RJ@Av2P*Czvyvz8E56a|4m61FyIC%^{*$5~ha zu*gim9>8Vd&k-rBR{sl*+6~}Vd{gAEfE14Ao9}gzd#M=!p!hJrqIUxXAb`j0 zjsP$MDDKGw$%p;76W9RMfm!r!1;7Bt6kx3QFw4D50bp-7GYVD+yhcC53Fizl=w6vk z;6GABCMMu7N~zASgoTAA<`~TSB)%aVTq`5bA`|gBNaX$dZ_1i-Ao@RFw4l4nGn^Yiw+Vzxqp_!hLv}K00LINoAww0%yCRh1Ln2Xx9MF z5B-oOYNV`19Je!)|K9jO;N}X>O!aBpr(Z@&GWVzXZRsdtr~>&5r8C;mra^B1dO-B= zH@;1qZ079W815)nj%DicN^5#lhvRqF!A?^&8a88dLI2e9z%QPOt82@fJAK#$loZF5Y1MxuNU!Gsgq$!Tk_nllI)UA?80cXKkaKtR&;A ztEq#1PajU&A72^U@V9G{dledHUXMAxltmzJ=vAOtM@NcOpm&qI+EA>iklF#03&Pe6 zwqHpfv)86yb8@Vb$Kt+q3l?tGgG41=01gdW%Kdt7?Pbtj}45=U9P=#>#lg0ixU#e0x93L>Q*j(vRK)(nrSwjrCI^-N$ z(wH_ZHXtf9?6wWf`!2&;k2IPkS#sP&ZpVB%LKO7=GY$VvT6`|`09SX)4n?`-ovwbk zLaFmDd9o2Kaq#A$+`sEP6FMKwea<`w2s`nH1fw10Ze!|ObIVpZyJDtN5IYY5{oMo>=$x9Mt z^6w<3>cDAijO!gfT6%EkgBoKtQtH)TswDL7v27U#CFN~_GZpPd*9{k#t@7^rPz?E9(ctOi6sgO}|NAk#FJXIIuoRpO3i*PT19%Di1Lf;n@SsFXZo~3bh zU>8!pOCs0PZaqoPSD#iC@`=3lS~Ouple&hY5;^4_`B9es z9~=f|`Xgd_OYWxU7Z2NGRoA^ zL8)bu&m|Gmzg^_Q8>eN8LV@4s8tfMXpnE# zMzFWimp)XTsPz|=VLLwN3TsSMUJ>IWHRwy$+b+W-VU?^wRoU)e=JQ%gJn+t?1c8jj WP?fu4bt=F|2C~KA(2XdcD;BzLK>~t~gdW+q({D3t)6bTNU#6FMt2f!$eMHA`1rb=6hg>;3*NzMTDE{xsk8<+n@Oe`EgF<7Mpc%#$82VgJ4P zPR;V+SDGKx#+S8k%yCfyZ!l*%Cd=9PD6?(Ux%l1XR z0kNvp4%@dAG<5rqaK8$8HQL(k+wVA08?Z+O^9N!90{#TEkn!z90#ZTp25mg;I0Y$} z>}v^HMgl&}xw)R7fQ{b;y~PGg^FNG3ClUCXN~m^P2d3CI99~KmDt^*nN#kzF}em6k6ZikS z{)eqYYA4m;cD&t9EaCPLTP9Z?!rGDm?`;jzGD(phLiPScN4RldzFJ>FdPfE)OQq%(Zaw$PsTp%YlI0g$qHyNNo zLDC8L!wP6*09eQ~)EvaXMvF^?JOBZpMovmV9nA2vF#!4zHWC2$`eq8iFkv@Xj$aFb z=OXj7VgvwkEd>DJwp<6$f?9DJU$YPJ(V&!86EN2*0M94^G7>;w(4zrnKMrs|-n4uY zVo(Wi&;!VK!3^`wnQ9WiMhno$05V%T4v_KyA}s(2FA%D&3?Q@Ra{urxFuVW&7)$E{;Nt|t^^yVLX#p}7 zKryA&I8OS=oRB=Q8UO(L${y=IV0(54egr7B04W$8a8pYI*eC$xTn%&p5r{7ksRtSW zZi{hKOabt900jvEKO8_NdH{QX^%JHk<^kmPg)Wq{kOZ*N05n8^2&WkS2?HRoKYb0t zL=6DaptjFaMgox2ps@qQOn?-JIR1qm0F3Ww&D5F-5Lz385+te~02EqllwVN={Pwbe5%yGXzYt*~_elTMIH(<{M_P{6A?py!}-icb2YoG7~2pDjmGgRSvXfqu4}Ui!1${OU3Zpif5riTYbs0;;v+Cm^4I zk$^xsX$8`&h!-7VI6P%BCtBc8hyWhW^7yegWb=6f@{R?2p V9(TCp4r>4a002ovPDHLkV1o4zgBAb) literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-seedprod.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-seedprod.png new file mode 100755 index 0000000000000000000000000000000000000000..615191f99c5a088f6812eae3370d95aad2da00da GIT binary patch literal 7472 zcmW+*2{aVm_aBCt!7yVIV`&TqBfgB3Mpvc5_q=z{J2#qg*?^Z@gc|?=@RCWorT_pN{OLI!QM1p-ghgxf^+BTwW;p zCdwo}lV>K&CNR;tv6yE;r;3^AJYUi3LLGz0|MslvWqR2RfO~q}fBB^Q@jtx#pLu*d z_CNZ6Tsf})A3r`G`X60z`)6v8|IH_v4ePuG0L0kHxj^>2IdR#OW8+PhpGpO7E{l<;eXIY`yT*_sto)QiZ}>t~0icFz2Nj*yG7EXHV-d z+vG-J)%+3_DpF-srY_U%RDO2oSw*z(&Uh-=I@0`KLBr7 zKo?q+@i7J#?JsFKNNC%VoI=q^GvAETW%HgW;JwM;0FI@omb@?B-H(GyoUP2geQ)nu z20YU~z;fXxVAQKD3FtH&RW$G8dqwQeDGaW=3WW|uT@d&zNL%yJt3qZ5mMk^wiV`OH z5+NNCp^~{uiEU;E63|XKoMLR@a6hx)tVK@~`F05LnW(3 z_zV!ZK=?BE958e$7eax=K5M^?zb(UkF=fGp}i~xW04V8(~X~hznW+nLsSoo zwEXYGg@lo>LP+V8&J`UYlI&n9`@3d>f7m2nMa-5fWx+j3bT}WfonHqB+Lw%b^Vz~j zmZ+_SW+nCmJ7c5TR=3v>sBUG}g!lI=DaY<`4UMhMToGx%i7;XSt&@dHJ_3M?R#Uu5 zzC<{!?BAK9(Cspu93$tu&CH6~_$kH9D<+`mR}gJAn;J4OyEFD?h+8B}488uh{v*YE zJ>S;nzj`+C_w#iRHwJ4gy`K{wl*!T2T3KKmp1btzI#qxSrI5ylG`+6#zva}kOO%z? z3pcvZqc;c9!&nQLES~|?)phbt_iJW*GVK@q z0#Uu&`y9yr<$ajc5rE^vh*PRTaM_r9+2Y8|5Tk$DsZXdt!Uw#S_?zdD4H>AxfmmJ> zQ!bX`I~8MWVT8bh^fy0bFnC&Jzfk8D(V0W{?9GO5hOi>ae;;NSef;K7DVNWMxMcSd z>FvaGIm0Q{3I61bIIjCm7Yr$_=sVo@o_ux;L)89bTpAR@LivRvm=r#xw3oK#Fk3|s z2@g)U^;TwsAQ#@>0Yaan%g9^sc`V-#TEFgx8gdAn&-Q(`UitU98)ZPj4Mo()YJ*?TeefYNdkB)seaXJldxqr3DsZs!$CPt`F+>ec+d*cSGV|?E~$a*i^K$OM+OOuExShTkg4pQANN*1dxR3SH)k$*_Zlv@fRGVV%0m96 z%qkZ!+rvUNPRLA%#ZuF2j|XqZMk0-izT+^4W9JX%c|>E!vK~Epj7=je z>O}Oz8jzar%-_wq8wc%wa5@Y?#7qHR-yQ~GGy&Q|Fcojkp>PllSL=8$tt-$!5KwTD zBR!1qF%Kz8Lh|ta*so^}5GYn9zJozvHQ7TaW>)*E&DF3SYHpoZSr}C5US1E65PEYvhFGQLKW^ZKkd{%<`p&!{L(&GrK=?C~JK}EHq1_M)WHKEe)E4Pq^X5 zj_x;_{BfB>XpN?Sl6jLe<`+s_VG9mn#xD=)<~8>l1|CyB%9L8K+UF{jkvnOXB}M5k z`wy_VHHN2hdQ(t?f6lO2_3}mOnA%rrVxe;%PQ>Kb^!<1@J4VuPaaZYW-(xgIEq$G{ zT)U;L`daBI)>Cow@Jt`fKNbWXR+J1iiRipGy;f8!!huAMh`;OZJ8FB>{7rN}vN17g zmKDT*aP#U5RjpFz1m6v?nzm%~gmb=7hQ%}9OOnsU(UY3dDCYo&FPvOBG#J{tY?_Fj zwsYhK0uhi_2VFKMOG;DcZv!GMQ|V{`)^VjMmM97Hzy}_$l?cb^ecn<;uYtd-@#@qc zzUx-n+&r2<7b+cg1`vfQ(CzdN=SbuCzJpHplY#M*+rgjv-qhVY1#Y9~zjF1O-e0-= z=Vriol}D4<`8!{K9UtGh3!f=pr+&^6dXxP`N>e1;#T~KbAJkNKR>edx>#wVDB*t{r z^n{cIve)-3XJzp<1Q5ExsUxZES-X8nlA_eTiO=6XbYDw^Ltin8AF-e5DIK!^VY8yX zT?bR~{_xxpc~t^SoTDv6Xi>_8^s`5%|U?h|88& zSlH%AJhEb!k=B^?f!<}|;6#X`t0>R>FX2m0%knkvLTmfD=fzybe!GlsSJv`}H9UwP znUGQb##9qYJu0trDa^*`v$fTu9r)hf&pyc^wn02c7*3u*zSf|9$M=Xd6Ycrd!5r@X z``nRc59AlR_klaC@s`MzOOoO?=JT?mMkd7Fj#>Ak|;w&fUyPG_fV5jj3{8pB#6r)%i~3D;XD* zBrdQiY&|{+L%g%e0!K4TlW?ozhAAI|OGL%_9kKjjX}VT#NmKQ{EP(D58jZSaXXjEJ z^OrfsRIWLS1rgnHt~}2g=glM~W4B=lYdEZLd>6wPD)w)Q^ts@He(G1EfEr{qLr;g}iEf$gTz;pU#SBuM2 zpk9ngn+L)W)?1!QpHFHRoAr>uv`Z!!T=hjMM^&H(?^mxu<@l)T_KiEFDG!}!jaXPiQr4BtH|I1SgC%GlT1OI9-#aaAcLd6mkQ!K|?tt@AZr3OAzuP(y0aKR`+LZs+xWF--7)zx;d!_bN zXWv2k8o@+n1ZI;JX=*#(%p)1ziOF%v72uRq(71GIOaX=(ev-iTq)Ic|m>c|pjMc!V z>mrV=FBF&6oqhd&ufV!3Zgra-x|^H$blPC+EW#A`FC?S5x7Go=34ZRk4(&C0PdG`3 zqDeeDQ$&2N5q;)w?kiSa#&#Kw@$9F9k>Y0=gRJZ-6Ke{buhYOpifS`+?+pui(I_`j zkoMpfI<59i=3#T)$m%R+qXB=kJL%r@2-3O*gJ|cpt+h0uBRq5MW-oSn7b|GjJj|hq zkz=pI&!gZpmRu#LY5Au`Co|P>Mh4K`XzRzb;;aK#I_r&R z&d02Znai4;@d(;#rX z0%P591%uKK+{4BnxHq(?K3J%Bi}lh!Yck6&p6lWUzpq@vD6{4KdoR^}GgayCHfOVY}8LkyJgpuROY?iN9G&=R)O@c)! z2lprAf8PF){ff>GBqZWz)A~LLXh}zNcLKhZCQ&7w@${B6M?q}@P7+UQDecfZE#BAHP zzb1c4adH_Lmr~tf<8OW(pM1j9!YScjb&-=;_jGHwbP`{&VA?gcU-sbw1(@;{b`<_G zUuaQHWhdg*>xR<~ZZ2|{Sjg6g0e`PKz_oKupO;yYcuTgdC4@PDYPJj;`!@dCMOPV| zvB3-U1lOO=oC%+GlZkrqW*9j^b7iOgvGXbvz56b5D(h?0>GM-Yp+{_dl|;M-9l0KP z$PQHK||%Mx+6LypfS1&1U-T@pktZkvDMe956ZD;O1G zLWhBvqG3h{^XC=0K`#9e$Cci=%wd6xfJRBWt`%)n+Iwr zGNR7`IB~fqz^FvKLqZ)bvHA%nPfgx2w>QhbK$%M}1IdBxg7#J@s?LgzRPf;TN%VBs zgXz?f6UUKPl_%g?fVNnn_B0{Wv!>y7bDGIfDv@`w3!6LVAIT8M%q>zLtY5A>c~B5A z6r3+lYC+$zpQkKwFI2jSbA#5WK>YWtQje*fb(smv03W( z?V3U=Q!rOz*!AV$gRX_{J>m;3G&tYl^wCheM4ZOVW_lpT9WQ>*!7V9e&O*i=$H_cm zBi0hzi(hbrH@TG?Ohzr$U2BETn6D-5aE8?ak%M23-JC00e>~-g?r+2N?iVy(51`ya zoc+8zQyeA4->!5V$EANKV6d;w)vwC@J$j>M?scB?jQ$NEO^;he$}s=F*MF5|40-)K-m#0;af##xLPP)=y=1=Un$+Gn^VSeVa?SNz;iw`HsOLX`^#j5pemtsk%NA z%UV1sQcg^k1YYs#MPpq|~pp}4}9A{)O#cy}B0jgUSn3_!krC%fKF3o8i z5c+k#A4T4_B~7NdGIlp>cR_=f!Yiwev$vfNj+5@|_qauGX=3;h2A4ebNc)GuE#Hm(i>HbRjxizPeL-)wwz&e$ zAB%6Su%a7(E)*MyOLuFYHE9{bI?yuJwf;W;bo_VbQd7}YWu(^l?MQq4q^-uXtr4ty za@gF<+)+GeCIb1nuHESy)+LJn@6oBv&%JdfQ=`OrCLu3O;_wN76aBUIgrvM`J0yD7 z5bnvy632h?Un7>$LUgTH>6Pa=R$Vt*QEx}Dm^=uk@;R{S+VQYc%P+^k11o+pm+D-a z)XTm!aC2+|#oW`55BJBgU=jLYSzm~ZNVoqYma5dwSNmj3xe2A~YwMc%i92)fBy+oM zOY~}5A>81pU&~NRE0L-`9BE+oBQ+(dfSuY0n?GmD@!0VhZ>p*Z{b*`657n*`UfOI4 z;17hWYGvF;*h_aD4CXa9JecV82~AKq1E?odZ# zlZB@iANxL+LkRYg858ZzKdE}t5PtEqSH`Mu_i%n`vkA_aFL9Fly%s_hyS8<)5G#<% z%pn#1IHP2@rYcX=z3|NZT*cFVN*aS&r(kf1hI6!??l@6I=_k5*CKD#mMN0!p;_LGB z_54C~F0K9!*!+_OWLw&P7H3=T2WU8rb?a%2Rbv6tgByAG%|gMP`fDpwFXGMOEO2{A zqlVEnF`HDA-`{ST=?;;eujE>iwua8KBMS)-uHDHB z!<%kGF(pV+N~|niT&Ninamo>L{eO{(NKq2n|0W&^tPnD~Qcf&>g4U}>=acS4w@%G5RezY`5>ZXf8H**ny!K_( zLS3)aA>bwk#`y@=7I0S-&mN2ac(W452zq)pqJ*5t$OZGy2?`@O9%d+gS{47gtV1fd z$*}F6Zs&%dZI^kST&;t5%*&M;H5g+}Om*m-uvRR1jL$>@-h&uFmW)xwz=c2FicIp*q>3+KEz zsmmS30xpFxVQ@4LzswP*&Kx)$T`W;{+yYkigbM`Lmj6bTh+BE~ZPJ{Z4i0eD!lU8BfwhfO#GY`E0`;s{@C8V^T&V{E z6824$JyK9_Hq@33uL&mTSQVymw}1z@BLC@mW$~%^ibmjDOplOLy^?V+6d~p9zj%pe zI0fe$B?1-dudyrIrWdDvF)8tru%*Pttkko6&lX#P07;_k$fj%19|C<*$?LM-UkW8~ z1u~MLy`xZ`-_^IIYLv2bP(bbx zr3YOxI`{CRa#+Eg^;#=U&uE@)7x3Lb|1B`Y4lrWA)sVRm}p*c?;pl)9^OE z;qd2J6pKxX?hI~mNlqWZzqRC|Lk_6z{Z#g!}2L*OsDG|FZD-@(tK3IOab7eESg^#@P{Vkao^u;{9~o)4=^7%q$9Mk z@18C0000yP)t-sz7XLo@Vf@c=Ec7=ZGfAV>7u-8tkA__ROsL-O2mq z)##Hehlq5~000XtNklE|jbH$AP@3~&1 zV!cO&+J;r3lKccLTLo+@XR8*U&FL!n37(}2;6xa9ZR|%faE^43xBGL14ZsNax;%EJ zS&t^Kec};p4By$ZHy}iFJfe%t7DNCa3}F=p|A!7ZK7bqE(2E{E0aV%^!0qYx4DcQA z^4qh8A+GS20{Vmb1E%m1yjt+I{VLayA3p&%GmtLf@I$!qWdl3g1lg{C+W||!c6$HA zD+oU2TuR;dTGC434bZxK|D1e3|AlO=^{M~!XuH@B$LaU)pW!Dniz%ctQS0qn`}kEW zv;95-=>(1`&#;gcq^ki`(`)&tRt4<6Za)3X5g1&$KsF@cBIZ1)r4BE(-ph{>oOK{Z zdQV%Ggc>zfOjVv`+epw>_gP_pENYA_LYhREkE$4Ou^yEB4!rjWXjF~@UdshHpwj|l zhXJzCMvYWPaU3F4&+#$pU2wdG0XBuafrG|u#)k>mwG#kz6yVi*y~KZYZid^9t4I*O zlf;5Xi{ist~Jj$F{pqSg0nH! zVfU0$DP>*P_j@fiIFOT_JMc#Z{7Sq=54Z#<60z>_F4i50ZU+aR|G$Wb1Hu;tEd57t zMV`bvEjvDB7YCl|fGPiFZs9d%p=k(ZCGsN5(hR7V`+;6R;|}Dj3wVK_w*Q3Dg5801 zji-Rh-dY?4P{ObQ{_ndBAb*Rp|9f{JtheLsA%K5y;E8J^Lj)b50cCBGm;{Xe`vOXw zIsp8W4%FM9O98LF`pY?S9G0b|oxkl9Jw1sZ9N-4jOiCc_-S|bofQQeR>xL{TC3myj zHm2a$7AfG_EjS!N%;`Xjom2MzBP@{Mg`F&=5n~K}Ps#}});l72TIfLIKZzd&e81EI z3g86T_QKq?5z38tFTQSpK>!@6Z7`q;SdI=D9QI!kAZt-usCXnw9vhx~IAAHz`*u4z z5JUhhc+-GUz&QK6OvS5n6(qjiEyZC7LcnnN-UWPP6rv8^i2~U1^Qo8uy7MdpOPTc6 zo|VnEctA!eAic*7Y(Aq5h#W+4OvVstK)rCwDU*%{|64pf=u)%^C}9_{bO9u?@LJuq z!NC0EYLSy29C$u|4i5ky9*+*Z9959)^`Zeag6%|X6hKALf3hiH^uMP74jdPQm!6f{2q=MlQ}T%M@xc&mEg6QN2>5F4;RXTW9H~TZi>(q{o+^@2=}?f96FnP* zn}Dhy7VV{Wk~?t(t4*Scq6ay68yR`&ZP3f$Ye0~b3Y(YS)CTJO^a|ilw z0N=XoaUqHU#Kp%rrg&UrQaibgI4!_fSQTZe;H3T}T!{$Ns6g!*_?5#Qw+6X9zZch&% zi<|+7YawO07K?)bYWVN?3t)6CHI@pAEJH$d0fr5KEyH)J9$3m8fUOL_4)0(D2q3eC z`~Y)r0oDQPqX6JPNC71Tk6M3Rf4Kn1dzG)tVT)v-*IONgpd%JHDg5ioU(YLlctVpY zfcYOC*d;tD!2EvYPZnU*9|~}Ya#I?e&odv;!u;E4qQ0lWJYfcWbI z+)bzuiQF6e&Pa*u+CCfu6d)%suE4SYv+~yx5B<+G6$~tg5 zbe;m(kb+TyIp&^77NC>wWAz>1qH4#G?a}0`r#n zz8vb-d)NVn*$EhUeo1)BaG>Jp0QwIBb@*ADFTnEfl|i_ZqL2Cb*0pgV|DR7qHM;xeaaU&j=K7S!Q2wtlHB$9vNKIeh) z1+)iKK=ynDoUed@pB2K)0r2am3J9%D9SF>QP&(SB18HYJApq$10`5-}Q0b@ZUpSYb zTcEiBu;IY>Aqn5^bfB+)aopc016pctKKsvCBWR!lXf@pV{MlUBKQ2F%KoP{Bhff_~ z`q8R@W`LLJY0T34cI`hcnC4$sBhvdA_@)QusD9rbQu}22No&c|?ss~;5HL8P?;x9p z23prPD|7ru&VJ=>L6%>%3;(?>21f_v6=d_cr68?oIs??Jygkf!0OzBCK>>7tt=^h| z5FQoM;m7%>tR9&Ei}~+TfW87BJ=PpN(%VP-hh0GMwHOT`{yO<*4vYp=0oKOgyTpYK z)WBn^==G#c_iv7W?_bHp0l*Of0<5el^SS$RBc6c2vHlRwNT(@iB9>%JXl3{=v&Zgh zaoR8bU(LckO99}F2Lyy*Wt|@L&(5EhbnXWZ0?>7e*p|Z<(fhM6?nsY|PrM|%WWhNE z=)lo}9||Bi(0H^d@0?2PoLtaATO9&D|SG@S2DM0@Msog1qWT5#`u(q2Hhyiq< zH7FFt7pV#Skib^F*WfLZ<`U z#qYC_L5QYsil6~=2RCYE9}fNd z7X(?--=MlXd+hncGQoSpU5^s=5~bvud%n+I0)83pIPtS((A@Mbu3KXqfAs1xRRuzF@?b&e1L_FsuJ+uD*HAr06HT_Ep~ zT&fwpnHOus&tJ>u?HJ>@BJO5*`S%TNyO);vYHrw9m!xzo`$fx4}QKIW0`h> zBgxCpXNHw{+!rxfHQYQuOF|&w8pD){6hboQjN_$1XlA%cSwN{ij@yRTc9EZui)(@B z1zHCWeQRCr^>i9QCeYT$G%A6b{o!t_YW^Dof8(6|Bg+-c*86XF@ohScpMou3WRW!Woeu;NAB#U52G<6S)Z+g% zIvYEoQLyq(pTc}^&EB7mx!I*QL76Y>%z5*vm`+~d>@z=f**BFL9Qm#!E6Tb&Tg>>N z;iI|faK(UvFk-DEkXU}I&Kj~#=Q>f0p;e~`_wK%mLIpRdD)tTyfun{tXr2}#C|k;N ze85(rJrfTeRPbGdDVg;cQ6{p%xYi!&`ZbzB6V#R6NxaBP6y=qi#iM4)g~R`HB7&h5 zTs_<#E_|AECED|3oB`1hBrP1{Eo=gRg0R2bXnR9<9ndRi6c&7@j$Rb+uthKMVVb$I zJhxma*N$M)v7gX&Z{vuyCd-}<$k~42<%|>3=6^GwS+g-IL*%A2*5woSY6FxEt?ogw zccf8uWm9r#=<>Ag^O^9F2L|bVIQuw&rKsb`PzxPbV4AD(s#~eOputTX4Vs++5F{t4 zoCXPgY*Xf59FH_HY+IiJrr5hmkq^(R6le*Iy#8=yVwlG1m2n&mPSxjEfu?OYlZ}}? zidIwp{vbw@JNr4&4H{I|lOCngS|jDZhtJCN=xz=akOG$|J72yrut}$+BbqUIdMZaf8gEg5T% z@*C}u8P2$Bws_9{nUO8{qF|}+=_u7fOxkVC9C=f3c&2D-vdDy|5(gf8Do$q%e#Tcy z2S`a`5m_mI>Ay**C_H83iI+Q*U_b<)L?I9kWFTF*v|^qJ6E zWqh!qtrKz*3t(^(ivi-}?y0_heWyuU&sPIMhq?*KQH{I|5aII3jdpI&r7CCCbtQTU z)MuxUvQK2J-E3}ag<~v{u;`pCvAdNhfJ9RTI24w`#N9ru*qf1uJ$~WsppscAW*`cc zX|V0}jOnO?t*}ORo~63f44ME(r3R!Wkbk>jqB&1MXc zdSlw=y^d*;_5A^1sdaf(C(6#qP$1%I2&X`QM;b<7&z1Zdq`rFN8|VGwA0)9ziB?N0 zhgr*3n!`5rvMG*)n}hv(i%`t+bq}DDvud8#{@$w=6dDY&_#TGBAiRRvrhX4eS3+K{73E}@cd+fyECbT09(||w4%!e zg4TN4^HYB-#U;=y=A+lrA)3!zkVY-8DNe;E|jT(KpBB_ICsU%9mbFv9Dr%i&n zqwjtU{x~;WB0aU#XZzLwERq$7YiMCJf#r^_fF4y~hw4;XAWTqB87Un{emFK1J0jU1 ze?afD)Lavh20%52FT|F~J9(G4jGcw=DDG zgI!JK+lM!{TZJOu0bcNHi&`FFkQ{#1(^W1hQ4l}g#sTv6y#ZI8gfes%~41o+)+Oi28?H2`&*ho2jS z%vQ8n?FgI@E-f!!dc3pC*Exq1y?BWyaSr*7}`ta1-|RjrZ6qOPs|$-L=88 zy1kynwaM>u@RQf-ytI#&OrH~6p|86c{|IV-_$_8%V1`cIQ9%r))xFk?pWNdAtg5zU zMEtlcc0F>CIE>_cc$O?yN)zmoA#`#xnU8(XuFhdBp=z!v!3tuxqE#Mte|W)YHeh;O ze{@>Na9&`u?d^(^`UdxpCCavGvWH@@`X(2hc_y^&KX;CVP%+Cg`%W}q2JyU9fA!f2 zQ{8!$xE_|e&1EATX>{#j#?UXe$~)(FOxugD@xg&~Cwh6&L30m>MyF4gkB~GBEM!Z=>_q*6aRAD zm_hFGqlC{Ym1`wZO*O;NLB(_zz*POL;A#-XN6jWc%E(voa_Cg)?tFL)*cC0002qP)t-s==J^W z_xF^ z&0fIhRiwE2@$3BX!T9=EO1I@alg+Ns^l`Pectq}L{z%k;M~ zBZsoz$#5l-!0etY>Djy|s^KP~)z+9j&#G%Ar{2DqQn0&=shwz$pMSZ;!*imVjLo6= zqOA5wVDit_=3sr*>X5$SnWfjAZ^Nily12?|i>Gdoe{PY>ny_Slspqxx<%{>ivgeSI z*0_x0ZjQ{9tlD^HTVenJ2jWRYK~#7Fw33C9ML`V19&`Wg9(i`OaGzs0AVrg|T5n%> zbA3)9!uL?3V2_4j@q6p7`vspYlf;b%&?oC~_=gXEwhV>F0KDjnWpY5F;n(yvY_$Uh zEx$#_YUBpIzxX-ctv~|>fG_-Jm=rKT0KO5QD`1fLKLYSK<1k2XKmhRz{2sJIK?Wp{ z0Q_J!s|_Rof6n>4Wx2te49WmbJPIiR0{Q?2Nc^k}0tr+BKH)Fj_03s%=&7p%QJ8;+Kok({1uVO3*X_N%|3lr$ z0gSn}#IwDApJ!%%a>V*!?>De4r2-OACmtOnYT?3 z%0Up6`482A`=Re>37GS(k_tyEK}jk&JP5;xYY4D-h^9Q|4r9m`&XDeKP#9d2!R+ez3XJ!{!B6Mud|nhl{I16wod&7}9s<*&3U+;q zjCV-!agG9VzHc!t0f&J<5EBr5DA4haChmroUl5Z_cFMggrBts&^(LqO!__PXg= zzZ}`X!N(80xqzEh&=Lk&HVT5jzM({s@B2ZyvR42G$_fm*Q3Gy_5s*Qm;t}x4APUpT zF}}P367b9f+#UodwE+p_JD@f|0%3XxKL-DN0dWYJ0U6Y08DAJE4TKQTT7jYd8QO6y z8er92phjtrW(OJo?8FM7fW{B)2JY_f9;gB_ge2!vMzai0ud;zCooj3W1fqYs0_^Vo z{{Hdq!Er~I11Zq!J&l$-4IEv8yntMQX*cjd0&uvS(hLgz6Xp5&dAU>@&{zTRhrX*V z;ADJyeVisOSpWoHUS4i*Z(na-qqk!#Fc(n-n)(8mfxuIyEwzB0|N8p&_C_}_KPWJk z1!Mx;Kp+Mm2JeH`ZUNv!fKWQm1H>O%1_JCs2!Q|ip45QfQ^2VkR0@cgfq-M*p#Wj< zK7+tH1?=pgegiDd2S6bM5-{6<-5bCT>NmjL2N*!%V^lLPK#oAJfKdZ38GtSXK1OZh z4Iuu!;9~_`<{Ca334=!nkbzkNFpx)>Pry`w46*_!pUbm1AfJF|EFcWP&kR<^8vq04 z2u%fO4~haP>!tPvU;sNeU@CybUl4%8_nPpsfb?hqyEkAifY@I-o&>(XZwRkfK&lqt zyJra?4-kNXP>9}&0yG*>o`}vBVDVRur*uUcgike2Q1T=9OaX-14_JX*A!;-lX*wV4 z?cfCjnr8@r?EFWo8K^kQLs8iN{lS`>7~RZ*78Ha9un>TKg|^mt{}wR z0}KFjK2J`XjJ@KG@DmC2{YT%n-&*f)w<@p>pg0C_f83p(Uen?agfIZ^UFayl z7$ArL%df!PgMd+i0SNB^HVF80PMiL47OPu09L{8fpr5c z=On_r$tVCwO{)NIXaMIjs3{46$Ue~k=Z^pe-dmBXNCQBkxCSfW7JyYj6d)b|IxPsT z*Nxi%MF{~&oUaw^2fI@N3;!!61Aqj{Yt=Y^)^!*KObGy~X53KlPNEY303cUpO!djWZl7@6MzYIJC#6j{ zeocXvb_OGRTz>{YKmZ6?YSREC)YzF?tFZQ5|24qwNT>TnP@YMpO08=ztxKik310&J zl|KRq0r*3$REX7IOF7i~t9UymU>F91AUM~DKi<@qYipmtJ%F7y>+QqlKJD(~_BQYD zfkR9@dgRhGpB_5()GNepV6@y1lYmEy$!CmSF@WJR`#tURSPP$xYxH|F@0+=S-_P;i f`NgMa_89*I06|N`hy})v00000NkvXXu0mjfsJ}<{ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-smash-balloon-youtube-feeds.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-smash-balloon-youtube-feeds.png new file mode 100755 index 0000000000000000000000000000000000000000..1b20fc628b056fce313c40167f302dde327d9b27 GIT binary patch literal 1371 zcmV-h1*H0kP)T(C(X`=yrSJRb28;R^B{B@HRirEcki=00jFt;AA7rS zoT3sWTOPIb-6mC&{`e)eMJ!u1!Fj?0a#51AG#w+0yE99qcxSn+ezsUF#t35{|0!X- zbLDf*;TXYRja43`2fL#9g+gbY>Noiz1jn-Wn&oGX`~BW3gD&Ht5FQ_%PYQX-9yxlk z|6)|!jdO$-G~mtkbF5EADgS9S;1BXh zhm@nH0H*RtiG1eFNiO$CQsmria4V0r$emLlSN|P}k#pwYn*u{DP`YM8vef|80y1G% zQUyS6AnzR`pn=|?eB#y-SXTmu)?jBBI6#Gov>m>N0p@w!6IOkx6q3;Ct zIY@3GnFR$GPzsE!ZKxlEa_(FN^n)ND*;T%4=*OUZYFq>r^vl4$2xtv<76E{s4CHlz zEquWc3Aiss^ahqjpx_EUHiA?^Uk38t*@x%{p}a1jp)Z5-UrQsrPG7C?hXxA-0^Cc$ z^ds<1gWG^w;1&h?8iZ?CqXY%|GAR88AVLC!)1chB1?UZ~3am9ai6=l{Al(}x3x-%= z3;h|$VJ88g6*z#0!6y8k%pzbJgyAZ<08`*$Fv>R}HiiBIPz#7W^j~RG1+AzB#2|12 zxq^1o0wN2NfWLsL1;jMywm4PbVSoaj1{MMT1dtB_z6$uwWT2omwLoWs@(%?}Eg1gdrrHvu$= zn*cJ1n*frnOHE{%P0DKK( zNP!G4=|2HnfR~ug0=d6Hy#Vb7J_2bcfocJI4}uIPFoUo3IRw*=cXs4FOad8P#ZcZa zxD*(?biKDEg9zXPw9zGj?bIK;wQjRpf7{6F9Fl-6b-#W`D{PR6`1G(;Bl7hFA@Rcd7O{l zz%KAz0|{3JEN4n-XnUq~pr9{<^3i#&n0^|R_x%chY4xO$H~<-z9hqfIL~kI6y$hH& z&ljw9Uj{pFd&Yzi`?ZL=7uVQ3F?lDdFz!BtVvmmL*eyKuyj&L z^%bp7X8^4<==Vz1KhLO>`pny|xEm+d@^%T%((_x%mPH}uLHQwNQB-dx8#3pM$=sl} zIKvqmBa_c>WxD`>SiPR@^5tyIUfUZ{+a$sUuUr$($l(0{_TYd90001Cko{BJ;{yf& d000005OcY21)4O*ec}KB002ovPDHLkV1nhMUi$z5 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-trustpulse.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/plugin-trustpulse.png new file mode 100755 index 0000000000000000000000000000000000000000..cb762d636516a1b595fb80fbe36fc39bb055363f GIT binary patch literal 1281 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 bocx(zo>&3v;DR+w00000NkvXXu0mjfM?2`6 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/sugar-calendar.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/sugar-calendar.png new file mode 100755 index 0000000000000000000000000000000000000000..6d0ae54174bfe1d1526c3b2e089c569a6135e29e GIT binary patch literal 1696 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%0A~(8DIc=SQ$SuFIocgxZ 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/about/wp-simple-pay.png b/wp-content/plugins/wp-mail-smtp/assets/images/about/wp-simple-pay.png new file mode 100755 index 0000000000000000000000000000000000000000..b752526051a17cfa1663a988a7ba86d976eadca7 GIT binary patch literal 2851 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 z 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/screenshot-02.png b/wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/screenshot-02.png new file mode 100755 index 0000000000000000000000000000000000000000..72346b890944a5afab10584b1449a81798ee9843 GIT binary patch literal 72699 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%0AQQ#6Wf@P2RcJuDW(p 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�c;-Rz!*j*qHbqNkSw*7djJ;Vm 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/thumbnail-02.png b/wp-content/plugins/wp-mail-smtp/assets/images/additional-connections/thumbnail-02.png new file mode 100755 index 0000000000000000000000000000000000000000..96caf312d381110ba47a14ac8aeede50c5c7884a GIT binary patch literal 13505 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 APXGV_ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/error-icon.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/error-icon.svg new file mode 100755 index 00000000..12fe2e93 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/error-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/delivered.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/delivered.svg new file mode 100755 index 00000000..54970493 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/delivered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/sent.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/sent.svg new file mode 100755 index 00000000..af291253 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/sent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/total.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/total.svg new file mode 100755 index 00000000..ff843f1f --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/total.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/unsent.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/unsent.svg new file mode 100755 index 00000000..aaa1d5a9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/smtp/unsent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/delivered.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/delivered.svg new file mode 100755 index 00000000..ab90d5dc --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/delivered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/sent.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/sent.svg new file mode 100755 index 00000000..af291253 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/sent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/total.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/total.svg new file mode 100755 index 00000000..b4bc0912 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/total.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/unsent.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/unsent.svg new file mode 100755 index 00000000..aaa1d5a9 --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/wp/unsent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/yes-green.svg b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/yes-green.svg new file mode 100755 index 00000000..57f1302c --- /dev/null +++ b/wp-content/plugins/wp-mail-smtp/assets/images/dash-widget/yes-green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-01.png b/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-01.png new file mode 100755 index 0000000000000000000000000000000000000000..4a878e971950d08a39c0a2d72189d342b40d1634 GIT binary patch literal 77117 zcmce-WmKHc(l0tmkl?`~SOUQz_z)n3Bv^nDAOyDo0zn3Mx8M@oEx0q-;4-)qd|=Sv zGC*+W4EgW7-~E2LXPtG|dGCB+J#=?fSN*EGs=E7mf)zhW<6%F=1^@tfG9M&90{~bM z007hX@gr1=6;CA$0C;$#`05yF{a%+1h zIqfHxOU)|s#QS@&eco_n9ejLpx_54OaAfqWsr464y*GZ1CH=pLe~lg=pKNY!t*>t& z*7quFYJ2+!U;8vHudIeuPiVw;>gnnt<`+A=dW^s}we?L4i%UsKNu`h~go2Votc>e||Na!LztDbX+h=}c$WNn{Z7K#!Og(f^jlhAHMG8JXcn#iKAUKeiwzy=_iH*UT`vTj87S@0GQZwr0140&am<-`xG@y6d(J;#{DbW7JbX0GX}&&f@Q3lrK;v9P%}h#4aCUiMZBh?e`9ldr=ij1+FE5qRG+H)!OL^-4zK-52NC-6!TSby?^{qyk?q;6z|BkCoz$$r0Z+$k_P(e ztA})Gz|j;#2oF3cC}?wt2TlQ&kdQcDzkLR8UjhiCUDyMKpCv60QUBhbHii%q5{@R= z3BxCTa+kWZ39!tG>mI)0q9j~%`iE>S6%Xj}p+&idko!=>3`?qbcAnPjgZxnWx`rT)#Kk7_b*2J}DV~KpCyr0*e@SEQdD3X5pWyXfcFBuy8ol2!NzYD|=LRilzi<&IK1_;M^5f?rzD(VL)z|73T zNJ)LYvMDGFN!AGS$@wGw`GU;Obw_GZ3whc88bwc+xkZ(jq+^=TnQUg?xUCPCw0 zm>ulcfEU`Uq6nr|a_TuQLCHsS!p~3&?w}O>%_A#rWn^s2wboEc|JKZ2xR@HR?Nyl3 zYE<{#(40lqTjn@ek7HbHzP)Ca_4yX7lG?&9fXl^5=k^c-Uitl|E6-$AIqM$G=lOo} z{7fIUC*+Cn%E$|Y*S3`&=^YkEOabj4_rL;N(6iVy=Zy2Je;m` z3Y0OZP?px|r2uctcv`PvRCvFbOqM5$)F9xC7!&TFbQFevsib=12wPwNYV2d_I#LE> z!VfxiQV7BDB=}1zg9SZmxLD_D#VfTnVh6?L^z_r9X{9dA%#T3>(qA1nf8^T6^T{1Tn8;Zo=#5?%Ctc!+tB%``~k?IH9@zy0vrW$41<9#g@=&Hu3zbtHeyL!cgv6a@3Jzu z-3+x$d5&K=2lcXBaekUt_ElMQ2ygU(r=Tz{RM;-Y`v(*)h1E;2_l4*k|72+r6U`X^ z)=RjpnsAI*T)+80zMMP`V_JTsaaj7%^6dMlv|5!Z8MV~Q*FTa2snN9ZjMkYr8gpu2 zaWT$hYxr9H*3pIczkzT2UMT+)I6^7>kkwNGPrj&5&8m8iX%u5-GYAjO$>{sMb`iCP zbpCPEVQ&ZBuiHU~*K|~%{|r6HerY077F4*8xOX#d$sd0}8{;&5YQXE< z`#{)ir)*#q|Bdg<$mgK2Cy$#Fy+eax(!CQnBv1P+lcUi{em(njgbU3fZgOAbdeGK} z1%zP$aOa-*S=c%PDKYNG01S5`eq&9z@iQjfk5lexN_CWA;7t4j07V7;ZQ_AXdBx+jV`?yBbp~j$ zh8!9J0K%pdoZl=zI&vl!-V%fx_f;9qYOcAMGGhZ6oRYf+u=X3m#(&AT!l0rY5?U(h zca{-VE=nYT?pC;VbqjPdvx${r=_Wwu)XM&U-djbRt0( zVjKpd@RbIe3}FXiiifQuXf8+j$m2NV3&2^*sL6h-L@Afv#`Npg>9@CcA483^qKHwo zaGUdrA99Up49GF9UTLw%4rMd{{zV~=voPu#c@cSYAQ|aNq~!B0U42+QbMa?t&fmXn zdy0As6qGm+1LsPHE^Dcb%?@ z`WO4hM>DK2#y*z+EFNr*eHi4=!gxWlOq_B^9bW6lDFTV?-~5PG5!c)*=M1s=07Qur zj1uJvI!(J?`x>0pP3$k{uNq@G`2tgjEUO|jfEnJTLbk&oYDP#4E%Awx+CUeqXe@h}TTiui}lq!v*2&gOw*Oetu=O`p#Nh#F*R_Z~yL zgkmkxwVuDy$~zS)c}-VD;)F&Of(HOB(Q&_o>w1Ek*Ut*)FBs8R?6UGnipqAGWRxwU z)wT3FHk0AiMET<^ui??3bWSm~j2dMoHFQd52kgJSQyJmklbxdiBMw)!!K@EZ7Wx{7 z1GQ2z6y3Pqfzz^5WDpx=Te`>_rTkkNHwXs4$q0Qo- z{7u$Kq>LpkhR3MD7jf=i_AtLV_98zsVqm7+a2|xc`U@~Am`b!qh#+5j6-W{`5^S8M zQY9b#lmpIRe}Z4pl|>pOo(-hTRc3BKz|XtKyZOARMmBM0Tw~4h%nkH|CQ2 zB~?baZ$L^?Qx8%KwstKn{_#;OM2r|r>5Fm=kfszGB0zME!JZU>iB0B|?zGGlnlm-k z_k#zSjDYF|UT8xUJx#yD4;=09wa4Vm4mD!G#}B(a!rn0dZC z+pkm#l^jru?Er+R<;!aPVfEw9!eGsbP5FsU?MQ1w9DokCNKp&k6-;B@VO2vnnM|hx)*nYJcxS)EOsn zwku)rFNe$Zdq26n5{3^>x9>=xq-8QRfgl->JBXP1rjef7Zr55ce~X=A23+4lzqCDD{ec?maZhcA-VOtfr#W_Lrg2j0}P zXR$I~JOjQxr-r*#z~9A?%u7CE{6jXgZz57PUnWsmz9IvrJUacXe~c0696q6d0d zy%!d7y{Nt;OLNZy01GRJk?8d^s#UIkFjBU~+_G(%ndd=*b>sJnW)1Twm%@fOF$w^Zh@ zWb#uHLmhoU_rZy=E*s4^P>KuHH}15VYi4dM+>euLnZpSn8CXdknBns7t#)Cigo0VoH_7*7PrxY7kz(*}deaFd9B{}2+SAr{ zAnW1{m_;n#idhMQcRVDFi$&rKo z=wG}<;JVlYy$FO|EHf!FxO633vP`ni(SFR8bK{tq+QQ4~*GQAnguEP`pb>q;04RH$ zcBl9N2Ev(IsM6I$nBQkHKraoLL4Qk5x?;~Wqqk9N?0B=z_$Bd4s{gXOdYNgqnWjq3 zOi@bZ0BGFp5w74fvwVz{DPTr6$t0xhc$-%8AEiX#FTWej*^mhjD2sk6uP|Uwu@l9J zaMaT$*dAkYWqO)-1CbfD^c{L7w!_I=A}f2MSfi>5Nn#So`Jz%Axx{3LhuSXz04{#W zT!;g^k#wO-tk0Lh*At1dYoA9X_G#9{8GDxN*MZEZ;y-Tdl^4ZMdLO@b_0}t$MocQZ zdT&gpln>6hH++K%3rUC=RUP zqnqv?hvr8!F)H>JIio*?pDNDv--wb9qW>Lp3R5MS%dF&&)Xe6&0-Bp_4-{({p1w&A zeo9jx?J4;X#mBqU5BZi`N2sLJGDkySIWBLgtZcni*CRnQpNOiz0)&5`f&ox`s5vZb zEwh6RzFPe=gcBclG9*}Uon+GZM)$t>0>IxvPSD2_^56lydE%VuK}F?a1HJN+JGeR2 zSjHdkSwI{h4(NQ*HWhfeJSw?UipTqEYEENpP^ua-C(gu|f8~Y3PCr>sf3By-#~cG; zZg?u=fV-dFZYqMN|52F$n&8_QWx603Z#?>t>g=7h71lj#C@z%Fw=vdq&$v(5jZ4{~ zLY@TGx+Lg!wx29T(PPu3r`;gC_W(T~9G(4g+Pn75YLjVrgW{0OzR%fjX;W`h`*D`U z!(^uF2`2l3QF?!-92)WbH;el>2cMcI)(r{|T;843H|8_WFSv_xDbRws!X!gP`3-i? ztSl!#)BIhtZ84aLsEW+&_{Qeob@LmMnz`VLrJ#G^mJ0olF|s_ni|$vByh^@3~^>-<==TA7wMxRx=&?j;=1};&nLgU)-z9_E?2rQjJ=0W zHuY|AWsLreesGmju+loy#3{Y^a;kmG(xR$!3Mj_{6;@9*Mmjze2YNtRL#s2YE94G?=?Bv9lZ9)zUnuR^&TDJeHgDdapHhtqWq$U?r&L4I8 zB2L~iO~QN&NsNl9Jl(A86YhZ2gSt)3_E=;q;J<%u%XLlBW%~mMx=L$ zZ?knO^$ud>4Bo5GBRw`Ciq(2&Y$pCjG|4lmKhZ*SeuejlI=^qfbba_VF2fKnxF&i- zz(}Qk4a2il;6_r}u{yaL$$!d1{MW5tzmEsWc{0uZaVu4~pEpq3(5&6CP4qWrv)yW_ zdKs9qFw1_~H6?Sc96QXBFyJB^{fr?iG;=P`_H`_HyyZi^q@J*e=F@~}`~<{X+Y*T| zHQK1wD#DkqfA=9O2YKaVOp3LIxMjde>tsrA6y6Ahd^vd|2G2?xeV@1{%gB{~2u1#J zL22qe2y^_}>HhSObE*0<&Y;&;+6Y5w@x%P)DD4Vn)`f4 zMA8+bho>S_hEQZiBM};+Y(Zv~%aQnwFDB*FE)hzKx9cD`^UhR~N1}ogD+V}$W=$k~ zg3xS=b8u%<4#|~c!FwJj&q$qVI6R|Ti38qpc)<-fxTvu(9q=8(seMHa9z&gXYd(XW zwx5bF{+_qxfT^x)r{t$<5S-BOrKrj94Q{roNzDzjNal%;){LtKKM;g|@I*KkJ;7viSDTuiN3`o&OA zp^AcG2S-KG1K%cF@S6%frlQ#>auRKu!%5qDU0N_EuP5J8gpOcwoBU#07tx-2f4Oqryl<&V}oU5B9Jfv``-iQl8Iu&+NbFl7D!<+Rtv`w4CBj`_6MBz21@LlB|bggK!(<0YoBU$C$x{@nAB`x35TVkZShrBqJxSe(J2psI4_`?R76h6pt0x-j}JTdU6)w0NMWDC?9E7S}{f`wo#+ zba~az8gEOD!GKi^sEA5#5_r1n`w?cGZ5Z{+95(dV{@8Dx} z(6|lp8;Lk&70uQ1%2FXDOe%Te;mq@Ox(mQFRc#2(R?SbkQ!;^5RbDi$GxLqNU-wHr z7ArtUR7R|V?n4lJX{k_DI9k}Mg;Ka^)_9PEJ%>)ob5EH(_q#BkdgiAd)BMOoB`-O+4^Y8tr;)KONTwVWjYhJkdZ;F-mlCVha7}#@KH$j|UWC{B}z%6Cxj+ zPFp+<4Z;Dc?9fr&ef&6CJ71s=%VWloADM!b;&Yt2o~od-GYcC$`6oMc-jx&FFKX7z zvb{T?Q9K#nXxY6&r6kt9lEjiiM6)wcnpl81L1fM94AiuoOc#5K5shy-UKs>7%$McP z>$fh7g$8>4TJ}0tOxCeiER{Zy(wIogs3{kle8XK6aC4|x)1ZAyCV8SNKRanALaA8G z(3ej`D~~!G3BiFb-GCA_Mwj_79F;?2wC$~}J)WiPB5C@>!A~vkOPqrV+31eW0X?u| zvrp0opJ-$u6&Si_CrRdb!en0>jDEd;0X! zR2bPc^=cxSsGdjRrmkBEXvaZ#j^loGGwRT|iJ-ZYU#k*tLzmv23tjG>%hC+1%%^vJ z$Cb<}Ysq{TvZMFjbpVcg(JIGfSLu=D#-2ca__)l!0fcod zt>8H;DxCF}y%2evoY7ou?fFLgN6nGTX0Aue6I93Rw=#~0JKr|v1s-o?7azeVCrxPa zn;P?oQRZm#i~TC-llom(bvYO{bje4yGW*$MUM574Hmcs~{rRF1$G7j>KCK^N%uiH* zeQXZJP|Rqn8B!$SDeC{#FVXGVA74tR7$9xmm);oFMg%{>cnEmBF8TbqW>nNV-q(Pi zZ{HVvXnW*t(^VFN4mh6&#?NM)Ie4zWj#v@Z+i(y=0p>N+t$Bs29t$l{`#RJ$JL*;) zl^06?uHBfqyx0d`r2eybRoHvgyP_!I~FoNRc!7Bd5NJaMZ;4%WJ2g(tgRjwzvB z|6Du}2U<|*(#ZzHXo5F-F-YsPM67Tm1+g5-p@U{p;dtqzn zx%2hR$wK7=zO$#?pa#u%+`#3*{^TeVc5`{g7kY__Ew8Q1FU!wj2I_3CXAY7AUV_#3N z7E*qeEiZ-{2e=s5WR?><9R_N^M}GyF8jR##5wAtKo-WErWC3v>O!d=>{`KLDEXSUk}?h# zB{5*Gvk|oOs64Bp#GbR_p%vVg5xyGs-n=}xrob^?z0TGf53j8q*H(!y4opC1ud(T30gLI)f3sZ}{np2Wnl6kxCHXUZ0G~HF z#;2-4T*zRKLK}hh8f6Wq``qD|eE00;I;LSvQuND-U5XQ>{hmqfr{Tt$ zPy5z8a`+Zf-`3KUnBxbU+BzreFj7c1&V^lM?ahp)*B{q)-fzkTm+NKS*x=nmXW5Kq z?PH+AX3h5DTYh+moVH{Q0{r=9A!w(7=bf!N4d0V3PuyH2R_UuVm?~7RuOQ-H2us*e zk^r1YK;eel+majWx#o>IMBY?C$-!!E%94$8o(PttMhk)O(D6`1Z+$psYlk&;iu8#wO{c{wL|NB8$}tb+p(|W0^*INL}9L;{uViT zO}bojM5uV+o#IRmHj0rmr2|W^bb+d7sL8&l7)=h1>cp?P;Ercmuv%1n+<-|17l&~j zq2}?Xay|R?;6@qJ+|W7gD}R2{^3~I{^qCRT`JBR$HpYa3yUIMYJ_a)>%IfBB~jF5_mplot2DD~;R8TkQMad?H2fUf{#xmRMjMJMUt4|O`t+W{0n1;&T3RH2{ zJxO9{Z_(dJ6`f13M)21m(MR&H&-~=EWz+}gnah0dY#>4o4#jGAp><_6oH!zMJfuXf zAFs?eV?c6E!T_mtdwv?$sKFOGjgehDGRs}RK`HWXcVZ8}bx87(-_==T`w z@mYD(0B@yhARPaKwOPYzZ8!H~804m>b(GKiX1eEkd5_yHfp6OmJ4OzIK7f2ap>MG@ zv5f{eXg#j9(&F?GUTr`cU5dCY40n`Q)HOw%)_c`d1@j3<& zOY@Rc$HVIlpnWuN0ZL2cOKC0-I`7B%n&pZ^cTRA7mt&EyjBo+#Mi|=M4-#djFR|&_76)H zqP9_~6nJ^$NY&Xjvr_k&QZHQx?atY`p6*MrUj`R}(i>kq@5Aj8bM_-o>bkz_O5QXy z^Z5B~Stm-PDi4SbeoV?azuc8x6mE=Ei78%anISXM-hr%7Ueo@eH_dCV&5D>$4Z>kLab(jE z+D=`ExMEA-m)V-I0&+}q-ZGMF6EwPbKQq`8o2=0e$b5RSX2lQmh$U3=2q%;!M%Tjc z=7*$$!Y2cQr*U|PRH4Ax{0dC9Nxb;Q!*m_5t4$Ut1oaZj_P((%-ub}7%+ZHWeh(7W z8h)SZnyR%#m~$wpKh?+5@nIzCug4aA$NrV|+LzEy)~C*w?yb-HgX5qmUy|U5oUDZf z@xN!qr>d`e)5}+XLPw#~06JZ1S-w4xNzCRvi?9ktn!x{+WK2@KO6M&-$f@ zx3t$sY^`t_+{b54IT?~R3rJ;T_x#0NlARcuN-)N64hFE^B69>m$SD_R zxy5t)7GparZBq^@AGJZzkJruZr`up(weei#+Fa$UF&hW*A0L(L$D*UWBAXtxquzUy zT#3oYrZTMPXi-MiK`QvOd80nOaE%}cZUGD!x=kGQhyYqv@UnKF=;IQ%*Xn)-ji1aE zL}~@2!1%yax#Dy7c-Ww`s|;crDBx709Y?Z zSK&-R0ADVx6OFzjJF2kWd}qNelx;LvzIFL1a`k*Fh$!p&sNML;JBx-~#fcoaavPN= z>qa$1`PMDSA;aF(EIfYpoQlm&hKC5)NGUz5{@U~ob8YFyNYq=9-Ypm zbQT-Zp0T5|$;WM)X+IsBd9m0zE~BDp$XC)wePS{}7=c5@$-ODQF@Qs5gDca)xqTIJ!lUoV5zLrtEM;x%Az}R$mP}fR2!D5~h4~JV zK+pCR4s|CmsW|$$tD1X%8$V&9;NzXv=6w=-)-SAIW%=HZ+r>%wu;$@( zL#4=jP!Nx)G@iQKA{(b^XM)7r^LWbnvzBmQGp;ZBher-sC$X$(BiPToX|V-i&2`pD z=&bZaYO&*Qw~84!Bpzj%89$kH7@Cl!&v$tDrBqZIJj3 zF)ZvLb%OIHI9DE&ab2TVXyfBLIh$U_O9dV{{K<)1TMY}~0}Pu_q;51rSlv9+wAc%j zs&f^c1SD&!7?4Qq8<3|ynp1^qIz&`7WtFuv^5f^pjpZjM_!2O=lxMpBq%Is_Qk7eG zy@*`5WhmgJvRz92XWUu-%oW6j2q;c|HOA7g!=57`{IPM7zP)=(xImd)i$3bZ;Owij z%L<%U=LgkuOWqI}3HcaxY7C+8?Rk~&GZ(s4gU7x*3U3a6WXRV|uWvtH0z7%*h!YKg zZMS3RE;rz)1?3i&C>UjLee7nwmBsfBc*+3lJu<&4{`IT?M3mRNlI!^n>4g4{ViNhm&N*>q$-sD$9K-!z1dQW zsF&xILL)r35(9|Hoel5 ze{*7Ei9~qj35&y|+M$v!#woF=7|tS}4){QjyLcwBxx;qH1rYuVFxj}7N$E2R>uk?X zYwu&C3TxT-#Sg3P!=tvd1PS#!@|4H=ok03~1Z5`lItV+pnP(?^NsRvChh$Cs<)n2& zEZ{dyw!TTqqy>rtZ|s0i+0`hrLdkgaI~>$p68F6c{fZd29Q$?Op7h#Q)Ip-M4|In) z@ThR87)L@sl3{C!k^lL;zeBM0 zjhQGIjYkgN3vZX7dDbm8QBsA6Pv(Oy)vkKb4bAeE{9gL@>+*JEMUusnscwqYi@~A3$gTFYFWw!U{-wvXqjdc94+wxm@PXlma;vUr@vQIF zc}nAUU$oQ?gCK+#AK<+!oEy|B9+2(5+5!mH_NAG}mSa29x%cZjUkQ#UK;KfiR3f0i z8`_BK-zA>ZF4gGLR&GV$(^1_lORD+=n`%p4hzx4Y{@p?B>uMBRv22qc#N!Vr+Uj|? zIG4cmc<@X$WJ}kbzTJ3V=`g<3BeIe4q;7~1 zy1%DT`9^s28-{Nd-zyGq6FGDgpXJ>z`0lTeaT$Gf%g0o7)D#nQ3}AR<>yQrP<>br@ zx{epJbt7+|w3I>WAWD+>{z%=s0CN)YJF#gT?3DL%dDIx3+Y!YQKX9l9ilj1)KEvBG zr4uw}gE&#e!8&$|j_cb2yr7jwob2X0@1^|1Psx$~7S)vzCwR#nv31|fy>wl*2;9!7 zG1?u2S81Qt4v$a4niz=)4iqDCONC#85q|B)BTOaOr@oKmEO*}h`t{PG+=6nD5U7O~ zwQQIn>ZlC|V)}=#coP*ZM8KmFuD^($PNejbjj2e$a|#RT1KZ;6~V#dB*iAvV-7 zaw4EgbeKF2)haps=Xg&MQLuzTIz*#vvHp*SQeptpj&+F~<{rVEqCQ<(mn-}O+)GR?lS>Y%&+Ofdn!LJW?Z@+rc#oZjJ=0~v)Td|4{MSl16C5CG!;UU%JH9|kkg zFj+fWPhs#ZX;>!e$udnP5dLb0O?4*(p;cW1R5 z%fH1hXVxFs-FhJ+=asxoi{E$c?h;+;=}2}$b@F?(@^kUB3cI;lJ~pBrdiE?85OvLQ zY08!|D6hvIA{F!vwemJTu`!OAvxzSO-SV-ue1v0-a$M^U@(V%veYzc9w){N$>?|3A z-@{#KS}weL*L>~ZyiM;af*`@LtTa}A21iMD3nCPd^gQD5thcz~d32^xnY;v9eY{kn zsnVsE*eTdom9F{-j7B8a^&h7s7jTR@UiIR$siC-iDx+jJ1!3h#dCF~%?DRrne+#+p zs`be?1u~ck*XLJ5?yJWg-yvH;kO$J7TQA3uC+}M7MK$1#9$kg!vlv$>F?$x1+B7kW z;9UM3;yl=6t*8iHF2E`FryXPK(w$PDVTg@%*;npyN|psY0*lIMHkvGq302#_Zw0B~xA?0TwFtmWi(TKqi;Cod|*F2B)=)enMbZ$WqkV;;)=$fe+)~b2KzQ z6{=6?;k=TEn-D(Yc@2G3Z!>S5ThJbNMAX~_rk~y%mMb`XP5ROpH?qRL}R(eG7nF7i9tvo zs49H*cOruJjAXgFzHUi_`21-!n?+PH z9eAvlWWTJDBEdHt#6bS2sHpCHY9ILn|Gbwe{_GJI5cK=BJ*bzsjq5eJr$3qa zw7J_&#O+jf360{6UJrT*6A4s=AjI=wEeUWbc6ZS09N?f~ZiSvbI6mT%V8U0>sBbnRd#a!!594WcVj)p({QHXMRVYVVRE_Z!D zh4lGNy(!SKqNc8uKtsvC2?M?4pw zNM8|BWl9-*GySR!XSr}uSC?wvYL^P0NJV$znz&ZI%gz_PoYsY*nQ?&I>Kqly4D^H_ zv)fWWPH8;tm(o=dK8&ka9@JJ*qjDN2?VgZt_-t@R@-mebN7lfq5%ANph~Us$OE zOxT=w2TQ(>2PdTE1P-mukA5EAUl5JI+HxQ4MGZ5$8C2X zD(L<4ow;S1vc0<*eDWb*rCbaCzJ@gXih&*sX>3bBX1x!0b?6G|ZC+stnEj_K`3GVf zJ3f^jcLFaS>f*&BJJb%WR-oqI>^S%!`DPH2wqsTv8a|zvD zk62~QRQ%$)y{0BQfVu5(A=NjX_B{Z>JPIurH!Jy$9LL3rtv+6KRxm0o1Vs#TPRSA* zow%Sq(I5s2y5Be6acx9?m<#Z7AvmI91K)4i?(N+QFMV`>`S<-p{4LVMfWcUknPFLNKDKFOuJ|3vqH^r5r^bu*jV zfRCU$-<_+#>)?KZ_D-WNk@Z1$N#_muTAR<)XPG$0?^Pk^J;Z=lX4Lr5ByH3^Sj^ya z)LC5!qZ~>){`+&$HPn^z+xo9*qQVrYTd<{quh^(>k&RWe{?#LdI^0(Lgc=X0%s6?KQkl2D@0hz(HWNTR#{aM|E5m3Ht$KrA216fF0rg8f*i4% z{-DN~FhspoNPc=hcT}ViZh!1T^kF^_<;7KX%$qEl^|&Qqy|3Zx9Py zeKeNSuGEH;w(A7FcR6m;_6noTkLQ)`xqcs2ok?dk207M5%p-qm;}n}Wy)oKSC|el*5^Qt+PF`!kaH&|jh( z^^Xt-=jNhs=pB*kPk3m4?5GovsV@F|%J*kEP6&OiVd}YE1s*L6&XVD+^ei{Rf94(e z<83bb`H|LwBQ+*YvD<$LGuDWNXsDOV{4>eDC?hk&MY^{XOf8+9ej1(%?%Gi*;UNm2A;W~^b z5BjSuYGO1O5Y>+pL)w&d8*$=)^LXGHU}0CV#_#FnIamWuPPhJ#J{S$WTU@^5Vh2*x zWey&x`-$~$S(a|cVcNxxJd+h$Jc9f_|Aq^02Zss}APv;b=8q$(lH2}`>~0%yQo7N$ zsPKNg_rJ$;;e&7Hh~_8rbSTYd%Aq?yw*)Os9{w9iUH5>}3`5Z(OV13Nh+>5v=+)dW zz`r2^EfO`0L3FyIHyg7tZ!GJ6KKQqMZMOoG+J=plg(8ku<5LyLc09cQ0^*bs%5}P@ zUSq+6+i~!G-u^+pTw7?*uL`$0*ix5Y+k=_xgkSQHMIx09T^~K4Ui#^zJ`i5`Eb1zW z!uEK}Bfz`6X|wI!Whvi?<4>cg$;q;Xulw+(Rh)(By^2h{Upnudi0u=8&3{J*l=ecA zBd#S?Z2bLZYGPJZWC4f>^-HOOsRwmWu^>CVy}_EtHVB#{+286vv1K9kvJ zjQ$soa)}Ob%34o$;kwn2JYh=&Fs;MlwWZ;^GlF?Wd%<^3So89!7vD>zsi2CMRVP`v z`p_$f!-KO*ySnh&9FEPFpN-%5nEp<OTBSBpbs%O`vrTQeLi`NXpZV{8#6E=P z%aMHiO*;89NdV&3;GM{SbuLmu3Fg$tv-)?+mVv{y2Je`|_J|r%{tf_(r54}$Z4lI! zQlbQ74*7RSlU}gy?{2nGm0@ctoCfB9tL>|nwSik}(?W_PY;%tk+Px|;VkloA!cnKg zLa4)nV{=6MUbVkqZlv3DPcVb60uiqkL(tQn-6Q9FKZ*4%e##|*u4i4Taa}k%=f6Pp z-78W^(_g_tTy1Fa%ys*Idh~CkxH}vP$CWp5HF|Bn4%8e}$_ffV4hhD|LV?m^id5f&G& zq|7%B75!!^1Uv4<{0#*EW#*g~eX1U%D#5GEC*=fcf1vf3l>1lChIpoRoVk1A@Ba-~ zVJlJdk414qBI&EvX`6e7|BJH!j%uoF-hg40E`kWsn}YPF(!tP_A_#~`mnI@D^b#O| zbVQm`r8nsmZAv~-8d{|f5V!Oe2Xk9jvuv|p_~K|Mk@lW zJO2E2&uIIKe|Yb?Q_vr9=x_t{po_Jfg(sykD*_)-0w@ii%$o9j3bKco- z2ZK$95$>hWfJ>vdkBqY8C+-7{Qb@fXL70r}i?#IZRcpX&D=2x;?Ms6n4hd`dfTSVr zbCMK**d32^sPCa`{igNV&Z!rcqi}q0&EL-KXwGEZ%tq9M1x^j4gRWSER)MBClk z&)Dt6GFt8mV3mAn;m(G^y+H57i*r~5LZGfxOW&SyE&a|VV!S_DkdgeNx4+#Tm}S)E zEv|d&%Uh2M%Y>336b2B%C|1_@?V`TTfi~6P`UJ!D^U+r(*<9uC);ms0QB4B?v~EfnNC%MQ+?@XT%3s&{=a3~z_!upnKVwjPgPGVf{6bL z@NiQqH_vpCi=qvx|AsF~29%+N4^&gf}%)xb1Le*u1H~!8fB6s*! zb9SSRp*`;kGyh-c0ZgL8Hv0CqGVJ_<4q`H{o-A95FsTkrCW7k^HoOGh{fs106(G;m zAXoT#ZOHlBcRH?vkZAk`LbGS@6h6QQFGP6lj%@E6iicS~L~{%n1)~%Pe0R9Jt5aru|t>JfjL$@lS zhsBhR#xn*Go3hiF@BadGyLAb?vBX+on(1~ZcQ2IKRW}QI+tp-zzMMRv!H=F|{wN+-u>e##$>zNACa=AiaaGyQO$H>=hjKAUqY7d6w?L}i zP$rH8n~$i+?ICsUEEy3faXOgkUvZ^ifW0BQslv=0BCNBKE+yUP9`0G^_s6>G=IB8o zDQarj0WMBaQ|!L{)|Ft_{@R};y)XPp$+CIK#vtlzR%P1&hEvZC6_Na{W%J%3+3HLC zX)#gY%`wg|o9UR;i1fdeG-6+1F~PHIlrn4YF!i~q01_ybH2(`q2K&WN%#Q0u3&f&U zy5(oU_useOdZTE*mVIuM?G&J9khjZ?h*-e)xSmJm`O*HdR&Zeb*IcpAFoj?B=gs`< zefy0HhoR!rGP6XQmVx^shB&L^C&D6Jhi#G{!Yi-bl!9#XR~RtvijpL ziUk{1I#EO26jB=Y4g*>Bt9v@A2};mmazbidUTB;FD4M#u_rpy@-9kV{KCMaDjH_{s zf5tUK8kIH?w?ftcR=|1$0UM5UPpy>XaT%H+x$7foDT7=L2suy&cIshp zNv5Xgu-2%rtU-pDTrnT8RjaFnA$D6j;;sJJqFp0vfIh+6YM$CzpQ^3n6ozb*{Nv{f zRwi{R13_W1GbO1*M*+f~N&B8FLtYI37 z%(sL)e=a(BoYSWe5*wPq%1+o*d*xFU8i0`PFAok)J;~R94HdOGf(8(eu{V^n{mo4R z=}EIwl~>ydE0)}qvdPUnN&9=Ip0}^`+_8G1SUuQccqRxVDl>)LQQ2GThmhv>?ktfG zR&{6SMMPsK%(Kh;XZ+@-^)2AySF3ajhKCSO zipyw(jIkvn82ppId;laZj@5iLeg)^}iO+E}c={H$385U}d$u=UuD@vwn;~V~c?el# zO)0taGsWMowPnm4x@j&{X=ijke(gP6%6z&y`|d~9GwH>AxooFZNgqcu?0>cUFK1&q zN`oIzsD2PLwIJnVwe50$d4HCcZ(){!c+V1*I-EJf+!w3p;Nfy@wh;)f`7u8?AF#|K zlTz|sT@qel4L^p~Fb})Wg57LeAEJYFVE2+hE#UiG0-8hEC5uzQ+>?QC*e4#o?2^Fd z&Ghgn(ToiJ)Re&Y9+o0g_l_EIk?nqZZoM;VIZfyQr0Jd5Ux5RR6WXR}$iD zX#+(7Iv6f85UVDSoY8PF$=93w+++r|nkw!?kE(Kwt}Ir)pAp!lNf7IVQ5w{+6=MD4 zVg0v*L-yQvt%|g#kQ%z}2WXcT zD#}RW(zShOFk$1xEf2AKA28mln-;$-zn@mO&AL;;AnF~tu=`~*F|>(sI5 zPG7qctWAlK%F_Oc4NiN@US1c8S>23MmEu#(4kIakfbhsbbL3QI$7-$_T}N}w8ntzt zoTy4seFusbckuC*HBM+XFz2B@Vz0OXI3&C4p?55c6k)eIETBG>&dQ*zfsM!WprwWT#7n-?XqWMZe(fShUs1j#C{)`LGbxsn7>m+H$a|z)Sd! zvqtI;8QbJ>pScK+#lV)aDU#%PX7}A)9;zZe%(zLu4{<`srEv@e{KNy%hYN&)v&0q4 z3i7KwJ~IN{{n@W5#SrOb9zmlpd&%XWR(gm&ISecI3C43w_TIr$FX(}C99fFsXSeq^ zN+p54A4;G?E5>*YDUeLCzL%7$)E@Qn5Eg4Kswqpm!VQCu2$uy>)*22?k!*9rS0G0e zMwo_uY$?j1ynn_Of!%2JC%40}PhIZ-n}}BI=?vI2q3nNzh!~_X85-i08OW9eM$;Iu zXF>1%M`8;QA85Tjh!Ch&c?uGAAAYh1ha*gH<22K32{gwdjS27>2qh&Y8^FOjt1I?T zeAGaa%<9FnAh$=&@AI(Pn-{r*E!82{D(a3w?pG+`nFOghz%F@hsHH4GWD6>uG-D#T z33nl1a$NPpWuoUt_;BPHG%&o#(9%Mf%vuj;8gCW*&**wo&D0Ya1pLg!J%AjsVter3 z-Zo&*he{gRu$Tz1Hux)SK}B6I@m$AFC|6fJw>qLyiV>saCu`}Yv1!E^`Me2Y!{V?ri;?e^ z`7Df(4*)NL1j49Ihs|ySV-Aze0v{M;WIKab(F#lA?7@}G`0%Lh8h9D{JbfG`~k@s53 zqyJst4DL%GF}%L6vtO#o_%E=Nv)w!w`obzc9@YE=>D(2XDdCogdcBrNHRD0|?)^fG zIazb4nFUe93TF1=CTW&wAhD|$ajEn08I2x&K-1CyV}1sls_~*@^42MHX#BmE${BX! z+fIQ$>L2){II^^T8xnWV?^)HOic3XBH-2MeHqrq0ta9YRN{$3J6!&9@!^A8Z?@B0C z;vQUQvt+|l4ic{tY$0ZpfU}7^zxjM9zfMgWK4t8Fn3Se#gznkc8XmTdK zLf`jB7K<*yc=i)BpLmU5BNY9eiBXQyQCNpv7m3T<_iRr0_B2bpR8b6xUG7UOyt}ej zM&uh3DZT=T$)8|7Xd;v+_98~l6-5eeJVLuY;0vS}AxuNoI8C=CIJYaVFdbQGPa|dg zxaD{~%A0KFNua%8wbwI;afDbvk&dQpWM0t=R@xg#CzXM4FTwW$`H$cIXf%1eIFpdM zS4PdAVb)XmeYm@l&k`~lHY4>;h`t#VN3r)C85+CX-&u0lCa~-K=smaGs*#u^K`jfb z?`tTP(sqlfzj>R~>>v*%@}A0oS7WH)#?BY2-6+j~A*t&;O|GB1-Ax(7T?xbMm4BI< znSYm>9^_#|UQ-!}h3y6#E%~spvva}NGT*f8?47nGgx#FR0de9721hcX-zN{Uw+!+~ zA^Z8{24TBcqh#8bM(LYev5gxt5I2idap%vetpOb|pszXF35^-r0XAEx1NO^8aK>lK zC8?t|2lUtt&JMvQ)P*eYr;nOlVhssM=nauhQ92VlzKX;}9bjyu`!^eNWHhf_c`S}s zbU+@@;2N%B@t1sG)AjH@vF6uZU$8DxL7#H8ml`t+0@ilU_k)efCcl78QbIv_G3ZPT zSIfoCDf!C#RNHC=7mKntur30TszL8YGBLv{FMN>g<~rVHQfk zU=pv)SxbVGsaD`K^od4Q{4S)X4^F%k9`rv@EZEt_Q@jI&GcT4v=CFBEhCp4AQXL5ZZ< ziF|tkb>sVli1QnHTlVw;23{Fz<9PRRWn8rP;j~ZVRF+C59bB+r7T2I=^M@}a~12GX>D>&C1>)3p%yE{(q z1S}l|O?WuKA?w06S{UZ--Hl&y@n#xmeX}-#Yea3=ANxEQ*xv&4JM zmk2x)QANH7-Nc*d!afeAUVf=ZJqz2l(!P!Mlz$$*|TROQ992&HJAc!fK4{O#3Ltf;iE<5UjWclS!RJa=zdoBYLyP~G5MSBTc%_c9U16M+d?EW$(?--qI$ zZ%i|mR_+;d;l=Nqv(UcT44p10Z9mz$SD;LJ^63uJU-{1UM%xFkSxO)6N|VS{VK-U( zfT5N%te%duU#v$VoiW4FQyov~*KY=IA*O_iHrI z07T9Y#9tPzv+9-6^d>%m?t_Q!++&+{BxHTr$HONjG;_-N9@l;u4k>oh=+1M{jqa)w zslYA-g38QwjFH50g&=Od^=sFV`|w61rc#QXOX>ScGfW@~(Q)GGeHus}=QSR1Ipq=; zj;-Q@K=LovU`Jm@+iO_JE{9_>HV|r2ISboMlwJtw*0-ozmAhKqu-`rJlGD9rq--rlw290VQXHN{ttM+lGqRoD(nJ zTv|DQR4fBkva?t^e=L0-sVcbwWsP`xuL}kYQ!Ty^3dwx7ac0jx38QniIRhwGJd!r9~IBZTpooq zjr$Q|A&h@FG^pvtVx&0s<#?Yo3Uj$gka{v8yayvl!a%m;xw>F@Cx4=}UOD-BYN4~~ z*42L%lQFI+lk6v`B=~<~@a>T8-~3hG-2fM&?sV?sGFp~P1$pF9QQ78V>YKMj^hz^5 z_u@BpqbEco~Qm0sm}>?%yJXo;9GwLNae-GvV!uBZulXvP1WVrvN+2g+DaW^y4S!N2W9h;YDVl zMP~g;1E%9`H%IxV?fS`uBbtgIyoOom*yp2f%9*c#Ne{6XNwXCa&4|SX+PNB z(E{9>!ky_=GesswdNz~oqU6^&fuMJuMxb|{53G(m*WfaW1iW^x%{7Vb2dl%XL>QT7 zyIa#s4}(2T#Fx%^dZ8p$uh+8#fl2yQUZb80y#3J=RW&ztCRco2Fd9=cO)kg>VV)+E zOK0?0)vyfg{)NGs5AAL0Ma;}hi?9A0D4o>|KhQwEBSiKmbfApP`c_$G>knlgjW^`lrTh%sZiJcxMV1(U(yJ$ z8U{1OhSkQgXH}4RK44hRzmhWjxwhIcr&UK#YLtr31!czF2yp zqh&|9OK160kwHGP3!nhWln@Daw+y|=IFm5@oyR1W?<~5E%lEDLmRCfrFS!kuJP#Be zLObd_WOII@?H#qr1?WZ=1VFPaaLG&fPgr)x4sZjhkU=CL$-TPNj64H^KSQsSlH>V- z;40{V6xI9^b$_(JEmL4Tc0u&g^p(6)+b9(*Y@1?kJ7$rkdn;PaOrgUx_rIyd?uOvC zA+=65x`>^b4`&|g{htIR?+4jMf#L2C-(3JMXWM^rC+ZR#oer$|=`t*O+_ zzB%^jzqv0(#d8JLVE45A8?{2ZI^2VOjpjdrl9Ehexi@ekSz3Ys(+i{FHj7Nlx*!I8 zdh-_3v`ldJ2@!%4p|pa0&JSb`Lk$52eS%P7C^lCIJ|Mw5-jytUMOq%SX7XP0fu7Rp z)xlHD?FQYZ_ID7nf&a$=?`+I=m0c6BjA^*CWPwHY=3a9Gp{`d4mwtsD!stuT!+$N5 zhp5B({;R+Xg5Mmw*1*{i{l`sYaNqyItcMj7|0^CHU=nrsZw%!jNQxTB=Kph0Sd1>A zcK^Y+NS4wnDT}#`@6szQ$pD`EUjxyPDMa*WR{l-G6VCsew&+v{T?xs*G3MmTFo~N@ z<^D~yF=-kEOWyxa9?OwtE^Q$wlRT`>hfpjp(~jvw_JhX-$yBdt9^wTgfBV!RtHKMD zBY!bRb!dT0AlRDX+vIyIhDWlHHR`+^;&>wTp(g@(#bLrO3_ktChPvYTY!6$)Y2mUM z{LA_Ehn3_G|MZs&gFQ$4e-950Z{7cgWpqVF`G40Ir%=fLL#(=@2hFMxD*r=~y5bQr zhOrL*;Tm1hrXE1<{rAxE{>T3VwLP&}2;z@Y#c~n;q5d?g-U<63Gw70n;xaKXi?%1S`_e*=^ z$TjSBgr$577+v^TXc3QZk`H?S2UC zX==VT!?xzo!#B|8R5k+YG5O7oNtSNJTz%9=Mc;2ln}3w;6_m15KByXFZl6r$o`EL3 zzlR0ayfE@PKOGvc3!s};{)gB$Ub>>Z$No$0*%TZp6U|O~8<)iPGtw4xcjf4DL^#<~p4o zqgD|$Z`eltrWLx3h@ENH>P%1eGDvE7J(whDF!)ofQ8b@j7~Wf&;dl6Q4|y9V^=k%- z=m+TlztVq#64mp{q2!Zq)M7%(6o0O47i>$KRAI1bzg$#`;B%4?)Y3>C)^fXf3 zGXK}d&@0GK!C#1P?^YrL_!)CcId>JamU!VPJCYCu7+hK8F6g$iZou@9J@0l7-((x1 z$o`ynt)e-m>#9k2Vvi1s9!ZPZDEG4Hy5!wLb|@BIs}KJKrC1QiT?tatfz(eq_bc52 zo>e}3__I^r!n@K!T5zr6Sx!jy5uvcs%y-2ioPYG)Z8(7`J)u+MZ}|s>7{`s0(PKTM zrQ7J z_pU>hNAz#n)FT&HP4>r|JU@5#mY^<1$6=la>z$`Ju_W>AjQqldCxkyO9>c5}!4MC6 z`o)!668n|mK8nLv6XF?n!t6YgZFCgXlVkvD+SHy3E+c_DKej&q$+2_(9_f^uckEM* zyls4%W%r!t(*u?k-bITZ(%dmGcMici_ch-RuPx4_O_q|JzA*auN4~n|Omh#!-et5A z*JPF=vMz#=rP9!nFuLh;Y)Q;f!_W3GB}u0CV85Kh(EMg>j@tiUK@GFVw|^9`!)tH( z3^7paV4h@H&)ukLA3fS>LLU_|=13fiioV3}G76fGzY8kV;(;q}3xR46_@e}y-)D3T z2L}Q0>G82{wZzl9V#HY_NiDoNv)O7yst3?LbkyCX|lGT z;;X_NDMPHX&%eq)_HHr>tHT$lQ`FkpB!3U&r?5kq1o@J4_~FW-(f`a_sqKKsV7JDs z{)UHp6J{u3CBq8j|Gb?Ht^-0-NrhOGV#mJn&F-n1nv-ZAL)1p#@K%BPcS)!ywL z#8VGKq-Bz&`UZ7MK>v%3`-Uj>*u5ti=5qsLmA7N1JKnhPC`yv*(`=S?Cak|jaW(z!00Uoe zxSim>j89=#ZsT@HzBEq4g*85VbzQZ_Sq(gWlA&PN&OL(cPFpH4(W?)f4h_Bv7iC5g zqc+VaH+t^(ifL;?O9+&lQOEd6Qe8gSZ}LIY z@2fx^4R*M4DjhK8^_wYjI?zO-!`MZNpdIApK&DaK1->O^2 z4`oYkp{ynPF6bk@kmk52t%+UYw7ptMGh3Fzc5GcgQO%fQ`9zQFM%;9z;Ez>kzgkd( zxR~XzAFJi|S5yuyKS2^Jp(&@OW&y%iONou`99uA!Peqk`bS+YIR&L9H+gIm366cs| z*T{6va{FnqL)OL7#H~;~q*@E~28khnu-NdmN`_M-WmE?M9rlml!*JUYeV97pQF^0F zM%JZF672`NeYr+^J3qK@lX%MYwQ5F{*{V=7sBI8unQ5zu@={2JZ9*kne|bE;M$xG6 zO3doX$+*Z$ii>35vcHa0(1ZVG}B*jWFES$P-2hqdlWvX*0r%AOO4g4 zHh*=NDCf^A{}{wW2X8J9B<@J_#Ys~=Cy)e*cPsE*E%Rdkq&B+_qzR_zD6Q^lMG#0j z{Z|$-V>!X7Gf5#^H3JZ+J6za{ z*v~#tT-_yb$4z_47&!}I`zPXu2Jm$Hu!F^s*Rd$!ueh!mm${1qxLg&YcX5Oa+?8D> zRxJ^5=zR6(+`2KUoDMqm9i$Ty?HPz z-|A7pHAElyu=={-wZOn9#6AIev-NpTR^qbWc9FQE%=eOx@gf~;NBjC};w4*Syqgw{ zQO?!~+NlS&&6$d*1c-J2j5m*RQ2LUy?Osin1wzj{2cg{7?xv4JNpc z+s8;crEPATMfut1xn`Db5TCr5a3_`fxodne22;sR3wc^^DiQ5FBsINEhUTZMCzT%5t>k3D~l6kCj zw4726V?F5t9uiJgI*!mH?AqpU&hrbB50H#Nk7Qxd?Hpmm6P%&EA!HF@PgxS0tGX0E z983H%!rOa*2p`FF9J!C+_wQaa3xWFJ`g@`A*AQewR7X!zC&gSH10GF?`M0fE4$%~f z%oUh582Y8mPv_@n+zu2BIg^Dkkd2&(zhdVeUtL{(#9?8PWA>zAmL!5stls<$4}tMl zouC|oHG5Iv&PLBY)*vOpV}CC(`T~rTvTDr604|h`TZ@;Jfze7Eo0v9DAvZDFkSF)& z^zLRd6o7L4y;wrOFn+#&kM{u(XT{!E+@=H-^3pWn-m?Vr-N#LXvM>;Bs?gOX=&Cc<6j z{-@l4%ByG*d_i(U(0k+Bni2Ss3ZUHGQhHga!s2F~pBGCopzuX_#{CfGJ2;5QTT1)` z2=Ye;z3p@zD=ZJFQ$w3r6w;SpQu1^FGm)Y4g@$7NHlPk$P{O?ZuXUzt81_=K9+7(m zeKhjIqCorE?wJgHxh-n4>I1!OsMA~ld&BzkB}EqjI3dISIy)${sb{S^x#+F(H0e1^%9or zt3Ou&XjoTTQk0%qIyB+3nfq=3H8e%UPCVM?f?d`!6ImWDS{_;v{KW}%qIv!nwrtpX zR=@1;!ti!jw8x?IEmh(|>YbW`F5?-pDO)A_T1?dLPT#Ud)Gih?QZE-OH&>wDuzo#W zeUmZ4oTcW&*89&@r5+z%E@L-?f!&G}wb%vvNyYx~7^7UevH$BkUn&i=_iZ}h@MMW* zIQui#O-TLkcwwObd}HCo-rx}qp@BomFe1qD6)G9m9+yAcu|q(zhAu9{cPHZ(BEpsmd)i!1CSlR*uyvDV@)Y=lW)(nx@o@2{{SBAH7^m1`F{Q#FlE1{UdrBXU$G-aeJ)jOiEYExgOzAE$B&G0C6 z1(6xzg!Ivtj2l%s?zNRkWIF5#dB54yk`z(6(Nv&n`pJ%kSB1Yf>g7Jn(w@$)`}P|^ zhsLXQ9|I?AgZ(LC3N$te=}#&-@2iUzD9(?*iYCR{Q*+_Sf|AXx2$YKEo8_DxmDM{p zAE%d$_o(?u;B@C?;P>4u!T{Gai#RY5{)0Co#%f2DsRMmbC-BaTVmM>h8 z(X9{r8vFJqDF1{X8MC!Cy1EU(O!IOj6pcv-f6)Q!ly0PjhnJfq_UvZJ82R|y6K?pm zIZ>CL?4Eibovn|DtI!p6SIxWU;5#@^+T5(3_|_&dUy;p~EXqhW8F|z=8elD9=kuk1 zYIAN&FNOQ#<1!txk3;ryhgpE)g`XaLyj5=7lfK*PW-11y2_}vHx{uW~JB+vSY&*I) zJO;khWq%ZNxEW>HZN@Sh9**wW-JLnUt{_m}{61YUvA(p_6rVRMPzt-RrV5ehH2_!O ztc}okr68Y%ya;`gDVs$OGU0JiT~P_?6pOvK4a+31+LCc$@XLLX>E}|+WB{s|XYEHk zU;RaWV|FZBoK6Pj{SY>{bnPzb%Fv`G_X20`+!@tA6}h2+Ezb-FIft zp*NXf|7^8YktQR6{luCDmeFzADi(kDnEUulhgTa}9-ln(knd+eLWx&KpJesdxUsxy z6WiGI*Dd^z5p-ysDu!;KubBM?^9XZzxXVOloZGEuQA=M3k8@fi&7S^B7SdhoQ!hZ$ zM(`KFKCD=}DHVqKYJ5@YW3@WSP|@ZuuoHCD&djAwoUATTwWDaYYUWf?InEUm1zDAGxaQQ?A@Xbk~33r*Mv( z5^8yAf}c2;6L%Y97?ujk2RUpb^Uz8;W<-{KPQ^&|mr61U&1i%Q%rG^6GH`#E+?hlt zxQ32Y>`dJ%@y%j_+v_{{k2YDJrX#n;KH4R$A*8sQ<*-6j-+@P@JiFkZ=O4SY zUR7M|FwrX161~-CAdlnXldobl`j`1YEP67f5HP@?XJRn0Bj- zno{C@sxnM@vl~(Gt6`d$$3UYH{v5lo%0Ks`UV2kZB>E&8=h{1(=9dMkfyQsDA;hr5NgfCSGeZpmN3 zgN6T*M7K9WY|SoN5eDmA33?@oQyG* zLe0apZ*3mURqc~1OtN%%R`R4o*|Rk>Gs)+2hA{>CiT4iKZ7Wt^Hst@}tbRH%VJ7r~ z5D)Tsc>lr8_FCA*>rSxPo)QOTnMlfuU0Isk!6D<~9v6gG2le!N&DlkGN~HJa>!(^$=!dw4?dQ_TUdQLp_=%zZuY^$)w`qu^!_*;Hx$O*K&6X$wRR^4 zzuJX=WQirPSg8mboYpif7D8zZS3ny`}pCQ{YnFn z?+gAzN2z3$Kx#L`d#O(*(Gd~hJHxrp;knc4W~%(~uA0=QoJEeN1WFFxNI^)TZMBC> zTu(!%f=r!%Kvf@8`}p{H_??PiY0|aGqz0G3x2;}U*Jb1Rtp+Qvy`+!9NU_alkL093 zuQ2M~tYMaXB~dn6ySs?VMIxmoMiM& zeg7L*(Z);cdr4U&T5SQY!q0}4Z284jJ>*+zefXC@tM$aQpOR1NEsj}jFL9B$X-Mx2 zxhBL7J$^~ax(!WVAMmo-R{lp{O_I2+O6bzNH~elkq0R|HNXcjFAmYe>n7d~ObUJ<=@z zOKA~UWOH>CTpoNiylKUg10Q^qXMJoSu+hSJF&EmD#kN3CnKd|+oC9obdByFT@QN)% z|7DZc)bx1xhl%gh-s^FBzBG_Av;{5(ymQkZMgEqEE8d#0PBpq(GDxt7IXYp*<`9ac zyJk8`256sA8(xq;HFe)+F})F)fMm4T!lxEdRpA9DylSloX1O>{>l-tty9d9)2}j2% z0&e-mL5+%}e}ory&-|!o=0L>=kd*qh-{OspM{Kos$wk?DWiT;Guw@Nae#z-=Z26s? zk$LxHG(X-+TDo9Jt{hSA8zd8b&4lliHhMON~^y9Y07T3k0w{$K%_K8|dtgn?}HysX^Q zJ+18Lg^PJeBw__5ck_+UMGum0or~;=<_N_d_o~f1u2w0}Zcoa69Eyk|u)aU=b(V8T zOX1b4J4e@Sq|KYd1ohhd#_!+f0RBFdz_=D~A{!g)=hxSjzPxOHl2`LK@z>hs%Zz5B zpAqjHYFBYsTxI4$bBIQkUr|(qDB89&*5u6q?Dk?g29H!F8X*NuaP&g-uJyx(BP8L; zo96ZG^skTb=p!a_Efx>@d@L$``H#LUsNP|5y)_q#uk`_6IQg2($kS%deCfL6{5ONvMEV8kTB|pw{Pt>f=Na=mGDQF>+vX7cVh3t= zx+c_RTQ23PO?{Yb7wad*`8+-Yi9}zKg4{jo9&OY?QCfO6JVsSg|?vlLi36E`nK@A?K~s1#QL` z^x3Rhhj;g#B_bw29lh|Ukv@diNvM;!U9i9TY^l!}Wpr%J$FnnH)K84Auj=40fzhY% z^yGQrB(@fBbQ-ZqQNP#W=`B14tH5}or29{-)Q9RN43HxEGwdSp6-z@P$(eCjoW1Sz z;&*R!sBlaQz^xci%v_In(}Zcy_sTm+Iq?vusg{rXuut% zH^q*RWKvNlfL~F?vQ}Mn?6M7JO)0XI>BW|I{a)%{(6CwlBlMI_5uJ&bI*Q^4Ap$q$ zDPB0Kxn`;ZTSQ8>!TZ2f3aQ zEb+xTPv~LsJabc@zv(hJfng=t6 z3X|!CrJG69K#g8djCa5Ej%^R6I{^rev!?#JSi)dhqz-#ch9CJl2p}rknQv?LCUt)8 z18R(|4LBR6?pP{?f?OL(dt}k-9_6c^ zIZ{+nJ2Tv;-(aDnEY_PuP`iwJ1J+^5&qAr=v=TVK0R2A1rXrK<#u-wtfmASmb|bZZ zGF{HFmU9h-m)OAOit_?A+1m|WlI8z;3`n&1hy~%ea7^;0*8nh)dlFbBENMrgK+1`E zBN?}bd=u38bA2}Tr~(k3Fp-WLPh-YTLB^3Z$y}@x>f^I0G0(#OB-h=>P3sAbXjcUB z@Ce0^9gttclrlE@-vpAc*D!NUKUJN6J+=dPgu_b5DY(ZF_{j#@*cTMJ)x}_cy1t0c zIg_py^Rz2GajCT|sR7`I12x3fP}JYrFXK7pf-X5W<^4GFW$8$1JQ#(^J{>=}Zv;|m zC1&W7Lm15pfVwx;%79~;p7`4EwA|f8wYvU4e zMiaprpE}eURjM@|?*q)i!n;cs$zPv+%-|03Sy97`F_Lw!G#Vm*GT37J;JX7Unh&D^ zS{wFECh&o5Z2Pb7&uSFZ)S zZ%C8gU~W2@JqgElNn@Ma6y0~2OTl6XufH&XJ0<~^5l;uN3}!(;r!~$&``2^5HYC)& zHt2LgTfw9Zmo2i`KH17xvF8~34T)as4LSu-<8m&p05B8Wd)2`!C^?yG;<|7FoDZx!OqCxxUur5;73lSDqnw_Dnwoe9Dr&C?TodfGR9ei4}`bgji{%B zNQNfcIfg*CTJ;NmwX#4vzvyQo))Hk1gB{+1JJa#aHI~KE)Q$5bhKD9$>EWr+8ipiC zNcI&@IZTU`=XyutuFS<^x7dEMSdOc?hKqyZ=6BD!yM-)FuUJuaBuUQy)h20nP8+%< zX5P;d0l0|XwU>Jdh9AF%$H-mAEr)?fc_ub}f&OaTE~>D+S)MW3;;Gw%A(@&XG0Y$_ zT=>&s&FsqQpmpp&^=J}sz(`69uEhepzn_Dx;p(3zbTBVm9r>fJe>!2(ftMEC)aEI6 zZ%_~jRm#rC!4XPlW@bjC(rGYFRa?lj_U3PbzDR(y^y9Sa@7Sxw>nJ29Uc<}2L9Y3E zYGV>nYX_&tZ5;qo3FVbG_p#FbFUrvxb()uLpOKkhz2I_0LXwI2#*fQ@KNp;^nqd1A z2`;Nl)DWtD{CVopR&KlTWv&|_`(HbUUs?ZyP|th@SiaA7I%FpJ3yN=T1n2qeuxaJW zGtOA@?P@L!03ca{MwW{tp=a3eu+M3toG6I0#mRVGlzn;Xr;) zNaa=sir#KfTYPu+0lsJhCt-+;0O#j+U~#OO z-G9u0rb%U()5?wBBH3IIVhdW=f>G=Zp#x_u-WxNaW_9oNoj!X;W1BCsz(iL@!C|O- zd_X>|`O8mNMuH=Q|M_$|6auLjz~Z|!0(*)fhxv@Po4UzkC=gFpjI*&u!Y@fN%zr*# zq6A+OdEDgwRj|#b7L^HG8oC_akhsDuk15JbBuj-X{^v~gS4vS5LxI1DT+5wR@8I}h z&*JzQzQOKzW|bO@-5Jekw{2{OU-N(Grcaqf>#(m_HyB$~CB(t0`<{!7t%kTP%g%Aq6XVDUP3hJg#{>swV6Ort+ld~ z=B@xcVPiCgUb4WpnbZ~Uozt36_L{rQ8~%L;QEM{DM^)Y_@>!}x*06)`#bpxZt0dCr z>6K*I?=<<}Uha=~Q9PVj@eZ_z37mMf7kd7kw^X6qg5-gu*7M^-w!x8CV_B-f2`!wW z@zVR*ilcqW)db&Cok|Hj_=gNS^;x-3M)!{7XNnf!^gm0#?wkrhj>h&>>UNh-?4W;lN(UR1m2o!;goIiW6zHCS&fgR zOWp*Ei~?-VXr60;A9b9cYrmor{F;(T)oJ+-{#-91M>6F9$J z2!eD=NDnPAAPtg3NFz#@h)CxkFo4w1jfB8Z0!pVe5^{(C`>yxik9V!R)}0S$p65L0 z?9;LL*=PTBtT^aEUX3sN^XvsQMTJ_yso&os z1-%Os1bBZtm{7LyZsypfIUX!(!dwS%@z*$MIk)y3hw+6(B~(+tXlN@pbgJhX*!e?L zc^ho`e}-7bj61ZD3F;=6t|(NbX$w+1p+hXuv^C!rX5>ogKQEw#jeh+?DcN#yhsMRY zLBm-pBx#w?)fLqw@9i7!^&%Ou?X&P={S~p2YJ7$EP{NSia#SA&Vxi_a_a`Uh(ZHnV ziY@9G=^&{`CCAImz9GEIIg+qbN~*S6LTc@f+22Ej{h-T8)mf8M;Mxw|u zJ1A|xY5R~|4D!o?V&&NVh3FbpI0ei86+QeD1a&!58D=Fse9;M6&qg9}h`AMrfT?iB%n-rmFj7?vQ#-t6_+_SE5ZAJ$(>SYdJIb{zENEY-tzOJq9p?A zuX6u3j%Cuq(RkxqM}u>##kkV#={dH35hr4m;0}fM!di3v*Bc1(BE;-3S#9e+C53Oo z{`4L-6p%N6>5qRI%MjJ}{oRy6X{vpCHr@;Q9yzU~pBDFi>tkHfY;$Gmat%Ue+2Weo zPct-~`yNCfU4cY-^EHs;r8J@0+HR458Fte(9l!Ot_gBK@&KSAkbnUU^d$<-IYzsIC zwo88A$tCE#*GS2MM=xqnXa6BpDYN#SdRZYfokTXHTF={ICwa`A&+jQdt8Bl6SEr2S zKWD2obM=$_eJ`m%zfr-@7sY9n98Bs$x>?x(NVo92-l&aTvM+4!=Q*S3xql@^)dQ~z zH&MME;7w50r~L^OTk~{Ip2-th;zi;VQY|m^ieY2zNA8t~rgmR{&wTciFFt={IaLds z<54z=$Fu$jh-{kX`|6893{x(snfItaGc&uLWp#)Rc+q1O@pLPPfH06S3d^t5p*WN> z5rz0T;0*IDB1n9u%b*$O$&z*+)W=kjarYt8MwF-_Ctp0FkpiS=f z`0z3opK7jiKk{9L!yC>1?DvL~t9I9IM7-J5SBx|za=j9`jmJ#C>wT=}a`(*=kbeK3 z6Sn_)k+s%jcl~2?D8Z#Xn=y{xsmQKCD#=bk0K8wIW-?)6zf&zPoJ@*nlOqkZhnmT# zFeVyu4zWk5SsjJR`gL0ng=Q%|n211zDB1KyWIvc{YxT={GxUed^|#7f?v;7>nLHax z{#<=T$_fDK@cb+ebgz?i9`qU`+oczPJZ@7N%x{~0?ztFs6^Jtp{PIozC|rKWP>Bt?^+urz z3tAwQVFz3^O<3=nBSaMrl5pZ_q|K<=A8jZit*)@~p}g~Usu`t&Eww>;^dlLu0>u$& zbb3>F;Qm%EL&UcNN2c-YbT@LCzuj1}+CJ@`KCmPka9y1pk?l1N?y9O$8rx4Ks&|Ny|;T9jqc5xbf#{;Vgf); zcJZ!mSBHd=d2#Sylcb*%=zLu4#o3De2hXfU1S!)hDzfbYyzfs?lVsaFm6<~Z9vOr= zg6eoSK2#Z~!U8$`sr_;8IkO0gtK`-A2x| zhsDOO{qTO^hhlHZaoJl8E(J^Yka((sAMyfN3D>d~C62=1@=(rXBp4VaF`&g=B}mKj z42by-4e@bhCafbSlj7_aS9!N&F(A@XR`h00sFA(>@TsMC_4~Kl;Ku!q1mfG(VUhhm zVY*tP?gQ`j1W{G!n&U?THXchc7GZ*Zwkw{p;T&m>0 zdJ&L3Gm))YTvQ)fWgbZt*Nmp_g}8=2xL@OvBLFL8p9P!b?*;uPas#9_`+dzsxRYEX zuG*dVcw!`uF^dxFjgoju?4VryrK3%5bre27f{}B3KZN*Z31CiG;%@WN!?!l8t|jEl z?X|BGtx0*k(b{zlD%K`>@ke{eYzruVub0!`|7Ju)mh3$`X`v;j1UN~ z0Vp8eZr0LVdT1D$l;xs*G}()e=&(plpRJIwP0;F$Xmb0d{XN0qa}W_rum~m*%OHj2m8*{k>gE(iwS4g{T`fCj{i1_*U?|A^U^NYZHe( z7P9ws}U9tXP1kb9O`M| z46s8&UB>CA-X6YQW2*>XtNAjwT5c(40$F8#l8E>CTEB30#qh@uTHn#61qyI;YRXU9Y?GAj8z>47Vyn$^zwV%@TApAuelzRPe~EO%k1GDatL zAXdFz@i30kO@g*F!X+{30ZCx4U$=G3-h z7%%FdYzDBqu8>IWfZ^kKK}y`K+*fr*!4yd ziaSf)|5k)D&O9_`g|d7-j3U#CY|i=-W6OhAh$Bi=O#8A?3wGJnxhU5pD&a1sKf<4{ zT%;b)a62LN7nK0YKK6e(+j=M#Z}>0DKsHP3sG|WYH=<{c#=yPx{t_+`0-!DhsJnnD zF~azR=J_QMfKX}PeS25~H(4^DUvzDThtgcRchvrdFL3+K%u%&{3k;nZgbQB@-oxld zgF+rI{~CV!@jIhWT$f6j-kHYq-b>nRqH~$~YCFb1TQ%P#@9uO|xa-k*_;GhtqAdg& zy?@hi)tDvRLhY#qiXRN0jd)7QSBNhhRVnP zbD-r?TiMm4!O-ma832^H=C0xmZb^^-(vTH6VC95lIVPjfQU=DI5JOcnI;L{Bkze%Z{`A@aB;0TgJ zP*&d&aW&_MJdrwNk1uPK^%-0k^xaO$s8P_;ZIVj@!N`+%vklX$@XKSc1q!(Q^s;Mi;mDZ>Gwa`PtvsY(AY%KZ(O|1Zr>OPe@Vh0kQ) zR2Fj+eFJWuwOyJ-x~C^cX5GAWJ6*%IX%HZ;Mv1fm+&CbyhwjWu6RnvBHTmbT4ilK5 z>TgA#G#A%Lngyhge~~pLMcGHwd{jm0s*C{~h#a zq&r{VU2W@x3STl2F*^TTdE3Ouluq@lEAl@`4g(D5DhpW@`vs@90M2Or5o=Q zunz;I>Dv)EGVEi1KEZ|cQrHnG1OVM8fpGncs+o?giT~{s?pIKn7rWojr885M+{%$N z681r8cByq!Rer9E7;Y$gX$i~FsF-N}F0q7uc8U16KV7u&)WoHGj-t&bsH)pvmbT8M z>cn_*WVXz#*5k*;<@z^|7#0c^<;Mmon|`6erWO|tSBXo(iSgf@ z{bk$|b@rPUc)Mf5QP)`$zM!tNdR3)`<+{&-j4|r7EQ*_8>eN(JtG28-yD@K|B(T&t z5_$ty(9-Jp0AlwbV(pa)0fM@^G^iSfhZ|xo6TK^~@gZ$w6F_r+%_JVC=%I-$N zJexV2DuOR8nA_C+ePj1!DaLDLdw^7docP2`OB=|vTMGvYe3?Y(8Gq22dk`;KB`Gvzf}N)oRuX%$3Dz23IpEJ4k_;%1U(K`? zMs5g~pEGYfwSx(!j}V)#5_c-V-OZQCkhoPM@l_k;U_{9h5juAqGq@9tLx_V*7f(q7bAfl`~xF@O8Ab zB`&;$<$|J3Uu*e6 zyAsu?1rmx+0zp?L0ITyWg*#B%~$T6=HZ&TcNx#C3O<^NZ7`NI-ENLiqp zD^~CCj==2kQlm($6Red1GIqr*f-JR?c*{56ZKCe7`R1p#ptsX=uw6gOHn{HI zwssmu47%D0-5a~>FKY=aeEYa{PmE7nYc%H} zIdkT|pW{c#3;+IY-jf+6>uka427wR2VzaVYaqxUK|K(pQ_6AmmA*lveEs>3fg6u~V z*m<;}Sy6(ECO?VubR*r}$VqJ)Lzlt9f<(5ZMnA1*2jSMQ=_+lc`_Of_(`g+4FlW@fLwXk3844Di`!&@n2)rjaUG)7kSsw^h)C1%_2}P&j&Z8zLrs+F+fnYrejpNvqYw11CXlxcx0$n!O6TYIe1ZA= z_}Kjf_Y2&VQXl}ziUVi;jh*M4^|w4Kdph2BhBB8Fa<5fnV5Jt$2=NQ3xUhub4zg=9 z3nQsCYer|PJ|(_)+k?P#X3xjMo5lrCD)A4i44)t4x#URHeZ~_+|GwE_{Q~mo>AD$e z-}D64A`W-pv&|#dU)-<1N_YP5s~0ch6YgE!9)D?g$0v_KKY0JHkEp?` zp)lK|)Ar?5VYGNmPJh#xl}cJ>J1e)|4!ZJr&4y=|dx-2CbyrcGDpoWtOEuHSMBtgM zG)-%d)aCE_U<6H}q1H2i2f=^F5P61H?tSlWhyCb^>y;>Sr!7n!hRY3K((@pJkPp88 zJ{(Nb&E;GqOn7VSv2V*0_(q8x-#LDo+`8YW{y=|(QA)I=Co#a5Jkj#f)s%J&UEb21 zzo11{;YKsPO0iz9{&5lZbi;w8q57WZWgg*b%kLF3$I)s)jPhj zqxik8UbR-Qqj*sbYfX>ZjS_lpv3=J>mCM&1jo2EgUz@Fs+J~f3ODDk72SqP{82&Jg zS{%J7%EWw7%Pyd$gZp1?h#?NVbDIbhcGQOZ2+kgG(zlwShu1xK)!uC))V0Z%ZHC(G zplZH9EzDFw1jAzW3~T9`M5meje@G;9-`9rNJ(3`Vi+-PvpN&QBiJ)zP)5jy+G2s2+ zpI}+^N3vHD$0MvbAdDquWz>ch5xUmqjT1@OeL47_;xb>?GDL!vVfP~cNea7@Kb8d< zR_{Dmj*DSS6SMt#&WYsNNZ?yUu0pdq^)!z8p@esgQRZc2>S$mNSY5HvQ@}E2WxKWS zYT{{RO*R;PO#!kg5vc>CL?Q7k$JVr~!f@esD9r0ySjIdKyfV`Lld1{~?a!de<-RDA zDvi~(^UKQwyH9Tl2J8#k08n;|g@)MnB=Wj(4^hQDC&qq53X9E!zyiWsGiyu$!@`I) zquMpUZoBv)Ko635X-|&|5PWcYz?$3>_OGC=>^~IB?nC@9NBv&q`HRtJ_Sd>E@?;e) zTVxG>3C0IpJMstnN%wqr7gId+N!Rj9taD_F-5d!egoeYvnts}5m;0#Oyzd0IwjuJ0 zq5uGlbWpWs^oT9=|LWYqd zZ7%jRT${nE-$}4jj_Lj=JX zQH`#z{pizxT3UIWdr+@Jv?$NXF-;0Uq2(!4IBF_M_)nbwpe3a~_S5nI03w~CxYj~T z(OML%nJX=Gjckiz0{~EldHz|=t1`zYFftGTz!Rud4J!S3nkcP?Vk3RHP_ccOwt;{# z+{dR!bR{1kDku2}EWi_PR6fRBWB`Ed7ypPzg12jzKm@9`-Mu+-js%LC(O9mc`a9CV zKsRdQ2&`aoaR)IB<2;aHC={W*-lQnwIFwtHVsyf0n6RSivS$u|gX%B+?|+2-Nh0p)37j zalq@O(lBC>B#I@!GUl{e5ZSy}98trjPd4>)3kN4Cp&KY%r$ui4ie(T?id9znjYU6U z<}aG1r=fNi1t|8`FK)mu@o3TH|p~&ve1yncU#Nr7fxL(=V zCyR8jgt3caWR)iK_VhBv^lGo~gZt@jSc&)pMZ3Y-?152)AQnre77+R%3tr+V*lVBA ztOHnN%gusEHt?iqY6`dmcIz-REydZtqAuYc2-rx!>a~y zS^@2{CUSJ(rIXQh#2jP@dWnnhFR9vcfkjtV+0A@>j`rQ{O+V{BfQ6NWb$xufKOPoE{=R}hCgFt!(BhrP zx4+Nc?-~vl2h+c<3#>G0jrVm&_w3B9S5_n8Q&uI74ymz^J#e}`#von_)CP;49if!o z5vIAhmWggUZ%TBa2D54S4x;|0`THiVl>$v)zW&J8R;oes3(Ikr6M((#FI@<%En_L$ zhq^yV(>{e6oX0f)`5eN3w5kF-h$?~dLsHpWW&3AgfQO#fKH+RC3-s*u#0 z70tUNI?MttPYjNKC59LT2vH!M-+I$w{w_t0fy zTOct1K#*N&T;AIYc%@de_%A5x#Z<7_ch!Ynw7kS=j+M||@PjnzIx?b0RCT6HfD4gh z^*&YP`JcdgONC6w(!IBqa`ww;OXg6A6f`y9SHXE) z63P4CQdpejpFr)gEgbNIQ5K6DCP-dO!pg(jYEB>(?R!&gYE5OT5qpl}XUP(x^7uEO z(LoF0IarDUrluq$v!9e!8@?1X3eCiDRH(_-yZjBYP8SN`UaZl%e4hcbv^%1stWfY0K+CI zf38*$(2<9H@%;*zMAKNi!TRNdZSBFd6rT2|L$#lp896}>ESBRMMi_6KI0EgvlE_Y!M0pREGnDKqf zSs*>7dU>e#ynOH0GX-?%=iszm54D{5^*5zi>;R9Tr)@(X5rnw#)&!QIG;g+<7$Jy5 zfEdI0kM$-0M!|OkkTs`_dV*wt*c<$ekx`A>XIusi@65^69UBOfsE~2$Kg`$u5LfV~ zdt*7ZGEq3Z>t*S6YycJ*>04Kc{~qh=-tPFoZz(1MpdHx4n>GmG;PHH4 z27Jr(*#`xe2lCtib~iq|!4(WSPs`b@OzyohG;2NLboK_> zj*sy<4e5L_+zmY$U1vF4+}_uVY-;NOj6O`sq{4(#d0?McJl~HkDYV#-!QS!))=YBl zPTziyw6blN1wy1)s&WbK-^A3=GPe=BF~oMfY`juk*~*J0rb03uY5$#yw8r;nxeqgE zhiI$AQftC6AgKenvJbje?r4Qi{;lh_(ITB%O_adBcQF$2*bv-5LW?@&$O5}$-H9W~ z%^yQJFr`h!a>c;@^$2zdPhiVWjkct`dwcMx)#BDxkz9*i zaaJ1|aznt%ZVN4J<(mSn6C+5LPv8|>1UBTeF3XQ$WW=~Br<`Ru8a1x4s@ zFP*?}IS{eZfeBYzzW?KCKkTutx<@qw1PzSb>;C?Y=LP0}MdxyO@X=KaSzm-NsU7Ey z1vjfTW`H>s^13?Jn-!e~LEY8dm(c2X+XkV@h}bpbNPinpY1Q4@=bhdB`=?m&KDXK6 zpN^-7afPosYrmN|kb=Jm%zvD%GW%<01)y+;a1!3>fVDneUr?f1$QAPA?cCx5^Sqmi zg^~l4rF8YQobC}${wp)=U_LAeCDT1|1YsR;e0K2<(NrSGeMP_^blm;B;yWUw2eUqt z3m0(sR}?y2SX{jMRe(yN1xVTJ1v)4noQkeUiV0G!wVNj{Uw{aH>yol?=>Y1IazysTBe9 zv!&6w=2n{Zb1{~$M;s!9wbF6Y87Mgb98>gFQ z>Z(lHcLC-R4ANX`{CXp{_4X6cVj3G_`zP?L8BlC34tgknj@L$MaS|L2M2(5*RUcEF*CDXk5x~izk}s;y_-DZB7hjyhG@m!P)F1N z)nzK2z@B1xMl)dQEIwN)N7X5pe5^6c}c=eKo>l?IR2a#;EiFgwu}Fxo zpr%syY zqg>k&14P|zgw_fe2zX2Lew_$5M7(KjVug(HL<}O2$ozZx2IJ3f%@{>XD%1)t(XLV+GoDX5fKSdxTJUt^)FrWqh7&!jfjPDg{hxfcb1Z0zZZMfBtO;2G>#aB6=-%XBp$ zh)&gQGZ`Ijx>A4*@(1s?a(=@UHO(&=W9=?Nhc{lvCW_rvwJp}5JzY;}Vsu7z8@duq z(A}~htF<3O^|z>_i~*P*(Bio&z0s15Ek6>%3R|FkEfiRNzs5Sf9-Mey?xs0i<^%4% zsNUgQ>fjrE?dBx{%K*gR{#|BPtN`0X(DZB zpU*s#M9pBLS56kCPGyC{;u9s}sh8+WYhkD;rY^bg=VyK4s?XZO6M`gje-4Y0qoGRH zFRw%seE)|L7TPCWOoTk5uKne8j+krq^w=^vD>uf2Zn==@FQU=EvgL2tX)J}o)mfYS ze;h<-azs!UIW>%VTiHPg8M#R>3Eig!KP}e&gAOaZK>bj=KznYOj=f)xZ4GRX=U_C) z+e;coY5fP*&rKlxecpohU-=YRhz-FdRU8~_)(WeT>%O8mMD`;F`~e#74Gwk{26!(R zh>)UdZ-bR)e`3SSbzvu8Y^3J5%2ir8;Ju}JVVu~r?`t7%YJMSNDC{XBbo9okzv_uu zHXRd0peFa!)yHzj@WgCsZqfdvX!0M}6?j|m^{18T4$ib_m1Z~aJy9&U9vhnPDp zT^ITFB+-$1QD-z58!}#2)#4cbKnvftnEUd>38azf12`HWQgm+Tl?JD|KPLk4>$!0w z%-?Aa+6ifUg=L|7D-Rzgx>0K=`9t+ss)pkm|rrng(`g)yxg3Ac#nI zSN;f*{g}jzL>9;rqbw@1y6Ep~Ysr!-`R?mjLT(A6*{PHb*h}(CEZz9P+i|50y zUv_bT@eQ9)cfQ%1EW7EjU}?zRIyGiMzC#(B;UQbefDK`qC3#x<6UIju2%RO~U|jbpi_|V+|s;x`nXePXhHnga=LhEJ8Gsqm}{R3{2~i z4X1|$D*{La8s=rA0eVfZs*Y||CXpl)>|)p9d>@8+yuZL>UNqKJNN_o|)Tx18>?A|& zm)!G<^pJ%JBA_0Ie&dJ((RNu>-!g*+16Uyhe~vrogEehCO})V6c?JM_`{ObCpMWm(lm~#q>Q2=>0e=e8}_WiJ71<1 zX@`r1DTNm*_y~D<;IQw|xt4HueT;k_OhtKeG^x$SVx!R6cH0u?ZYGdrvq;!HD(tbo zEIjH6nUC+#I;Rf~i0fq`iMFMX`0C74Nz{A6=NeqaRKpRyhQkpTzAitCb}jm(EjF3U z8L*LXEmlC_1FP|%gw);m0!TDrQ?4+1T>|*_%ZnobOFH<=ELhg3$7C~F0uYG{^2f69 z(ZW_c5B)bn0+77CD6%`Dk4Y{QwE9N`K+Gzj0I^vf&#)h%usvs{m5%CB@}_K*{H8CD z3j%*sKFEP}f9jBJK^>1ruw)~{r|gKc59~`5@P}{#UMPu=qUDXS0RW(lB67O5qll7G z@jL=-$B{o$<$~>^o_T`%TOWl>J=G}Z*ZCvyM>$mAqvXgd!3X8{1EmVlHy*9?7~2O0 z$4%n=KTflPZQi3=LLy3q9NJF&8c75IxII3%T+KwFgiR#y)m|aj0oX?|j$HadE^`eelyi`##um5uB9<%dzCgM>)V2ttcrM|cH zvEU7lIs%db$jAIXAw-GClJA=ZQ|?f^Lckj4eyf~+?d*qglst_(IKVSfk>I(3IA{Bc z_}U0s_eabfkcBLaEKyxLlWXQ#j3Umqk=NhXClPNO8#^+Yx-u`lQ3=o-L%eGInGKu)1x?w_Qzq%oenz1AH z(4xffCOrx#&q9FeOYx@6!7be%nS)o9$#bR?dZ+JJdGOxe3OC9*ImFWUG@!}qDpYnF zd?6%!xPIdq=x&N;-IvUquO#m1d=E6nN1X@JGgaiu<)9x*{kjOk)T7rF*slb&X3ZKI zG-QP~H+o-c{mpEuzHIqBLZMwv&)`}!muz-^s#7&^l0r_el zI#&gViC)d{n@dJU*0S@9pF&M<>*k^zb=A<9vNTK13hFMTC}GdnK4HXAm>ztD5}Lz4 zz5h+sbhnC+WS9@7^kt?SUS}qT^pD@7MCU$S|ckO_dqTM3ORlyj3+T5 z@$=}5DU%VIMRj54;muPg|CCLw*1sik{(|GLA&T!o880T6(CGIK6|*su-N+ocLT#JC zlNwPX_V}9*tP2!QAn`h~TFjnhv&G;lbeyzzjX58jKOAK1VY}{-#cBN26-UkNesoy=p?X-f3S-oj{8oFUT~+P*hEST0 zULDf|(cFm+gC@DIUh_uQ`Xt#yJCvQ;ezMds$AYm^^auu*Fd>x=WFKu4aFd}z9`UX6 zeY9+s3iz?6E@3x0YoM|go7{|+S4WmhA$X%C=oc-trA!pg2~#@8gJAT2h^J6}4S@e4 zfON&mA+l8(_}+;zq~~rqz{T`st$!{?#7-;zjf zwY0)=0Q3ww>gbs=Q{2Cw1)8x{spzXcr=9tLn5zic-C*Y&K|T}7@PTZU)rZN#l=96A z!tl!G;(yen34+;a=K8jn@FA1GQ2Bkkci!x7>@-n%i7)o8U*lD#SFwS07=?8ZmqIs+F`XV%3VT=~GyNbNq3?i=E%#19>RH{HTV|K34H!{`N`ef(gUiJMc zGj89=*Xx139@xOHV)`o+r!uNe=={c}rBnxJ*SVyjveWP$pPG>GFCWplxJyZ3%pcO& z)QFeXvi34$sCxe-E3FYPN;U1iWK6%z_|$jBb5|cccEwwE6}OeX7Uj) z-Jf@#GJPj(ysj)I->oNMfc9t)hwtA@2C8S%1kxed!lTw$$6qvlUJw&~0=ec*eIcu< zTa)ejvsZLMKn24W8=2|UNtG>>8k;>;5EicjUsSD_V!K(EY<%dgAKd&X<^z6aoKcwm~scOAmDq?JD9OJizPvo zKx>G`)3qbxtu?1UrN+Jh@sa9@A!4yH&M@_yoAzZcr~kwUWo`n|tVTSc)>j2CMGAEk z(p4xWKNDSfNhFuPJKVY~uV_YdEDV#0$r6p>q0`5h6{S%5gD=QOaG0sT$-W~`H1kJc*MDptU z!}g4Ki#tV@ofweQ)|UtFcu3Frp>Fab0sU7drbKgZG=4(Is~vTLUk0l;YkqD}k~EQy zk7t{V@{z`nBISVAilSeyfqs454L1~Vn%gh*1gmXdJhfYXI2a1Yn4jgwfqpAQdB7M9WC0X32&ApC>m$Fo~TJntTWS`Ier!Z@**MBM8d~ zVDXoqt4XRpe1mnrgR=RdN$zg-_!;#2iO_pr(uo60o{Y=wxIBe@4y8jD;V|PNr_U&9 zt*y&t zb~Q0#cj&T(g~hQ+L0l}ZH97tzV1jiQy}7hXJ`Aoq#pZrC6pnFu!nFL@W~d$^Yo zVvce!xNt?jl$G(*XeJT*()`b?@8`d%CtMeR@Z&D2fM|!E7*BA8BBA77ATjI%Xiw+} z&jWC#a({%O8DI&sr%!5JnSM*9!kv#J4z!B(4{*uZUWfZUJZ~3NT z@(GXjQ!g0~pf9zq_%uRQImsX*&_#(bM3Zg?ljy)!tU-;lm}8C9D)|zPK6kJ_4G8)` zz(fmC^sy=Y3xR<Jp|;$`1t(~YyVYbtdnS)?qD)_%fJLPdQ5R3Mw+0$~WQCa)9e%8e#If4R zOjgW$het?+PQRG6F_kfHlJIkyE) zXX2-eSf{qvw2S;W%o1W@8MVnPVGO-m4fzpNFty`MbCxC-8HqophYl}NEN9)@a_orASETtox;CJs#x#* z4od!{&Y|~-=9I+Jg)=pBhh~>{8E47SnR7!TZ$+^^ty<=z$vE?+uYWeawU~7(-g$uh zzK)mT8ryH#i|9(f`)T{O32!_|W9HvLlZ}?9jW@SWwiCq5-wGC#i04QUPKL4J$T*OiwWjTD}me4VWFE3@jGSvBR1gu0?K6-W71O~xtxX%`!|$O3t~Ej0`IGLTT-MLurScXdhynu z2YIr^Dae+J2z-KtEhnX%*o?YYKax4_)6lZk&BGd%g!|)Mc!*9W=jc9mPw%SudzrfN zG;2-mO=0b(?84QN_Wgca@UfuXH;8O2B8HT-`&md44CBfojiC90r3S7fdQOqA zmWy>5@Gtc;pSa8Z;6U_KacKe=MCBT1%gwpqs{nf63&H}pq@MN}jB^toN1lYGmInC@ z3S_ckB^jBINRGzHY#Z~na-G*@g&7bHc^KnBI4GX5Ri)f)2wn~Y=+QZ%-b@w)Y>Ba_{c&tQPwN_*=& z{KXS?1Rq!y>uoVkm+wdWRQiL-@ zQN2Rq9t?gREBf;@RG@&Vs?}=`Dp=^!!};NDUckw~&d=a>!-~FEVj!rQ0T~!QG8pyk zkYg4G7AE0dn`#=bbptFx=if5H*Wn__;T^aDI^6%)d$&Y2A#CKbA^7(YTTKT5IplZ~ zQ~Q0zd`M7xe|-ax7p+r`i4;9^6ns*3c=*XZ)-(HCU*v^R{htIT(0Bn5+@=$J{ngK0 zYxm3{H6F$d;}ur@4rLBr(cCPTdX=jNSoFR)FyiWeaa3Kx>P$2`pBjI0t&MO>jW6X` z9cmE%J-{@y`HmegCD!mdepi&qw7N&6L5-}DFxil#MCoVXpdPYtQsCKmO^d-wz$*$^ z$3k1smtTa1%_1=43h~*QTQvHVFEekqip%R+i~r!v8ZO}%CqNHXLcD*d`uw5*E^*c( z%K%8rcgeqT%MetcGXe`LB-EfWqtu5v{Secl=ulf9t1e_bb4Lk51(-29<8tKjH;>t& zhB$kd99Cj|$Qv+yX%>769iJs)nM0Ju(*l1%^3NLaHk(2Vdw6s_>l~{aZ>~Rs*~7UY zRnvP5^Om(ytAKuK<8m}+_V-_np@4M>)2B*QxBf-UjIN{F!`W;|6Uh0V5u#7LKR6J z`g)lbga%T@el|lBq)s_XVYs7=hvt4N2cC@x0pojp_ONFP?GF`@*T;Ym6(%x)mVa{x z5Rrq^>PHu<0J_p!EVxsN|C%kq7VntsT^*)vD63MNYbPBM1-Xcrc6(I=UeW4S$KAS4%5a`G6qqO>r^=mVNoR zBK{1PI`~8GpRPkHhviFSlTY1#Y~huJUgFQSy^}sd>!ZKAsi_vJS07yD6Z|3eT04?*D-~a7O?9l4r-OX2)Z(k$ z8=nT<_pOORyrzY@yQ|diM{b8NG(hlk_M7tU$QStSFKj0xiW6wwr(t;SxbXu(%P~$v zDY2^1Try;)l6QHyptAGi4j`o`cqRl)&K_dR-p(8$@QVAes;H3(-Tm@w|Ee;TzhYhz zadQ@s{wM8ts&}*z@0b4cUnF_iE$=I)B6ON#w+}d$Y6~IeI-jvXR!D|}(UaAv7KPtU zvCMJTidX#hmNefo*n^8CD$5hLlx71|J}|C^fPb6kei(0s2yTAe)>!;{xayo8sf~Q= zko3G}JWuL+4a-A(fxBcU&aVDi8UKcUDxDD*`*6(8h<;rZ?!9#wL}b&KvZ@8G!8CI0 zzIuVWI=s?QSz-we4u30!UKxb&?-Ddf?RVU{zLq^99F}0^yttWkd5ck{%OjAHH-~Pu zL5{VPU}*g8Y1j?{rhfuduUgypAgB+c(ldauNeH279fgIxGi0wbg%k zFA7g1bP{+xUzz`%ra*#(WMMm{f3h~+nDenAyZXyepYBENne$U!09G;9FsVM|^Gg2W zWg`XhNuUc+=5C0_G29owI8gwb+ZZZnPaG?#6#~NP%T@NUqu#-Y{#+eUHQlrD zA$RlSZ}Ds`+vN{)v?v^194hJ;0qjwzOg3wv`FNiCTKnjgZ#ftN*=Lmf1bYLl(+mXP z*p@dNd&w(L+Had@M{mZsfS5>4bq3WKzd9F0bX_bMz}T1e7v=Dg`0-F1PgJ^6 zKll*RDE;!I`p=z!3qd#(z9ZZbYY5a`41n4h-6Avz0c<}Pf$g^z5p*ILvflr~_Ym;^ zKeYdP2MGZ80f_!T55Rx^2cSDdRbmuKj9T@WNU{s85QM)Ymj+=L!GskPMK~~m5LLlQ zd;xne{Z6-6kO6NAD+&@u1mia2!v@Clmu8K%Yg^dJNaF>3bk7mU|1VxTN8qBq|EGOg z2=_vM1uAf|81m%;ifENR5Igi=)5d5(*?`mIyD*|QgsVa9|7|9skSKmW(6N^YheMoq z9uClr6aW8pe0&o5|8@vbatqk)aX3nLrHrv+L<)*3>Tl2uK%I5&$^#u!Q}MjWWsOcm zi}IMQ4eP{eLX2Fo7-G-|yJ$cOz^LMQ1B0}Z;73R0b?62-4eok>3)Ow>2An#t8>-x0 zsZREH>bJ8$0Cy;7_%*XnOJVKynijB$7m29S;|r&W{jE$ZLBH_r=vY$`N9=HK|tE z<%u+CDeTc3YIvesQ9~znX?l*E>F)uXYM*}QYJGe2TA`pHb9LwC-BpADQxuU`0Xvjf z9*Zf8_Ok*uIZ3hhOu)1)tqE=`Iw9FyrQv1oqJ#5LFt#g5gy+_B+zc~qSN37 zX9o*1_6d!zSGYH$ z>?`tmhU>^Dh<96togG-1*i#t4$7j~;!)HS;eF=||sOsl`nkY>?hf?QTFyoyWdlx<) zEzh3(u`3__gJk%zL@ih*PsX>hOW_*5Uh@eN}i(6_1 zKNCG-zc+4_mi>|a>P%$oBMO|P8P9~nrV&SyJGVT2(_sNUpBOKvw$RMqrU?A_S}2Ru z@2L>`h%J+rWM&qa=^M_^?{+BVALFf#w0)RoF>h}L&_SK`vG%lq#XW|mh775Ol}+~a z#qN}gZuBfrCZKH=f`!Olyv(SUI70O1U&~pWHB!7G;tXS)=LM}cVjBzV->TwNf^su92$u>XxX;d@w{45bFLWWj_R%lVj{9sQ zyfGa{WZVoUHGaQc!(FULE6cQhVcepIhbDn(^WQ}t1FcC_M<+Y8@jJaa$zxuJwbDd7RZ!_x6V zoFSLhe%3GlfeO03T92=21f~}oG_I+$4NXOG{_uBQ{O0x1)k{WzOES<*4>mBD8lGhB! z=_F?#gK94Cf>SL>>X*-PaQWfFlHDAIi`pa1FjxT0wJ zmPv7(t&B31I_hNFu`;TjMr1bwD^G>=El$~P^+t*5!pUlX&7=iq6i;-2)n#P>3@9alUd>wJIL=hzA@!q59r)}n8&6`!uWATTE4Y9ai z)F@wXJFDTEj?yjNr$8s|!bDygjX>3xRwPGQ*O7!-7*=zpVz4gYO#v5r|U z6+4^o8a6w8bwUGO)7dBG7Hn8&X|R>*im4|_pssOk-pb`ArfMx!G(UW+ePW|WD8UZd z_#DsGRnDV8#?Hge1Ht|6`ZJCIdDYm)PvyyZ%USyP8<2k9_F^USTyild-*hl9Bs;FM zljV(e3|qSBGJnGxuKqvjbM4$>!WLH-6iuGZ%ts@dli8x3e1nuFMIV5U;NGa z&M$gjI%^3REqCd-NgqBsKV*I2fgA`d<0s+kBn4EGkaFfbe6q1p55X73#|rp#kfsR# zF80QgW*Mx(|2%?AQS~^-_Dwj?U?)eRkrwVei^Um+_x@^N=OwRO299Zb+*>P_6e&lq zSMWY{y@E^Ec?%Lv(DAm2jtQLI^=Go4N5kAtYR^MG`Xt4WY(3B}IjctNI z`KH5a&m)(s&DgF}f1vp=8{EE>!~B>?(n9L{^vwn%F(?~Jk{HmU?#^1Uz4BL%Z`X*6 za&DWKtiNc(sGwr$_q7?-9~z8sQiH?jJ`M}>bbAU@e~U_*b$F8L=)KH*Xk|qMW-0`= zKy-?K>6pVEWo6k+7D7~a7Awy7d;=KY>Ub24V3@Oae&%Xsh9pnX>F!o+38ThCuVaV{ zW(r<9=5bf-Pz~zA4r@08yGeh~rv;2B6NCCce2a3W6G5wzE+6whY-_Z7B=m(>o3#?b zFy*^L9+;P(F}Ow@XwC;=S($2Wk$7*org?|aSKo(w5zqAmCN8X&Gbb2?b=DE8 zSDISoBL@h7ZuPTO3?2DQF5WrNDS3#unBPI*)cKvlvLvFF;hTsyM33EsxyE7 z*u0P}UMqKmzqsfN5sf-v$?wB>bDmkL2tOX&S~Fy(EdY7OGWRK%em!nrEVyoiwv_h` zt;}|Kw1^NAiY&>5tPNw)d=Bk-VJc$U2XfyM)3qXX>S;=6e;E(W{49I&CQ9I2BmpOk zu29LC>Jr(?yWhQMApN*=nkzcV=oVe4l=*?r#>H*~2miN@8JyZD=SC)!Lj6*I>AQO4 zftnwdsX+^c0WCS`?zQA?bbWq6GN#fWsIR3ZbAOvC&M+%vIY3>hYrxRu%CYLjg~`dG z*YOWL?0JRm+hhOf6jo*JZd)}tE2UE2^Q57R#XeA=27ZPyb8sr^nJ6|*slMoV5KSNK zHy{$m_Q|K2#8zhTGYBXqTtn`*Bc4C3w;C$J(7y{0)*7wEs{Ft(V6gO;y@9 zCe3L4lH+!mXNGLBhn2=;mYe)ht7v-82ku~pqLy*3d9c`eu@cHL!(HC`a8Hd}#XLZAR_>BD^LGDW$}_6t%@HRg zwHdeXgT*?Zbb2DTX)f1@o0X08bPDf`l18tPRX;#o>{o~uz^+`|I7-n-SLEJl!VAm5 z&L@&jaM*9$ccQKrC>1+{H)GVn{2Kz?DP z5epBjkO7sg)dy0|%xc#hl_GVQd^FEJBmtd9-Ds*^n9Xb8(zq#pudyv-0Uek){P0?> zk=SJArE%^jtlGg`E+yH21}LE7LG|S^Yt^c?Ktstex?zF7s(OgTIXVI?y_|p&zFK z-{i*c8{|J(tsKca!#4U*ZU!G{*352EXXH%wi|o#w;v*d+&&hge0e@ljLV;W^^S!wq zzn*J_(a$)O>WmoaD*gnMKvjJeEE-RHvQZqCXm_6?T$;-abmS&C+$2k~+cEMaW=e~! zi)Uf^x9ua;lOzZD?{-$6>dv5r7&v3+>$e@-M`|{a`N$6W5oBy-wQ0k1<}T8^ct?i? z(y(b7gPxjmLY`{3r>Yo2emv8)VkTvUd>wWhAkI};Q|5O)A_c7<<%&wIMi;)Rfk=*al7ZE z8=@=uE?!a9^65>wj)L!?FT-ILOUvh4@_4nc8GE3|Tz2U`7=w!hwefyjzub-0!$W{} zAnzoh)LFH#m#AR0zvk7VoiX>5ia%m>ZKcxHZ&T_iTI5gP)-~Sh2g&QK;c!+|DTq)f zZGLc~ZfRW(?#$1w?+WjveZ;Et`_c@(PrLfYx{FTdXnk`L^gixHDM`6(f?XEZ{>((W z=X1s*H8Bslsp7LjE~5*Uut28OOJ>dZhq~wkyTq{o`(K=U^%BC=Ny<;;n|0g)mY4!$ zTtIaFkr*WNB{D_$SxxkT(lPr)ra9qYeSMV#&brn1GboXG@!jx}G~sGM%`qj0-N8_`0?WOAiw z%@n8;qV_VK*fL^R(Wn3IO*mRjIsQ9-9k+gFnXCZV{(!g!I98BwM-?a(w#9dWmA@$i za7SaTC^1lqm4DJ|W%kjO8|F`cj+jj(f58mz>F?f~lX;PfhQ#Z4PVGAJp}XjE2f=gw zOVhsFWq6%efnb!bIGbMBwY2<9`vAxv_tft%cdvUVRwAGcJOpU;xy^?Wz&==-5zx*! zf+FhC+;0ykG&ANRB$qt^$$q3Lgf~m)53_X!6@au5 z_}4$^%N2a43K)Pq`gklsLy?dQ=3)>;T&xbucpRW|1mcv9g}|N=)h?ic5SX0cKUi(a z>R+(=JPm?B%Qy;X%lv0nR1|`^O7I^}1(0`T3nuk3}31wJcjEdaBFli^R)rmZT1rgIS8qkAtBN=AbEBk0SV9` z{Y;4)RPkaiM8xbzPNB_H$~<7^BlyGk$xYC~x=ZhwKN~0as|SA$sgW4F;+jT{2F5%< z4pQB7lEF*A(%A8ilAo?yuge7|Wb*q6+uB9&1e!Clq_P)0&e(Zj@m!T#tC@7I}Lvd_;B508M`VG6>6W7SPt6K{CNwX)^cIF*l+C#Ou z(H5)ZzDOSo2tf9WCq6e{3(T)JUFQ@k=xWwt=OeLg3xB$ZcU{9+c0qeSSpX-d_Vz29 zf=zl9J;i+AwuBFv-S8?_&va}xe0M5C3YS$!g(wF(Dayltsa9f7YH_R8)KtpND4^8r z;tL%BQR*qF5AU=g8-?M0rWbdl1W4{r@znk@5H3Ek@f7q!dt8AlvnhfoY*6y_VIJ(L zBOf7bL%Fm)FL5t};zrgce(TV@Z+jS{hRLRj($%T!zuyVDc~3mghGbfgZoLi?>9H?Q zf6XL=0$prkuf|}pt$F%BgXmP34j+q(F-fHK#Gtk$S$q4C4OA|d!pan=6F1gNey_m~ z3yO~xpNDvi{<6&;Ko+U9mXn7Qw-%zzolmh{7GhkzRcK>#9G(v!)8gBi8^;j6PS<{9 z%n2g1`eAy64jVpQ-dG7)@_`b<&EBfiH!Sef%OJxW{vLKJui}Tkz&)i*2s{X{hnelRD3~Qoj)-(i8(`$P*fL{ z^JOACTnfDj`&(#qw10_*<0xz_N9O~H5H3@a;7Y-!E%};g(01pA78v*YY_GUD>fc?_Xur;^gi~B9W_$y-J9pRO=0VUm$YgMN zYZIHF66@N>&kxj)!yYdbrO&x?8bfx=x;ZX2%4BA<3M%AL-Xo8^Y&hv6llwdd$Z(Ps z5h}Z=Ho{q1HuO?VBw!pWczZVG>m%gt^pJR#s~FzTTHI8@*hltb?psy2mD+FO4U|rOwEPWJU?GWAi~+rfF&dW~q75A! zR8M|ZmV)gkn`!~tmOd5(tig?S!XG78w7FX~?6Q1PN8+qw(`IAb4(OBTJ~+vlf2gCv zhjYGmQ>=biX!O;VPsy#Yct~jRN1jioln6lOWs2J8SJ2{=I4jt80|y^kTAnVtfJKl% zbifl+3^R25+Y?exVlY-T7Nb6H?WSf2MWw`?CzsSgnc!OF=>ee;Y81~Dcc1PyT!CySEJfncLVZv+OD*iHL1|De@< z_#Tzo3)bkfB-`VgLxvzL=;wl5`{u;Vi?RdX(nv@wD>y4+j@X!m8n3Zyd%2+FwN1S=!xe_FEA}8FC0-z_tks;)XwoAe#g{A!s zFP`Fjp!Z+Z>Jh)Q3?JjvYc!&{GbT7khw(Ct7{)VBsFgEb=ZWl$NyTwZQ$-K7ShA|p9^0@W0*>((o+OH_VB zr8XdLrMmT=RwR}|OD5N7X+Puvyt zv6U0;dflZd>dK<@=ViF22t3M>mRRXmxZHeY+DhE}5Q(!PddY}`MvV&%;EQ_C_4-HA zI6nOKYc{CrA2qoB9$vcr`Kue_vs`v4&vhnxY<+so07biRb3RgEMw6CwvmhHLh{3Bg z1Z}x|LufjDmzZI=`2vH#S0)Z1BliU6dkn5Ei zU_;(%6tXvYc+3}TfH2C`o-u4^GmR+Fg`5vstUcy**LnGljcb9qN-5FkWG`y*voFg} z0>*!%LW+kSJbv@)fhDVk+Afz$BWGqxBdNApwHh8Vp+*))JDH2-Slc(@*8J)g(q|J< zIKZ5ysdOvEwS?U4K zy=M62oPIsAKZw~~&@W<8svP^Sy?xIg-$l_N^Qc&! zz*}(_Nhtb8H}v<-#=}P$Cv=D#Pw@5a8yW~zjPLfhl6}1qPGoY0Ue(|TO){RZqmCFJ zbw|`Ll_0)RjtKn2^u^~ArQAN>%_QTUa1l?&I~<6?=^LLXDW@Yjbl;~i#c@oWBGGb`>fyheMy5?THkyumcQlu1Y~L7o_sfc|@6ADu zMn-Zs@a^=+(E3Ck)0B2zmbh!bpydhtAs|X3QX>dpjAwt4cnAr4X7Uq|2R8c^lrwfm z5(nr`HtgN_?0rci$?W=tgd=J0zd37Ll|1RSIo|t|)Vsml-(-Y(>+O7|`zggJ^2={q zpLg09mA(OwO$kewfaBxZ@xn(L!5lmvmx2VhVIrdszOhZFPs@XC2seNs{#tW9V1lPv z$e%o~ZICEhu>5q-sb6_A?p+0DA?l9K%Ud++(PT%(tMp82Bk29Ke(xTL1)p|)GX3mL zj!v~V%E5*-1N?zkrWSMD4L@HOXuFA@R{DC`Crg_(4jtiIJE@r^bci`dw3)hFwr7i( z@3tSGv!b(!)fqr-D4*jq^c9RJPX^R#E0U{#7f z*z_%}t6MU<48NJ+dj2)=-Ie$tW3YQ+>C-Qgs`5u(S>mnVb-=~IZ=HdwPR3&|_Oj%6 z1LJPkDAHJ3<+ssBcd8mo8~2OPl0v@Hr__et`Tq`+hDv3HP1C~J?|iBre54j$d%+58 zs}>GJq!k`@4^6tNC99gd!?eU>^B-qCQqmCHgtXM^%Ac!3UO0SWSW_@|Q}2hVY4`yw zg8L^f5e~ahl>1DkZi({=CDPh2Xsn_1Md{Iidsk0IiL~N7B8IW@! z_(Q_r<^bDh2?IK8@08#@DdMH|71*|iGwDnjMBv?}q=si@jK3v=gjRlF!0rV(bpER# z4BlZw29Q4R%2ts3d?Lys_e(63CG-%#=ideORU+bqofPBoi)qa%# zSOX!Vl1D_)Z=W$h;)wE|0@mhYh()~zu-auTK&;n4U!3{_3+2>*isP$@rK=dQON3Z! zM|mTb`2_%PNA|OCA1i!iY>93G2`^HXNaMy`;wNg_rGVaGJSxrqI5_*jB?HyK8hK40 zSRwxpLVy_|@P+)IO~6#~C_<3j%^!|vb>F{2Uo;S+cjKe|Z3x6+?qF759Vjo>A_+l^ zgB3zgeGLRf82yhzgJ>~;OBewa*!{yOI{P<`2?6{8p;Y%D_JQbLN|z+eiU^~R|2vi_ zralKe{5MZ+AnMFl#}du-KH^Efy)F*vIe$MfAnO&6}d|g+}1tQe; zd4tjNZ^5<2+SZ>Rt0BO>ID+DLCHh%4|z9EjfeJu|jGmT20S9t=FiQMn0 zr){gh$(+XJJ+;(&CtQh{-ZUU_e*Z+QTe@v%6{FzB%$m>r$1unp8#8$D_flNd8tv=Mk zcP#4y`d`te-!uNGuypDP(Q~LV_|fdO;Rg4g|Vk7r-D zrA1=hsIFJu7N7}xcK1tVh{NekCid+%*R!wejcvl_KD_w(Z68f?*Ci`qmLHq1?3;I( znZC@0Ol8;Oe@gx3>6a+$>K{&^d}ihrYX$^j|he*h#51DOSDp@j#`8Y|9{zRoTepAFs7x%wB#0E=F97(rliWBWHe(X3D zcn7*#X?becEe&0qe!u|NY8a=yqlBrV!tI_h4)#8x!&w$qn5fo{BV2j1Ul;uyxqt=MID7fiDNe$cDWJ(*_5ppL>shTA4JvZY(;qW@^s5HYvAr zz|B5JWiF$@m!>g}YSyi|)FlGQJEM1EDUfNXd$$HxQE6m%_3dHr;DY z%Q;~tJWX@+=9A|r%q|XBg1#r)_Anw!lkH|vrS-J;;DlU>AE&C=MpOyYeM1x()?p$a zUN5MMSrP56`d4a`3X>E^#>zo#e;_Atr7v{~&W+~~1?xjMkxR)XfSB=&Th|T-iP3)K zX#DEuK)usL-oHZHE=ox_yp|D{EJMI=61DomHGJZGM3VpXc%o`EsiK56Cpg%-g#|je z%L3-6mFEQyj*pE+;|JVYm+s_P)H}bafTQGl<^`+7)u>As1gX!cje1$W;7aMVOlTC^ z`pSaM<^Ii#y0*{EFAdRSwzV&R4kmArRX5yHyr~Vo9FUr{$ug?C`Q8NW6HwmBM()|* z$X<2%ieqB`(dv>Rnm+PLaNGF7`-1~XJ3pi%S=8s)@HH+txb8k_DL2griMp{f@|7*E z23_Tld@4~X4yAos@kfE)GC^K1*iHz+VR>CqRLg-%@*WMyy<=TBZ>(+{>N z_2SddAe5tf+p(x_>KC=fjIfD;q9G z7yAG5y&gFd**z=^*EANVJkG#bv(l?AlvF2=edKv0 z%MJ$%b^PoW-3mNB5n5UHJaOb(r$)97wj5c(&4S9`yBph%rAl0gmnvrD^;)~AY%g%L z$Zr}Sby7{~BIpBh=4nn*h&}{25Xhmx&pT4wDt>MDjpaD-Jfob|TC^9b3jq|dLS$YL zO(DG+V*%&mAxl?=SP7FCD}R7|0^~fb3YE*g5r9qWv2S%UsI|p{#wa%v1yZsT(4bPi zFNhfe;#A#>3zSNz7lgLt``$4vFHeMP8jU8KYk!_1NauYkZe??eLhg(Z}bqM1j=2bW6hYWNDGKC4-i{XxOP{6vmM32v2%rrV|w+ zUs^2Z5zQm6yq1#__!au%2OcF<$HL~1k7B7j`=U2zv{0pcM4co_Cd#~`#X?RRbE`86 zn%qh0iAh5N#;XiG^6}Oz42XhLs6tQqHvH8DzK~y|msRdT7_7&>)Jyk>;{vzS&wbPV zwFP^Cr?sI;v~)JB39Mq_cyunmL)LJE`B`qeXd^7^ppDY1dO3rFu@) zUx%(NDU9>+ZLb>-a#AA-sLlAHpTE$6f+B59VS4C8+2#B*9nuZa{H;M8?W&bBfm%Eo z121Fl#mu~1n-^P?pE!d$HYbk-A?=wR5j_4v7?9^Sf_jeL1>e8kz9y7bh?O|st=cKZ zHe;TlCPdjshwk_@jH&T{Sv>S4LiZajGDUvwpzyb2~6M^nNY$Hk9mviVBq62VFq zVf<=vv9Bs#zJzyd;*)rvn3+7j(A~VzN*l~ys}8^MAvz}}845{W>u(z3Vl>cxI`TCx zqvV(9X3pNVMG#6LZK%5kCd&?CZWd7*D!E^ocBvba89AY9pDlPT_@I*G1kj zPYQbkug6uY73_D!>Xd09<-fj~sMp`EDqo}k6pHyvNesIQpb>}kDJvp!F+B0Q(oUWh zIz)<$ZfwvbX;jz+{)7ewELtH}RX3RcqEY|EW!NS;SXQ+!sge;}Qpr3Mb)FLfEfFJ3 z9*9mnanpZx3%ox2sl%|}kebUc4p$wt_Sn}b9+Y_th2f^xGraLmM?J%@Ep4qI_$kBD z4XG&fDJ~mT8RFg7OGo!fYkzG2{Y&7Yxub;m=7Fgs5eamESY}+E?!YO;DO){X8f;_Z1S%UOEsx@som3o5Eb zIn^{YzMm|=d%5AW3rd@;kKl-L=G9J29=@{T#Rs|1ieBnhYL0j9xn`)^H6i0#?;-c9 zUghC9xl9r4f8GRIkA`Ty>D)MdDyNY=sAe$}dOFyXMZ5Uyyi3_fK4L6YMb8!4R8fBC z$@e;1Zr7JrL35U1R!)tedj`1D5iMKLXSnTHHoKa z;?s504c%yPmM~TA1$p9yL>~s`XLg)EEj{*GAv+1;e|8*|$-l)m8D3#`(sVtonPh)0 zObrL~;@_p0p3~gkj`y_^0_RmOUT;?5{N2}hBskleHLD#fy)Exc072!>p6PHv94dql^l)@ zH6-H7MfaT~(Rc~^KcK;LC|;gC(IhZGDbct5#Qu}^Auraop3w)LMmUd_sSZgLuiv2e z*H`=ayvmB~cp10sfk3NQCt(c?ot7l7{nZf(F|E;Ucc@gg44nLpENwRvlxR~?!rdfDO!C~M%vXWt}oWpE8DU(;_ zuh*o)HTiQp1JEJw)J$I)B=_6(Y%auw%yM-zkvT9lwN{HUe`59xM+Z%11nz5JdYi~F ziVB&S|4K4y7bbREH={N`DRn6){Jc&xBF8f|rAj#fd8L|wE6=A%JvuY5!w%y+W-TMq z^B2WC7xcj*>8V@}h1HKPWSHHu`WveuH@Af$>$m_nA-d;s%A98cM7eLJkkg~_ypO4q zP&`N25$HgES_5&iJf`pu-;?0t}rQ9l|d>ScomNYAv`PnIbJxFf<)!lkr-0!?^S>!{s3&iB>Y|aT1;U zgrTEe`tN)pY|fIF(-p@i7Cr4R~Jaw~uE-jmrAls&)ZXYP; z+2^-JHPl98qJS1<{^i?JQGAz_u$X%v`@uTWF#j2fTupzxzrTV=X4Z&}^2yUFQl2Np za%vb!C5(F?WLaiy1TS!88SIU%eX*h2XZ1`RtC(SiEO8;li^+U{EOXcMBWbnC>UcVv z0wE)K9nJIXeJ|L9K`sB?Q+InkOrv^&@Ji~}9W{#=+hW3slJ;%PUKh)D*%Uu=M4h4! zLeo)zr}J0W7ap$7m{5SOqMwv}O3p3SVv{w`Jj*`6mP!z&J#u<=Qp6VdqmgmG5TLNs zkPjRAW*3et*nG0dYI&O7bE%d!TT6#5a+=qJ(PK&8-+oVCBK})oWB_G;m|UjcaF@(q zRFuuX>v+bn1G|O~2`QKaPQVXfDCG?B-=P4HrWiTmpbVhEKzY295JGPm=C)NOu%fvN zM20qtIRy|yY~Ik>KKH~EnEjJ+bfmv3+j(0TL4{f73Z-0#xGoRbo3lDtpo|z`Y~|v; zxqXY-^F##?gy|;`AeF%jvq1G02$ zaLfJ0MrU?nM#KoF~#S0B?CWA+fGx;flbbA#zYjEaY*oCuqC zJXnv`KLi`8PaNnw*42gTIYMO5R=X5oGT@({Tofh|Zy@PZsUj zNz3BHz5$80KhRYlttTR4No9&mXy}g66J;oKA;w$`VYd954<;cM`eejAaQ-+?@GLuI zVWSLNw9tIVZw*o=N(&4u(n{{`z+xmPz$HQ|c6}A?TKXNx&xjNb!l6MNDxd+T0#Z*8 zB8wsth8ur$5+5D#>#h;XLw~Vz>TmVu&k?X+SWO@LqQQ9_aVe6@1Ma*sE*X#r2Fd8* z(MoSG6NoQFTKWDc2`Q?X8pOiM$9}_jE1vtJptF_yln0lSH8hQMuC~+*o4H3dtM<7i zPrg8FS)vwO1^mRC%jWF8*ZxpjU{~1-a(e~PY;^0C;PJ3I`{Tky^nry4RevMB(wS=Q>Td$~wRNHl z-0OGL-rEa){kD@Ml%zWFZa6?i`V_&RY*d96DCYTrj?=2M@g?>kY&}Re>&*Z-#t^b7 z<#W23)W)r7EsJJ{#KiJa8rdbYdUuKM*Va-9%+u-S9jn6>m7y%Yc zn-q1zu6u;HV>mxP$Ss|Te~(g;4Ag*i?2j;v;FiE-uG(w`Bj53 zdYT@JRUO}YAQs*e-&Scm%{DUB2o029GxX^uE!_~=wBpMLY^E~95jI<8=HXZm!AO;^ zIG&a*u|zi7GF+KTK(P z);d5>Y1qiZ1o^I4)c@llJZVGIliUAq-i63r>N)?WV_^8FcXZ{`#O^z@W2oJVPaRM_ zFOUH`5Ft8jen?b`7DQ%@_ld>FH>~IbSofC_l@thSeq!`#b_ScD%LpBk`PvxJr)CXz zyxVyu)jqv91x>9G+OSH{@bz+<=?PQI#i5w$aGI_(KyGjsC z3zirSKg}Q>w0n-(bn;Cz-FsdsS;1ze7hWzGho5PFAFg0e+_e9^*Qv6J=xFt4;9f+} zrpQuY9uiI7ESjV5T*C4cNr0Kw4@N6B|d+~dZ}UADz4t50tH))yQjnJv!z zwpWWmss+p~6VL4+PH^yZ9Zkog>CQTr+_w59&%pjGJhtatME96Ie)9p|hCO~>e-^^u zB)#$^67cdyohQhm^?N$|gsjznQR;cyAuR#MWw%F?fvsKju5&YNwkTULakFSOFTYmU z&uJg0_)W0l9rx$h#I1-f`YBTK2Hb4={ze;c`Z$=SLG8y}0$1;9(%##S<|Uu$MKY+I zw$p6;2i=Nv>TePa*tb!~N^n-is?tO2tjQKf7lY!W5na=kuZCJxq0>(1uR&QKLzX#^ zOpE04@{jZ{bH9n>uQ&Q)3gGgUs8Z>?3F)Z`;^Y7;Xo!k~ah-}jwkfcG9gDzJ^~TUl zJ~JJC<(qByW5fZe^brYuNWESXFhs6!2c??D^bW&`75B}9KbBg~{sKiYi%46%kX_&O*oo%5S zcN3PiKeqNEhUccVUAKCY~A7mVOw@8H|bL1S@9Rd`bKn87SY-n&kF{4a1ktM3u6W?V@5BdP8mv*^$=l4H&% zOyV~140{@=;;w3gGf?N-?R&2iM=oJwvy_0c^Y^v#?Ml&>-lBB26SBJSD^^YvnlU>m zJZ`^UwM?zAo;m7FYzp(81j{EECbGFdPTxRuf?*dbsPD}NAXyS0CE(u~#wy2^ASyQE z;ajv&4xzCg%z%a~^sV#MR+kn$IUA|{c+S^$iX35w)xHWLvGZ|SFdL~|q`WsjCCFa9 zCxhPzE3*EXl+c{BjVaI#*z_(1bhbNsJ4C(I3BNlRveqif5x>V<#BwxIds)WP%#IGK zwQoyM%HR_)J-NX3Cg(%{se^+TaNEw6*uu5c8PCF*g`B^SrqDPg0x1^Baqg`0_M1Y% zkZ1KX66Q|mVbwO7Dm1J)N4gmBUyRVcn=t%>&(~zE_0>^6C!{M*)4uwm6xD9%CrQZS zv*F2;P&Pt{^W@J&0Z?M9HBDI)n$Tcn4%2#qLNu{~_G;xBUfqYy#MB8#wY%)+;~x`K z=R%7eSqX<|7bz>uCo6NFwB-7-_=Nv0n0CAiC|el9w1Q5Ac^0Slv-*p8qf;m8WkX(J zK#B)XuFW5kWl;+9VTz7LD038kNsPfM#kBCD)52aSu$~cBZ9XTP=JA4>o7Eb5cs*Bh z8#O^J@bqBvd~|23xy(u*RUAHLOxuV;%Cr#U!_-@I$zdJQwY;`Henc{r$P)4(P3Xyr zo747=osO}SqP6K4dXHwUllsUcz7j>FlN{lhQ?8e!Z80!Ypn*Mo`P3oJx2bdJ+Z0hp z@Jniu>rSW1DoyNY7|X!l6~@X%ArAruba*1hwn*@G?QUw*m=A0$vsKyf(7yp+*Cgiiicg}{WDV-94z;7wn$d3?|yp%AQc?AzHTUVGo` z7$lKj5vhO7;{K?+Ddt+`_=GR5C+irJ#{4 zPtU|yGhA};Qx$EZWHHx$|3m@Y;TnFpQWV$y@aykic~S75$%5mWuj5=M8ldXWS1^{% z<#FSAtu%v9UqIoAi#>6h#V4`y^Dh`|ldN8Ut++8V%mOZC1qh)tH>oK zyCNKV@a^dejiSf|p`CtK>H?BeyAaygsrY`}O~C25bs1#X=+VY6ck*z}v~L8dO5yX! zrDXjC;#C|GSk#ivfgj?FI^pVCf4hIbr6b0@7sOwsdDCFy#vDYs#ik)8#@sN4cUuh* znzfSU9UIWiUV{J3|B< z_{}|_*6UtDuwK$1oH@>WMa_1H&h+sfv7k~7(1=Bzo%Y8;=yP?Ry;HUD`fA^53pego z+sR7nA4*_cr7?0#RqUQD_bk^&RjP(@d(ERFY-mNT&F?6)^>EGKE>pJO!o zXg{&~1brGFmvqF3_$Q_KU%4+);isNhxPzO+a3JVS#ce==P{zoNb5iG2G5n&Chc{8~Zm(wkm& zN>^Tq^eVLfSvRO!^X=hO^F4jCuG0=~D98?D6@L`Cm1uf?U83Uku|Zkv)n6I^Ph;O5 z4aXP1t(WM%x9FXS)y3*PM2WIQiN1PBLiA-)avJ-`2c|Lo40otb<0&b@Qa=b5JnL%%5mWt+LXl2EBjVfz)zdX`pTQ7&zND!qj&`DIuvFHTbwk%(N2jrd)b7m5;_8nf7=8H8ahPwxRJzyHE-8p(zhx$Rg6tNmT7PP{`_~1_Wx5dE*XB7yx z41)h;!mjC|k?jF3njBIWXG`}(Ok;O1^vjz>ZuO%3pi=-k5fBWN934p62 z-1>wR;E}P4e3j#ZCvqQs5kK6;xm+Pot7BCy2K7kY&4OdBID=baE0 zxQ~N`N2diAbdl0K+SSM(!9t6Ur$@_UU6YWNR7-4NTDX8g^jA#wPUc53lS;j$;BuZB zk!q6kDN8@T`P#{F>Q&o)CXhW@;jdP0uaw`p+6@;$Z*2mlXyZdbu1s-V>X$RlEGM9l zYL=FUWP7X{>z9z+9I6$v4IfcoLh&9~lPXK>@^bYBWyV+XqKI~6V8OP_yNew%=vuFHDP>cvR zY*k4{Z6rZnU*-aQrS~^gwEksY5Nl!ueD+2I77S0>lMvcILp9&4CfV6~E)Bh-qn`dx z0{ZDLv$HFONOujtZ;YSGNW3pB&t)%G$!`=!>4~R(0D;B{8Y*XV^__Ti<%+D643wsq zd5G@NWi)NWOt@d?iv*H2r9`oI7pV5id+(iRuZzsX-zlX|nRVOCYPPiGsVZq;WioZ7 z(L~NJ{Y_f>6Jaba(bF|efi><8JuHq_}9a@jH|sCbkS%+ zI{7dU$YOfhIveb1Xko!ZF?Xa>%?tf0HJoUeL?31HW>GD!(k$;wqrvpc?fB1oj<@=# zwJvGaFSxaytqh4|XA5AFE%*NxKJ3+hu|<)~KTmgYWVs#F^$Jckbh=u(w&SzF^8ma5 zvJc;7S!z<%9BD^Phn^O?u>a%UW`|rd0eV}Zse=8xCa0KA{bz#r^d;T4?SppZU%yg7 zmOr9-$@(n0C3?@>j+r=A>bV7i>+|J{=$*q?B9C70(1DZ$4QYwMwA+ac=v2m{SDlGM z$Hx;ReJ9PckqT04rLZ(!vRK~2Xc>+p0_Z<_m*92wa8E1e@abi6Hf&7DnIHIdoLR-s ziVE4|D*v^!HgUOFmF*`g-uKQJ9Vi(|2VC1Db)Oq`|x=*a9OCD;K6xZucK?{RSpiT^);f$rOsg~+c>g0A6~ zaUAAy{oyABeG5b{i(H2_bmPvw-ueq5T(s4=xP$+ki7@VfYz^1YXW&_e7cGBr9|r?r zf}Fa5FV&O%GBP|?SWH>eXIhq1tW_pCLUTU!zsv)iF6{amI58IQ{!blpTU!d8nAWkjf8`yiZgL?Gn_VVJym-RxU(F9 zun#YmJ;osvS;x4HX|rn@r0UkyHQKu=ieTl1b%}DnBE#1R1gLMTDUtiKo7nFpIO3g5 zrl6~h)W3_r4#2&5mXYb>&+o`KpW>Kg2MqHOHZrlXG!U1OP{efz?VrQV0?gRWg?4U$ z;Dy)dO>CbM0E}UPyzg~NDzcqe5C=Fq0VY-@cl;ML7%>m>64zb@S5Xh< z{^N~-)G%o#Hh<1ydAv6<+$@uG%M3(fnQ4p|=J$aiYVXY?p?GfIduw)3f+A=0o`Mk! zT~Mj7%s>8gS84uE36L>+2-ym|G%!*P`)^4RnGY_*_V}-2XG#CZp0tFF>t#U%Ml`=+ z0-4CHyhQdWn>ZVNNx1xC5`$ZBWb5;NB&UVePa|&koxG9en)wv8u0wdm!}`ZuHQ1%t zz)py_5gY%7H;&=`^p4PS+~sBowb(BiBWVMAQcI#1OU_SpQL0-lOYVc`vtrDn!9!k} zG5dpTY!dJpEbnih(`l(+@YWDN zp%hQ-uYF_t2?HlwyWPAr?15bvI*P&?T4Pg{UG!b!=tH-SsZv+|sa-_~r=`Kt6t(F~ zS8g4%y*L)*AMbtrCK@&VtC=6s8Z@~kcbqD@R!d?3{;c)$ZUA@mI%3@B#mlxxcZnM- z_t}CU7GXQc{evP7ZQID@t%-?f&YynfP^A3tZ*_!58H+;!TZfqUoHxKhFJTT!*`hGn z(3UT((lDUa+p5Cr1Cny9T+&CNfjMbVv$5h`?Zc}6>N3Xs%I|$uM^HcAWMMmyYf5Ex z#u~HVofaq2MFK7>L8k+^yP}G8r8h@uGpwesl+q*~^Fe(jq2jH5?%+X%HDd-5=lkQW zwBiv$yahG30?_v{vRm}RQLLf(JBLkW^c=R1jz<(4oCBq2`IW!=n17m(d}lU&R)uAQ6E;4y~2P}N?+&PrsAjf=fgLF5C# zuer{dAa+)fTZ+BI)FdHrsc`jOjPGI%v}Nxg8Zv)kH8(^rY%8_dKp4OhXcU^)!vl=O zgSfA)u$~5(WEC+FueECNe1{hohS7J3kNLaC;MVq2u^{JFeEq=rj3F>;(7c^<>c#3=^-ONP=GjiEB zpkyp~>UllYUn}2@Ztktuqmk1P9)huoQZK>6W8}6mo&fngf%Fg&E|pep=SB47|ml?C5h(?)zpR zal7b|RZka3vbWEcs#aY(cZeX9e=|FAos;{rpnP3=#I2lWZCbB;yhIdwDFf($sy-&3 zH5VF6p(Y~Njpu^!HaX`yk2p7_hjANiv-kTFJWd*(gj^}NI|Gk|PxNR4_)$f8Hu5r# zZ>^ViL$i$rRT7Qd=_JkaIfh<%$<5`_S8P~k$)KP8RF}z;rt`P4kTNRS5W>eoI+Tfk zE(7+`vgr#lj6-Tx3N};Q{PzY zKUO{-d`@{umUA9o=%FILSystN67ZKtpHn4N!nSjzXZ!RSrBhe$4LfZyJnQK|8V(sN z0V%DjlPd*cW~yqhK;pUE_#vyl#pkgrUqyQi080HFVrdJ^GNL#nH;Pqs=DS_|dYMs< zPkgWlQ$_hC6FNGFsiVe_l*s-rqrX4fBA8JMRd{$--9+OD2*SuPp%Jnz^*-e#KWX~q z&%>oDktGd{$1lD;X9_pCm=b0E5JXj0l_C->Y*q=@6N66Cg}-}S(KYe1n$F$+xh*#l zG#_w+Z=i(c*ax{|(EWnSC@^QeOFwa#eC4S5-}CZ6n5UZhUx}!cwzFcGW2c2;m)f7a zNxB--o;&(T!c3?+yqx?IfnvRZZyfPTQn}96hZrj1^Fe#5kF`Qr^^BeRD}R#aJRn(+ zjc#zYox6WY2|eRU00bD@O_^>HyoEkP$yDFcT4j&Jn{BiU8Z`=r*!M^jZbwItaMw_a z?1}%Xxfe#i*fk(^MI?u$pp zL2l6|JZU+d7}MLEw-uM6R!sR+#20vxl0UwqxsvxZ2fcxVC?X* ze)!mZ@~5Zk!EV}sTr0F)+uSu5Wp^w6sRJ=HCGp4^+DJouGN`Y}vo85%HkNqQK7Z~Z zBizqgDl(64zeDk7Z@adYG#RvBY5Pi!2=u&tX!AmXtR0Po1IUjm*O6`h8c=j0HZ|>JDq#J_L#s5GfUKb_)(5-xx| zMh!{{9|nm|hsKlG^zv4A}PM`+`soWW$Ah z2Oe6<=F}|yorxVy1!2q{!@{h(7bSG%kx8*VwbQQ6gJYF%CsEeWxaCA6GaXk3A&GEJ zF$eaHY7vXd-vXw((nAt7Bxv4>7V)1cZ&kX~py9UI!mLqRtjoB=L$Lts!KV$+M$|$w z5G6yg=Sr7?KA1sNRT3oe%PiaQZn=q5QCX6|3i8bM=~_)0Ve7&?+JSY6h>I0?&q=sz zloDObF61(5?(RO;tgp4F>a#$&C|+kl@3@F^vFf7;($n)HAJu=rL`azqyC`fwscbR3 zWqP4a?}%{Ch2wKz=9x0R9jqE1Y4>8rw6M)|aRUD`XiEy;8h)^bOS&0^ZZMCz8F>Y3 zIR&?TE;xl1Xp-G=Yc}UvULXP`D&`FAVVKpjshA;K&K$8%@5bw9@zsxVy3d!&uc5=pwD~*SNAKn5Rrwuz zRbpU@lM*a;+0%JME8lTi92LA_)AGpH^Rt^1n2040)d5w4t;S`L=Xpk2<`_PpC?-zc zQjtXTq-HPG$- z|Ef@6<0L*NVP3!Yqx$&N${THkhL^_5@0xZb1qBNd8{AdhyVIhKh~ z9(99c9U9J!)(#o5UW}$W!>h|F1|^==lr zQ=6G{zO41q4~qu9`?2u7*3eIbHhrCNJN%l~ z-H%g*s`)1a0ovGw>`aj#7bD*D+R5(dNeecI(sYQGYCo(Ys#9_@Z|Cp`U|>v}qH8Lu z-9G5DISA=AKHEp;0CLvQ8=LZYrfs`3ouJK%RH+MQ>>z=C7JN7Ti{JSPD_-=w??z6z z`myXFW(=qb0dHBnj7rvBJ`#{#IUXjUeqBN!JiVxt1gE-kQgn2+fNO^^9N;(>QPv8m zf@-UA>PoN^;h%>Grrx};a*-Q1@wt91f}7@Ds7SG!t}(DpqFT$PZn{;kQS}wHw8igw zIM77*h<}m)8PBc&u5RrA^T-LuAo)m%D@}88r73U-?e;a%1IHb?W{sEvhwz%>Tua8+ zAi%!sidHxNIt}q!SyYWPBK80X5WLscG3}G|^0><19cLA@Z>Kzg6OXmvYW8bCm+M$X zg2nk|u4#a3z)N{_z)n%DV#gss3ABPcWjs&{5KP@kq7IKbQ01)EPy`OcGte>BZq#&& F{XdMW!8QN@ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-02.png b/wp-content/plugins/wp-mail-smtp/assets/images/email-reports/screenshot-02.png new file mode 100755 index 0000000000000000000000000000000000000000..48c4aeb9ab83983b89365411e71fa7f42e8c813e GIT binary patch literal 145973 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�p6o`SVrCvx^ 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%0DfX!T-Y~SH8Nm+uncI&$r$GgaO9*=tbEIhUzM-T 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